;"Thank you for installing this Object." ;"This installation file was created by debug(smithdm@metronet.com)" ;"Other Generics are availible at http://www.cmoo.com/moo/moogens.html" ;"This object was created by: JSlocum of LambdaMOO" ;"*Please make sure that you have edited this script and replaced with the appropriate object number*" @prop ."on_track" 1 r @prop ."lapse_max" 15 rc @prop ."sounds" {} r @prop ."actions" {} r @prop ."pet_response_msg" "" rc @prop ."lazymsgs" {} r @prop ."tofollow" #-1 r @prop ."home" #-1 r @prop ."masters" {} r @prop ."lazy_finish_msg" "" rc @prop ."lazy" 0 r @prop ."ignore" {} r @prop ."activemsgs" {} r ".("listeners") => E_PERM (Permission denied) @prop ."noisy" 1 r @prop ."msg_lapse" 1 r @prop ."lazy_ignore_msg" "" rc @prop ."lazy_obey_msg" "" rc @prop ."act_finish_msg" "" rc @prop ."act_ignore_msg" "" rc @prop ."act_obey_msg" "" rc @prop ."help_msg" {} rc ;;.("help_msg") = {"Generic Multi-Purpose Pet (#28280)", " The Generic Multi-Purpose Pet has many features, with many found in the description. In addition to all of the included perks, its easy, non-forking/suspending method of linking customized verbs forms its greatest asset. Hopefully, the owners of children of the pet will make full use of this versatile way of creating totally unique and extremely interesting new pets of their own. ", "The following comprises a list of many of the verbs that may be of use to any pet owner. will be used to denote the name/object number of a character's pet.", "@info --This provides a formatted printout of pertinent facts about a person's pet, including masters, who it is following, and linked verbs.", "@lazy/@active --switches the pet from its current mode to its lazy/active mode.", "@master*of is --used to set masters for a pet; if none, then everyone is its master.", "gag/silence/muz*zle --stop hearing a pet's messages.", "talk*ative/verb*ose --raise the pet's noisiness level by 1/to the maximum.", "hush/quiet --lower pet's noise level by 1/to absolute silence.", "@sound/@action is --installs a new sound/action for the pet.", "@actmess*age/@lazymess*age is --adds a message to the pet's random lists under active/lazy heading; allows linking of new verb to the random message; see `help :@actmess' for more informatimessage; see `help :@actmess' for more information.", "follow with --sets the pet following after .", "stop --stops pet from following whatever it may be following.", "mon*itor --echoes messages from pet's location to player.", "ign*ore --drops player from pet's listeners.", "pet --allows player to pet the pet.", "", " Many of the verbs have \"un-\" or \"rm\" functions to remove and undo their respective actions (e.g., @rmsound removes messages set by @sound). Further help may be available on many verbs through \"help :\". Enjoy your own personally-customized pets."} @prop ."sleep" 2 rc ;;.("otake_succeeded_msg") = "forcefully seizes the helpless %t." ".("key") => E_PERM (Permission denied) ;;.("aliases") = {"pet", "generic"} ;;.("description") = {"A very useful generic pet. It seems rather formless, having only a vague outline and strangely indistinct features. Its possibly furry body looks soft, but you can't determine an exact color. ", "You can @create one of your own, giving it a nice name and description. Your pet will be able to follow people, monitor conversations which you must leave (such as for editing), or perform a variety of other, programmable functions. It is either lazy or active, with a setting to determine how noisy it can be at any given time. It utilizes server-friendly tell-trapping to determine when to follow or perform some random function. Its messages can be tied to your own verbs for special effects. With so many useful features that remain almost completely generic, you can create nearly any imaginable pet. Have fun! BTW, it even has a handy gagging system for those who hate pets! ", "For new owners, try \"help \" for a basic list of commands. Additional help may be available under \"help :\"."} ;;.("object_size") = {31708, 864462453} @verb :"@lazy @active" this none none @program :@lazy if ((player in this.masters) || (!this.masters)) if (verb == "@lazy") if (this.lazy == 1) player:tell("By the bored expression on ", this.name, "'s face, you can tell that ", this.ps, " is already lazy."); else this.lazy = 1; player:tell(this.name, " is now lazy."); this.location:announce_all_but({this.ignore}, this.name, " curls up in a corner of ", this.location.name, " and falls asleep."); endif elseif (this.lazy == 0) player:tell("By the way ", this.name, " playfully dodges you, you can tell that ", this.ps, " is already active."); else this.lazy = 0; player:tell(this.name, " is now active."); this.location:announce_all_but({this.ignore}, this.name, " wakes up from its satisfying nap."); endif elseif (verb == "@lazy") if (this.lazy == 1) player:tell(this.name, " pretends not to hear you."); else player:tell(this.name, " playfully dodges you, refusing to calm down."); endif else if (this.lazy == 1) player:tell(this.name, " pretends not to hear you."); else player:tell(this.name, " dodges you, already being quite active."); endif endif . @verb :"finish_msg" none none none rxd @program :finish_msg string = this.lazy ? this.lazy_finish_msg | this.act_finish_msg; message = string ? string | "finishes"; return message; . @verb :"random_msg" none none none rxd @program :random_msg indexmsg = args[1]; if (this.lazy == 1) message = this.lazymsgs[indexmsg]; else message = this.activemsgs[indexmsg]; endif suspend(1); this.location:announce_all_but(this.ignore, $string_utils:pronoun_sub(message[1])); if (message[2]) verbname = message[2]; this:(verbname)(); endif . @verb :"gag silence muz*zle" this none none @program :gag if (player in this.ignore) player:tell("You have already muzzled ", this.name, "."); elseif (player.location != this.location) player:tell("Why do you bother, since ", this.name, " isn't here anyways?"); else this.ignore = setadd(this.ignore, player); player:tell(this.name, " gives you one last \"", this:sound(), "\" and turns away."); this.location:announce_all_but(this.ignore, "Nasty ", player.name, " straps an ACME sound-reducing muzzle onto poor ", this.name, "."); endif . @verb :"talk*ative verb*ose hush quiet" this none none @program :talkative if ((player in this.masters) || (!this.masters)) verbname = verb[1..4]; if (this.noisy == 1) if (verbname == "hush") this.noisy = 2; player:tell(this.name, " becomes a bit more quiet."); elseif (verbname == "quie") this.noisy = 0; player:tell(this.name, " goes silent."); else player:tell(this.name, " is talkative enough as it is."); endif elseif (this.noisy == 0) if (verbname == "talk") this.noisy = this.lapse_max; player:tell(this.name, " becomes a bit more talkative, giving you a \"", this:sound(), "\""); elseif (verbname == "verb") this.noisy = 1; player:tell(this.name, " becomes quite verbose, telling you, \"", this:sound(), "!\""); else player:tell(this.name, " is already very quiet."); endif else if (verbname == "talk") this.noisy = this.noisy - 1; player:tell(this.name, " becomes a bit more talkative, giving you a \"", this:sound(), "\""); elseif (verbname == "verb") this.noisy = 1; player:tell(this.name, " becomes quite verbose, telling you, \"", this:sound(), "!\""); elseif (verbname == "hush") this.noisy = this.noisy + 1; player:tell(this.name, " becomes a bit more quiet."); else this.noisy = 0; player:tell(this.name, " goes silent."); endif endif else player:tell(this.name, " will speak as much as ", this.ps, " wants to, so \"", this:sound(), "!\""); endif . @verb :"@actmess*age @lazymess*age" this is any @program :@actmessage "Usage: @actmess*age/@lazymess*age is "; "This adds to 's lists of random messages for either the active or lazy mode. The pet will ask for a verb for it to link to that particular message, with a blank indicating none. This allows hooking in of customized tricks, etc."; if ((player in this.masters) || (!this.masters)) if (verb[1..8] == "@actmess") if (iobjstr) this:add_message(iobjstr, "activemsgs"); else this:display_message("activemsgs"); endif elseif (iobjstr) this:add_message(iobjstr, "lazymsgs"); else this:display_message("lazymsgs"); endif else player:tell(this.name, " doesn't want you sticking words in ", this.pp, " mouth."); endif . @verb :"stop" this none none @program :stop "Usage: stop "; "Stops pet from chasing anyone that it may be currently following."; if (valid(this.tofollow)) if ((player in this.masters) || (!this.masters)) player:tell(this.name, " stops following ", this.tofollow.name, "."); this.tofollow = #-1; else player:tell(this.name, " doesn't want you to stop ", this.po, "."); endif else player:tell(this.name, " isn't following anybody."); endif . @verb :"mon*itor" this none none @program :monitor "Usage: monitor "; "This adds you to the pet's list of listeners to whom it will echo all that it hears; only available to those with master permissions over the pet."; if ((player in this.masters) || (!this.masters)) if (player in this.listeners) player:tell(this.name, " is already listening for you."); else this.listeners = setadd(this.listeners, player); player:tell(this.name, " perks up ", this.pp, " ears."); endif else player:tell(this.name, " sniffs in disdain at you. Get someone else to do your dirty work!"); endif . @verb :"ign*ore" this none none @program :ignore "Usage: ignore "; "Removes you from the pet's list of listeners."; if ((player in this.masters) || (!this.masters)) if (player in this.listeners) this.listeners = setremove(this.listeners, player); player:tell(this.name, "'s ears relax a bit."); else player:tell(this.name, " hasn't really been paying much attention to you."); endif else player:tell(this.name, " ignores you, too."); endif . @verb :"sound" none none none rxd @program :sound return this.sounds ? this.sounds[random(length(this.sounds))] | "teehee"; . @verb :"soundverb" none none none rxd @program :soundverb return this:sound() + "s"; . @verb :"follow" any with this @program :follow "Usage: follow with "; "This sets the pet to follow player. The pet only makes checks through calls of its :tell verb, so silent exits will delay its following. If it can't follow, it will return to its home (if it has one) or to its master's home."; if ((player in this.masters) || (!this.masters)) who = $string_utils:match_player(dobjstr); if (who == $failed_match) player:tell(this.name, " ", this:soundverb(), " and looks confused, being unable to find anyone named ", dobjstr, "."); elseif (who == $ambiguous_match) player:tell(this.name, " ", this:soundverb(), " and looks confused, being unable to decide who to follow."); elseif (who == $nothing) player:tell(this.name, " needs the name of someone to follow."); else this.tofollow = who; this.on_track = 1; result = who == player; if (this.tofollow.location == this.location) player:tell(this.name, " ", this:obey_msg(0), " and pads over to " + (result ? "you." | (this.tofollow.name + "."))); this.location:announce_all_but({@this.ignore, player}, this.name, " ", this:obey_msg(1), " and pads over to ", this.tofollow.name, "."); this.location:announce_all_but(this.ignore, "Then, ", this.ps, " ", this:finish_msg(), "."); else this.location:announce_all_but(this.ignore, this.name, " ", this:obey_msg(1), " and pads off to find ", this.tofollow.name, "."); this:moveto(this.tofollow.location); if (this.location != this.tofollow.location) this.location:announce_all_but(this.ignore, this.name, " ", this:action(), " ineffectively at some invisible barrier to ", this.tofollow.name, " and is finally forced to give up."); this.tofollow = #-1; this.on_track = 0; else this.location:announce_all_but(this.ignore, this.name, " enters obediently after ", this.tofollow.name, "."); endif endif endif else player:tell(this.name, " watches your movements curiously for a moment and then ", this:ignore_msg(0), "."); this.location:announce_all_but({@this.ignore, player}, this.name, " watches ", player.pp, " movements curiously for a moment and then ", this:ignore_msg(1), "."); endif . @verb :"@master*of" this is any @program :@masterof "Usage: @master*of is "; "Adds the person specified by to the pet's list of masters whom it will obey and from whom it will learn new messages, etc."; if (this == #28280) player:tell("You can't make anyone the master of the ", this.name, ". Why not @create a child of it?"); return; endif if ((!$perm_utils:controls(player, this)) || (this.masters && (!(player in this.masters)))) player:tell(this.name, " looks at you strangely, and you get the feeling you shouldn't be ordering ", this.po, " around."); else who = $string_utils:match_player(iobjstr); if (who == $failed_match) player:tell(this.name, " tells you that ", this.ps, " can't find anyone named ", iobjstr, "."); elseif (who == $ambiguous_match) player:tell(this.name, " found several people that might answer to that name. Be more specific."); elseif (who == $nothing) player:tell("No name found. Nothing done."); elseif ((who in this.masters) != 0) player:tell(who.name, " is already a master of ", this.name, "!"); else this.masters = {@this.masters, who}; player:tell(this.name, " now recognizes ", who.name, " as one of its masters."); who:tell(this.name, " now recognizes you as one of its masters."); endif endif . @verb :"pet" this none none @program :pet player:tell("You gently pet ", this.name, "."); player.location:announce(player.name, " gently pets ", this.name, "."); this.location:announce_all_but(this.ignore, this.name, " ", this.pet_response_msg ? this.pet_response_msg | this:soundverb(), "."); . @verb :"anti_message_recursion" this none this @program :anti_message_recursion for thing in (callers = callers()) if (((thing[2] == "random_msg") && $object_utils:isa(thing[1], #28280)) || (length(callers) > 10)) this.msg_lapse = 0; return; endif endfor return 1; . @verb :"eavesdrop" this none this @program :eavesdrop for listener in (this.listeners) if (listener:is_listening()) listener:tell(this.name, (" hears, \"" + tostr(@args)) + "\""); else this.listeners = setremove(this.listeners, listener); endif endfor . @verb :"ungag unsil*ence unmuz*zle" this none none @program :ungag if (!(player in this.ignore)) player:tell(this.name, " isn't ignoring you. Maybe ", this.ps, " just doesn't feel like talking right now."); elseif (player.location != this.location) player:tell("You can't reach ", this.name, " from here."); else this.ignore = setremove(this.ignore, player); player:tell("You unstrap the muzzle from ", this.name, ". How humane and kind of you to do so!"); this.location:announce_all_but({@this.ignore, player}, player.name, " unstraps the cruel muzzle ", player.ps, " had placed upon ", this.name, "."); endif . @verb :"action" this none this @program :action return this.actions ? this.actions[random(length(this.actions))] | "scratches"; . @verb :"@sound @action" this is any @program :@sound "Usage: @sound/@action is "; "This adds a sound or action to the pet's list. These are not the messages from which the pet randomly draws when it hears something."; if ((player in this.masters) || (!this.masters)) propname = verb[2..length(verb)] + "s"; if (iobjstr) this.(propname) = setadd(this.(propname), iobjstr); player:tell("\"", iobjstr, "\" added to ", this.name, "'s list of ", propname, "."); else player:tell_lines({(($string_utils:capitalize(propname) + " currently known by ") + this.name) + ":", @this.(propname)}); endif else player:tell(this.name, " remains faithfully obedient to ", this.pp, "master", (length(this.masters) > 1) ? "s" | "", " by ignoring you."); endif . @verb :"obey_msg ignore_msg" this none this @program :obey_msg general = args[1]; if (general == 1) guy = player.name; else guy = "you"; endif string = this.((this.lazy ? "lazy_" | "act_") + verb); message = string ? string | ((verb[1..length(verb) - 4] + "s ") + guy); return message; . @verb :"@rmaction @rmsound" any from this @program :@rmaction "Usage: @rmaction/sound from "; "This removes the action or sound (which must be typed exactly) from the pet's lists; these are not the lists from which the pet randomly draws when it hears something."; if ((player in this.masters) || (!this.masters)) propname = verb[4..length(verb)] + "s"; if (dobjstr in this.(propname)) this.(propname) = setremove(this.(propname), dobjstr); player:tell("\"", dobjstr, "\" removed from ", this.name, "'s list of ", propname, "."); else player:tell("\"", dobjstr, "\" isn't in ", this.name, "'s list of ", propname, "."); endif else player:tell(this.name, " remains faithfully obedient to ", this.pp, " master", (length(this.masters) > 1) ? "s" | "", " by ignoring you."); endif . @verb :"add_message" this none this @program :add_message if (caller_perms() == #28280.owner) player:tell("Which verb would you like to link to the message? (Enter for none)"); linkverb = $command_utils:read(); this.(args[2]) = setadd(this.(args[2]), {args[1], linkverb ? linkverb | 0}); player:tell("You have taught ", this.name, " a new message."); else return E_PERM; endif . @verb :"display_message" this none this @program :display_message if (caller_perms() == #28280.owner) english_type = (type = args[1])[1..length(type) - 4]; if (this.(type)) messages = {"Messages", "========"}; verbs = {"Verbs", "====="}; increment = 0; for item in (this.(type)) increment = increment + 1; messages = listappend(messages, (tostr(increment) + "--") + $string_utils:pronoun_sub(item[1])); verbs = listappend(verbs, item[2]); endfor player:tell($string_utils:capitalize(english_type), " messages and linked verbs known by ", this.name, ": (0 == no verb)"); player:tell_lines($string_utils:columnize({@messages, @verbs}, 2)); else player:tell(this.name, " doesn't have any ", english_type, " messages."); endif else return E_PERM; endif . @verb :"remove_message" this none this @program :remove_message if (caller_perms() == #28280.owner) index = args[1]; prop = args[2]; if (length(this.(prop)) >= index) player:tell("\"", this.(prop)[index][1], "\" removed from ", this.name, "'s list of ", prop[1..length(prop) - 4], " messages."); this.(prop) = listdelete(this.(prop), index); else player:tell(this.name, " doesn't have a ", $string_utils:english_ordinal(index), " message!"); endif else return E_PERM; endif . @verb :"@rmactive @rmlazy" any from this @program :@rmactive "Usage: @rmactive/lazy from "; "This verb removes the Nth random message from the pet, as displayed by @info ; @rmactive removes from the active list; @rmlazy removes from the lazy list. Linked verbs must be removed via @rmverb if they are no longer desired."; if ((player in this.masters) || (!this.masters)) type = verb[4..length(verb)] + "msgs"; if ((index = tonum(dobjstr)) == 0) player:tell("Usage: ", verb, " from ", this.name); else this:remove_message(index, type); endif else player:tell(this.name, " doesn't like your feeble brainwashing attempts."); endif . @verb :"@info" this none none @program :@info "Usage: @info "; "Displays information about pet, including masters, current status, and lists of messages."; if ((player in this.masters) || (!this.masters)) player:tell($string_utils:center("Information Pertaining to " + this.name, 79)); player:tell("Masters: ", this.masters ? $string_utils:english_list($list_utils:map_prop(this.masters, "name")) | "Everybody"); player:tell("Following: ", valid(this.tofollow) ? this.tofollow.name | "Nothing", " (", this.tofollow, ")"); player:tell("Ignoring: ", this.ignore ? $string_utils:english_list($list_utils:map_prop(this.ignore, "name")) | "Nothing."); player:tell($string_utils:left("Status: " + (this.lazy ? "Lazy" | "Active"), 39), $string_utils:left(((("Noisiness: " + ((this.noisy == 0) ? "Quiet" | ((this.noisy == 1) ? "Noisy" | "Intermittent"))) + " (") + tostr(this.noisy)) + ")", 40)); player:tell(); this:display_message("activemsgs"); player:tell(); this:display_message("lazymsgs"); sounds = this.sounds ? {"Sounds", "======", @this.sounds} | {"No sounds"}; actions = this.actions ? {"Actions", "=======", @this.actions} | {"No actions"}; player:tell(); player:tell_lines($string_utils:columnize(this:equal_list(actions, sounds), 2)); else player:tell("You do not have master permissions over ", this.name, " (", this, ")."); endif . @verb :"equal_list" this none this @program :equal_list len1 = length(list1 = args[1]); len2 = length(list2 = args[2]); if (len1 < len2) list1 = this:fill_list(list1, len2, ""); else list2 = this:fill_list(list2, len1, ""); endif return {@list1, @list2}; . @verb :"fill_list" this none this @program :fill_list ":fill_list(list, length, filler) => fills list to length by appending filler; returns original list if the length of list is longer than or equal to length"; item = args[1]; length = args[2]; filler = args[3]; if (length(item) < length) while (length(item) != length) item = listappend(item, filler); endwhile endif return item; . @verb :"g*et t*ake" this none none @program :get pass(@args); suspend(0); if (this.location == player) player:tell(this.name, this:action(), " at you, seeking to escape. Finally, it manages to squirm out of your grasp."); if (player.location:accept(this)) this:moveto(player.location); this.location:announce_all_but({player, @this.ignore}, this.name, " struggles free of ", player.name, "'s grasp."); else this:moveto(valid(this.home) ? this.home | this.owner.home); this.location:announce_all_but(this.ignore, this.name, " struggles homeward, escaping from the clutches of ", player.name, "."); endif endif . @verb :"sweep_msg" this none this @program :sweep_msg listeners = setremove(this.listeners, player); if (listeners) who = {}; for person in (listeners) who = listappend(who, ((person.name + " (") + tostr(person)) + ")"); endfor return "is listening for " + $string_utils:english_list(who); endif . @verb :"is_listening" this none this rx @program :is_listening "Note: This verb is !d."; for guy in (this.listeners) if (typeof(idle_seconds(guy)) != ERR) return 1; endif endfor . @verb :"tell_may_be_broken" this none this @program :tell_may_be_broken if (this.noisy > 0) this.msg_lapse = this.msg_lapse + 1; else this.msg_lapse = this.noisy = 0; endif if (valid(follow = this.tofollow) && (this.location != follow.location)) fork (0) sleep = 0; this.location:announce_all_but({this, @this.ignore}, this.name, " follows ", follow.name, " obediently."); this:moveto(follow.location); followname = follow.name; if (this.location == follow.location) this.location:announce_all_but(this.ignore, this.name, " enters obediently after ", followname, "."); else if (this.on_track) follow:tell(this.name, " ", this:action(), " ineffectively at some invisible barrier to you and is finally forced to give up."); this.on_track = 0; endif this.tofollow = #-1; this:moveto(dest = valid(this.home) ? this.home | this.owner.home); this.location:announce_all_but(this.ignore, (this.location == dest) ? ((this.name + " returns home after losing track of ") + followname) + "." | (((this.name + " finds that it can't return home after losing track of ") + followname) + ".")); endif endfork endif if ((this.msg_lapse > this.noisy) && this:anti_message_recursion()) "Thus, setting .noisy to 1 will cause the pet to try to make some noise every other time it hears something."; this.msg_lapse = 0; "Tell was once broken by the wizards for being infinitely reactive"; "A pet left in the entranceway would run its tell verb indefinitely, for example"; "Two pets left together could activate each other indefinitely"; "This can cause harmful lag on large DBs that don't have CPU cycles to burn"; "First, test for location, and if not the pet's or owner's home, increment a counter"; if ((this.location != this.home) || (this.location != this.owner.home)) sleep = sleep + 1; endif if (this.lazy && this.lazymsgs) message = random(length(this.lazymsgs)); this:random_msg(message); elseif ((!this.lazy) && this.activemsgs) message = random(length(this.activemsgs)); this:random_msg(message); endif if (sleep >= this.sleep) this.msg_lapse = this.noisy = 0; endif endif if (this.listeners) this:eavesdrop(@args); endif . @verb :"@rmmaster" any from this @program :@rmmaster "Usage: @rmmaster from "; "This verb removes one of the pet's current masters from its .masters list. Current masters can remove themselves only, but the pet's owner can remove anyone from the list."; if ($command_utils:object_match_failed(dobj, dobjstr)) elseif (!($perm_utils:controls(player, this) || (player == dobj))) player:tell("Sorry, but you must either own ", this.name, " or be one of its masters removing yourself from ", this.pp, " list of masters."); elseif (!(dobj in this.masters)) player:tell(dobj.name, " isn't in ", this.name, "'s list of masters."); else this.masters = setremove(this.masters, dobj); player:tell(dobj.name, " removed from ", this.name, "'s list of masters."); endif . @verb :"tell_old" this none this @program :tell_old if (this.noisy > 0) this.msg_lapse = this.msg_lapse + 1; else this.msg_lapse = this.noisy = 0; endif if (valid(follow = this.tofollow) && (this.location != follow.location)) fork (0) this.location:announce_all_but({this, @this.ignore}, this.name, " follows ", follow.name, " obediently."); this:moveto(follow.location); followname = follow.name; if (this.location == follow.location) this.location:announce_all_but(this.ignore, this.name, " enters obediently after ", followname, "."); else if (this.on_track) follow:tell(this.name, " ", this:action(), " ineffectively at some invisible barrier to you and is finally forced to give up."); this.on_track = 0; endif this.tofollow = #-1; this:moveto(dest = valid(this.home) ? this.home | this.owner.home); this.location:announce_all_but(this.ignore, (this.location == dest) ? ((this.name + " returns home after losing track of ") + followname) + "." | (((this.name + " finds that it can't return home after losing track of ") + followname) + ".")); endif endfork endif if ((this.msg_lapse > this.noisy) && this:anti_message_recursion()) "Thus, setting .noisy to 1 will cause the pet to try to make some noise every other time it hears something."; this.msg_lapse = 0; if (this.lazy && this.lazymsgs) message = random(length(this.lazymsgs)); this:random_msg(message); elseif ((!this.lazy) && this.activemsgs) message = random(length(this.activemsgs)); this:random_msg(message); endif endif if (this.listeners) this:eavesdrop(@args); endif . ;"Your object should now be installed."