(EDIT: on further experimentation, it looks like a little of what I want to do already works! I didn't realize the formula was @{character|attribute}) I would love to have the following commands added to the text chat window (and hence the macro system): /as Aerith This causes me to select the token linked to Aerith on the object layer, and causes all references to @{attribute} to be replaced with @{Aerith|attribute}. For example, @{hitpoints} will be interpreted as @{Aerith|hitpoints}. (Selecting Aerith from the 'As:' dropdown should have the same effect) /as This causes all references to @my:attribute to be replaced with the character associated with the next character-linked token that I click. For example, if I type /as (or run a macro which has /as in it) and click on Aerith, all references to @{hitpoints} will be interpreted as @{Aerith|hitpoints}. If you don't select a character-linked token with your next click, it says "not a character" and cancels back out to the chat window. /target Bob This causes me to select the token linked to Bob on the object layer, and causes all references to @{target|attribute} to be replaced with @{Bob|attribute} within macros. For example, @{target|hitpoints} will be interpreted as @{Bob|hitpoints}. /target This causes all references to @{target|attribute} to be replaced with the character associated with the next character-linked token that I click. For example, if I type /target (or run a macro which has /target in it) and click on Bob, all references to @{target|hitpoints} will be interpreted as @{Bob|hitpoints}. If you don't select a character-linked token with your next click, it says "not a character" and cancels back out to the chat window. /set @{character|attribute} = value The "set" command takes whatever is after the "=" and processes it as if it was typed into chat, but instead of putting the result into the chat window, it puts it into the specified @{character|attribute}. For example, if I type: /set @{Bob|damage_die} = /roll 1d6-1 It will perform /roll 1d6-1, and then put the result of that roll into @{Bob|damage_die}. /if value1 == value2 then command This will check to see if value1 and value2 are string-equivalent. If they are, then it performs command (which could be just text to say, or a #macro, or /em or /if or /set or /roll); otherwise, it does nothing. (We don't really need nesting or do...while control, since we can use #macros as a recursion system) This lets me set up things like "Descent" dice, like so: #attack /set @{damage_die} = /roll 1d6-1 /set @{range_die} = /roll 1d6-1 /set @{damage} = X /if @{damage_die} == 1 then /set @{damage} = ♥♥♥ /if @{damage_die} == 2 then /set @{damage} = ★♥♥ /if @{damage_die} == 3 then /set @{damage} = ♥♥ /if @{damage_die} == 4 then /set @{damage} = ★♥ /if @{damage_die} == 5 then /set @{damage} = ♥ /if @{range_die} == 0 then /set @{damage} = ★@{damage} /set @{range} = /roll 1d0*0 + @{range_die} + @{damage_die} You rolled @{range}@{damage}.