diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm
index 37231b29651..ba474ccc877 100644
--- a/_maps/map_files/Delta/delta.dmm
+++ b/_maps/map_files/Delta/delta.dmm
@@ -51452,7 +51452,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/mob/living/simple_animal/pet/fox/Renault,
+/mob/living/simple_animal/pet/dog/fox/Renault,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -63383,7 +63383,7 @@
icon_state = "alarm0";
pixel_x = 24
},
-/mob/living/simple_animal/pet/corgi/Ian,
+/mob/living/simple_animal/pet/dog/corgi/Ian,
/turf/simulated/floor/plasteel{
icon_state = "wood"
},
@@ -94462,7 +94462,7 @@
},
/area/toxins/explab)
"dnd" = (
-/mob/living/simple_animal/pet/pug,
+/mob/living/simple_animal/pet/dog/pug,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index ccfadc2ab79..30539064bef 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -44349,7 +44349,7 @@
pixel_y = 30
},
/obj/structure/bed/dogbed/ian,
-/mob/living/simple_animal/pet/corgi/Ian,
+/mob/living/simple_animal/pet/dog/corgi/Ian,
/turf/simulated/floor/wood,
/area/crew_quarters/heads)
"byf" = (
@@ -50014,7 +50014,7 @@
network = list("MiniSat","tcomm");
pixel_y = -29
},
-/mob/living/simple_animal/pet/fox/Renault,
+/mob/living/simple_animal/pet/dog/fox/Renault,
/turf/simulated/floor/carpet{
tag = "icon-carpetside";
icon_state = "carpetside"
@@ -68716,7 +68716,7 @@
pixel_y = 32
},
/obj/structure/chair/stool,
-/mob/living/simple_animal/pet/corgi/Ian/borgi,
+/mob/living/simple_animal/pet/dog/corgi/borgi,
/turf/simulated/floor/plasteel{
tag = "icon-cafeteria (NORTHEAST)";
icon_state = "cafeteria";
@@ -69612,7 +69612,7 @@
dir = 4;
on = 1
},
-/mob/living/simple_animal/pet/pug{
+/mob/living/simple_animal/pet/dog/pug{
name = "Pugley IV";
real_name = "Pugley IV"
},
diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm
index e2ed24880f1..4dcf9a2797b 100644
--- a/_maps/map_files/MetaStation/z2.dmm
+++ b/_maps/map_files/MetaStation/z2.dmm
@@ -4552,7 +4552,7 @@
},
/area/syndicate_mothership)
"mE" = (
-/mob/living/simple_animal/pet/fox/Syndifox,
+/mob/living/simple_animal/pet/dog/fox/Syndifox,
/turf/unsimulated/floor{
icon_state = "bar";
dir = 2
diff --git a/_maps/map_files/RandomZLevels/spacebattle.dmm b/_maps/map_files/RandomZLevels/spacebattle.dmm
index 2525d05730f..c48e4632627 100644
--- a/_maps/map_files/RandomZLevels/spacebattle.dmm
+++ b/_maps/map_files/RandomZLevels/spacebattle.dmm
@@ -2300,7 +2300,7 @@
/area/awaymission/spacebattle/syndicate7)
"hr" = (
/obj/structure/largecrate,
-/mob/living/simple_animal/pet/corgi/puppy,
+/mob/living/simple_animal/pet/dog/corgi/puppy,
/turf/simulated/floor/plating,
/area/awaymission/spacebattle/cruiser)
"hs" = (
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 71d83c16ee1..16c46a85239 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -43480,7 +43480,7 @@
/turf/simulated/floor/carpet,
/area/crew_quarters/captain)
"bCQ" = (
-/mob/living/simple_animal/pet/fox/Renault,
+/mob/living/simple_animal/pet/dog/fox/Renault,
/turf/simulated/floor/carpet,
/area/crew_quarters/captain)
"bCR" = (
@@ -50259,7 +50259,7 @@
/area/assembly/robotics)
"bPb" = (
/obj/machinery/atmospherics/unary/vent_pump/on,
-/mob/living/simple_animal/pet/corgi/Ian/borgi,
+/mob/living/simple_animal/pet/dog/corgi/borgi,
/turf/simulated/floor/plasteel{
icon_state = "white"
},
@@ -52780,7 +52780,7 @@
pixel_y = 24
},
/obj/structure/bed/dogbed/ian,
-/mob/living/simple_animal/pet/corgi/Ian,
+/mob/living/simple_animal/pet/dog/corgi/Ian,
/turf/simulated/floor/plasteel,
/area/crew_quarters/heads)
"bTe" = (
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index 7c7b0403547..e84f90a3ee2 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -3226,7 +3226,7 @@
},
/area/syndicate_mothership)
"is" = (
-/mob/living/simple_animal/pet/fox/Syndifox,
+/mob/living/simple_animal/pet/dog/fox/Syndifox,
/turf/unsimulated/floor{
icon_state = "bar";
dir = 2
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 22b43f84b9f..0d934260b6d 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -64,7 +64,7 @@
// Factor of how fast mob nutrition decreases
#define HUNGER_FACTOR 0.1
-// Taste sensitivity - lower is more sensitive
+// Taste sensitivity - lower is more sensitive
// Represents the minimum portion of total taste the mob can sense
#define TASTE_SENSITIVITY_NORMAL 15
#define TASTE_SENSITIVITY_SHARP 7.5
@@ -182,7 +182,8 @@
#define isdrask(A) (is_species(A, /datum/species/drask))
#define isanimal(A) (istype((A), /mob/living/simple_animal))
-#define iscorgi(A) (istype((A), /mob/living/simple_animal/pet/corgi))
+#define isdog(A) (istype((A), /mob/living/simple_animal/pet/dog))
+#define iscorgi(A) (istype((A), /mob/living/simple_animal/pet/dog/corgi))
#define ismouse(A) (istype((A), /mob/living/simple_animal/mouse))
#define isbot(A) (istype((A), /mob/living/simple_animal/bot))
#define isswarmer(A) (istype((A), /mob/living/simple_animal/hostile/swarmer))
diff --git a/code/datums/diseases/lycancoughy.dm b/code/datums/diseases/lycancoughy.dm
index b50b7e0a0c3..8a296df05ee 100644
--- a/code/datums/diseases/lycancoughy.dm
+++ b/code/datums/diseases/lycancoughy.dm
@@ -35,7 +35,7 @@
"You howl!")
affected_mob.AdjustConfused(rand(6, 8))
if(prob(3) && barklimit <= 10)
- var/list/puppytype = list(/mob/living/simple_animal/pet/corgi/puppy, /mob/living/simple_animal/pet/pug, /mob/living/simple_animal/pet/fox)
+ var/list/puppytype = list(/mob/living/simple_animal/pet/dog/corgi/puppy, /mob/living/simple_animal/pet/dog/pug, /mob/living/simple_animal/pet/dog/fox)
var/mob/living/puppypicked = pick(puppytype)
affected_mob.visible_message("[affected_mob] coughs up [initial(puppypicked.name)]!", \
"You cough up [initial(puppypicked.name)]?!")
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 444b4838319..766c52c7b65 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -214,7 +214,7 @@
stage3 = list("Must... eat... chocolate....", "YAP")
stage4 = list("Visions of washing machines assail your mind!")
stage5 = list("AUUUUUU!!!")
- new_form = /mob/living/simple_animal/pet/corgi
+ new_form = /mob/living/simple_animal/pet/dog/corgi
/datum/disease/transformation/corgi/stage_act()
..()
diff --git a/code/datums/dog_fashion.dm b/code/datums/dog_fashion.dm
new file mode 100644
index 00000000000..e8436930726
--- /dev/null
+++ b/code/datums/dog_fashion.dm
@@ -0,0 +1,202 @@
+/datum/dog_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/dog_fashion/New(mob/M)
+ name = replacetext(name, "REAL_NAME", M.real_name)
+ desc = replacetext(desc, "NAME", name)
+
+/datum/dog_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/dog_fashion/proc/get_overlay(var/dir)
+ if(icon_file && obj_icon_state)
+ var/image/corgI = image(icon_file, obj_icon_state, dir = dir)
+ corgI.alpha = obj_alpha
+ corgI.color = obj_color
+ return corgI
+
+
+/datum/dog_fashion/head
+ icon_file = 'icons/mob/corgi_head.dmi'
+
+/datum/dog_fashion/back
+ icon_file = 'icons/mob/corgi_back.dmi'
+
+/datum/dog_fashion/head/hardhat/apply(mob/living/simple_animal/pet/dog/D)
+ ..()
+ D.set_light(4)
+
+/datum/dog_fashion/head/helmet
+ name = "Sergeant REAL_NAME"
+ desc = "The ever-loyal, the ever-vigilant."
+
+/datum/dog_fashion/head/chef
+ name = "Sous chef REAL_NAME"
+ desc = "Your food will be taste-tested. All of it."
+
+
+/datum/dog_fashion/head/captain
+ name = "Captain REAL_NAME"
+ desc = "Probably better than the last captain."
+
+/datum/dog_fashion/head/kitty
+ name = "Runtime"
+ emote_see = list("coughs up a furball", "stretches")
+ emote_hear = list("purrs")
+ speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS", "MEEEEEEW")
+ desc = "It's a cute little kitty-cat! ... wait ... what the hell?"
+
+/datum/dog_fashion/head/rabbit
+ name = "Hoppy"
+ emote_see = list("twitches its nose", "hops around a bit")
+ desc = "This is Hoppy. It's a corgi-...urmm... bunny rabbit."
+
+/datum/dog_fashion/head/beret
+ name = "Yann"
+ desc = "Mon dieu! C'est un chien!"
+ speak = list("le woof!", "le bark!", "JAPPE!!")
+ emote_see = list("cowers in fear.", "surrenders.", "plays dead.","looks as though there is a wall in front of him.")
+
+
+/datum/dog_fashion/head/detective
+ name = "Detective 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/dog_fashion/head/nurse
+ name = "Nurse REAL_NAME"
+ desc = "NAME needs 100cc of beef jerky... STAT!"
+
+/datum/dog_fashion/head/pirate
+ name = "Pirate-title Pirate-name"
+ desc = "Yaarghh!! Thar' be a scurvy dog!"
+ emote_see = list("hunts for treasure.","stares coldly...","gnashes his tiny corgi teeth!")
+ emote_hear = list("growls ferociously!", "snarls.")
+ speak = list("Arrrrgh!!","Grrrrrr!")
+
+/datum/dog_fashion/head/pirate/New(mob/M)
+ ..()
+ name = "[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]"
+
+/datum/dog_fashion/head/ushanka
+ name = "Communist-title Realname"
+ desc = "A follower of Karl Barx."
+ emote_see = list("contemplates the failings of the capitalist economic model.", "ponders the pros and cons of vanguardism.")
+
+/datum/dog_fashion/head/ushanka/New(mob/M)
+ ..()
+ name = "[pick("Comrade","Commissar","Glorious Leader")] [M.real_name]"
+
+/datum/dog_fashion/head/warden
+ name = "Officer REAL_NAME"
+ emote_see = list("drools.","looks for donuts.")
+ desc = "Stop right there criminal scum!"
+
+/datum/dog_fashion/head/blue_wizard
+ name = "Grandwizard REAL_NAME"
+ speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "EI NATH!")
+
+/datum/dog_fashion/head/red_wizard
+ name = "Pyromancer REAL_NAME"
+ speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "ONI SOMA!")
+
+/datum/dog_fashion/head/cardborg
+ name = "Borgi"
+ speak = list("Ping!","Beep!","Woof!")
+ emote_see = list("goes rogue.", "sniffs out non-humans.")
+ desc = "Result of robotics budget cuts."
+
+/datum/dog_fashion/head/ghost
+ name = "\improper Ghost"
+ speak = list("WoooOOOooo~","AUUUUUUUUUUUUUUUUUU")
+ emote_see = list("stumbles around.", "shivers.")
+ emote_hear = list("howls!","groans.")
+ desc = "Spooky!"
+ obj_icon_state = "sheet"
+
+/datum/dog_fashion/head/santa
+ name = "Santa's Corgi Helper"
+ emote_hear = list("barks Christmas songs.", "yaps merrily!")
+ emote_see = list("looks for presents.", "checks his list.")
+ desc = "He's very fond of milk and cookies."
+
+/datum/dog_fashion/head/cargo_tech
+ name = "Corgi Tech REAL_NAME"
+ desc = "The reason your yellow gloves have chew-marks."
+
+/datum/dog_fashion/head/reindeer
+ name = "REAL_NAME the red-nosed Corgi"
+ emote_hear = list("lights the way!", "illuminates.", "yaps!")
+ desc = "He has a very shiny nose."
+
+/datum/dog_fashion/head/reindeer/apply(mob/living/simple_animal/pet/dog/D)
+ ..()
+ D.set_light(2, 2, LIGHT_COLOR_RED)
+
+/datum/dog_fashion/head/sombrero
+ name = "Segnor REAL_NAME"
+ desc = "You must respect Elder Dogname"
+
+/datum/dog_fashion/head/sombrero/New(mob/M)
+ ..()
+ desc = "You must respect Elder [M.real_name]."
+
+/datum/dog_fashion/head/hop
+ name = "Lieutenant REAL_NAME"
+ desc = "Can actually be trusted to not run off on his own."
+
+/datum/dog_fashion/head/deathsquad
+ name = "Trooper REAL_NAME"
+ desc = "That's not red paint. That's real corgi blood."
+
+/datum/dog_fashion/head/clown
+ name = "REAL_NAME the Clown"
+ desc = "Honkman's best friend."
+ speak = list("HONK!", "Honk!")
+ emote_see = list("plays tricks.", "slips.")
+
+/datum/dog_fashion/back/deathsquad
+ name = "Trooper REAL_NAME"
+ desc = "That's not red paint. That's real corgi blood."
+
+/datum/dog_fashion/head/not_ian
+ name = "Definitely Not REAL_NAME"
+ desc = "That's Definitely Not Dogname"
+
+/datum/dog_fashion/head/not_ian/New(mob/M)
+ ..()
+ desc = "That's Definitely Not [M.real_name]."
+
+/datum/dog_fashion/back/hardsuit
+ name = "Space Explorer REAL_NAME"
+ desc = "That's one small step for a corgi. One giant yap for corgikind."
+
+/datum/dog_fashion/back/hardsuit/apply(mob/living/simple_animal/pet/dog/D)
+ ..()
+ D.mutations.Add(BREATHLESS)
+ D.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)
+ D.minbodytemp = 0
\ No newline at end of file
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index c86a18eba80..4e6e8352511 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -1780,7 +1780,7 @@
..()
mind.assigned_role = "Animal"
-/mob/living/simple_animal/pet/corgi/mind_initialize()
+/mob/living/simple_animal/pet/dog/corgi/mind_initialize()
..()
mind.assigned_role = "Corgi"
diff --git a/code/datums/spells/shapeshift.dm b/code/datums/spells/shapeshift.dm
index e3ee9e2e182..ff303ce750b 100644
--- a/code/datums/spells/shapeshift.dm
+++ b/code/datums/spells/shapeshift.dm
@@ -15,7 +15,7 @@
var/list/current_shapes = list()
var/list/current_casters = list()
var/list/possible_shapes = list(/mob/living/simple_animal/mouse,
- /mob/living/simple_animal/pet/corgi,
+ /mob/living/simple_animal/pet/dog/corgi,
/mob/living/simple_animal/bot/ed209,
/mob/living/simple_animal/hostile/construct/armoured)
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index ad073b4bf54..56f07d52826 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -434,7 +434,7 @@ var/list/teleport_runes = list()
var/sacrifice_fulfilled
var/datum/game_mode/cult/cult_mode = SSticker.mode
if(T)
- if(istype(T, /mob/living/simple_animal/pet/corgi))
+ if(isdog(T)) // Doggos are the best, but not cats
for(var/M in invokers)
var/mob/living/L = M
to_chat(L, "\"Even I have standards, such as they are!\"")
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 935c587fa57..f61e0027e17 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -64,6 +64,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/block_chance = 0
var/hit_reaction_chance = 0 //If you want to have something unrelated to blocking/armour piercing etc. Maybe not needed, but trying to think ahead/allow more freedom
+ // Needs to be in /obj/item because corgis can wear a lot of
+ // non-clothing items
+ var/datum/dog_fashion/dog_fashion = null
+
var/mob/thrownby = null
//So items can have custom embedd values
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 27d27b11a9b..bf7ee23eed0 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -20,6 +20,7 @@
var/ks1type = null
var/ks2type = null
+ dog_fashion = null
/obj/item/radio/headset/New()
..()
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 3064b0ae3c8..8e440dc1d94 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -10,6 +10,7 @@
var/circuitry_installed = 1
var/last_tick //used to delay the powercheck
var/buildstage = 0
+ dog_fashion = null
/obj/item/radio/intercom/custom
name = "station intercom (Custom)"
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 00efc83668b..73c5dc8b41f 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -22,6 +22,7 @@ var/global/list/default_medbay_channels = list(
/obj/item/radio
icon = 'icons/obj/radio.dmi'
name = "station bounced radio"
+ dog_fashion = /datum/dog_fashion/back
suffix = "\[3\]"
icon_state = "walkietalkie"
item_state = "walkietalkie"
@@ -396,7 +397,7 @@ var/global/list/default_medbay_channels = list(
if(ishuman(M))
var/mob/living/carbon/human/H = M
displayname = H.voice
- if(H.voice != real_name)
+ if(H.voice != real_name)
voicemask = TRUE
if(syndiekey && syndiekey.change_voice && connection.frequency == SYND_FREQ)
@@ -653,6 +654,7 @@ var/global/list/default_medbay_channels = list(
icon_state = "radio"
canhear_range = 0
subspace_transmission = 1
+ dog_fashion = null
/obj/item/radio/borg/syndicate
keyslot = new /obj/item/encryptionkey/syndicate/nukeops
@@ -840,6 +842,7 @@ var/global/list/default_medbay_channels = list(
/obj/item/radio/off
listening = 0
+ dog_fashion = /datum/dog_fashion/back
/obj/item/radio/phone
broadcasting = 0
@@ -847,6 +850,7 @@ var/global/list/default_medbay_channels = list(
icon_state = "red_phone"
listening = 1
name = "phone"
+ dog_fashion = null
/obj/item/radio/phone/medbay
frequency = MED_I_FREQ
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 3d893c86371..674329abacb 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -14,6 +14,7 @@
container_type = AMOUNT_VISIBLE
materials = list(MAT_METAL=90)
attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed")
+ dog_fashion = /datum/dog_fashion/back
var/max_water = 50
var/last_use = 1.0
var/safety = 1
@@ -35,6 +36,7 @@
materials = list()
max_water = 30
sprite_name = "miniFE"
+ dog_fashion = null
/obj/item/extinguisher/examine(mob/user)
. = ..()
diff --git a/code/game/objects/items/weapons/grenades/clusterbuster.dm b/code/game/objects/items/weapons/grenades/clusterbuster.dm
index 09822143a34..8de1b1c6627 100644
--- a/code/game/objects/items/weapons/grenades/clusterbuster.dm
+++ b/code/game/objects/items/weapons/grenades/clusterbuster.dm
@@ -230,12 +230,12 @@
/obj/item/grenade/clusterbuster/fluffy
name = "Fluffy Love Bomb"
desc = "Exactly as snuggly as it sounds."
- payload = /mob/living/simple_animal/pet/corgi/puppy
+ payload = /mob/living/simple_animal/pet/dog/corgi/puppy
/obj/item/grenade/clusterbuster/fox
name = "Troublemaking Grenade"
desc = "More trouble than two foxes combined."
- payload = /mob/living/simple_animal/pet/fox
+ payload = /mob/living/simple_animal/pet/dog/fox
/obj/item/grenade/clusterbuster/crab
name = "Crab Grenade"
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index ea178aa3345..fc4f3438aa1 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -15,6 +15,7 @@
desc = "A tank of oxygen."
icon_state = "oxygen"
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
+ dog_fashion = /datum/dog_fashion/back
/obj/item/tank/oxygen/New()
@@ -34,10 +35,12 @@ obj/item/tank/oxygen/empty/New()
/obj/item/tank/oxygen/yellow
desc = "A tank of oxygen, this one is yellow."
icon_state = "oxygen_f"
+ dog_fashion = null
/obj/item/tank/oxygen/red
desc = "A tank of oxygen, this one is red."
icon_state = "oxygen_fr"
+ dog_fashion = null
/*
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index d7900d82e38..af57fb360f3 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -19,6 +19,7 @@ LINEN BINS
burn_state = FLAMMABLE
slot_flags = SLOT_BACK
+ dog_fashion = /datum/dog_fashion/head/ghost
var/list/dream_messages = list("white")
var/list/nightmare_messages = list("black")
var/comfort = 0.5
diff --git a/code/game/objects/structures/crates_lockers/crittercrate.dm b/code/game/objects/structures/crates_lockers/crittercrate.dm
index 50d9b056e96..f1d58cd334a 100644
--- a/code/game/objects/structures/crates_lockers/crittercrate.dm
+++ b/code/game/objects/structures/crates_lockers/crittercrate.dm
@@ -33,11 +33,11 @@
/obj/structure/closet/critter/corgi
name = "corgi crate"
- content_mob = /mob/living/simple_animal/pet/corgi
+ content_mob = /mob/living/simple_animal/pet/dog/corgi
/obj/structure/closet/critter/corgi/New()
if(prob(50))
- content_mob = /mob/living/simple_animal/pet/corgi/Lisa
+ content_mob = /mob/living/simple_animal/pet/dog/corgi/Lisa
..()
/obj/structure/closet/critter/cow
@@ -79,7 +79,7 @@
/obj/structure/closet/critter/fox
name = "fox crate"
- content_mob = /mob/living/simple_animal/pet/fox
+ content_mob = /mob/living/simple_animal/pet/dog/fox
/obj/structure/closet/critter/butterfly
name = "butterflies crate"
diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm
index 5f62786a888..f54a0459b16 100644
--- a/code/game/objects/structures/crates_lockers/largecrate.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate.dm
@@ -55,7 +55,7 @@
/obj/structure/largecrate/lisa/attackby(obj/item/W as obj, mob/user as mob) //ugly but oh well
if(istype(W, /obj/item/crowbar))
- new /mob/living/simple_animal/pet/corgi/Lisa(loc)
+ new /mob/living/simple_animal/pet/dog/corgi/Lisa(loc)
..()
/obj/structure/largecrate/cow
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index c7a362592f4..21706aeabe3 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -348,7 +348,7 @@
if("queen") M.change_mob_type( /mob/living/carbon/alien/humanoid/queen/large , null, null, delmob, 1 )
if("sentinel") M.change_mob_type( /mob/living/carbon/alien/humanoid/sentinel , null, null, delmob, 1 )
if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob, 1 )
- if("human")
+ if("human")
var/posttransformoutfit = usr.client.robust_dress_shop()
var/mob/living/carbon/human/newmob = M.change_mob_type(/mob/living/carbon/human, null, null, delmob, 1)
if(posttransformoutfit && istype(newmob))
@@ -358,8 +358,7 @@
if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob, 1 )
if("cat") M.change_mob_type( /mob/living/simple_animal/pet/cat , null, null, delmob, 1 )
if("runtime") M.change_mob_type( /mob/living/simple_animal/pet/cat/Runtime , null, null, delmob, 1 )
- if("corgi") M.change_mob_type( /mob/living/simple_animal/pet/corgi , null, null, delmob, 1 )
- if("ian") M.change_mob_type( /mob/living/simple_animal/pet/corgi/Ian , null, null, delmob, 1 )
+ if("corgi") M.change_mob_type( /mob/living/simple_animal/pet/dog/corgi , null, null, delmob, 1 )
if("crab") M.change_mob_type( /mob/living/simple_animal/crab , null, null, delmob, 1 )
if("coffee") M.change_mob_type( /mob/living/simple_animal/crab/Coffee , null, null, delmob, 1 )
if("parrot") M.change_mob_type( /mob/living/simple_animal/parrot , null, null, delmob, 1 )
@@ -1514,7 +1513,7 @@
usr.client.cmd_admin_animalize(M)
else if(href_list["incarn_ghost"])
- if(!check_rights(R_SPAWN))
+ if(!check_rights(R_SPAWN))
return
var/mob/dead/observer/G = locateUID(href_list["incarn_ghost"])
@@ -1839,9 +1838,8 @@
P.universal_understand = 1
P.can_collar = 1
P.faction = list("neutral")
- var/obj/item/clothing/accessory/petcollar/C = new /obj/item/clothing/accessory/petcollar(P)
- P.collar = C
- C.equipped(P)
+ var/obj/item/clothing/accessory/petcollar/C = new
+ P.add_collar(C)
var/obj/item/card/id/I = H.wear_id
if(I)
var/obj/item/card/id/D = new /obj/item/card/id(C)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 96cff51ec4d..37a99a54682 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -601,6 +601,7 @@ BLIND // can't see anything
strip_delay = 50
put_on_delay = 50
burn_state = FIRE_PROOF
+ dog_fashion = null
/obj/item/clothing/suit/space
name = "Space suit"
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 81ab79adbc4..b5ac9aa405f 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -258,7 +258,7 @@
flash_protect = 1
tint = 1
prescription_upgradable = 1
-
+ dog_fashion = /datum/dog_fashion/head
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm
index 70f0b1944de..2cfc2adccaf 100644
--- a/code/modules/clothing/head/collectable.dm
+++ b/code/modules/clothing/head/collectable.dm
@@ -25,33 +25,39 @@
desc = "A rare Chef's Hat meant for hat collectors!"
icon_state = "chef"
item_state = "chef"
+ dog_fashion = /datum/dog_fashion/head/chef
/obj/item/clothing/head/collectable/paper
name = "collectable paper hat"
desc = "What looks like an ordinary paper hat, is actually a rare and valuable collector's edition paper hat. Keep away from water, fire and Librarians."
icon_state = "paper"
+ dog_fashion = /datum/dog_fashion/head
/obj/item/clothing/head/collectable/tophat
name = "collectable top hat"
desc = "A top hat worn by only the most prestigious hat collectors."
icon_state = "tophat"
item_state = "that"
+ dog_fashion = /datum/dog_fashion/head
/obj/item/clothing/head/collectable/captain
name = "collectable captain's hat"
desc = "A Collectable Hat that'll make you look just like a real comdom!"
icon_state = "captain"
item_state = "caphat"
+ dog_fashion = /datum/dog_fashion/head/captain
/obj/item/clothing/head/collectable/police
name = "collectable police officer's hat"
desc = "A Collectable Police Officer's Hat. This hat emphasizes that you are THE LAW."
icon_state = "policehelm"
+ dog_fashion = /datum/dog_fashion/head/warden
/obj/item/clothing/head/collectable/beret
name = "collectable beret"
desc = "A Collectable red Beret. It smells faintly of Garlic."
icon_state = "beret"
+ dog_fashion = /datum/dog_fashion/head/beret
/obj/item/clothing/head/collectable/welding
name = "collectable welding helmet"
@@ -84,35 +90,46 @@
desc = "You'd make a great Dread Syndie Roberts!"
icon_state = "pirate"
item_state = "pirate"
+ dog_fashion = /datum/dog_fashion/head/pirate
/obj/item/clothing/head/collectable/kitty
name = "collectable kitty ears"
desc = "The fur feels.....a bit too realistic."
icon_state = "kitty"
item_state = "kitty"
+ dog_fashion = /datum/dog_fashion/head/kitty
/obj/item/clothing/head/collectable/rabbitears
name = "collectable rabbit ears"
desc = "Not as lucky as the feet!"
icon_state = "bunny"
item_state = "bunny"
+ dog_fashion = /datum/dog_fashion/head/rabbit
/obj/item/clothing/head/collectable/wizard
name = "collectable wizard's hat"
desc = "NOTE:Any magical powers gained from wearing this hat are purely coincidental."
icon_state = "wizard"
+ dog_fashion = /datum/dog_fashion/head/blue_wizard
/obj/item/clothing/head/collectable/hardhat
name = "collectable hard hat"
desc = "WARNING! Offers no real protection, or luminosity, but it is damn fancy!"
icon_state = "hardhat0_yellow"
item_state = "hardhat0_yellow"
+ dog_fashion = /datum/dog_fashion/head
/obj/item/clothing/head/collectable/HoS
name = "collectable HoS hat"
desc = "Now you can beat prisoners, set silly sentences and arrest for no reason too!"
icon_state = "hoscap"
+/obj/item/clothing/head/collectable/HoP
+ name = "collectable HoP hat"
+ desc = "It's your turn to demand excessive paperwork, signatures, stamps, and hire more clowns! Papers, please!"
+ icon_state = "hopcap"
+ dog_fashion = /datum/dog_fashion/head/hop
+
/obj/item/clothing/head/collectable/thunderdome
name = "collectable Thunderdome helmet"
desc = "Go Red! I mean Green! I mean Red! No Green!"
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index 0e9d2bac8de..9109821937d 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -11,7 +11,7 @@
flags_inv = 0
actions_types = list(/datum/action/item_action/toggle_helmet_light)
burn_state = FIRE_PROOF
-
+ dog_fashion = /datum/dog_fashion/head/hardhat
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
@@ -55,11 +55,13 @@
icon_state = "hardhat0_orange"
item_state = "hardhat0_orange"
item_color = "orange"
+ dog_fashion = null
/obj/item/clothing/head/hardhat/red
icon_state = "hardhat0_red"
item_state = "hardhat0_red"
item_color = "red"
+ dog_fashion = null
name = "firefighter helmet"
flags = STOPSPRESSUREDMAGE
heat_protection = HEAD
@@ -76,12 +78,13 @@
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
-
+ dog_fashion = /datum/dog_fashion/head/hardhat
/obj/item/clothing/head/hardhat/dblue
icon_state = "hardhat0_dblue"
item_state = "hardhat0_dblue"
item_color = "dblue"
+ dog_fashion = null
/obj/item/clothing/head/hardhat/atmos
icon_state = "hardhat0_atmos"
@@ -95,7 +98,7 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
-
+ dog_fashion = null
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)
\ No newline at end of file
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 13826e53ea1..a2679fc3adc 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -13,7 +13,7 @@
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
strip_delay = 60
burn_state = FIRE_PROOF
-
+ dog_fashion = /datum/dog_fashion/head/helmet
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Drask" = 'icons/mob/species/drask/helmet.dmi',
@@ -76,6 +76,7 @@
icon_state = "swat"
item_state = "swat-alt"
armor = list(melee = 15, bullet = 40, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
+ dog_fashion = null
/obj/item/clothing/head/helmet/riot
name = "riot helmet"
@@ -86,6 +87,7 @@
flags_inv = HIDEEARS
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
strip_delay = 80
+ dog_fashion = null
/obj/item/clothing/head/helmet/riot/knight
name = "medieval helmet"
@@ -94,6 +96,7 @@
item_state = "knight_green"
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+ dog_fashion = null
/obj/item/clothing/head/helmet/justice
name = "helmet of justice"
@@ -105,6 +108,7 @@
can_toggle = 1
toggle_cooldown = 20
active_sound = 'sound/items/weeoo1.ogg'
+ dog_fashion = null
/obj/item/clothing/head/helmet/justice/escape
name = "alarm helmet"
@@ -127,6 +131,7 @@
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
strip_delay = 80
+ dog_fashion = null
/obj/item/clothing/head/helmet/swat/syndicate
name = "blood-red helmet"
@@ -146,6 +151,7 @@
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
strip_delay = 80
+ dog_fashion = null
/obj/item/clothing/head/helmet/roman
name = "roman helmet"
@@ -155,6 +161,7 @@
icon_state = "roman"
item_state = "roman"
strip_delay = 100
+ dog_fashion = null
/obj/item/clothing/head/helmet/roman/legionaire
name = "roman legionaire helmet"
@@ -175,6 +182,7 @@
can_toggle = 1
toggle_cooldown = 20
toggle_sound = 'sound/items/zippoclose.ogg'
+ dog_fashion = null
obj/item/clothing/head/helmet/redtaghelm
name = "red laser tag helmet"
@@ -185,6 +193,7 @@ obj/item/clothing/head/helmet/redtaghelm
armor = list(melee = 15, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0)
// Offer about the same protection as a hardhat.
flags_inv = HIDEEARS|HIDEEYES
+ dog_fashion = null
obj/item/clothing/head/helmet/bluetaghelm
name = "blue laser tag helmet"
@@ -195,6 +204,7 @@ obj/item/clothing/head/helmet/bluetaghelm
armor = list(melee = 15, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0)
// Offer about the same protection as a hardhat.
flags_inv = HIDEEARS|HIDEEYES
+ dog_fashion = null
obj/item/clothing/head/blob
name = "blob hat"
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 9c96cbae961..b6333241128 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -8,6 +8,7 @@
desc = "The commander in chef's head wear."
strip_delay = 10
put_on_delay = 10
+ dog_fashion = /datum/dog_fashion/head/chef
//Captain
/obj/item/clothing/head/caphat
@@ -17,12 +18,14 @@
item_state = "caphat"
armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
+ dog_fashion = /datum/dog_fashion/head/captain
//Captain: no longer space-worthy
/obj/item/clothing/head/caphat/parade
name = "captain's parade cap"
desc = "Worn only by Captains with an abundance of class."
icon_state = "capcap"
+ dog_fashion = null
//Head of Personnel
/obj/item/clothing/head/hopcap
@@ -30,6 +33,7 @@
icon_state = "hopcap"
desc = "The symbol of true bureaucratic micromanagement."
armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
+ dog_fashion = /datum/dog_fashion/head/hop
//Nanotrasen Representative
/obj/item/clothing/head/ntrep
@@ -75,12 +79,14 @@
icon_state = "detective"
allowed = list(/obj/item/reagent_containers/food/snacks/candy/candy_corn, /obj/item/pen)
armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ dog_fashion = /datum/dog_fashion/head/detective
//Mime
/obj/item/clothing/head/beret
name = "beret"
desc = "A beret, an artists favorite headwear."
icon_state = "beret"
+ dog_fashion = /datum/dog_fashion/head/beret
/obj/item/clothing/head/beret/durathread
name = "durathread beret"
@@ -108,6 +114,7 @@
icon_state = "policehelm"
armor = list(melee = 30, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
+ dog_fashion = /datum/dog_fashion/head/warden
/obj/item/clothing/head/officer
name = "officer's cap"
@@ -123,6 +130,7 @@
icon_state = "beret_officer"
armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
+ dog_fashion = null
/obj/item/clothing/head/beret/sec/warden
name = "warden's beret"
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index c3377296177..8ca480d1c72 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -40,6 +40,7 @@
desc = "It's an amish looking hat."
icon_state = "tophat"
item_state = "that"
+ dog_fashion = /datum/dog_fashion/head
/obj/item/clothing/head/redcoat
name = "redcoat's hat"
@@ -68,6 +69,7 @@
name = "nurse's hat"
desc = "It allows quick identification of trained medical personnel."
icon_state = "nursehat"
+ dog_fashion = /datum/dog_fashion/head/nurse
/obj/item/clothing/head/syndicatefake
name = "black and red space-helmet replica"
@@ -151,6 +153,7 @@
name = "rabbit ears"
desc = "Wearing these makes you look useless, and only good for your sex appeal."
icon_state = "bunny"
+ dog_fashion = /datum/dog_fashion/head/rabbit
/obj/item/clothing/head/flatcap
name = "flat cap"
@@ -163,6 +166,7 @@
desc = "Yarr."
icon_state = "pirate"
item_state = "pirate"
+ dog_fashion = /datum/dog_fashion/head/pirate
/obj/item/clothing/head/hgpiratecap
name = "pirate hat"
@@ -374,12 +378,14 @@
icon_state = "sombrero"
item_state = "sombrero"
desc = "You can practically taste the fiesta."
+ dog_fashion = /datum/dog_fashion/head/sombrero
/obj/item/clothing/head/sombrero/green
name = "green sombrero"
icon_state = "greensombrero"
item_state = "greensombrero"
desc = "As elegant as a dancing cactus."
+ dog_fashion = null
/obj/item/clothing/head/sombrero/shamebrero
name = "shamebrero"
@@ -387,6 +393,7 @@
item_state = "shamebrero"
desc = "Once it's on, it never comes off."
flags = NODROP
+ dog_fashion = null
/obj/item/clothing/head/cone
desc = "This cone is trying to warn you of something!"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 0501171d650..bd224890576 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -136,7 +136,7 @@
flags_inv = HIDEEARS
cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
-
+ dog_fashion = /datum/dog_fashion/head/ushanka
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
@@ -181,6 +181,7 @@
flags_inv = 0
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
brightness_on = 1 //luminosity when on
+ dog_fashion = /datum/dog_fashion/head/reindeer
/*
@@ -191,6 +192,7 @@
desc = "A pair of kitty ears. Meow!"
icon_state = "kitty"
var/icon/mob
+ dog_fashion = /datum/dog_fashion/head/kitty
/obj/item/clothing/head/kitty/update_icon(var/mob/living/carbon/human/user)
if(!istype(user)) return
@@ -234,7 +236,7 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
species_disguise = "High-tech robot"
-
+ dog_fashion = /datum/dog_fashion/head/cardborg
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index 81d36884ef2..49fcd17869d 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -6,7 +6,7 @@
item_color = "cargo"
var/flipped = 0
actions_types = list(/datum/action/item_action/flip_cap)
-
+ dog_fashion = /datum/dog_fashion/head/cargo_tech
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi'
)
@@ -38,30 +38,35 @@
desc = "It's a baseball hat in a tasteless red colour."
icon_state = "redsoft"
item_color = "red"
+ dog_fashion = null
/obj/item/clothing/head/soft/blue
name = "blue cap"
desc = "It's a baseball hat in a tasteless blue colour."
icon_state = "bluesoft"
item_color = "blue"
+ dog_fashion = null
/obj/item/clothing/head/soft/green
name = "green cap"
desc = "It's a baseball hat in a tasteless green colour."
icon_state = "greensoft"
item_color = "green"
+ dog_fashion = null
/obj/item/clothing/head/soft/yellow
name = "yellow cap"
desc = "It's a baseball hat in a tasteless yellow colour."
icon_state = "yellowsoft"
item_color = "yellow"
+ dog_fashion = null
/obj/item/clothing/head/soft/grey
name = "grey cap"
desc = "It's a baseball hat in a tasteful grey colour."
icon_state = "greysoft"
item_color = "grey"
+ dog_fashion = null
/obj/item/clothing/head/soft/orange
name = "orange cap"
@@ -74,24 +79,28 @@
desc = "It's a baseball hat in a tasteless white colour."
icon_state = "mimesoft"
item_color = "mime"
+ dog_fashion = null
/obj/item/clothing/head/soft/purple
name = "purple cap"
desc = "It's a baseball hat in a tasteless purple colour."
icon_state = "purplesoft"
item_color = "purple"
+ dog_fashion = null
/obj/item/clothing/head/soft/black
name = "black cap"
desc = "It's a baseball hat in a tasteless black colour."
icon_state = "blacksoft"
item_color = "black"
+ dog_fashion = null
/obj/item/clothing/head/soft/rainbow
name = "rainbow cap"
desc = "It's a baseball hat in a bright rainbow of colors."
icon_state = "rainbowsoft"
item_color = "rainbow"
+ dog_fashion = null
/obj/item/clothing/head/soft/sec
name = "security cap"
@@ -100,6 +109,7 @@
item_color = "sec"
armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
+ dog_fashion = null
/obj/item/clothing/head/soft/sec/corp
name = "corporate security cap"
@@ -112,9 +122,11 @@
desc = "A soft cap worn by marines of the Sol Federation."
icon_state = "solgovsoft"
item_color = "solgov"
+ dog_fashion = null
/obj/item/clothing/head/soft/solgov/command
name = "Sol Federation Lieutenant's cap"
desc = "A soft cap worn by marines of the Sol Federation. The insignia signifies the wearer bears the rank of a Lieutenant."
icon_state = "solgovcsoft"
item_color = "solgovc"
+ dog_fashion = null
\ No newline at end of file
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 8956a456166..b50c1cd68e0 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -108,6 +108,7 @@
item_state = "clown_hat"
flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR
burn_state = FLAMMABLE
+ dog_fashion = /datum/dog_fashion/head/clown
/obj/item/clothing/mask/gas/clown_hat/attack_self(mob/user)
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index a60e4b2c2a6..924179bdd4c 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -228,6 +228,7 @@
icon_state = "fake-moustache"
flags_inv = HIDEFACE
actions_types = list(/datum/action/item_action/pontificate)
+ dog_fashion = /datum/dog_fashion/head/not_ian
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
@@ -259,6 +260,7 @@
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.90
+
/obj/item/clothing/mask/redscarf
name = "red scarf"
desc = "A red and white checkered neck scarf."
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index c085aea93da..b56d2122ee8 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -186,6 +186,7 @@
item_state = "eng_hardsuit"
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine
+ dog_fashion = /datum/dog_fashion/back/hardsuit
//Atmospherics
/obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
@@ -207,6 +208,7 @@
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
+ dog_fashion = null
//Chief Engineer's hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/engine/elite
@@ -229,6 +231,7 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite
jetpack = /obj/item/tank/jetpack/suit
+ dog_fashion = null
//Mining hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/mining
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 1e5c9ad6dcb..7bce8a21293 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -62,6 +62,7 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
unacidable = 1
strip_delay = 130
+ dog_fashion = /datum/dog_fashion/back/deathsquad
//NEW SWAT suit
/obj/item/clothing/suit/space/swat
@@ -107,6 +108,7 @@
)
flags = BLOCKHAIR | STOPSPRESSUREDMAGE
flags_cover = HEADCOVERSEYES
+ dog_fashion = /datum/dog_fashion/head/santa
/obj/item/clothing/head/helmet/space/santahat/attack_self(mob/user as mob)
if(src.icon_state == "santahat")
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index e27b3b8ef1f..0d7267d9a92 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -21,6 +21,7 @@
blood_overlay_type = "armor"
flags_size = ONESIZEFITSALL
armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
+ dog_fashion = /datum/dog_fashion/back
/obj/item/clothing/suit/armor/vest/jacket
name = "military jacket"
@@ -148,6 +149,7 @@
heat_protection = UPPER_TORSO|LOWER_TORSO|HANDS
strip_delay = 70
burn_state = FLAMMABLE
+ dog_fashion = null
/obj/item/clothing/suit/armor/vest/warden/alt
name = "warden's jacket"
@@ -161,6 +163,7 @@
item_state = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
armor = list(melee = 50, bullet = 40, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ dog_fashion = null
/obj/item/clothing/suit/armor/vest/capcarapace/alt
name = "captain's parade jacket"
@@ -252,6 +255,7 @@
flags_size = ONESIZEFITSALL
allowed = list(/obj/item/tank/emergency_oxygen,/obj/item/reagent_containers/spray/pepper,/obj/item/flashlight,/obj/item/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/storage/fancy/cigarettes,/obj/item/lighter,/obj/item/detective_scanner,/obj/item/taperecorder)
burn_state = FLAMMABLE
+ dog_fashion = null
//Reactive armor
/obj/item/clothing/suit/armor/reactive
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 56204c5d3c2..8907e874270 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -174,6 +174,7 @@
item_state = "chickensuit"
body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS|FEET
flags_inv = HIDESHOES|HIDEJUMPSUIT
+ dog_fashion = /datum/dog_fashion/back
/obj/item/clothing/suit/corgisuit/super_hero
name = "super-hero corgi suit"
@@ -229,6 +230,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO
flags_inv = HIDEJUMPSUIT
species_disguise = "High-tech robot"
+ dog_fashion = /datum/dog_fashion/back
/obj/item/clothing/suit/cardborg/equipped(mob/living/user, slot)
..()
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index b3f55aed84a..4329f3e04f4 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -11,16 +11,19 @@
strip_delay = 50
put_on_delay = 50
magical = TRUE
+ dog_fashion = /datum/dog_fashion/head/blue_wizard
/obj/item/clothing/head/wizard/red
name = "red wizard hat"
desc = "Strange-looking, red, hat-wear that most certainly belongs to a real magic user."
icon_state = "redwizard"
+ dog_fashion = /datum/dog_fashion/head/red_wizard
/obj/item/clothing/head/wizard/black
name = "black wizard hat"
desc = "Strange-looking black hat-wear that most certainly belongs to a real skeleton. Spooky."
icon_state = "blackwizard"
+ dog_fashion = null
/obj/item/clothing/head/wizard/clown
@@ -28,6 +31,7 @@
desc = "Strange-looking purple hat-wear that most certainly belongs to a real magic user."
icon_state = "wizhatclown"
item_state = "wizhatclown" // cheating
+ dog_fashion = null
/obj/item/clothing/head/wizard/fake
name = "wizard hat"
@@ -37,22 +41,26 @@
permeability_coefficient = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
magical = FALSE
+ dog_fashion = /datum/dog_fashion/head/blue_wizard
/obj/item/clothing/head/wizard/marisa
name = "Witch Hat"
desc = "Strange-looking hat-wear, makes you want to cast fireballs."
icon_state = "marisa"
+ dog_fashion = null
/obj/item/clothing/head/wizard/magus
name = "Magus Helm"
desc = "A mysterious helmet that hums with an unearthly power"
icon_state = "magus"
item_state = "magus"
+ dog_fashion = null
/obj/item/clothing/head/wizard/amp
name = "psychic amplifier"
desc = "A crown-of-thorns psychic amplifier. Kind of looks like a tiara having sex with an industrial robot."
icon_state = "amp"
+ dog_fashion = null
/obj/item/clothing/suit/wizrobe
name = "wizard robe"
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 96e174ed2dd..9b1a0dbc146 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -320,6 +320,7 @@
/obj/item/clothing/accessory/scarf // No overlay
name = "scarf"
desc = "A stylish scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks."
+ dog_fashion = /datum/dog_fashion/head
/obj/item/clothing/accessory/scarf/red
name = "red scarf"
@@ -678,7 +679,7 @@
/obj/item/clothing/accessory/petcollar/process()
var/mob/living/simple_animal/M = loc
// if it wasn't intentionally unequipped but isn't being worn, possibly gibbed
- if(istype(M) && src == M.collar && M.stat != DEAD)
+ if(istype(M) && src == M.pcollar && M.stat != DEAD)
return
var/area/t = get_area(M)
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index c1acd1e3d38..894d9a30ff2 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -238,17 +238,20 @@
force = 2
/obj/item/fluff/dogwhistle/attack_self(mob/user)
- user.visible_message("[user] blows on the whistle, but no sound comes out.", "You blow on the whistle, but don't hear anything.")
- spawn(20)
- var/mob/living/simple_animal/pet/corgi/C = new /mob/living/simple_animal/pet/corgi(get_turf(user))
- var/obj/item/clothing/head/det_hat/D = new /obj/item/clothing/head/det_hat(C)
- D.flags |= NODROP
- C.inventory_head = D
- C.regenerate_icons()
- C.name = "Detective Sax"
- C.visible_message("[C] suddenly winks into existence at [user]'s feet!")
- to_chat(user, "[src] crumbles to dust in your hands!")
- qdel(src)
+ user.visible_message("[user] blows on the whistle, but no sound comes out.", "You blow on the whistle, but don't hear anything.")
+ addtimer(CALLBACK(src, .proc/summon_sax, user), 20)
+
+/obj/item/fluff/dogwhistle/proc/summon_sax(mob/user)
+ var/mob/living/simple_animal/pet/dog/corgi/C = new /mob/living/simple_animal/pet/dog/corgi(get_turf(user))
+ C.name = "Detective Sax"
+ C.real_name = "Detective Sax"
+ var/obj/item/clothing/head/det_hat/D = new
+ D.flags |= NODROP
+ C.place_on_head(D)
+ C.visible_message("[C] suddenly winks into existence at [user]'s feet!")
+ to_chat(user, "[src] crumbles to dust in your hands!")
+ user.drop_item()
+ qdel(src)
/obj/item/storage/toolbox/fluff/lunchbox //godoforeos: Jason Conrad
name = "lunchpail"
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 3839c977a86..672285b84d3 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -153,33 +153,29 @@
/obj/item/reagent_containers/food/snacks/attack_animal(mob/M)
if(isanimal(M))
M.changeNext_move(CLICK_CD_MELEE)
- if(iscorgi(M))
- var/mob/living/simple_animal/pet/corgi/G = M
- if(world.time < (G.last_eaten + 300))
- to_chat(G, "You are too full to try eating [src] right now.")
+ if(isdog(M))
+ var/mob/living/simple_animal/pet/dog/D = M
+ if(world.time < (D.last_eaten + 300))
+ to_chat(D, "You are too full to try eating [src] right now.")
else if(bitecount >= 4)
- M.visible_message("[M] [pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where [src] was")].","You swallow up the last part of [src].")
+ D.visible_message("[D] [pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where [src] was")].","You swallow up the last part of [src].")
playsound(loc,'sound/items/eatfood.ogg', rand(10,50), 1)
- var/mob/living/simple_animal/pet/corgi/C = M
- C.adjustBruteLoss(-5)
- C.adjustFireLoss(-5)
+ D.adjustHealth(-10)
+ D.last_eaten = world.time
+ D.taste(reagents)
qdel(src)
- G.last_eaten = world.time
- G.taste(reagents)
else
- M.visible_message("[M] takes a bite of [src].","You take a bite of [src].")
+ D.visible_message("[D] takes a bite of [src].","You take a bite of [src].")
playsound(loc,'sound/items/eatfood.ogg', rand(10,50), 1)
bitecount++
- G.last_eaten = world.time
- G.taste(reagents)
+ D.last_eaten = world.time
+ D.taste(reagents)
else if(ismouse(M))
var/mob/living/simple_animal/mouse/N = M
to_chat(N, text("You nibble away at [src]."))
if(prob(50))
N.visible_message("[N] nibbles away at [src].", "")
- //N.emote("nibbles away at the [src]")
- N.adjustBruteLoss(-1)
- N.adjustFireLoss(-1)
+ N.adjustHealth(-2)
N.taste(reagents)
/obj/item/reagent_containers/food/snacks/sliceable/examine(mob/user)
diff --git a/code/modules/holiday/christmas.dm b/code/modules/holiday/christmas.dm
index 047c8ce069e..a6a88ff2a19 100644
--- a/code/modules/holiday/christmas.dm
+++ b/code/modules/holiday/christmas.dm
@@ -4,8 +4,8 @@
for(var/turf/simulated/floor/T in orange(1,xmas))
for(var/i=1,i<=rand(1,5),i++)
new /obj/item/a_gift(T)
- for(var/mob/living/simple_animal/pet/corgi/Ian/Ian in GLOB.mob_list)
- Ian.place_on_head(new /obj/item/clothing/head/helmet/space/santahat(Ian))
+ for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in GLOB.mob_list)
+ Ian.place_on_head(new /obj/item/clothing/head/helmet/space/santahat)
for(var/datum/crafting_recipe/snowman/S in GLOB.crafting_recipes)
S.always_availible = TRUE
break
diff --git a/code/modules/martial_arts/adminfu.dm b/code/modules/martial_arts/adminfu.dm
index ae48795f2f9..12436061e20 100644
--- a/code/modules/martial_arts/adminfu.dm
+++ b/code/modules/martial_arts/adminfu.dm
@@ -58,12 +58,6 @@
var/mob/living/simple_animal/P = new O.type(O.loc)
P.real_name = O.real_name
P.name = O.name
- if(iscorgi(O))
- var/mob/living/simple_animal/pet/corgi/C = O
- if(C.inventory_head)
- C.inventory_head.loc = C.loc
- if(C.inventory_back)
- C.inventory_back.loc = C.loc
if(O.mind)
O.mind.transfer_to(P)
else
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 78bc0004b15..e5bea0357eb 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -152,14 +152,6 @@ var/const/MAX_ACTIVE_TIME = 400
target.equip_to_slot(src, slot_wear_mask,,0)
if(!sterile)
M.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
- else if(iscorgi(M))
- var/mob/living/simple_animal/pet/corgi/C = M
- if(C.facehugger)
- var/obj/item/F = C.facehugger
- F.forceMove(C.loc)
- forceMove(C)
- C.facehugger = src
- C.regenerate_icons()
GoIdle() //so it doesn't jump the people that tear it off
@@ -192,11 +184,6 @@ var/const/MAX_ACTIVE_TIME = 400
if(!target.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo))
new /obj/item/organ/internal/body_egg/alien_embryo(target)
-
- if(iscorgi(target))
- var/mob/living/simple_animal/pet/corgi/C = target
- src.loc = get_turf(C)
- C.facehugger = null
else
target.visible_message("[src] violates [target]'s face!", \
"[src] violates [target]'s face!")
diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm
index 20f6155ba0f..3fafd7267f2 100644
--- a/code/modules/mob/living/simple_animal/animal_defense.dm
+++ b/code/modules/mob/living/simple_animal/animal_defense.dm
@@ -1,15 +1,6 @@
/mob/living/simple_animal/attackby(obj/item/O, mob/living/user)
- if(can_collar && !collar && istype(O, /obj/item/clothing/accessory/petcollar))
- var/obj/item/clothing/accessory/petcollar/C = O
- if(user.drop_item())
- C.forceMove(src)
- collar = C
- collar.equipped(src)
- regenerate_icons()
- to_chat(usr, "You put \the [C] around \the [src]'s neck.")
- if(C.tagname)
- name = C.tagname
- real_name = C.tagname
+ if(can_collar && istype(O, /obj/item/clothing/accessory/petcollar) && !pcollar)
+ add_collar(O, user)
return
else
return ..()
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 928cd9789da..2458532b157 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -23,7 +23,7 @@
response_disarm = "gently pushes aside"
response_harm = "kicks"
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
-
+ collar_type = "cat"
var/turns_since_scan = 0
var/mob/living/simple_animal/mouse/movement_target
var/eats_mice = 1
@@ -38,6 +38,7 @@
icon_resting = "cat_rest"
gender = FEMALE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
+ unique_pet = TRUE
var/list/family = list()
var/memory_saved = 0
var/list/children = list() //Actual mob instances of children
@@ -107,6 +108,7 @@
else if(prob(1))
custom_emote(1, pick("sits down.", "crouches on its hind legs.", "looks alert."))
icon_state = "[icon_living]_sit"
+ collar_type = "[initial(collar_type)]_sit"
resting = TRUE
update_canmove()
else if(prob(1))
@@ -188,6 +190,7 @@
/mob/living/simple_animal/pet/cat/Proc
name = "Proc"
+ unique_pet = TRUE
/mob/living/simple_animal/pet/cat/kitten
name = "kitten"
@@ -199,6 +202,7 @@
gender = NEUTER
density = 0
pass_flags = PASSMOB
+ collar_type = "kitten"
/mob/living/simple_animal/pet/cat/Syndi
name = "SyndiCat"
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
deleted file mode 100644
index c6a572e9679..00000000000
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ /dev/null
@@ -1,669 +0,0 @@
-//Corgi
-/mob/living/simple_animal/pet/corgi
- name = "\improper corgi"
- real_name = "corgi"
- desc = "It's a corgi."
- icon_state = "corgi"
- icon_living = "corgi"
- icon_dead = "corgi_dead"
- gender = NEUTER
- health = 30
- maxHealth = 30
- speak = list("YAP", "Woof!", "Bark!", "AUUUUUU")
- speak_emote = list("barks", "woofs")
- emote_hear = list("barks", "woofs", "yaps","pants")
- emote_see = list("shakes its head", "shivers")
- var/bark_sound = list('sound/creatures/dog_bark1.ogg','sound/creatures/dog_bark2.ogg') //Used in emote.
- var/yelp_sound = 'sound/creatures/dog_yelp.ogg' //Used on death.
- speak_chance = 1
- turns_per_move = 10
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/corgi = 3)
- response_help = "pets"
- response_disarm = "bops"
- response_harm = "kicks"
- see_in_dark = 5
- childtype = list(/mob/living/simple_animal/pet/corgi)
- animal_species = /mob/living/simple_animal/pet/corgi
- gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
- var/shaved = 0
- var/obj/item/inventory_head
- var/obj/item/inventory_back
- var/facehugger
- var/default_atmos_requirements = 0
- var/last_eaten = 0
-
-/mob/living/simple_animal/pet/corgi/New()
- ..()
- default_atmos_requirements = src.atmos_requirements
- regenerate_icons()
- if(gender == NEUTER)
- gender = pick(MALE, FEMALE)
-
-/mob/living/simple_animal/pet/corgi/Life(seconds, times_fired)
- . = ..()
- regenerate_icons()
-
-/mob/living/simple_animal/pet/corgi/show_inv(mob/user as mob)
- user.set_machine(src)
- if(user.stat) return
-
- var/dat = {"
- Close
- "}
-
- var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 440, 500)
- popup.set_content(dat)
- popup.open()
-
-/mob/living/simple_animal/pet/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
- if(inventory_head && inventory_back)
- //helmet and armor = 100% protection
- if( istype(inventory_head,/obj/item/clothing/head/helmet) && istype(inventory_back,/obj/item/clothing/suit/armor) )
- if( O.force )
- to_chat(user, "[src] is wearing too much armor! You can't cause [p_them()] any damage.")
- visible_message(" [user] hits [src] with [O], however [src] is too armored.")
- else
- to_chat(user, "[src] is wearing too much armor! You can't reach [p_their()] skin.")
- visible_message("[user] gently taps [src] with [O].")
- if(health>0 && prob(15))
- custom_emote(1, "looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression.")
- return
-
- if(istype(O, /obj/item/razor))
- if(shaved)
- to_chat(user, "You can't shave this corgi, it's already been shaved!")
- return
- user.visible_message("[user] starts to shave [src] using \the [O].", "You start to shave [src] using \the [O]...")
- if(do_after(user, 50 * O.toolspeed, target = src))
- user.visible_message("[user] shaves [src]'s hair using \the [O].")
- playsound(loc, O.usesound, 20, 1)
- shaved = 1
- icon_living = "[initial(icon_living)]_shaved"
- icon_dead = "[initial(icon_living)]_shaved_dead"
- if(stat == CONSCIOUS)
- icon_state = icon_living
- else
- icon_state = icon_dead
- return
- ..()
-
-/mob/living/simple_animal/pet/corgi/Topic(href, href_list)
- if(usr.stat) return
- if((!ishuman(usr) && !isrobot(usr)) || !Adjacent(usr))
- 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
- name = real_name
- desc = initial(desc)
- speak = list("YAP", "Woof!", "Bark!", "AUUUUUU")
- speak_emote = list("barks", "woofs")
- emote_hear = list("barks", "woofs", "yaps","pants")
- emote_see = list("shakes its head", "shivers")
- desc = "It's a corgi."
- set_light(0)
- mutations.Remove(BREATHLESS)
- atmos_requirements = default_atmos_requirements
- minbodytemp = initial(minbodytemp)
- inventory_head.loc = src.loc
- inventory_head = null
- regenerate_icons()
- else
- to_chat(usr, "There is nothing to remove from its [remove_from].")
- return
- if("back")
- if(inventory_back)
- if(inventory_back.flags & NODROP)
- to_chat(usr, "\The [inventory_back] is stuck too hard to [src] for you to remove!")
- return
- inventory_back.loc = src.loc
- inventory_back = null
- regenerate_icons()
- else
- to_chat(usr, "There is nothing to remove from its [remove_from].")
- return
- show_inv(usr)
- //Adding things to inventory
- 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("back")
- if(inventory_back)
- 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 back for a moment.")
- 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 corgis can wear on their backs.
- var/list/allowed_types = list(
- /obj/item/clothing/suit/armor/vest,
- /obj/item/clothing/suit/armor/vest/blueshield,
- /obj/item/clothing/suit/space/deathsquad,
- /obj/item/clothing/suit/space/hardsuit/engine,
- /obj/item/radio,
- /obj/item/radio/off,
- /obj/item/clothing/suit/cardborg,
- /obj/item/tank/oxygen,
- /obj/item/tank/air,
- /obj/item/extinguisher,
- )
-
- if( ! ( item_to_add.type in allowed_types ) )
- to_chat(usr, "You set [item_to_add] on [src]'s back, but [p_they()] shake[p_s()] it off!")
- if(!usr.drop_item())
- to_chat(usr, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s back!")
- return
- item_to_add.loc = loc
- if(prob(25))
- step_rand(item_to_add)
- for(var/i in list(1,2,4,8,4,8,4,dir))
- dir = i
- sleep(1)
- return
-
- usr.drop_item()
- item_to_add.loc = src
- src.inventory_back = item_to_add
- regenerate_icons()
- show_inv(usr)
-//Removing facehuggers
- else if(href_list["remove_hugger"])
- if(!facehugger)
- return
- var/obj/item/F = facehugger
- F.forceMove(loc)
- facehugger = null
- to_chat(usr, "You remove [F] from [src]'s face. [src] pants for air and barks.")
- regenerate_icons()
- show_inv(usr)
- else
- ..()
-
-//Corgis are supposed to be simpler, so only a select few objects can actually be put
-//to be compatible with them. The objects are below.
-//Many hats added, Some will probably be removed, just want to see which ones are popular.
-/mob/living/simple_animal/pet/corgi/proc/place_on_head(obj/item/item_to_add, var/mob/user as mob)
-
- 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.")
- return
-
-
- var/valid = 0
-
- //Various hats and items (worn on his head) change Ian's behaviour. His attributes are reset when a hat is removed.
- if(istype(item_to_add, /obj/item/clothing/accessory/scarf))
- valid = 1
- else
- switch(item_to_add.type)
- if( /obj/item/clothing/glasses/sunglasses, /obj/item/clothing/head/that, /obj/item/clothing/head/collectable/paper,
- /obj/item/clothing/head/hardhat, /obj/item/clothing/head/collectable/hardhat, /obj/item/clothing/head/hardhat/white,
- /obj/item/paper)
- valid = 1
-
- if(/obj/item/clothing/head/helmet)
- name = "Sergeant [real_name]"
- desc = "The ever-loyal, the ever-vigilant."
- valid = 1
-
- if(/obj/item/clothing/head/chefhat, /obj/item/clothing/head/collectable/chef)
- name = "Sous chef [real_name]"
- desc = "Your food will be taste-tested. All of it."
- valid = 1
-
- if(/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain)
- name = "Captain [real_name]"
- desc = "Probably better than the last captain."
- valid = 1
-
- if(/obj/item/clothing/head/kitty, /obj/item/clothing/head/collectable/kitty)
- name = "Runtime"
- emote_see = list("coughs up a furball", "stretches")
- emote_hear = list("purrs")
- speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS", "MEEEEEEW")
- desc = "It's a cute little kitty-cat! ... wait ... what the hell?"
- valid = 1
-
- if(/obj/item/clothing/head/rabbitears, /obj/item/clothing/head/collectable/rabbitears)
- name = "Hoppy"
- emote_see = list("twitches its nose", "hops around a bit")
- desc = "This is Hoppy. It's a corgi-...urmm... bunny rabbit"
- valid = 1
-
- if(/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret)
- name = "Yann"
- desc = "Mon dieu! C'est un chien!"
- speak = list("le woof!", "le bark!", "JAPPE!!")
- emote_see = list("cowers in fear.", "surrenders.", "plays dead.","looks as though there is a wall in front of him.")
- valid = 1
-
- if(/obj/item/clothing/head/det_hat)
- name = "Detective [real_name]"
- desc = "[name] sees through your lies..."
- emote_see = list("investigates the area.","sniffs around for clues.","searches for scooby snacks.")
- valid = 1
-
- if(/obj/item/clothing/head/nursehat)
- name = "Nurse [real_name]"
- desc = "[name] needs 100cc of beef jerky... STAT!"
- valid = 1
-
- if(/obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate)
- name = "[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]"
- desc = "Yaarghh!! Thar' be a scurvy dog!"
- emote_see = list("hunts for treasure.","stares coldly...","gnashes his tiny corgi teeth!")
- emote_hear = list("growls ferociously!", "snarls.")
- speak = list("Arrrrgh!!","Grrrrrr!")
- valid = 1
-
- if(/obj/item/clothing/head/ushanka)
- name = "[pick("Comrade","Commissar","Glorious Leader")] [real_name]"
- desc = "A follower of Karl Barx."
- emote_see = list("contemplates the failings of the capitalist economic model.", "ponders the pros and cons of vanguardism.")
- valid = 1
-
- if(/obj/item/clothing/head/warden, /obj/item/clothing/head/collectable/police)
- name = "Officer [real_name]"
- emote_see = list("drools.","looks for donuts.")
- desc = "Stop right there criminal scum!"
- valid = 1
-
- if(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard)
- name = "Grandwizard [real_name]"
- speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "EI NATH!")
- valid = 1
-
- if(/obj/item/clothing/head/cardborg)
- name = "Borgi"
- speak = list("Ping!","Beep!","Woof!")
- emote_see = list("goes rogue.", "sniffs out non-humans.")
- desc = "Result of robotics budget cuts."
- valid = 1
-
- if(/obj/item/bedsheet)
- name = "\improper Ghost"
- speak = list("WoooOOOooo~","AUUUUUUUUUUUUUUUUUU")
- emote_see = list("stumbles around.", "shivers.")
- emote_hear = list("howls!","groans.")
- desc = "Spooky!"
- valid = 1
-
- if(/obj/item/clothing/head/helmet/space/santahat)
- name = "Santa's Corgi Helper"
- emote_hear = list("barks Christmas songs.", "yaps merrily!")
- emote_see = list("looks for presents.", "checks his list.")
- desc = "He's very fond of milk and cookies."
- valid = 1
-
- if(/obj/item/clothing/head/soft)
- name = "Corgi Tech [real_name]"
- desc = "The reason your yellow gloves have chew-marks."
- valid = 1
-
- if(/obj/item/clothing/head/hardhat/reindeer)
- name = "[real_name] the red-nosed Corgi"
- emote_hear = list("lights the way!", "illuminates.", "yaps!")
- desc = "He has a very shiny nose."
- set_light(1)
- valid = 1
-
- if(/obj/item/clothing/head/sombrero)
- name = "Segnor [real_name]"
- desc = "You must respect elder [real_name]"
- valid = 1
-
- if(/obj/item/clothing/head/hopcap)
- name = "Lieutenant [real_name]"
- desc = "Can actually be trusted to not run off on his own."
- valid = 1
-
- if(/obj/item/clothing/head/helmet/space/deathsquad)
- name = "Trooper [real_name]"
- desc = "That's not red paint. That's real corgi blood."
- valid = 1
-
- if(/obj/item/clothing/suit/space/hardsuit/engine)
- name = "Space Explorer [real_name]"
- desc = "That's one small step for a corgi. One giant yap for corgikind."
- valid = 1
- mutations.Add(BREATHLESS)
- 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
-
- if(/obj/item/clothing/mask/fakemoustache)
- name = "Definitely Not [real_name]"
- desc = "That's Definitely Not [real_name]"
- valid = 1
-
- if(/obj/item/clothing/head/beret/centcom/officer, /obj/item/clothing/head/beret/centcom/officer/navy)
- name = "Blueshield [real_name]"
- desc = "Will stand by you until the bitter end."
- emote_see = list("stands with pride.", "growls heroically.")
- valid = 1
-
- if(valid)
- if(user && !user.drop_item())
- to_chat(user, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!")
- return 0
- 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.loc = src
- src.inventory_head = item_to_add
- regenerate_icons()
-
- else
- if(user && !user.drop_item())
- to_chat(user, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!")
- return 0
- to_chat(user, "You set [item_to_add] on [src]'s head, but [p_they()] shake[p_s()] it off!")
- item_to_add.loc = loc
- if(prob(25))
- step_rand(item_to_add)
- for(var/i in list(1,2,4,8,4,8,4,dir))
- dir = i
- sleep(1)
-
- return valid
-
-/mob/living/simple_animal/pet/corgi/death(gibbed)
- playsound(src, yelp_sound, 75, 1)
- ..()
-
-/mob/living/simple_animal/pet/corgi/emote(act, m_type = 1, message = null, force)
- if(stat != CONSCIOUS)
- return
-
- var/on_CD = 0
- act = lowertext(act)
- switch(act)
- if("bark")
- on_CD = handle_emote_CD()
- if("growl")
- on_CD = handle_emote_CD()
- else
- on_CD = 0
-
- if(!force && on_CD == 1)
- return
-
- switch(act)
- if("bark")
- message = "[src] [pick(src.speak_emote)]!"
- m_type = 2 //audible
- playsound(src, pick(src.bark_sound), 50, 0.85)
- if("growl")
- message = "[src] growls!"
- m_type = 2 //audible
- if("help")
- to_chat(src, "scream, bark, growl")
-
- ..()
-
-
-//IAN! SQUEEEEEEEEE~
-/mob/living/simple_animal/pet/corgi/Ian
- name = "Ian"
- real_name = "Ian" //Intended to hold the name without altering it.
- gender = MALE
- desc = "It's a corgi."
- var/turns_since_scan = 0
- var/obj/movement_target
- response_help = "pets"
- response_disarm = "bops"
- response_harm = "kicks"
- gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
-
-/mob/living/simple_animal/pet/corgi/Ian/handle_automated_movement()
- . = ..()
- //Feeding, chasing food, FOOOOODDDD
- if(!resting && !buckled)
- turns_since_scan++
- if(turns_since_scan > 5)
- turns_since_scan = 0
- if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) ))
- movement_target = null
- stop_automated_movement = 0
- if( !movement_target || !(movement_target.loc in oview(src, 3)) )
- movement_target = null
- stop_automated_movement = 0
- for(var/obj/item/reagent_containers/food/snacks/S in oview(src,3))
- if(isturf(S.loc) || ishuman(S.loc))
- movement_target = S
- break
- if(movement_target)
- spawn(0)
- stop_automated_movement = 1
- step_to(src,movement_target,1)
- sleep(3)
- step_to(src,movement_target,1)
- sleep(3)
- step_to(src,movement_target,1)
-
- if(movement_target) //Not redundant due to sleeps, Item can be gone in 6 decisecomds
- if(movement_target.loc.x < src.x)
- dir = WEST
- else if(movement_target.loc.x > src.x)
- dir = EAST
- else if(movement_target.loc.y < src.y)
- dir = SOUTH
- else if(movement_target.loc.y > src.y)
- dir = NORTH
- else
- dir = SOUTH
-
- if(!Adjacent(movement_target)) //can't reach food through windows.
- return
-
- if(isturf(movement_target.loc) )
- movement_target.attack_animal(src)
- else if(ishuman(movement_target.loc) )
- if(prob(20))
- custom_emote(1, "stares at [movement_target.loc]'s [movement_target] with a sad puppy-face")
-
- if(prob(1))
- custom_emote(1, pick("dances around.","chases its tail!"))
- spin(20, 1)
-
-/obj/item/reagent_containers/food/snacks/meat/corgi
- name = "Corgi meat"
- desc = "Tastes like... well you know..."
-
-/mob/living/simple_animal/pet/corgi/regenerate_icons()
- overlays.Cut()
- if(inventory_head)
- var/image/head_icon
- if(health <= 0)
- head_icon = image('icons/mob/corgi_head.dmi', icon_state = inventory_head.icon_state, dir = EAST)
- head_icon.pixel_y = -8
- head_icon.transform = turn(head_icon.transform, 180)
- else
- head_icon = image('icons/mob/corgi_head.dmi', icon_state = inventory_head.icon_state)
- overlays += head_icon
- if(inventory_back)
- var/image/back_icon
- if(health <= 0)
- back_icon = image('icons/mob/corgi_back.dmi', icon_state = inventory_back.icon_state, dir = EAST)
- back_icon.pixel_y = -11
- back_icon.transform = turn(back_icon.transform, 180)
- else
- back_icon = image('icons/mob/corgi_back.dmi', icon_state = inventory_back.icon_state)
- overlays += back_icon
- if(facehugger)
- if(istype(src, /mob/living/simple_animal/pet/corgi/puppy))
- overlays += image('icons/mob/mask.dmi',"facehugger_corgipuppy")
- else
- overlays += image('icons/mob/mask.dmi',"facehugger_corgi")
- ..(0)
-
-/mob/living/simple_animal/pet/corgi/puppy
- name = "\improper corgi puppy"
- real_name = "corgi"
- desc = "It's a corgi puppy."
- icon_state = "puppy"
- icon_living = "puppy"
- icon_dead = "puppy_dead"
- shaved = 0
- density = 0
- pass_flags = PASSMOB
- mob_size = MOB_SIZE_SMALL
-
-//puppies cannot wear anything.
-/mob/living/simple_animal/pet/corgi/puppy/Topic(href, href_list)
- if(href_list["remove_inv"] || href_list["add_inv"])
- to_chat(usr, "You can't fit this on [src]!")
- return
- ..()
-
-
-
-//LISA! SQUEEEEEEEEE~
-/mob/living/simple_animal/pet/corgi/Lisa
- name = "Lisa"
- real_name = "Lisa"
- gender = FEMALE
- desc = "It's a corgi with a cute pink bow."
- icon_state = "lisa"
- icon_living = "lisa"
- icon_dead = "lisa_dead"
- response_help = "pets"
- response_disarm = "bops"
- response_harm = "kicks"
- var/turns_since_scan = 0
- var/puppies = 0
- gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
-
-//Lisa already has a cute bow!
-/mob/living/simple_animal/pet/corgi/Lisa/Topic(href, href_list)
- if(href_list["remove_inv"] || href_list["add_inv"])
- to_chat(usr, "[src] already has a cute bow!")
- return
- ..()
-
-/mob/living/simple_animal/pet/corgi/Lisa/Life()
- ..()
- make_babies()
-
-/mob/living/simple_animal/pet/corgi/Lisa/handle_automated_movement()
- . = ..()
- if(!resting && !buckled)
- if(prob(1))
- custom_emote(1, pick("dances around.","chases her tail."))
- spin(20, 1)
-
-/mob/living/simple_animal/pet/corgi/attack_hand(mob/living/carbon/human/M)
- . = ..()
- switch(M.a_intent)
- if(INTENT_HELP) wuv(1,M)
- if(INTENT_HARM) wuv(-1,M)
-
-/mob/living/simple_animal/pet/corgi/proc/wuv(change, mob/M)
- if(change)
- if(change > 0)
- if(M && stat != DEAD) // Added check to see if this mob (the corgi) is dead to fix issue 2454
- new /obj/effect/temp_visual/heart(loc)
- custom_emote(1, "yaps happily!")
- else
- if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case)
- custom_emote(1, "growls!")
-
-/mob/living/simple_animal/pet/corgi/Ian/borgi
- name = "E-N"
- real_name = "E-N" //Intended to hold the name without altering it.
- desc = "It's a borgi."
- icon_state = "borgi"
- icon_living = "borgi"
- bark_sound = null //No robo-bjork...
- yelp_sound = null //Or robo-Yelp.
- var/emagged = 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
- loot = list(/obj/effect/decal/cleanable/blood/gibs/robot)
- del_on_death = 1
- deathmessage = "blows apart!"
-
-/mob/living/simple_animal/pet/corgi/Ian/borgi/emag_act(user as mob)
- if(!emagged)
- emagged = 1
- visible_message("[user] swipes a card through [src].", "You overload [src]s internal reactor.")
- spawn (1000)
- src.explode()
-
-/mob/living/simple_animal/pet/corgi/Ian/borgi/proc/explode()
- for(var/mob/M in viewers(src, null))
- if(M.client)
- M.show_message("[src] makes an odd whining noise.")
- sleep(10)
- explosion(get_turf(src), 0, 1, 4, 7)
- death()
-
-/mob/living/simple_animal/pet/corgi/Ian/borgi/proc/shootAt(var/atom/movable/target)
- var/turf/T = get_turf(src)
- var/turf/U = get_turf(target)
- if(!T || !U)
- return
- var/obj/item/projectile/beam/A = new /obj/item/projectile/beam(loc)
- A.icon = 'icons/effects/genetics.dmi'
- A.icon_state = "eyelasers"
- playsound(src.loc, 'sound/weapons/taser2.ogg', 75, 1)
- A.current = T
- A.yo = U.y - T.y
- A.xo = U.x - T.x
- A.fire()
- return
-
-/mob/living/simple_animal/pet/corgi/Ian/borgi/Life(seconds, times_fired)
- ..()
- //spark for no reason
- if(prob(5))
- do_sparks(3, 1, src)
-
-/mob/living/simple_animal/pet/corgi/Ian/borgi/handle_automated_action()
- if(emagged && prob(25))
- var/mob/living/carbon/target = locate() in view(10, src)
- if(target)
- shootAt(target)
-
-/mob/living/simple_animal/pet/corgi/Ian/borgi/death(gibbed)
- // Only execute the below if we successfully died
- . = ..(gibbed)
- if(!.)
- return FALSE
- do_sparks(3, 1, src)
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm b/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm
deleted file mode 100644
index 5f6f34b8b1c..00000000000
--- a/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm
+++ /dev/null
@@ -1,6 +0,0 @@
-/mob/living/simple_animal/pet/corgi/verb/chasetail()
- set name = "Chase your tail"
- set desc = "d'awwww."
- set category = "Corgi"
- visible_message("[src] [pick("dances around","chases [p_their()] tail")].","[pick("You dance around","You chase your tail")].")
- spin(20, 1)
diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm
index 1456e2f70fb..dad78016f58 100644
--- a/code/modules/mob/living/simple_animal/friendly/crab.dm
+++ b/code/modules/mob/living/simple_animal/friendly/crab.dm
@@ -40,6 +40,7 @@
response_disarm = "gently pushes aside"
response_harm = "stomps"
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
+ unique_pet = TRUE
//LOOK AT THIS - ..()??
/*/mob/living/simple_animal/crab/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
new file mode 100644
index 00000000000..caa8eece169
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -0,0 +1,767 @@
+//Dogs.
+
+/mob/living/simple_animal/pet/dog
+ name = "dog"
+ icon_state = "blackdog"
+ icon_living = "blackdog"
+ icon_dead = "blackdog_dead"
+ response_help = "pets"
+ response_disarm = "bops"
+ response_harm = "kicks"
+ 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.")
+ faction = list("neutral")
+ see_in_dark = 5
+ speak_chance = 1
+ turns_per_move = 10
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
+ var/bark_sound = list('sound/creatures/dog_bark1.ogg','sound/creatures/dog_bark2.ogg') //Used in emote.
+ var/yelp_sound = 'sound/creatures/dog_yelp.ogg' //Used on death.
+ var/last_eaten = 0
+
+/mob/living/simple_animal/pet/dog/verb/chasetail()
+ set name = "Chase your tail"
+ set desc = "d'awwww."
+ set category = "Dog"
+
+ 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/pet/dog/death(gibbed)
+ // Only execute the below if we successfully died
+ . = ..(gibbed)
+ if(!.)
+ return
+ playsound(src, yelp_sound, 75, TRUE)
+
+/mob/living/simple_animal/pet/dog/emote(act, m_type = 1, message = null, force)
+ if(!incapacitated())
+ return
+
+ var/on_CD = 0
+ act = lowertext(act)
+ switch(act)
+ if("bark")
+ on_CD = handle_emote_CD()
+ if("yelp")
+ on_CD = handle_emote_CD()
+ else
+ on_CD = 0
+
+ if(!force && on_CD == 1)
+ return
+
+ switch(act)
+ if("bark")
+ message = "[src] [pick(src.speak_emote)]!"
+ m_type = 2 //audible
+ playsound(src, pick(src.bark_sound), 50, TRUE)
+ if("yelp")
+ message = "[src] yelps!"
+ m_type = 2 //audible
+ playsound(src, yelp_sound, 75, TRUE)
+ if("growl")
+ message = "[src] growls!"
+ m_type = 2 //audible
+ if("help")
+ to_chat(src, "scream, bark, growl")
+
+ ..()
+
+/mob/living/simple_animal/pet/dog/attack_hand(mob/living/carbon/human/M)
+ . = ..()
+ switch(M.a_intent)
+ if(INTENT_HELP)
+ wuv(1, M)
+ if(INTENT_HARM)
+ wuv(-1, M)
+
+/mob/living/simple_animal/pet/dog/proc/wuv(change, mob/M)
+ if(change)
+ if(change > 0)
+ if(M && stat != DEAD) // Added check to see if this mob (the corgi) is dead to fix issue 2454
+ new /obj/effect/temp_visual/heart(loc)
+ custom_emote(1, "yaps happily!")
+ else
+ if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case)
+ custom_emote(1, "growls!")
+
+//Corgis and pugs are now under one dog subtype
+
+/mob/living/simple_animal/pet/dog/corgi
+ name = "\improper corgi"
+ real_name = "corgi"
+ desc = "It's a corgi."
+ icon_state = "corgi"
+ icon_living = "corgi"
+ icon_dead = "corgi_dead"
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/corgi = 3, /obj/item/stack/sheet/animalhide/corgi = 1)
+ childtype = list(/mob/living/simple_animal/pet/dog/corgi/puppy = 95, /mob/living/simple_animal/pet/dog/corgi/puppy/void = 5)
+ animal_species = /mob/living/simple_animal/pet/dog
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
+ collar_type = "corgi"
+ var/obj/item/inventory_head
+ var/obj/item/inventory_back
+ var/shaved = FALSE
+ var/nofur = FALSE //Corgis that have risen past the material plane of existence.
+
+/mob/living/simple_animal/pet/dog/corgi/Initialize(mapload)
+ . = ..()
+ regenerate_icons()
+
+/mob/living/simple_animal/pet/dog/corgi/Destroy()
+ QDEL_NULL(inventory_head)
+ QDEL_NULL(inventory_back)
+ return ..()
+
+/mob/living/simple_animal/pet/dog/corgi/handle_atom_del(atom/A)
+ if(A == inventory_head)
+ inventory_head = null
+ regenerate_icons()
+ if(A == inventory_back)
+ inventory_back = null
+ regenerate_icons()
+ return ..()
+
+/mob/living/simple_animal/pet/dog/corgi/Life(seconds, times_fired)
+ . = ..()
+ regenerate_icons()
+
+/mob/living/simple_animal/pet/dog/corgi/death(gibbed)
+ ..(gibbed)
+ regenerate_icons()
+
+/mob/living/simple_animal/pet/dog/corgi/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 += "
Back: [inventory_back]" : "add_inv=back'>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/corgi/getarmor(def_zone, type)
+ var/armorval = 0
+
+ if(def_zone)
+ if(def_zone == "head")
+ if(inventory_head)
+ armorval = inventory_head.armor[type]
+ else
+ if(inventory_back)
+ armorval = inventory_back.armor[type]
+ return armorval
+ else
+ if(inventory_head)
+ armorval += inventory_head.armor[type]
+ if(inventory_back)
+ armorval += inventory_back.armor[type]
+ return armorval * 0.5
+
+/mob/living/simple_animal/pet/dog/corgi/attackby(obj/item/O, mob/user, params)
+ if(istype(O, /obj/item/razor))
+ if(shaved)
+ to_chat(user, "You can't shave this corgi, it's already been shaved!")
+ return
+ if(nofur)
+ to_chat(user, "You can't shave this corgi, it doesn't have a fur coat!")
+ return
+ user.visible_message("[user] starts to shave [src] using \the [O].", "You start to shave [src] using \the [O]...")
+ if(do_after(user, 50, target = src))
+ user.visible_message("[user] shaves [src]'s hair using \the [O].")
+ playsound(loc, O.usesound, 20, TRUE)
+ shaved = TRUE
+ icon_living = "[initial(icon_living)]_shaved"
+ icon_dead = "[initial(icon_living)]_shaved_dead"
+ if(stat == CONSCIOUS)
+ icon_state = icon_living
+ else
+ icon_state = icon_dead
+ return
+ ..()
+ update_corgi_fluff()
+
+/mob/living/simple_animal/pet/dog/corgi/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
+ usr.put_in_hands(inventory_head)
+ inventory_head = null
+ update_corgi_fluff()
+ regenerate_icons()
+ else
+ to_chat(usr, "There is nothing to remove from its [remove_from].")
+ return
+ if("back")
+ if(inventory_back)
+ if(inventory_back.flags & NODROP)
+ to_chat(usr, "\The [inventory_head] is stuck too hard to [src] for you to remove!")
+ return
+ usr.put_in_hands(inventory_back)
+ inventory_back = null
+ update_corgi_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
+ unEquip(pcollar)
+ usr.put_in_hands(the_collar)
+ pcollar = null
+ update_corgi_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_corgi_fluff()
+
+ if("head")
+ place_on_head(usr.get_active_hand(),usr)
+
+ if("back")
+ if(inventory_back)
+ 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 back for a moment.")
+ return
+
+ if(!usr.unEquip(item_to_add))
+ to_chat(usr, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s back!")
+ 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 corgis can wear on their backs.
+ var/allowed = FALSE
+ if(ispath(item_to_add.dog_fashion, /datum/dog_fashion/back))
+ allowed = TRUE
+
+ if(!allowed)
+ to_chat(usr, "You set [item_to_add] on [src]'s back, 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_back = item_to_add
+ update_corgi_fluff()
+ regenerate_icons()
+
+ show_inv(usr)
+ else
+ return ..()
+
+//Corgis are supposed to be simpler, so only a select few objects can actually be put
+//to be compatible with them. The objects are below.
+//Many hats added, Some will probably be removed, just want to see which ones are popular.
+// > some will probably be removed
+
+/mob/living/simple_animal/pet/dog/corgi/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.dog_fashion, /datum/dog_fashion/head))
+ valid = TRUE
+
+ //Various hats and items (worn on his head) change Ian'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_corgi_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/corgi/proc/update_corgi_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)
+ 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 && inventory_head.dog_fashion)
+ var/datum/dog_fashion/DF = new inventory_head.dog_fashion(src)
+ DF.apply(src)
+
+ if(inventory_back && inventory_back.dog_fashion)
+ var/datum/dog_fashion/DF = new inventory_back.dog_fashion(src)
+ DF.apply(src)
+
+/mob/living/simple_animal/pet/dog/corgi/regenerate_icons()
+ ..()
+ if(inventory_head)
+ var/image/head_icon
+ var/datum/dog_fashion/DF = new inventory_head.dog_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(health <= 0)
+ head_icon = DF.get_overlay(dir = EAST)
+ head_icon.pixel_y = -8
+ head_icon.transform = turn(head_icon.transform, 180)
+ else
+ head_icon = DF.get_overlay()
+
+ add_overlay(head_icon)
+
+ if(inventory_back)
+ var/image/back_icon
+ var/datum/dog_fashion/DF = new inventory_back.dog_fashion(src)
+
+ if(!DF.obj_icon_state)
+ DF.obj_icon_state = inventory_back.icon_state
+ if(!DF.obj_alpha)
+ DF.obj_alpha = inventory_back.alpha
+ if(!DF.obj_color)
+ DF.obj_color = inventory_back.color
+
+ if(health <= 0)
+ back_icon = DF.get_overlay(dir = EAST)
+ back_icon.pixel_y = -11
+ back_icon.transform = turn(back_icon.transform, 180)
+ else
+ back_icon = DF.get_overlay()
+ add_overlay(back_icon)
+
+//IAN! SQUEEEEEEEEE~
+/mob/living/simple_animal/pet/dog/corgi/Ian
+ name = "Ian"
+ real_name = "Ian" //Intended to hold the name without altering it.
+ gender = MALE
+ desc = "It's the HoP's beloved corgi."
+ var/turns_since_scan = 0
+ var/obj/movement_target
+ response_help = "pets"
+ response_disarm = "bops"
+ response_harm = "kicks"
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
+ unique_pet = TRUE
+ var/age = 0
+ var/record_age = 1
+ var/memory_saved = FALSE
+ var/saved_head //path
+
+/mob/living/simple_animal/pet/dog/corgi/Ian/Initialize(mapload)
+ . = ..()
+ //parent call must happen first to ensure IAN
+ //is not in nullspace when child puppies spawn
+ Read_Memory()
+ if(age == 0)
+ var/turf/target = get_turf(loc)
+ if(target)
+ var/mob/living/simple_animal/pet/dog/corgi/puppy/P = new /mob/living/simple_animal/pet/dog/corgi/puppy(target)
+ P.name = "Ian"
+ P.real_name = "Ian"
+ P.gender = MALE
+ P.desc = "It's the HoP's beloved corgi puppy."
+ Write_Memory(FALSE)
+ qdel(src)
+ return
+ else if(age == record_age)
+ icon_state = "old_corgi"
+ icon_living = "old_corgi"
+ icon_dead = "old_corgi_dead"
+ desc = "At a ripe old age of [record_age], Ian's not as spry as he used to be, but he'll always be the HoP's beloved corgi." //RIP
+ turns_per_move = 20
+
+/mob/living/simple_animal/pet/dog/corgi/Ian/Life()
+ if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
+ Write_Memory(FALSE)
+ memory_saved = TRUE
+ ..()
+
+/mob/living/simple_animal/pet/dog/corgi/Ian/death()
+ if(!memory_saved)
+ Write_Memory(TRUE)
+ ..()
+
+/mob/living/simple_animal/pet/dog/corgi/Ian/proc/Read_Memory()
+ if(fexists("data/npc_saves/Ian.sav")) //legacy compatability to convert old format to new
+ var/savefile/S = new /savefile("data/npc_saves/Ian.sav")
+ S["age"] >> age
+ S["record_age"] >> record_age
+ S["saved_head"] >> saved_head
+ fdel("data/npc_saves/Ian.sav")
+ else
+ var/json_file = file("data/npc_saves/Ian.json")
+ if(!fexists(json_file))
+ return
+ var/list/json = json_decode(file2text(json_file))
+ age = json["age"]
+ record_age = json["record_age"]
+ saved_head = json["saved_head"]
+ if(isnull(age))
+ age = 0
+ if(isnull(record_age))
+ record_age = 1
+ if(saved_head)
+ place_on_head(new saved_head)
+
+/mob/living/simple_animal/pet/dog/corgi/Ian/proc/Write_Memory(dead)
+ var/json_file = file("data/npc_saves/Ian.json")
+ var/list/file_data = list()
+ if(!dead)
+ file_data["age"] = age + 1
+ if((age + 1) > record_age)
+ file_data["record_age"] = record_age + 1
+ else
+ file_data["record_age"] = record_age
+ if(inventory_head)
+ file_data["saved_head"] = inventory_head.type
+ else
+ file_data["saved_head"] = null
+ else
+ file_data["age"] = 0
+ file_data["record_age"] = record_age
+ file_data["saved_head"] = null
+ fdel(json_file)
+ WRITE_FILE(json_file, json_encode(file_data))
+
+/mob/living/simple_animal/pet/dog/corgi/Ian/handle_automated_movement()
+ . = ..()
+ //Feeding, chasing food, FOOOOODDDD
+ if(!resting && !buckled)
+ turns_since_scan++
+ if(turns_since_scan > 5)
+ turns_since_scan = 0
+ if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) ))
+ movement_target = null
+ stop_automated_movement = 0
+ if( !movement_target || !(movement_target.loc in oview(src, 3)) )
+ movement_target = null
+ stop_automated_movement = 0
+ for(var/obj/item/reagent_containers/food/snacks/S in oview(src,3))
+ if(isturf(S.loc) || ishuman(S.loc))
+ movement_target = S
+ break
+ if(movement_target)
+ spawn(0)
+ stop_automated_movement = 1
+ step_to(src,movement_target,1)
+ sleep(3)
+ step_to(src,movement_target,1)
+ sleep(3)
+ step_to(src,movement_target,1)
+
+ if(movement_target) //Not redundant due to sleeps, Item can be gone in 6 decisecomds
+ if(movement_target.loc.x < src.x)
+ dir = WEST
+ else if(movement_target.loc.x > src.x)
+ dir = EAST
+ else if(movement_target.loc.y < src.y)
+ dir = SOUTH
+ else if(movement_target.loc.y > src.y)
+ dir = NORTH
+ else
+ dir = SOUTH
+
+ if(!Adjacent(movement_target)) //can't reach food through windows.
+ return
+
+ if(isturf(movement_target.loc) )
+ movement_target.attack_animal(src)
+ else if(ishuman(movement_target.loc) )
+ if(prob(20))
+ custom_emote(1, "stares at [movement_target.loc]'s [movement_target] with a sad puppy-face")
+
+ if(prob(1))
+ custom_emote(1, pick("dances around.","chases its tail!"))
+ spin(20, 1)
+
+/obj/item/reagent_containers/food/snacks/meat/corgi
+ name = "Corgi meat"
+ desc = "Tastes like... well you know..."
+
+/mob/living/simple_animal/pet/dog/corgi/Ian/narsie_act()
+ playsound(src, 'sound/misc/demon_dies.ogg', 75, TRUE)
+ var/mob/living/simple_animal/pet/dog/corgi/narsie/N = new(loc)
+ N.setDir(dir)
+ gib()
+
+/mob/living/simple_animal/pet/dog/corgi/narsie
+ name = "Nars-Ian"
+ desc = "Ia! Ia!"
+ icon_state = "narsian"
+ icon_living = "narsian"
+ icon_dead = "narsian_dead"
+ faction = list("neutral", "cult")
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
+ nofur = TRUE
+ unique_pet = TRUE
+
+/mob/living/simple_animal/pet/dog/corgi/narsie/Life()
+ ..()
+ for(var/mob/living/simple_animal/pet/P in range(1, src))
+ if(P != src && !istype(P, /mob/living/simple_animal/pet/dog/corgi/narsie))
+ visible_message("[src] devours [P]!", \
+ "DELICIOUS SOULS")
+ playsound(src, 'sound/misc/demon_attack1.ogg', 75, TRUE)
+ narsie_act()
+ if(P.mind)
+ if(P.mind.hasSoul)
+ P.mind.hasSoul = FALSE //Nars-Ian ate your soul; you don't have one anymore
+ else
+ visible_message("... Aw, someone beat me to this one.")
+ P.gib()
+
+/mob/living/simple_animal/pet/dog/corgi/narsie/update_corgi_fluff()
+ ..()
+ speak = list("Tari'karat-pasnar!", "IA! IA!", "BRRUUURGHGHRHR")
+ speak_emote = list("growls", "barks ominously")
+ emote_hear = list("barks echoingly!", "woofs hauntingly!", "yaps in an eldritch manner.", "mutters something unspeakable.")
+ emote_see = list("communes with the unnameable.", "ponders devouring some souls.", "shakes.")
+
+/mob/living/simple_animal/pet/dog/corgi/narsie/narsie_act()
+ adjustBruteLoss(-maxHealth)
+
+/mob/living/simple_animal/pet/dog/corgi/puppy
+ name = "\improper corgi puppy"
+ real_name = "corgi"
+ desc = "It's a corgi puppy!"
+ icon_state = "puppy"
+ icon_living = "puppy"
+ icon_dead = "puppy_dead"
+ density = FALSE
+ pass_flags = PASSMOB
+ mob_size = MOB_SIZE_SMALL
+ collar_type = "puppy"
+
+//puppies cannot wear anything.
+/mob/living/simple_animal/pet/dog/corgi/puppy/Topic(href, href_list)
+ if(href_list["remove_inv"] || href_list["add_inv"])
+ to_chat(usr, "You can't fit this on [src]!")
+ return
+ ..()
+
+/mob/living/simple_animal/pet/dog/corgi/puppy/void //Tribute to the corgis born in nullspace
+ name = "\improper void puppy"
+ real_name = "voidy"
+ desc = "A corgi puppy that has been infused with deep space energy. It's staring back..."
+ icon_state = "void_puppy"
+ icon_living = "void_puppy"
+ icon_dead = "void_puppy_dead"
+ nofur = TRUE
+ unsuitable_atmos_damage = 0
+ minbodytemp = TCMB
+ maxbodytemp = T0C + 40
+
+/mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0)
+ return 1 //Void puppies can navigate space.
+
+//LISA! SQUEEEEEEEEE~
+/mob/living/simple_animal/pet/dog/corgi/Lisa
+ name = "Lisa"
+ real_name = "Lisa"
+ gender = FEMALE
+ desc = "It's a corgi with a cute pink bow."
+ gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
+ unique_pet = TRUE
+ icon_state = "lisa"
+ icon_living = "lisa"
+ icon_dead = "lisa_dead"
+ response_help = "pets"
+ response_disarm = "bops"
+ response_harm = "kicks"
+ var/turns_since_scan = 0
+ var/puppies = 0
+
+//Lisa already has a cute bow!
+/mob/living/simple_animal/pet/dog/corgi/Lisa/Topic(href, href_list)
+ if(href_list["remove_inv"] || href_list["add_inv"])
+ to_chat(usr, "[src] already has a cute bow!")
+ return
+ ..()
+
+/mob/living/simple_animal/pet/dog/corgi/Lisa/Life()
+ ..()
+ make_babies()
+
+/mob/living/simple_animal/pet/dog/corgi/Lisa/handle_automated_movement()
+ . = ..()
+ if(!resting && !buckled)
+ if(prob(1))
+ custom_emote(1, pick("dances around.","chases her tail."))
+ spin(20, 1)
+
+/mob/living/simple_animal/pet/dog/corgi/exoticcorgi
+ name = "Exotic Corgi"
+ desc = "As cute as it is colorful!"
+ icon = 'icons/mob/pets.dmi'
+ icon_state = "corgigrey"
+ icon_living = "corgigrey"
+ icon_dead = "corgigrey_dead"
+ animal_species = /mob/living/simple_animal/pet/dog/corgi/exoticcorgi
+ nofur = TRUE
+
+/mob/living/simple_animal/pet/dog/corgi/exoticcorgi/Initialize(mapload)
+ . = ..()
+ var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255))
+ add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
+
+/mob/living/simple_animal/pet/dog/corgi/borgi
+ name = "E-N"
+ real_name = "E-N" //Intended to hold the name without altering it.
+ desc = "It's a borgi."
+ icon_state = "borgi"
+ icon_living = "borgi"
+ bark_sound = null //No robo-bjork...
+ yelp_sound = null //Or robo-Yelp.
+ var/emagged = 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
+ loot = list(/obj/effect/decal/cleanable/blood/gibs/robot)
+ del_on_death = 1
+ deathmessage = "blows apart!"
+ animal_species = /mob/living/simple_animal/pet/dog/corgi/borgi
+ nofur = TRUE
+
+/mob/living/simple_animal/pet/dog/corgi/borgi/emag_act(user as mob)
+ if(!emagged)
+ emagged = 1
+ visible_message("[user] swipes a card through [src].", "You overload [src]s internal reactor.")
+ addtimer(CALLBACK(src, .proc/explode), 1000)
+
+/mob/living/simple_animal/pet/dog/corgi/borgi/proc/explode()
+ visible_message("[src] makes an odd whining noise.")
+ explosion(get_turf(src), 0, 1, 4, 7)
+ death()
+
+/mob/living/simple_animal/pet/dog/corgi/borgi/proc/shootAt(var/atom/movable/target)
+ var/turf/T = get_turf(src)
+ var/turf/U = get_turf(target)
+ if(!T || !U)
+ return
+ var/obj/item/projectile/beam/A = new /obj/item/projectile/beam(loc)
+ A.icon = 'icons/effects/genetics.dmi'
+ A.icon_state = "eyelasers"
+ playsound(src.loc, 'sound/weapons/taser2.ogg', 75, 1)
+ A.current = T
+ A.yo = U.y - T.y
+ A.xo = U.x - T.x
+ A.fire()
+
+/mob/living/simple_animal/pet/dog/corgi/borgi/Life(seconds, times_fired)
+ ..()
+ //spark for no reason
+ if(prob(5))
+ do_sparks(3, 1, src)
+
+/mob/living/simple_animal/pet/dog/corgi/borgi/handle_automated_action()
+ if(emagged && prob(25))
+ var/mob/living/carbon/target = locate() in view(10, src)
+ if(target)
+ shootAt(target)
+
+/mob/living/simple_animal/pet/dog/corgi/borgi/death(gibbed)
+ // Only execute the below if we successfully died
+ . = ..(gibbed)
+ if(!.)
+ return FALSE
+ do_sparks(3, 1, src)
+
+///Pugs
+
+/mob/living/simple_animal/pet/dog/pug
+ name = "\improper pug"
+ real_name = "pug"
+ desc = "It's a pug."
+ icon = 'icons/mob/pets.dmi'
+ icon_state = "pug"
+ icon_living = "pug"
+ icon_dead = "pug_dead"
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/pug = 3)
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
+ collar_type = "pug"
+
+/mob/living/simple_animal/pet/pug/handle_automated_movement()
+ . = ..()
+ if(!resting && !buckled)
+ if(prob(1))
+ custom_emote(1, pick("chases its tail."))
+ spawn(0)
+ for(var/i in list(1, 2, 4, 8, 4, 2, 1, 2, 4, 8, 4, 2, 1, 2, 4, 8, 4, 2))
+ dir = i
+ sleep(1)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm
index f295ec5b271..7f1e4dcbccc 100644
--- a/code/modules/mob/living/simple_animal/friendly/fox.dm
+++ b/code/modules/mob/living/simple_animal/friendly/fox.dm
@@ -1,5 +1,5 @@
//Foxxy
-/mob/living/simple_animal/pet/fox
+/mob/living/simple_animal/pet/dog/fox
name = "fox"
desc = "It's a fox. I wonder what it says?"
icon_state = "fox"
@@ -20,13 +20,14 @@
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
//Captain fox
-/mob/living/simple_animal/pet/fox/Renault
+/mob/living/simple_animal/pet/dog/fox/Renault
name = "Renault"
desc = "Renault, the Captain's trustworthy fox. I wonder what it says?"
+ unique_pet = TRUE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
//Syndi fox
-/mob/living/simple_animal/pet/fox/Syndifox
+/mob/living/simple_animal/pet/dog/fox/Syndifox
name = "Syndifox"
desc = "Syndifox, the Syndicate's most respected mascot. I wonder what it says?"
icon_state = "Syndifox"
@@ -35,6 +36,7 @@
icon_resting = "Syndifox_rest"
mutations = list(BREATHLESS)
faction = list("syndicate")
+ unique_pet = TRUE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
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
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index ec9cb5cd884..6bfb2c044dc 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -168,6 +168,7 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "splats"
+ unique_pet = TRUE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm
index 6920da2690f..8a9899b7fa9 100644
--- a/code/modules/mob/living/simple_animal/friendly/pet.dm
+++ b/code/modules/mob/living/simple_animal/friendly/pet.dm
@@ -1,31 +1,16 @@
/mob/living/simple_animal/pet
icon = 'icons/mob/pets.dmi'
- can_collar = 1
mob_size = MOB_SIZE_SMALL
blood_volume = BLOOD_VOLUME_NORMAL
+ can_collar = TRUE
-/mob/living/simple_animal/pet/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
+/mob/living/simple_animal/pet/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/newspaper))
if(!stat)
- user.visible_message("[user] baps [name] on the nose with the rolled up [O].")
+ user.visible_message("[user] baps [name] on the nose with the rolled up [O].")
spawn(0)
for(var/i in list(1,2,4,8,4,2,1,2))
- dir = i
+ setDir(i)
sleep(1)
else
- ..()
-
-/mob/living/simple_animal/pet/revive()
- ..()
- regenerate_icons()
-
-/mob/living/simple_animal/pet/death(gibbed)
- . = ..()
- regenerate_icons()
-
-/mob/living/simple_animal/pet/regenerate_icons(cut_overlays = 1)
- if(cut_overlays)
- overlays.Cut()
- if(collar)
- overlays += "[icon_state]collar"
- overlays += "[icon_state]tag"
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/pug.dm b/code/modules/mob/living/simple_animal/friendly/pug.dm
deleted file mode 100644
index c7b52928e8a..00000000000
--- a/code/modules/mob/living/simple_animal/friendly/pug.dm
+++ /dev/null
@@ -1,30 +0,0 @@
-//Corgi //best comment 2014
-/mob/living/simple_animal/pet/pug
- name = "\improper pug"
- real_name = "pug"
- desc = "It's a pug."
- icon_state = "pug"
- icon_living = "pug"
- icon_dead = "pug_dead"
- 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.")
- speak_chance = 1
- turns_per_move = 10
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/pug = 3)
- response_help = "pets"
- response_disarm = "bops"
- response_harm = "kicks"
- see_in_dark = 5
- gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
-
-/mob/living/simple_animal/pet/pug/handle_automated_movement()
- . = ..()
- if(!resting && !buckled)
- if(prob(1))
- custom_emote(1, pick("chases its tail."))
- spawn(0)
- for(var/i in list(1, 2, 4, 8, 4, 2, 1, 2, 4, 8, 4, 2, 1, 2, 4, 8, 4, 2))
- dir = i
- sleep(1)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/sloth.dm b/code/modules/mob/living/simple_animal/friendly/sloth.dm
index 6660265302f..92ef76b71e0 100644
--- a/code/modules/mob/living/simple_animal/friendly/sloth.dm
+++ b/code/modules/mob/living/simple_animal/friendly/sloth.dm
@@ -28,4 +28,5 @@
/mob/living/simple_animal/pet/sloth/paperwork
name = "Paperwork"
desc = "Cargo's pet sloth. About as useful as the rest of the techs."
+ unique_pet = TRUE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm
index 687e0b7c73a..e92bc114936 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm
@@ -16,5 +16,5 @@
harm_intent_damage = 3
melee_damage_lower = 15
melee_damage_upper = 20
-
+ unique_pet = TRUE
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 2, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index c8e43a936d2..7e41711554b 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -135,7 +135,7 @@
dat += "| Headset: | [(ears && !(ears.flags&ABSTRACT)) ? ears : "Empty"] |
"
if(can_collar)
dat += "| |
"
- dat += "| Collar: | [(collar && !(collar.flags&ABSTRACT)) ? collar : "Empty"] |
"
+ dat += "| Collar: | [(pcollar && !(pcollar.flags&ABSTRACT)) ? pcollar : "Empty"] |
"
dat += {"
Close
@@ -697,6 +697,7 @@
"What were the wires again?",
"Goddam emaggers!"
)
+ unique_pet = TRUE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
/mob/living/simple_animal/parrot/Poly/New()
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index b556fa24bec..299be975def 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -61,8 +61,10 @@
var/speed = 1 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster
var/can_hide = 0
- var/obj/item/clothing/accessory/petcollar/collar = null
- var/can_collar = 0 // can add collar to mob or not
+ var/obj/item/clothing/accessory/petcollar/pcollar = null
+ var/collar_type //if the mob has collar sprites, define them.
+ var/unique_pet = FALSE // if the mob can be renamed
+ var/can_collar = FALSE // can add collar to mob or not
//Hot simple_animal baby making vars
var/list/childtype = null
@@ -109,15 +111,12 @@
verbs -= /mob/verb/observe
if(!can_hide)
verbs -= /mob/living/simple_animal/verb/hide
- if(collar)
- if(!istype(collar))
- collar = new(src)
+ if(pcollar)
+ pcollar = new(src)
regenerate_icons()
/mob/living/simple_animal/Destroy()
- if(collar)
- collar.forceMove(loc)
- collar = null
+ QDEL_NULL(pcollar)
master_commander = null
GLOB.simple_animals[AIStatus] -= src
if(SSnpcpool.state == SS_PAUSED && LAZYLEN(SSnpcpool.currentrun))
@@ -133,6 +132,11 @@
return ..()
+/mob/living/simple_animal/handle_atom_del(atom/A)
+ if(A == pcollar)
+ pcollar = null
+ return ..()
+
/mob/living/simple_animal/examine(mob/user)
. = ..()
if(stat == DEAD)
@@ -147,11 +151,17 @@
..()
if(icon_resting && stat != DEAD)
icon_state = icon_resting
+ if(collar_type)
+ collar_type = "[initial(collar_type)]_rest"
+ regenerate_icons()
/mob/living/simple_animal/StopResting(updating = 1)
..()
if(icon_resting && stat != DEAD)
icon_state = icon_living
+ if(collar_type)
+ collar_type = "[initial(collar_type)]"
+ regenerate_icons()
/mob/living/simple_animal/update_stat(reason = "none given")
if(status_flags & GODMODE)
@@ -278,6 +288,9 @@
for(var/path in butcher_results)
for(var/i in 1 to butcher_results[path])
new path(Tsec)
+ if(pcollar)
+ pcollar.forceMove(drop_location())
+ pcollar = null
..()
/mob/living/simple_animal/emote(act, m_type = 1, message = null, force)
@@ -348,6 +361,9 @@
if(flip_on_death)
transform = transform.Turn(180)
density = 0
+ if(collar_type)
+ collar_type = "[initial(collar_type)]_dead"
+ regenerate_icons()
/mob/living/simple_animal/proc/CanAttack(atom/the_target)
if(see_invisible < the_target.invisibility)
@@ -387,6 +403,9 @@
density = initial(density)
update_canmove()
flying = initial(flying)
+ if(collar_type)
+ collar_type = "[initial(collar_type)]"
+ regenerate_icons()
/mob/living/simple_animal/proc/make_babies() // <3 <3 <3
if(gender != FEMALE || stat || next_scan_time > world.time || !childtype || !animal_species || !SSticker.IsRoundInProgress())
@@ -421,7 +440,7 @@
return
user.set_machine(src)
- var/dat = ""
+ var/dat = ""
dat += "Close"
var/datum/browser/popup = new(user, "mob\ref[src]", "[src]", 440, 250)
@@ -431,14 +450,14 @@
/mob/living/simple_animal/get_item_by_slot(slot_id)
switch(slot_id)
if(slot_collar)
- return collar
+ return pcollar
. = ..()
/mob/living/simple_animal/can_equip(obj/item/I, slot, disable_warning = 0)
// . = ..() // Do not call parent. We do not want animals using their hand slots.
switch(slot)
if(slot_collar)
- if(collar)
+ if(pcollar)
return FALSE
if(!can_collar)
return FALSE
@@ -453,32 +472,26 @@
if(!slot)
return FALSE
- W.forceMove(src)
- W.equipped(src, slot)
W.layer = ABOVE_HUD_LAYER
W.plane = ABOVE_HUD_PLANE
switch(slot)
if(slot_collar)
- collar = W
- if(collar.tagname)
- name = collar.tagname
- real_name = collar.tagname
- regenerate_icons()
+ add_collar(W)
/mob/living/simple_animal/unEquip(obj/item/I, force)
. = ..()
if(!. || !I)
return
- if(I == collar)
- collar = null
+ if(I == pcollar)
+ pcollar = null
regenerate_icons()
/mob/living/simple_animal/get_access()
. = ..()
- if(collar)
- . |= collar.GetAccess()
+ if(pcollar)
+ . |= pcollar.GetAccess()
/mob/living/simple_animal/update_canmove(delay_action_updates = 0)
if(paralysis || stunned || weakened || stat || resting)
@@ -572,4 +585,25 @@
..()
if(AIStatus == AI_Z_OFF)
SSidlenpcpool.idle_mobs_by_zlevel[old_z] -= src
- toggle_ai(initial(AIStatus))
\ No newline at end of file
+ toggle_ai(initial(AIStatus))
+
+/mob/living/simple_animal/proc/add_collar(obj/item/clothing/accessory/petcollar/P, mob/user)
+ if(QDELETED(P) || pcollar)
+ return
+ if(user && !user.unEquip(P))
+ return
+ P.forceMove(src)
+ P.equipped(src)
+ pcollar = P
+ regenerate_icons()
+ if(user)
+ to_chat(user, "You put [P] around [src]'s neck.")
+ if(P.tagname && !unique_pet)
+ name = P.tagname
+ real_name = P.tagname
+
+/mob/living/simple_animal/regenerate_icons()
+ cut_overlays()
+ if(pcollar && collar_type)
+ add_overlay("[collar_type]collar")
+ add_overlay("[collar_type]tag")
\ No newline at end of file
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 00e5c1550d9..ba54db9b415 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -184,8 +184,7 @@
for(var/t in bodyparts) //this really should not be necessary
qdel(t)
- var/mob/living/simple_animal/pet/corgi/new_corgi = new /mob/living/simple_animal/pet/corgi (loc)
- new_corgi.a_intent = INTENT_HARM
+ var/mob/living/simple_animal/pet/dog/corgi/new_corgi = new /mob/living/simple_animal/pet/dog/corgi (loc)
new_corgi.key = key
to_chat(new_corgi, "You are now a Corgi. Yap Yap!")
@@ -277,7 +276,7 @@
return 0
if(ispath(MP, /mob/living/simple_animal/pet/cat))
return 1
- if(ispath(MP, /mob/living/simple_animal/pet/corgi))
+ if(ispath(MP, /mob/living/simple_animal/pet/dog/corgi))
return 1
if(ispath(MP, /mob/living/simple_animal/crab))
return 1
@@ -288,9 +287,9 @@
if(ispath(MP, /mob/living/simple_animal/parrot))
return 1
if(!GAMEMODE_IS_NUCLEAR)
- if(ispath(MP, /mob/living/simple_animal/pet/fox/Syndifox))
+ if(ispath(MP, /mob/living/simple_animal/pet/dog/fox/Syndifox))
return 0
- if(ispath(MP, /mob/living/simple_animal/pet/fox))
+ if(ispath(MP, /mob/living/simple_animal/pet/dog/fox))
return 1
if(ispath(MP, /mob/living/simple_animal/chick))
return 1
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 9e844d6cf21..d7ea9db01ea 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -20,7 +20,7 @@
burn_state = FLAMMABLE
burntime = 5
attack_verb = list("bapped")
-
+ dog_fashion = /datum/dog_fashion/head
var/info //What's actually written on the paper.
var/info_links //A different version of the paper which includes html links at fields and EOF
var/stamps //The (text for the) stamps on the paper.
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 5dabd8a9db6..4bf6c98fc50 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -234,7 +234,7 @@
if("parrot")
new_mob = new /mob/living/simple_animal/parrot(M.loc)
if("corgi")
- new_mob = new /mob/living/simple_animal/pet/corgi(M.loc)
+ new_mob = new /mob/living/simple_animal/pet/dog/corgi(M.loc)
if("crab")
new_mob = new /mob/living/simple_animal/crab(M.loc)
if("cat")
@@ -248,7 +248,7 @@
if("lizard")
new_mob = new /mob/living/simple_animal/lizard(M.loc)
if("fox")
- new_mob = new /mob/living/simple_animal/pet/fox(M.loc)
+ new_mob = new /mob/living/simple_animal/pet/dog/fox(M.loc)
else
new_mob = new /mob/living/simple_animal/chick(M.loc)
new_mob.universal_speak = TRUE
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index c40c1213793..c118af7d763 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -189,7 +189,7 @@
/datum/chemical_reaction/corgium/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
- new /mob/living/simple_animal/pet/corgi(location)
+ new /mob/living/simple_animal/pet/dog/corgi(location)
..()
/datum/chemical_reaction/flaptonium
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index dad2b6698ad..581f4983d03 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -89,7 +89,7 @@
component_parts += new /obj/item/stock_parts/micro_laser(src)
component_parts += new /obj/item/stock_parts/micro_laser(src)
spawn(1)
- trackedIan = locate(/mob/living/simple_animal/pet/corgi/Ian) in GLOB.mob_list
+ trackedIan = locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_list
trackedRuntime = locate(/mob/living/simple_animal/pet/cat/Runtime) in GLOB.mob_list
SetTypeReactions()
RefreshParts()
@@ -511,7 +511,7 @@
trackedIan.loc = src.loc
investigate_log("Experimentor has stolen Ian!", "experimentor") //...if anyone ever fixes it...
else
- new /mob/living/simple_animal/pet/corgi(src.loc)
+ new /mob/living/simple_animal/pet/dog/corgi(src.loc)
investigate_log("Experimentor has spawned a new corgi.", "experimentor")
ejectItem(TRUE)
if(globalMalf > 36 && globalMalf < 59)
@@ -620,7 +620,7 @@
/obj/item/relic/New()
icon_state = pick("shock_kit","armor-igniter-analyzer","infra-igniter0","infra-igniter1","radio-multitool","prox-radio1","radio-radio","timer-multitool0","radio-igniter-tank")
realName = "[pick("broken","twisted","spun","improved","silly","regular","badly made")] [pick("device","object","toy","suspicious tech","gear")]"
- floof = pick(/mob/living/simple_animal/pet/corgi, /mob/living/simple_animal/pet/cat, /mob/living/simple_animal/pet/fox, /mob/living/simple_animal/mouse, /mob/living/simple_animal/pet/pug, /mob/living/simple_animal/lizard, /mob/living/simple_animal/diona, /mob/living/simple_animal/butterfly, /mob/living/carbon/human/monkey)
+ floof = pick(/mob/living/simple_animal/pet/dog/corgi, /mob/living/simple_animal/pet/cat, /mob/living/simple_animal/pet/dog/fox, /mob/living/simple_animal/mouse, /mob/living/simple_animal/pet/pug, /mob/living/simple_animal/lizard, /mob/living/simple_animal/diona, /mob/living/simple_animal/butterfly, /mob/living/carbon/human/monkey)
/obj/item/relic/proc/reveal()
@@ -677,7 +677,7 @@
to_chat(user, message)
var/animals = rand(1,25)
var/counter
- var/list/valid_animals = list(/mob/living/simple_animal/parrot,/mob/living/simple_animal/butterfly,/mob/living/simple_animal/pet/cat,/mob/living/simple_animal/pet/corgi,/mob/living/simple_animal/crab,/mob/living/simple_animal/pet/fox,/mob/living/simple_animal/lizard,/mob/living/simple_animal/mouse,/mob/living/simple_animal/pet/pug,/mob/living/simple_animal/hostile/bear,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/carp)
+ var/list/valid_animals = list(/mob/living/simple_animal/parrot,/mob/living/simple_animal/butterfly,/mob/living/simple_animal/pet/cat,/mob/living/simple_animal/pet/dog/corgi,/mob/living/simple_animal/crab,/mob/living/simple_animal/pet/dog/fox,/mob/living/simple_animal/lizard,/mob/living/simple_animal/mouse,/mob/living/simple_animal/pet/pug,/mob/living/simple_animal/hostile/bear,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/carp)
for(counter = 1; counter < animals; counter++)
var/mobType = pick(valid_animals)
new mobType(get_turf(src))
diff --git a/icons/mob/corgi_back.dmi b/icons/mob/corgi_back.dmi
index 4aec9894ec5..2adfc53abe4 100644
Binary files a/icons/mob/corgi_back.dmi and b/icons/mob/corgi_back.dmi differ
diff --git a/icons/mob/corgi_head.dmi b/icons/mob/corgi_head.dmi
index 8f33c35934a..df2f3a66d84 100644
Binary files a/icons/mob/corgi_head.dmi and b/icons/mob/corgi_head.dmi differ
diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi
index 3c3cbddaf93..0f5e80c4299 100644
Binary files a/icons/mob/pets.dmi and b/icons/mob/pets.dmi differ
diff --git a/paradise.dme b/paradise.dme
index b4090ec2c83..21d156ad2df 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -250,6 +250,7 @@
#include "code\datums\datacore.dm"
#include "code\datums\datum.dm"
#include "code\datums\datumvars.dm"
+#include "code\datums\dog_fashion.dm"
#include "code\datums\gas_mixture.dm"
#include "code\datums\holocall.dm"
#include "code\datums\hud.dm"
@@ -1927,18 +1928,16 @@
#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm"
#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm"
-#include "code\modules\mob\living\simple_animal\friendly\corgi.dm"
-#include "code\modules\mob\living\simple_animal\friendly\corgi_powers.dm"
#include "code\modules\mob\living\simple_animal\friendly\crab.dm"
#include "code\modules\mob\living\simple_animal\friendly\deer.dm"
#include "code\modules\mob\living\simple_animal\friendly\diona.dm"
+#include "code\modules\mob\living\simple_animal\friendly\dog.dm"
#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm"
#include "code\modules\mob\living\simple_animal\friendly\fox.dm"
#include "code\modules\mob\living\simple_animal\friendly\lizard.dm"
#include "code\modules\mob\living\simple_animal\friendly\mouse.dm"
#include "code\modules\mob\living\simple_animal\friendly\penguin.dm"
#include "code\modules\mob\living\simple_animal\friendly\pet.dm"
-#include "code\modules\mob\living\simple_animal\friendly\pug.dm"
#include "code\modules\mob\living\simple_animal\friendly\slime.dm"
#include "code\modules\mob\living\simple_animal\friendly\sloth.dm"
#include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm"