From 86fe18f32f972ff61527ea6b295812ba4cac3e45 Mon Sep 17 00:00:00 2001 From: "johnsonmt88@gmail.com" Date: Mon, 8 Oct 2012 02:36:24 +0000 Subject: [PATCH] More work on parrots! - Parrots now have a chance to use department channels when they speak, assuming they have a headset with encryption keys. Parrots can not use the common channel ';'. I seems to be more trouble than it's worth to set up and it would get annoying very fast. - The drop_item proc now works properly for player-controlled parrots - A parrot's sprite now updates when they get pulled - Fixed a bug where a player attacking a parrot would get messages intended for the parrot - Player-controlled parrot sprites now update when they move - Player-controlled parrots can now perch themselves on perch-able objects. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@4831 316c924e-a436-60f5-8080-3fe189b3f50e --- .../mob/living/simple_animal/parrot.dm | 146 +++++++++++++++--- 1 file changed, 126 insertions(+), 20 deletions(-) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index d59480614a4..c521ea937de 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -8,10 +8,6 @@ * Sub-types */ -//TODO List: -// Make parrots faster (But not retardedly fast like when using byond's walk() procs) -// See if its possible for parrots to target a human's eyes (peck their eyes out) - /* * Defines */ @@ -59,6 +55,7 @@ var/parrot_dam_zone = list("chest", "head", "l_arm", "l_leg", "r_arm", "r_leg") //For humans, select a bodypart to attack var/list/speech_buffer = list() + var/list/available_channels = list() //Headset for Poly to yell at engineers :) var/obj/item/device/radio/headset/ears = null @@ -99,7 +96,8 @@ parrot_sleep_dur = parrot_sleep_max //In case someone decides to change the max without changing the duration var verbs.Add(/mob/living/simple_animal/parrot/proc/steal_from_ground, \ /mob/living/simple_animal/parrot/proc/steal_from_mob, \ - /mob/living/simple_animal/parrot/proc/drop_held_item) + /mob/living/simple_animal/parrot/verb/drop_held_item_player, \ + /mob/living/simple_animal/parrot/proc/perch_player) /mob/living/simple_animal/parrot/Die() if(held_item) @@ -139,9 +137,15 @@ switch(remove_from) if("ears") if(ears) - src.say(":e BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") + if(available_channels.len) + src.say("[pick(available_channels)] BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") + else + src.say("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") ears.loc = src.loc ears = null + for(var/possible_phrase in speak) + if(copytext(possible_phrase,1,3) in department_radio_keys) + possible_phrase = copytext(possible_phrase,3,length(possible_phrase)) else usr << "\red There is nothing to remove from its [remove_from]." return @@ -166,13 +170,37 @@ usr << "\red This object won't fit." return + var/obj/item/device/radio/headset/headset_to_add = item_to_add + usr.drop_item() - item_to_add.loc = src - src.ears = item_to_add + headset_to_add.loc = src + src.ears = headset_to_add usr << "You fit the headset onto [src]." + + clearlist(available_channels) + for(var/ch in headset_to_add.channels) + switch(ch) + if("Engineering") + available_channels.Add(":e") + if("Command") + available_channels.Add(":c") + if("Security") + available_channels.Add(":s") + if("Science") + available_channels.Add(":n") + if("Medical") + available_channels.Add(":m") + if("Mining") + available_channels.Add(":d") + if("Cargo") + available_channels.Add(":q") + + if(headset_to_add.translate_binary) + available_channels.Add(":b") else ..() + /* * Attack responces */ @@ -250,15 +278,24 @@ /mob/living/simple_animal/parrot/Life() ..() + //Sprite and AI update for when a parrot gets pulled + if(pulledby && stat == CONSCIOUS) + icon_state = "parrot_fly" + if(!client) + parrot_state = PARROT_WANDER + return + if(client || stat) return //Lets not force players or dead/incap parrots to move - if(!isturf(src.loc) || !canmove || buckled || pulledby) - return //If it can't move, dont let it move. (The buckled check probably isn't necessary) + if(!isturf(src.loc) || !canmove || buckled) + return //If it can't move, dont let it move. (The buckled check probably isn't necessary thanks to canmove) - //Parrot speech mimickry! Phrases that the parrot hears in mob/living/say() get added to speach_buffer. - //Every once in a while, the parrot picks one of the lines from the buffer and replaces an element of the 'speech' list. - //Then it clears the buffer to make sure they dont magically remember something from hours ago. +//-----SPEECH + /* Parrot speech mimickry! + Phrases that the parrot hears in mob/living/say() get added to speach_buffer. + Every once in a while, the parrot picks one of the lines from the buffer and replaces an element of the 'speech' list. + Then it clears the buffer to make sure they dont magically remember something from hours ago. */ if(speech_buffer.len && prob(10)) if(speak.len) speak.Remove(pick(speak)) @@ -285,7 +322,36 @@ return else - parrot_sleep_dur = parrot_sleep_max //This way we only call the loop below once every [sleep_max] ticks. + //This way we only call the stuff below once every [sleep_max] ticks. + parrot_sleep_dur = parrot_sleep_max + + //Cycle through message modes for the headset + if(speak.len) + var/list/newspeak = list() + + if(available_channels.len && src.ears) + for(var/possible_phrase in speak) + + //50/50 chance to not use the radio at all + var/useradio = 0 + if(prob(50)) + useradio = 1 + + if(copytext(possible_phrase,1,3) in department_radio_keys) + possible_phrase = "[useradio?pick(available_channels):""] [copytext(possible_phrase,3,length(possible_phrase)+1)]" //crop out the channel prefix + else + possible_phrase = "[useradio?pick(available_channels):""] [possible_phrase]" + + newspeak.Add(possible_phrase) + + else //If we have no headset or channels to use, dont try to use any! + for(var/possible_phrase in speak) + if(copytext(possible_phrase,1,3) in department_radio_keys) + possible_phrase = "[copytext(possible_phrase,3,length(possible_phrase)+1)]" //crop out the channel prefix + newspeak.Add(possible_phrase) + speak = newspeak + + //Search for item to steal parrot_interest = search_for_item() if(parrot_interest) emote("[src] looks in [parrot_interest]'s direction and takes flight.") @@ -454,6 +520,11 @@ * Procs */ +/mob/living/simple_animal/parrot/movement_delay() + if(client && parrot_state != "parrot_fly") + icon_state = "parrot_fly" + ..() + /mob/living/simple_animal/parrot/proc/search_for_item() for(var/atom/movable/AM in view(src)) for(var/path in desired_items) @@ -509,29 +580,36 @@ return -1 if(held_item) - usr << "\red You are already holding the [held_item]" + src << "\red You are already holding the [held_item]" return 1 for(var/obj/item/I in view(1,src)) for(var/path in desired_items) + //Make sure it's the proper item and we're not holding it if(istype(I, path) && I.loc != src) + + //If we have a perch and the item is sitting on it, continue + if(!client && parrot_perch && I.loc == parrot_perch) + continue + held_item = I I.loc = src visible_message("[src] grabs the [held_item]!", "\blue You grab the [held_item]!", "You hear the sounds of wings flapping furiously.") return held_item - usr << "\red There is nothing of interest to take." + src << "\red There is nothing of interest to take." return 0 /mob/living/simple_animal/parrot/proc/steal_from_mob() set name = "Steal from mob" set category = "Parrot" set desc = "Steals an item right out of a person's hand!" + if(stat) return -1 if(held_item) - usr << "\red You are already holding the [held_item]" + src << "\red You are already holding the [held_item]" return 1 var/obj/item/stolen_item = null @@ -551,9 +629,17 @@ visible_message("[src] grabs the [held_item] out of [C]'s hand!", "\blue You snag the [held_item] out of [C]'s hand!", "You hear the sounds of wings flapping furiously.") return held_item - usr << "\red There is nothing of interest to take." + src << "\red There is nothing of interest to take." return 0 +/mob/living/simple_animal/parrot/verb/drop_held_item_player() + set name = "Drop held item" + set category = "Parrot" + set desc = "Drop the item you're holding." + + src.drop_held_item() + return + /mob/living/simple_animal/parrot/proc/drop_held_item(var/drop_gently = 1) set name = "Drop held item" set category = "Parrot" @@ -569,16 +655,35 @@ if(!drop_gently) if(istype(held_item, /obj/item/weapon/grenade)) var/obj/item/weapon/grenade/G = held_item - G.loc = get_turf(src) + G.loc = src.loc G.prime() + src << "You let go of the [held_item]!" held_item = null + return 1 - usr << "You drop the [held_item]." + src << "You drop the [held_item]." held_item.loc = src.loc held_item = null return 1 +/mob/living/simple_animal/parrot/proc/perch_player() + set name = "Sit" + set category = "Parrot" + set desc = "Sit on a nice comfy perch." + + if(stat || !client) + return + + if(icon_state == "parrot_fly") + 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" + return + return + /* * Sub-types */ @@ -589,4 +694,5 @@ /mob/living/simple_animal/parrot/Poly/New() ears = new /obj/item/device/radio/headset/headset_eng(src) + available_channels = list(":e") ..()