diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index b9b526514b..6467990776 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -424,6 +424,41 @@
setDir(i)
sleep(1)
+/mob/living/simple_animal/pet/dog/corgi/Ian/narsie_act()
+ playsound(src, 'sound/magic/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("dog", "cult")
+ gold_core_spawnable = FALSE
+ nofur = 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 && prob(5))
+ visible_message("[src] devours [P]!", \
+ "DELICIOUS SOULS")
+ playsound(src, 'sound/magic/demon_attack1.ogg', 75, TRUE)
+ narsie_act()
+ 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/regenerate_icons()
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 6357f83286..09d9f66f61 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -33,6 +33,7 @@
icon_state = "parrot_fly"
icon_living = "parrot_fly"
icon_dead = "parrot_dead"
+ var/icon_sit = "parrot_sit"
density = FALSE
health = 80
maxHealth = 80
@@ -284,7 +285,7 @@
return
if(!stat && M.a_intent == INTENT_HARM)
- icon_state = "parrot_fly" //It is going to be flying regardless of whether it flees or attacks
+ icon_state = icon_living //It is going to be flying regardless of whether it flees or attacks
if(parrot_state == PARROT_PERCH)
parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched
@@ -320,7 +321,7 @@
if(M.melee_damage_upper > 0 && !stat)
parrot_interest = M
parrot_state = PARROT_SWOOP | PARROT_ATTACK //Attack other animals regardless
- icon_state = "parrot_fly"
+ icon_state = icon_living
//Mobs with objects
/mob/living/simple_animal/parrot/attackby(obj/item/O, mob/living/user, params)
@@ -335,7 +336,7 @@
parrot_state |= PARROT_ATTACK
else
parrot_state |= PARROT_FLEE
- icon_state = "parrot_fly"
+ icon_state = icon_living
drop_held_item(0)
else if(istype(O, /obj/item/reagent_containers/food/snacks/cracker)) //Poly wants a cracker.
qdel(O)
@@ -358,7 +359,7 @@
parrot_interest = null
parrot_state = PARROT_WANDER | PARROT_FLEE //Been shot and survived! RUN LIKE HELL!
//parrot_been_shot += 5
- icon_state = "parrot_fly"
+ icon_state = icon_living
drop_held_item(0)
return
@@ -371,7 +372,7 @@
//Sprite update for when a parrot gets pulled
if(pulledby && stat == CONSCIOUS)
- icon_state = "parrot_fly"
+ icon_state = icon_living
if(!client)
parrot_state = PARROT_WANDER
return
@@ -400,11 +401,11 @@
if(parrot_perch && parrot_perch.loc != src.loc) //Make sure someone hasnt moved our perch on us
if(parrot_perch in view(src))
parrot_state = PARROT_SWOOP | PARROT_RETURN
- icon_state = "parrot_fly"
+ icon_state = icon_living
return
else
parrot_state = PARROT_WANDER
- icon_state = "parrot_fly"
+ icon_state = icon_living
return
if(--parrot_sleep_dur) //Zzz
@@ -445,7 +446,7 @@
if(parrot_interest)
emote("me", 1, "looks in [parrot_interest]'s direction and takes flight.")
parrot_state = PARROT_SWOOP | PARROT_STEAL
- icon_state = "parrot_fly"
+ icon_state = icon_living
return
//-----WANDERING - This is basically a 'I dont know what to do yet' state
@@ -530,7 +531,7 @@
src.loc = parrot_perch.loc
drop_held_item()
parrot_state = PARROT_PERCH
- icon_state = "parrot_sit"
+ icon_state = icon_sit
return
walk_to(src, parrot_perch, 1, parrot_speed)
@@ -603,8 +604,8 @@
*/
/mob/living/simple_animal/parrot/movement_delay()
- if(client && stat == CONSCIOUS && parrot_state != "parrot_fly")
- icon_state = "parrot_fly"
+ if(client && stat == CONSCIOUS && parrot_state != icon_living)
+ icon_state = icon_living
//Because the most appropriate place to set icon_state is movement_delay(), clearly
return ..()
@@ -797,12 +798,12 @@
if(stat || !client)
return
- if(icon_state == "parrot_fly")
+ if(icon_state == icon_living)
for(var/atom/movable/AM in view(src,1))
for(var/perch_path in desired_perches)
if(istype(AM, perch_path))
src.loc = AM.loc
- icon_state = "parrot_sit"
+ icon_state = icon_sit
return
to_chat(src, "There is no perch nearby to sit on!")
return
@@ -816,7 +817,7 @@
if(stat || !client)
return
- if(icon_state == "parrot_fly")
+ if(icon_state == icon_living)
for(var/mob/living/carbon/human/H in view(src,1))
if(H.has_buckled_mobs() && H.buckled_mobs.len >= H.max_buckled_mobs) //Already has a parrot, or is being eaten by a slime
continue
@@ -824,7 +825,7 @@
return
to_chat(src, "There is nobody nearby that you can sit on!")
else
- icon_state = "parrot_fly"
+ icon_state = icon_living
parrot_state = PARROT_WANDER
if(buckled)
to_chat(src, "You are no longer sitting on [buckled]'s shoulder.")
@@ -842,7 +843,7 @@
H.buckle_mob(src, force=1)
pixel_y = 9
pixel_x = pick(-8,8) //pick left or right shoulder
- icon_state = "parrot_sit"
+ icon_state = icon_sit
parrot_state = PARROT_PERCH
to_chat(src, "You sit on [H]'s shoulder.")
@@ -961,6 +962,12 @@
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
+/mob/living/simple_animal/parrot/Poly/ratvar_act()
+ playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 75, TRUE)
+ var/mob/living/simple_animal/parrot/clock_hawk/H = new(loc)
+ H.setDir(dir)
+ dust()
+
/mob/living/simple_animal/parrot/Poly/ghost
name = "The Ghost of Poly"
desc = "Doomed to squawk the earth."
@@ -996,4 +1003,23 @@
loc = H
H.ContractDisease(P)
parrot_interest = null
- H.visible_message("[src] dive bombs into [H]'s chest and vanishes!", "[src] dive bombs into your chest, vanishing! This can't be good!")
\ No newline at end of file
+ H.visible_message("[src] dive bombs into [H]'s chest and vanishes!", "[src] dive bombs into your chest, vanishing! This can't be good!")
+
+
+/mob/living/simple_animal/parrot/clock_hawk
+ name = "clock hawk"
+ desc = "Cbyl jnaan penpxre! Fdhnnnjx!"
+ icon_state = "clock_hawk_fly"
+ icon_living = "clock_hawk_fly"
+ icon_sit = "clock_hawk_sit"
+ speak = list("Penpxre!", "Ratvar vf n qhzo anzr naljnl!")
+ speak_emote = list("squawks rustily", "says crassly", "yells brassly")
+ emote_hear = list("squawks rustily.", "bawks metallically!")
+ emote_see = list("flutters its metal wings.")
+ faction = list("ratvar")
+ gold_core_spawnable = FALSE
+ del_on_death = TRUE
+ death_sound = 'sound/magic/clockwork/anima_fragment_death.ogg'
+
+/mob/living/simple_animal/parrot/clock_hawk/ratvar_act()
+ return
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 038514d22a..b860bd8426 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi
index e852426e62..647781e2b1 100644
Binary files a/icons/mob/pets.dmi and b/icons/mob/pets.dmi differ