diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 415d012b402..cd66b3e9d90 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -503,53 +503,58 @@ /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 + if(resting || buckled) + return + + if(++turns_since_scan > 5) + turns_since_scan = 0 + + // Has a target, but it's not where it was before, and it wasn't picked up by someone. + if(movement_target && !(isturf(movement_target.loc) || ishuman(movement_target.loc))) + movement_target = null + stop_automated_movement = FALSE + + // No current target, or current target is out of range. + var/list/snack_range = oview(src, 3) + if(!movement_target || !(movement_target.loc in snack_range)) + movement_target = null + stop_automated_movement = FALSE + var/obj/item/possible_target = null + for(var/I in snack_range) + if(istype(I, /obj/item/reagent_containers/food/snacks)) // Noms + possible_target = I + break + else if(istype(I, /obj/item/paper)) // Important noms + if(prob(10)) + possible_target = I 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(possible_target && (isturf(possible_target.loc) || ishuman(possible_target.loc))) // On the ground or in someone's hand. + movement_target = possible_target + if(movement_target) + INVOKE_ASYNC(src, .proc/move_to_target) - 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(prob(1)) + chasetail() - if(!Adjacent(movement_target)) //can't reach food through windows. - return +/mob/living/simple_animal/pet/dog/corgi/Ian/proc/move_to_target() + stop_automated_movement = TRUE + step_to(src, movement_target, 1) + sleep(3) + step_to(src, movement_target, 1) + sleep(3) + step_to(src, movement_target, 1) - 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(movement_target) // Not redundant due to sleeps, Item can be gone in 6 deciseconds + // Face towards the thing + dir = get_dir(src, movement_target) - if(prob(1)) - custom_emote(1, pick("dances around.","chases its tail!")) - spin(20, 1) + if(!Adjacent(movement_target)) //can't reach food through windows. + return + + if(isturf(movement_target.loc)) + movement_target.attack_animal(src) // Eat the thing + else if(prob(30) && ishuman(movement_target.loc)) // mean hooman has stolen it + custom_emote(EMOTE_VISUAL, "stares at [movement_target.loc]'s [movement_target] with a sad puppy-face.") /obj/item/reagent_containers/food/snacks/meat/corgi name = "Corgi meat" diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index c8b24eea2c5..ba809fd7119 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -163,6 +163,51 @@ else return ..() +/obj/item/paper/attack_animal(mob/living/simple_animal/M) + if(!isdog(M)) // Only dogs can eat homework. + return + var/mob/living/simple_animal/pet/dog/D = M + D.changeNext_move(CLICK_CD_MELEE) + if(world.time < D.last_eaten + 30 SECONDS) + to_chat(D, "You are too full to try eating [src] now.") + return + + D.visible_message("[D] starts chewing the corner of [src]!", + "You start chewing the corner of [src].", + "You hear a quiet gnawing, and the sound of paper rustling.") + playsound(src, 'sound/effects/pageturn2.ogg', 100, TRUE) + if(!do_after(D, 10 SECONDS, FALSE, src)) + return + + if(world.time < D.last_eaten + 30 SECONDS) // Check again to prevent eating multiple papers at once. + to_chat(D, "You are too full to try eating [src] now.") + return + D.last_eaten = world.time + + // 90% chance of a crumpled paper with illegible text. + if(prob(90)) + var/message_ending = "." + var/obj/item/paper/crumpled/P = new(loc) + P.name = name + if(info) // Something written on the paper. + /*var/new_text = strip_html_properly(info, MAX_PAPER_MESSAGE_LEN, TRUE) // Don't want HTML stuff getting gibberished. + P.info = Gibberish(new_text, 100)*/ + P.info = "Whatever was once written here has been made completely illegible by a combination of chew marks and saliva." + message_ending = ", the drool making it an unreadable mess!" + P.update_icon() + qdel(src) + + D.visible_message("[D] finishes eating [src][message_ending]", + "You finish eating [src][message_ending]") + D.emote("bark") + + // 10% chance of the paper just being eaten entirely. + else + D.visible_message("[D] swallows [src] whole!", "You swallow [src] whole. Tasty!") + playsound(D, 'sound/items/eatfood.ogg', 50, TRUE) + qdel(src) + + /obj/item/paper/proc/addtofield(id, text, links = 0) if(id > MAX_PAPER_FIELDS) return @@ -487,7 +532,8 @@ icon_state = "scrap" /obj/item/paper/crumpled/update_icon() - return + if(info) + icon_state = "scrap_words" /obj/item/paper/crumpled/bloody icon_state = "scrap_bloodied" @@ -591,10 +637,6 @@ name = "paper- 'Note'" info = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!" -/obj/item/paper/crumpled - name = "paper scrap" - icon_state = "scrap" - /obj/item/paper/syndicate name = "paper" header = "

Failure to adhere appropriately to orders that may be contained herein is in violation of Space Law, and punishments may be administered appropriately upon return to Central Command.
The recipient(s) of this memorandum acknowledge by reading it that they are liable for any and all damages to crew or station that may arise from ignoring suggestions or advice given herein.