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 = {""} - - dat += "" - dat += "" - if(can_collar) - dat += "" - dat += "" - if(facehugger) - dat += "" - dat += {"
Head:[(inventory_head && !(inventory_head.flags&ABSTRACT)) ? inventory_head : "Empty"]
Back:[(inventory_back && !(inventory_back.flags&ABSTRACT)) ? inventory_back : "Empty"]
 
Collar:[(collar && !(collar.flags&ABSTRACT)) ? collar : "Empty"]
Facehugger:[facehugger]
- 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 = "
Collar:[(collar && !(collar.flags&ABSTRACT)) ? collar : "Empty"]
" + var/dat = "
Collar:[(pcollar && !(pcollar.flags & ABSTRACT)) ? pcollar : "Empty"]
" 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"