I’ve really enjoyed working in Roll20 since I stumbled across it and I love the community, which I’ve found helpful, knowledgeable, and every bit as excited about gaming as I am. As I’ve been porting my campaigns and building custom character sheets, I’ve structured my work into two groups: that which is game-specific and that which is generic and reusable. I wanted to share the latter of these with the community, in the form of a project I call “ORAL ORCS”: <a href="https://github.com/onyxring/Roll20OralOrcs" rel="nofollow">https://github.com/onyxring/Roll20OralOrcs</a> ORAL ORCS is a collection of scripts which work together, a framework really. It’s easy to install, has a footprint which resides in both the API and Workersheet spaces, and adds support for modern features of the JavaScript language. Contrary to the name, it is not genre-specific and has nothing to do with orcs. Or dentists. Like many frameworks, it abstracts underlying services, simplifying them. I believe it makes code easier to write, easier to read, and easier to understand. By design, the framework is inert: it can be added to an existing game with no effect until its features are deliberately used. I’ve put together an introductory guide/tutorial, in which I try to strike a balance between technical content and readability: <a href="https://github.com/onyxring/Roll20OralOrcs/blob/master/OralOrcs.pdf" rel="nofollow">https://github.com/onyxring/Roll20OralOrcs/blob/master/OralOrcs.pdf</a> Outside of the above document, a few examples are in order for this announcement. These don’t equate to an exhaustive list of features, but they should provide a taste of what is provided, assuming readers are familiar with how to do these things in vanilla Roll20 for contrast: 1. The framework makes the act of manipulating character attributes as simple as manipulating properties. Here we add a character’s recovery attribute to his or her hitPoints attribute: pc.hitPoints = pc.hitPoints + pc.recovery; Note that calls to the traditional getAttrs/setAttrs functions are abstracted away from your code. 2. Working with Repeating Sections is also more intuitive. Below, we cycle through a character’s list of spells, totaling their collective “attack” power and removing the spells that have been marked as used up/expended: var totAtkPower = 0; pc.repeating.spells.forEach(spell=>{ if(spell.isAttack=="on") totAtkPower = totAtkPower + spell.power; if(spell.isExpended=="on") spell.delRow(); }); Here, there is no need to make calls to getSectionIds() and we read the attributes of spells in the same fashion we did character attributes in the previous example. We can also write to these in the same way. The delRow() call removes individual items. Similarly… var newSpell = pc.repeating.spells.addNew(); …will create a new entry in the Repeating Section. 3. ORAL ORCS includes a simplified approach to creating macro/chat processors: class api extends orProcessor{ constructor(){ super("!API"); } time(){ orSend.all(`Current Time:${new Date().toUTCString()}`); } hello(){ orSend.all(`Right back at you.`); } } new api(); Parsing of chat text is done for you. The above is all that is required to begin processing !API commands. For demonstration, it also creates two simple commands that will trigger when the correct text is placed in chat: !API time and !API hello In addition to the above examples, the framework provides a recursive template system and custom dice rolling. It includes the recently released AsyncRoll20 script, so the native functions setTimeout() and setInterval() now work correctly in Sheetworkers. The traditional API function sendChat() has been brought into Sheetworkers as well. Today, the framework is nascent, with a version number less than 1, and I’m confident that it is NOT bug-free. Quite the contrary. I have, however, been using it for my personal projects, so there has been a measure of stabilization already. I have had, and continue to have, a lot of satisfaction building ORAL ORCS and I hope other creators might find it useful. From those that are inclined, I’d appreciate feedback on how to make ORAL ORCS more helpful, easier to use, and/or the guide easier to read. Cheers, Jim at OnyxRing