This is a really interesting concept! I agree with Aaron in the basic setup. Different rollable tables for different conversations and/or different qualities of those same different conversations. If you wanted to do this with metascripts, you'd primarily want Muler and ZeroFrame (or just get the MetaScriptToolbox , and have all the toys at your disposal). Muler will treat rollable tables as direct-access tables with indices built from the weight of each item... so if the first item has a weight of 3, it will occupy indices 1, 2, and 3. If the next item has a weight of 5, it will occupy 4, 5, 6, 7, and 8, etc. The indices are open at both ends, so if you have a total weight in your table of 10 but you as for index 12, you will get the item at 10. Similarly, since with Muler you'd be asking for an item by its index, you can control how certain items can be returned. For instance, if you have 120 items of equal weight (1) in your table (giving a total weight of 120), but you only roll 1d100 to return an item, you'll never get the top 20 things. But if you have a potential modifying attribute that could have a value of 0 to 20, you could instead roll 1d100+@{selected|modifier} and you would get a different range (from the modifier value as the lower bound and 100-plus-the-modifier-value as the upper bound). And because the table indices are open ended, even if you gave an additional +10 bonus, you'd never "fall off" the set of returns... you could roll a 130 as your result, but you'd still get item 120. Here is how that might look: Setup Rollable Table: PlotPoint1_GuardConversation Populate with phrases and snippets of overheard conversation as you see fit. I only put 5 items in this table, but you might have more. Weight them appropriately based on the above explanation of how the weights generate the indices and what roll you will want. I weighted my entries as 1-each, and intended to roll a 1d4 + mod against the table. Retrieve Data Points To retrieve a given entry from that table, we'll use a roll. Like I said, I built the table as if I were going to typically roll a 1d4 (so the last item would be out of reach without a mod). You might have 140 items and be rolling a 1d100 plus modifiers, leaving the last 40 items out of reach except with the help of those mods. If my roll were going to be a d4 plus the character's listen attribute (imagine that's a 0 or a 1), that would look like: [[1d4 + @{selected|listen} ]] Then we'd use a .value (from ZeroFrame) to get the roll result as a number: [[1d4 + @{selected|listen} ]].value Then we'd use that in a Muler-get statement, referencing the PlotPoint1_GuardConversation table: get.table.PlotPoint1_GuardConversation. [[1d4 + @{selected|listen} ]].value/get As long as you use that in a bangsy message, you have your overheard item. Here is a simple output using the ZeroFrame {&simple} tag to drive the resulting command line to the chat: !/w gm The character overhears: get.table.PlotPoint1_GuardConversation. [[1d4 + @{selected|listen} ]].value/get {&simple} Obviously you could have a query of potential whisper targets, and you said something about wanting the ability to see the result first and then send it on to the player. Here is an implementation that presents the result to you in a template that includes a button to forward the result on to the character: !/w gm &{template:default}{{name=Overheard Conversation}} {{Overheard=get.table.PlotPoint1_GuardConversation.[[1d4 + @{selected|listen} ]].value/get}} {{Send to player=[SEND]^(`/w @{selected|character_name} You overhear: get.table.PlotPoint1_GuardConversation.$[[0]].value/get)}}{&escape ^}{&simple} Expanding (Recursion) A table item could, itself, have a Muler-get statement as a part of it. That means that you could have a rarer-result have not only its own statement, but another roll against the same conversation table (or another conversation table). For instance: You hear who the assassin is? I heard it was Mortimer Creagle. get.table.PlotPoint1_GuardConversation.[[1d4]].value/get As long as Muler detects a new construction it should act on, ZeroFrame will keep the metascript loop going. This could get harder to present to the player (relaying it through a button), so if you want to go this route, post back and we can brainstorm options. Expanding (Loop) Another way to expand it would be to roll for a number of snippets the character might overhear, then build the template around them. This would require a counter variable set with a Muler-set, so I won't go into it in this post, but let me know if you would be interested. The basic idea would be determining how many snippets the character overhears, then generating a new line in the template output for that overheard phrase. Each of them would come with their own SEND button so you could pass it on to the player (or choose among them which make the most sense to share). Expanding (DiscreteWhisper) DiscreteWhisper is a mod script that lets you send individualized whispers to a handful of players at once. For instance, someone could hear more (or less) than another character, or they could mishear something that others heard properly. I honestly owe DiscreteWhisper a refactor, but for now you can check out the expanation in the thread and see if something like that would help. Since DiscreteWhisper is a standard script, the metascripts could still populate the output command line before DiscreteWhisper ever saw it, allowing you to dynamically build the overheard content. Again, as with the others, if you want to go this route, post back and I'll try to help.