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);
asyncfunctionmain(){// Fetch All Selected Targets
letactors=canvas.tokens.controlled.map(token=>{returntoken.actor});for(letactorofactors){let_atk=actor.data.data.attributes.fight.valueconsole.log("Atk: ",_atk)if(!_atk){_atk=0}console.log("Wep: ",_wep)letroll=newRoll("2d20kl + @actorAtk",{actorAtk:_atk}).roll()roll.toMessage()}}
Attack with Equipped weapon:
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+=`<option value=${item.id}>${item.data.name} | ATK: ${item.data.data.attributes.attack.value}</option>`}letdialogTemplate=`
<h1> Pick a weapon </h1>
<div style="display:flex">
<div style="flex:1"><select id="weapon">${weaponOptions}</select></div>
<span style="flex:1">Mod <input id="mod" type="number" style="width:50px;float:right" value=0 /></span>
<span style="flex:1"><input id="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} Target Armor </p>
<p> It was a Hit! </p>
<p> <button id="rollDamage">Roll Damage</button></p>
`}else{chatTemplate=`
<p> Rolled: ${result} against ${armor} Target Armor </p>
<p> It was a Miss! </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)}