Peter R. said: Brian said: A script could send messages as a specific player or character, but there's no way to change what's selected in the Speaking As dropdown below the chat. What script would be required, and how can I get the scripts to work I've tried repeatedly. I've looked on youtube but although there are a ton of videos showcasing scripts none of them show a step by step on how to activate them and use them in a campaign. To get a script into the campaign, copy the script's code and paste it into a tab on the "API Scripts" page. Make sure to give the tab a name, and hit "Save Script". Here's an (untested) sample script that would post to the chat as a given character. To use it, you'd type !as Peter R.|Hello, world! Note that there is currently a bug with the sendChat function, and if you use this with a player's name, their avatar won't show up. If you use a character's name, however, it should work fine. You can also include partial names, and the script will to its best to find who you're talking about. I haven't spent the time to make this script work with inline rolls, but it's absolutely doable. on('chat:message', function(msg) { if (msg.type != 'api') return; var command = msg.content.split(' ').shift().substring(1); if (command == 'as') { var content = msg.content.substring(4); var parts = content.split('|'); if (parts.length < 2) { sendChat('SYSTEM', 'No player or character specified for message sender'); return; } var who = parts.shift(); var message = parts.join('|'); var players = filterObjs(function(obj) { if (obj.get('type') != 'player') return false; return (obj.get('displayname').indexOf(who) >= 0); }); if (players.length > 0) { who = 'player|' + players[0].id; } else { var characters = filterObjs(function(obj) { if (obj.get('type') != 'character') return false; return (obj.get('name').indexOf(who) >= 0); }); if (characters.length > 0) { who = 'character|' + characters[0].id; } else { sendChat('SYSTEM', 'Could not find a player or character matching the name ' + who); return; } } sendChat(who, message); } }); This script also doesn't check that the person sending the command has permission to speak as the given player or character, so watch out! Checking those permissions could be done in the filterObjs callback function. For example, you could allow the GM to talk as anybody, but others can only talk as a player if they are that player, and can only talk as a character if they have control over that character.