I have hit a snag with Kurt's Action Menu macro mentioned HERE . I loved the idea of using a spell mule to customize spells. I am sure we have all found spells that just don't work as described within the sheet framework (magic missile, scorching ray, etc.), and there are lots of great spell macros to go around (lightning bolt, fireball, etc.). Kurt's Action Menu macro to the rescue. My group and I enjoy seeing the 3d dice roll, and since the built-in formatting in the action menu foregoes the visual dice, and does not seem to trigger Combat Master, I decided to make a spell mule and copy all the roll commands from the player's spell lists directly in, incorporating several other API commands when appropriate, adding some flavor and fluff, while still retaining the visual appeal of the dice and triggering Combat Master. HOWEVER, I seem to have hit upon an issue with this macro command. After spending literally days copying roll commands from the sheet button into the Spell Mule action list, and accumulating over a hundred abilities, I found that some spells just would not fire from the SM Ability and would default to the built-in format. After combing through my spell list and testing each entry, I found a patern. Apparently, this Scriptcard macro fails to detect spells from the Ability section of the spell mule if it's name is more than two words. Any spell with two or less words works fine, but spells like Toll the Dead, Word of Radiance, Shield of Faith, Tasha's Hideous Laughter, Mass Healing Word, the list goes on, fail to register in the substitution framework of the macro. Kurt, or anyone else, do you have any thoughts? Here is my modified Action Menu where I have removed all basic attack syntax, leaving a trimmed down Spell Action Menu. (It also gives a report on available resources like Sorcery Points and other abilities stored in the Repeating Resource list which I have customized for each character.) !script {{ --/|Script Name : 5E Action Menu --/|Version : 1.6.4 --/|Requires SC : 1.3.9+ --/|Author : Kurt Jaegers, Catori Swann --/|Description : This script can be used with either a PC or NPC selected. It will generate an action menu with clickable --/| buttons to execute character actions and cast spells. The menu is whispered to the player executing the --/| script, while the results of clicking the action buttons are displayed in general chat. --/|========================================================================================================= --/|Settings Area - Customize the behavior of the script here --/|If you create a "spell mule" character and put its name here, it's ability list will be checked for --/|abilities that match the name of each spell found on PCs. If a match is found, the button that is --/|created for that spell will be a sheet-button for that ability instead of a reentrant button back to --/|this script for generic processing. This lets you define "special case" macros for non-standard spells. --/|The name of the ability on the spell mule needs to exactly match the spell name (case sensitive) --&spellmulename|Spell_Mule --/|Set to "1" to enable loading of settings information from a saved format named after the character (case sensitive) --&UseNamedCharacterSettings|1 --/|If this value is set to 1, prepared spells checks will be skipped --&skipPreppedSpellsCheck|0 --/|If this value is set to 1, NPC attack information will be sent to the GM only, and AC will be masked from the players. --&sendGmInfo|1 --/|These are here for future implementation, and don't do anything quite yet: --&hipoint_bar_number|3 --&damageapi|token-mod --/|End Settings Area --/|========================================================================================================= --/|Give the script a reentrant name based on the selected character id so we can have multiple instances at the same time --#reentrant|CharacterAction @{selected|character_id} --/|Set up some style information for the action menu and subsequent cards. These attempt to somewhat --/|simulate the 5E style --#bodyfontface|Helvetica --#bodyfontcolor|#000000 --#buttonfontsize|11px --#buttonbackground|#0229e8 --#buttonfontface|Tahoma --#titlecardbackground|#f6efd6 --#titlefontcolor|#000000 --#titlefontsize|1.5em --#titlefontshadow|0 --#oddrowbackground|#f6efd6 --#evenrowbackground|#f6efd6 --#subtitlefontcolor|#000000 --#emoteBackground|#070091 --emoteFontColor|#FFFFFF --/|The menu is whispered to the player executing the macro. #whisper will be set again later for the --/|actual output to be public. --#whisper|self --/|Store the selected character so we can use it later even if it gets de-selected --#sourcetoken|@{selected|token_id} --?[&UseNamedCharacterSettings] -eq 1|[ --lsettings|[*S:character_name] --]| --#emotestate|visible --#emoteText|[*S:character_name] [*s:castquote] --#title|[*S:character_name] --#rightsub|[*S:class_display] --+|[hr #58180d] --+|[t border=0 width=90%] [tr][td][b] &nbsp;&nbsp;&nbsp;Save DC:[/b] [*S:spell_save_dc] [/td][td][r] [b]Attack Bonus:[/b] +[*S:spell_attack_bonus][/r][/td][/tr][/t][br] --+|[c][b][*S:class_resource_name]: [/b][*S:class_resource][/c] --+|[c][b][*S:other_resource_name]: [/b][*S:other_resource][/c] --+|[c][b][*S:repeating_resource_$1_resource_left_name]: [/b][*S:repeating_resource_$1_resource_left][/c] --+|[c][b][*S:repeating_resource_$0_resource_left_name]: [/b][*S:repeating_resource_$0_resource_left][/c] --+|[c][b][*S:repeating_resource_$4_resource_left_name]: [/b][*S:repeating_resource_$4_resource_left][/c] --+|[c][b][*S:repeating_resource_$5_resource_left_name]: [/b][*S:repeating_resource_$5_resource_left][/c] --+|[c][b][*S:repeating_resource_$5_resource_right_name]: [/b][*S:repeating_resource_$5_resource_right][/c] --+|[hr #58180d] --+[c]Available Spells[/c]|[br] --+|[t border=0 width=100%][tr][td][c][b]Level 1:[/b] [*S:lvl1_slots_total][/c][/td][td][c][b]Remaining:[/b] [*S:lvl1_slots_expended][/c][/tr][/td][/t] --+|[t border=0 width=100%][tr][td][c][b]Level 2:[/b] [*S:lvl2_slots_total][/c][/td][td][c][b]Remaining:[/b] [*S:lvl2_slots_expended][/c][/tr][/td][/t] --+|[t border=0 width=100%][tr][td][c][b]Level 3:[/b] [*S:lvl3_slots_total][/c][/td][td][c][b]Remaining:[/b] [*S:lvl3_slots_expended][/c][/tr][/td][/t] --/|Determine if the selected character is a PC or NPC and process appropriately --?[*S:npc] -eq 1|proc_npc|proc_pc --:proc_pc| --+|[hr #58180d] --#whisper|self --]| --Rfirst|[*S:character_id];repeating_spell-cantrip --&PCCantrips|[br] --?"[*R:spellname]" -ne "NoRepeatingAttributeLoaded"|[ --:PCCantrips_Display| --~testName|string;replace; ;-;[*R:spellname] --~testMule|system;findability;[&spellmulename];[&testName] --?[&testMule] -ne "AbilityNotFound"|MULE_CANTRIP --?"[*R:spelloutput]" -eq ATTACK|CANTRIP_GENERATE_WITH_TARGET --&PCCantrips|+ [rbutton][*R:spellname]::EXEC_PC_CANTRIP;[*R:spellname]|NONE[/rbutton] --^CANTRIP_END_GENERATE| --:CANTRIP_GENERATE_WITH_TARGET| --&PCCantrips|+ [rbutton][*R:spellname]::EXEC_PC_CANTRIP;[*R:spellname]|&#64;{target|character_id}[/rbutton] --^CANTRIP_END_GENERATE| --:MULE_CANTRIP| --&PCCantrips|+ [sheetbutton][*R:spellname]::[&spellmulename]::[&testName][/sheetbutton] --:CANTRIP_END_GENERATE| --Rnext| --?"[*R:spellname]" -ne "NoRepeatingAttributeLoaded"|PCCantrips_Display --+[C]Cantrips[/C]|[C][&PCCantrips][/C][br] --]| --%levelCounter|1;9 --Rfirst|[*S:character_id];repeating_spell-[&levelCounter] --&PCSpells|[br] --=PCSpellCount|0 --?"[*R:spellname]" -ne "NoRepeatingAttributeLoaded"|[ --:PCSpells_Display| --?[&skipPreppedSpellsCheck] -eq 1|SKIP_PREP_CHECK --?[*S:class] -eq "Sorcerer"|SKIP_PREP_CHECK --?"X[*S:multiclass1_flag]" -eq "X1" -and [*S:multiclass1] -eq "Sorcerer"|SKIP_PREP_CHECK --?"X[*S:multiclass2_flag]" -eq "X1" -and [*S:multiclass2] -eq "Sorcerer"|SKIP_PREP_CHECK --?"X[*S:multiclass3_flag]" -eq "X1" -and [*S:multiclass3] -eq "Sorcerer"|SKIP_PREP_CHECK --&isWizard|0 --?[*S:class] -eq "Wizard"|&isWizard;1 --?"X[*S:multiclass1_flag]" -eq "X1" -and [*S:multiclass1] -eq "Wizard"|&isWizard;1 --?"X[*S:multiclass2_flag]" -eq "X1" -and [*S:multiclass2] -eq "Wizard"|&isWizard;1 --?"X[*S:multiclass3_flag]" -eq "X1" -and [*S:multiclass3] -eq "Wizard"|&isWizard;1 --?[&isWizard] -eq 0 -and "X[*R:spellprepared]" -ne "X1"|DONE_SPELL_BUTTON --?"X[*R:spellprepared]" -ne "X1" -and "X[*R:spellritual]" -ne "XYes"|DONE_SPELL_BUTTON --&spellsuffix| --?"X[*R:spellritual]" -eq "XYes"|&spellsuffix; [R] --:SKIP_PREP_CHECK| --~testName|string;replace; ;-;[*R:spellname] --~testMule|system;findability;[&spellmulename];[&testName] --?[&testMule] -ne "AbilityNotFound"|MULE_SPELL --&slotString| --?[&levelCounter] -eq 9|SKIP_SLOT_LIST --&slotString||&# --&slotString|+63;{Slot Level| --%slotcounter|[&levelCounter];9 --&slotString|+[&slotcounter] --?[&slotcounter] -eq 9|SKIP_VERTICAL_BAR --&slotString|+| --:SKIP_VERTICAL_BAR| --%| --&slotString|+} --^DONE_SLOT_LIST| --:SKIP_SLOT_LIST| --&slotString||9 --:DONE_SLOT_LIST| --&PCSpells|+ [rbutton][*R:spellname][&spellsuffix]::EXEC_PC_SPELL;[&levelCounter]|[*R:spellname]|&#64;{target|character_id}[&slotString][/rbutton] --=PCSpellCount|[$PCSpellCount.Raw] + 1 --^DONE_SPELL_BUTTON| --:MULE_SPELL| --&PCSpells|+ [sheetbutton][*R:spellname][&spellsuffix]::[&spellmulename]::[&testName][/sheetbutton] --=PCSpellCount|[$PCSpellCount.Raw] + 1 --:DONE_SPELL_BUTTON| --Rnext| --?"[*R:spellname]" -ne "NoRepeatingAttributeLoaded"|PCSpells_Display --?[$PCSpellCount] -eq 0|PC_SKIP_LEVEL_DISPLAY --+[C]Level [&levelCounter] Spells[/C]|[C][&PCSpells][/C] [br] --:PC_SKIP_LEVEL_DISPLAY| --]| --%| --X| --:EXEC_PC_CANTRIP| --+|[hr #58180d] --~cantrip_name|string;before;|;[&reentryval] --~cantrip_target|string;after;|;[&reentryval] --#whisper| --#targettoken|[&cantrip_target] -->Find_Active_Global_Attack_Modifiers|[*S:character_id];PC_GAM --Rfind|[*S:character_id];[&cantrip_name];repeating_spell-cantrip;spellname --?"[*R:spelloutput]" -eq ATTACK|PC_ATTACK_CANTRIP|PC_CARD_CANTRIP --:PC_ATTACK_CANTRIP| --?"X[*R:spellattack]" -eq "XRanged" -or "X[*R:spellattack]" -eq "XMelee"|CANTRIP_ATTACK_ROLL|CANTRIP_DONE_ATTACK_ROLL --&cantrip_crit|0 --:CANTRIP_ATTACK_ROLL| --&rollType|1d20 --?"[*S:advantagetoggle]" -inc advantage|&rollType;2d20kh1 --?"[*S:advantagetoggle]" -inc disadvantage|&rollType;2d20kl1 --=attackRoll|[&rollType] + [*S:spell_attack_bonus] [Spell Atk Bonus] [&PC_GAM] --=AC|[*T:ac] --?"X[*T:npc_ac]" -ne "X"|=AC;[*T:npc_ac] --?[&sendGmInfo] -eq 1|[ --+[*R:spellattack] Attack|rolled [$attackRoll] vs the target's AC[br][br] --]|[ --+[*R:spellattack] Attack|rolled [$attackRoll] vs AC [b][$AC.Raw][/b][br][br] --]| --?[$attackRoll.Base] -eq 20|=cantrip_crit;1 --?[$attackRoll.Total] -lt [$AC]|CANTRIP_ATTACK_MISS --?[$attackRoll.Base] -eq 1|CANTRIP_ATTACK_MISS --:CANTRIP_DONE_ATTACK_ROLL| --&damageRoll|[*R:spelldamage] --?[*S:level] -ge 5|&damageRoll;+ + [*R:spelldamage] --?[*S:level] -ge 11|&damageRoll;+ + [*R:spelldamage] --?[*S:level] -ge 17|&damageRoll;+ + [*R:spelldamage] --?[$cantrip_crit] -eq 1|&damageRoll;+ + [&damageRoll] --=cantripDamage|[&damageRoll] --?"X[*R:spellsave]" -ne "X"|CANTRIP_SAVE|CANTRIP_NO_SAVE --:CANTRIP_NO_SAVE| --?[$cantrip_crit] -eq 1|&hittag;Critical Hit!|&hittag;Hit! --?[$cantrip_crit] -eq 1|&hitdesc;critically hits|&hitdesc;hits --+[&hittag]|The [*R:spellname] [&hitdesc] and deals [$cantripDamage] [*R:spelldamagetype] damage.[br][br] --^PC_CARD_CANTRIP| --:CANTRIP_SAVE| --+|The target needs to make a DC [*S:spell_save_dc] [*R:spellsave] saving throw or take [$cantripDamage] [*R:spelldamagetype] damage.[br][br] --/&output|The [b][i][*R:spellname][/i][/b] deals [$cantripDamage] [*R:spelldamagetype] damage. --/?"X[*R:spellsave]" -ne "X"|&output;+ The target can make a [*R:spellsave] save vs DC [*S:spell_save_dc] to negate the damage. --^PC_CARD_CANTRIP| --:CANTRIP_ATTACK_MISS| --+The [*R:spellname] attack missed!|[br][br] --:PC_CARD_CANTRIP| --#title|[&cantrip_name] --#leftsub|[*S:character_name] --+|[*R:spelldescription] --:PC_DONE_CANTRIP| --X| --:EXEC_PC_SPELL|spellInfo1=Spell Level, 2=SpellName, 3=Target ID, 4=Slot Level --+|[hr #58180d] --~spellInfo|string;split;|;[&reentryval] --=UpCast|[&spellInfo4] - [&spellInfo1] --#title|[&spellInfo2] --#leftsub|[*S:character_name] --#whisper| --#targettoken|[&action_target] -->Find_Active_Global_Attack_Modifiers|[*S:character_id];PC_GAM --Rfind|[*S:character_id];[&spellInfo2];repeating_spell-[&spellInfo1];spellname --#targettoken|[&spellInfo3] --?"[*R:spelloutput]" -eq ATTACK|PC_ATTACK_SPELL|PC_CARD_SPELL --:PC_ATTACK_SPELL| --?"X[*R:spellattack]" -eq "XRanged" -or "X[*R:spellattack]" -eq "XMelee"|SPELL_ATTACK_ROLL|SPELL_DONE_ATTACK_ROLL --&spell_crit|0 --:SPELL_ATTACK_ROLL| --&rollType|1d20 --?"[*S:advantagetoggle]" -inc advantage|&rollType;2d20kh1 --?"[*S:advantagetoggle]" -inc disadvantage|&rollType;2d20kl1 --=attackRoll|[&rollType] + [*S:spell_attack_bonus] [Spell Atk Bonus] [&PC_GAM] --=AC|[*T:ac] --?"X[*T:npc_ac]" -ne "X"|=AC;[*T:npc_ac] --?[&sendGmInfo] -eq 1|[ --+[*R:spellattack] Attack|rolled [$attackRoll] vs the target's AC[br][br] --]|[ --+[*R:spellattack] Attack|rolled [$attackRoll] vs AC [b][$AC.Raw][/b][br][br] --]| --?[$attackRoll.Base] -eq 20|=spell_crit;1 --?[$attackRoll.Total] -lt [$AC]|SPELL_ATTACK_MISS --:SPELL_DONE_ATTACK_ROLL| --&damageRoll|[*R:spelldamage] --&damageRoll2|[*R:spelldamage2] --&ability_bonus| --?"X[*R:spell_ability]" -eq "Xspell"|[ --~ability|string;before;};[*S:spellcasting_ability] --~ability|string;after;{;[&ability] --?[&ability] -eq strength_mod|&ability_bonus; + [*S:strength_mod] [Spellcasting Ability] --?[&ability] -eq dexterity_mod|&ability_bonus; + [*S:dexterity_mod] [Spellcasting Ability] --?[&ability] -eq constitution_mod|&ability_bonus; + [*S:constitution_mod] [Spellcasting Ability] --?[&ability] -eq intelligence_mod|&ability_bonus; + [*S:intelligence_mod] [Spellcasting Ability] --?[&ability] -eq wisdom_mod|&ability_bonus; + [*S:wisdom_mod] [Spellcasting Ability] --?[&ability] -eq charisma_mod|&ability_bonus; + [*S:charisma_mod] [Spellcasting Ability] --]| --&spell_heal|0 --?"X[*R:spellhealing]" -ne "X"|&spell_heal;1 --?"X[*R:spellhealing]" -ne "X"|&damageRoll;[*R:spellhealing] --?[$UpCast] -eq 0|NO_UPCAST --=upcastDice|[$UpCast.Raw] * [*R:spellhldie] --&damageRoll|+ + [$upcastDice.Raw][*R:spellhldietype] [Upcasting] --:NO_UPCAST| --?[$spell_crit] -eq 1|&damageRoll;+ + [&damageRoll] --?[$spell_crit] -eq 1|&damageRoll2;+ + [&damageRoll2] --?[$spell_crit] -eq 1|&hittag;Critical Hit!|&hittag;Hit! --?[$spell_crit] -eq 1|&hitdesc;critically hits|&hitdesc;hits and deals --?[&spell_heal] -eq 1|&hittag;[b][/b] --?[&spell_heal] -eq 1|&hitdesc;heals for --/&damageRoll|+ [&ability_bonus] --/&damageRoll2|+ [&ability_bonus] --=spellDamage|[&damageRoll] --=spellDamage2|[&damageRoll2] --?"X[*R:spelldamage2]" -ne "X"|TWO_DAMAGE --+[&hittag]|The [*R:spellname] [&hitdesc] [$spellDamage] [*R:spelldamagetype] damage.[br][br] --^DONE_SPELL_DAMAGE| --:TWO_DAMAGE| --+[&hittag]|The [*R:spellname] [&hitdesc] [$spellDamage] [*R:spelldamagetype] damage and [$spellDamage2] [*R:spelldamagetype2] damage.[br][br] --:DONE_SPELL_DAMAGE| --?"X[*R:spellsave]" -eq "X"|PC_CARD_SPELL --+|The target can make a [*R:spellsave] save vs DC [*S:spell_save_dc] to modify the damage as described below.[br][br] --^PC_CARD_SPELL| --:SPELL_ATTACK_MISS| --+The [*R:spellname] attack missed!|[br][br] --:PC_CARD_SPELL| --+|[*R:spelldescription] --:PC_DONE_SPELL| --X| --/| FUNCTIONS --:Find_Active_Global_Attack_Modifiers|character_id;StringVariableToSet --&_GAM_Temp| --Rfirst|[%1%];repeating_tohitmod --:_GAM_Loop| --?"[*R:global_attack_active_flag]" -eq "1"|>_AddGAM;[*R:global_attack_name];[*R:global_attack_roll] --Rnext| --?"[*R:global_attack_name]" -ne "NoRepeatingAttributeLoaded"|_GAM_Loop --&[%2%]|[&_GAM_Temp] --<| --:_AddGAM| --&_GAM_Temp|+ + [%2%] [ [%1%] ] --<| }} Any help would be greatly appreciated!