actor=token.actoractor=canvas.tokens.controlled[0].actoractor.data.name//get all actors
letactors=canvas.tokens.controlled.map(token=>{returntoken.actor});
//Add varable
letroll=newRoll("2d20kl + @fight", {fight:3}).roll();//Send as message to Chat
//set the name of the person the name of the
roll.toMessage({speaker:{actor.data.name}});
//Get a list of the tokens that are controlled by the user
canvas.tokens.controlled//Get a list of the tokens that are Targeted.
lettargets=Array.from(game.user.targets);
main()asyncfunctionmain(){// Get Selected
letselected=canvas.tokens.controlled;if(selected.length>1){ui.notifications.error("Please select only one token")return;}letselected_actor=selected[0].actor;// Get Target
lettargets=Array.from(game.user.targets)if(targets.length==0||targets.length>1){ui.notifications.error("Please target one token");return;}lettarget_actor=targets[0].actor;// Select Weapon
// Why Filter instead of Find?
letactorWeapons=selected_actor.items.filter(item=>item.data.data.attributes.type.value=="weapon")letweaponOptions=""for(letitemofactorWeapons){weaponOptions+=`<optionvalue=${item.id}>${item.data.name}|ATK:${item.data.data.attributes.attack.value}</option>`}letdialogTemplate=`<h1>Pickaweapon</h1><divstyle="display:flex"><divstyle="flex:1"><selectid="weapon">${weaponOptions}</select></div><spanstyle="flex:1">Mod<inputid="mod"type="number"style="width:50px;float:right"value=0/></span><spanstyle="flex:1"><inputid="ignoreArmor"type="checkbox"checked/></span></div>`newDialog({title:"Roll Attack",content:dialogTemplate,buttons:{rollAtk:{label:"Roll Attack",callback:(html)=>{letwepID=html.find("#weapon")[0].value;letwep=selected_actor.items.find(item=>item.id==wepID)letmodifier=html.find("#mod")[0].value;letignoreArmor=html.find("#ignoreArmor")[0].checked;// Roll Attack
letnewRollString=`1d20+${wep.data.data.attributes.attack.value}+${modifier}`letroll=newRoll(newRollString).roll();// See if Attack is Greater than their armor, if so
letresult=roll.totalconsole.log(result)// Print Chat with Button to Roll Damage
letchatTemplate=""letarmor=target_actor.data.data.attributes.armor?.value&&!ignoreArmor?target_actor.data.data.attributes.armor?.value:0;if(result>armor){chatTemplate=`<p>Rolled:${result}against${armor}TargetArmor</p><p>ItwasaHit!</p><p><buttonid="rollDamage">RollDamage</button></p>`}else{chatTemplate=`<p>Rolled:${result}against${armor}TargetArmor</p><p>ItwasaMiss!</p>`}ChatMessage.create({speaker:{alias:selected_actor.name},content:chatTemplate,roll:roll})// Roll Damage
Hooks.once('renderChatMessage', (chatItem,html)=>{html.find("#rollDamage").click(()=>{//console.log("Damage Button Clicked")
letwepDmg=wep.data.data.attributes.damage?.value?wep.data.data.attributes.damage.value:""newRoll(wepDmg).roll().toMessage();})})}},close:{label:"Close"}}}).render(true)}