#MidiQOL

1 messages ยท Page 78 of 1

zinc mantle
#

@vast bane I rarely get this frustrated and I feel silly, haha. Not sure what those are actually doing. The intended expectation is player uses his ability, gets a popup on what token he wants to make and can spawn it in himself.

#

I bet you it's some commendium item I'm missing.

#

Ah I found a readme in Arbon's Comp

robust vault
#

Heyyy zhell, a question. Does your bab module have any target filter? I haven't seen it anywhere. I mean for example:

Bonus against a determinated target.

Bonus that targets receive.

#

When I say target, I mean for example point it, alt+Left click (quick way).

charred bay
#

i have a macro triggered from a spell, it is set to run as GM, but it fails with permission error when run as a player

molten solar
charred bay
#

is the dnd5e to me?

kind cape
#

Its for the BaB question

kind cape
charred bay
#

so, is there a way to do that through midi?

cobalt schooner
#

is there a way to make the spell PROTECTION AGAINST EVIL AND GOOD works with automation in foundry?

kind cape
charred bay
#

this is the script

zinc mantle
#

@vast bane How much experience do you have with summons? I think I'm getting it.

kind cape
# charred bay

I don't thinkt here is a straight-forward way to do that as GM ๐Ÿค”

#

You'd have to modify the macro to use sockets

zinc mantle
#

What's the easiest way to see the roll data of an actor?

#

Such as what an actors spell save DC would be

charred bay
molten solar
zinc mantle
#

Found it, thank you so much @molten solar !

#

So for something like Arbrons if I was trying to force the summon to have the same spell DC as the summoner it would be what, @summoner.spelldc ?

violet meadow
cobalt schooner
violet meadow
#

Yes

#

Or too close to that ๐Ÿ˜…

molten solar
#

Crispy Maids

cobalt schooner
#

It has 10 dependencies...

molten solar
#

They're safe, half of them are my modules

#

(/s?)

cobalt schooner
#

this is very awfull... for each automation I need, i need to install a new module, and those have tons of dependencies...

#

you should make ONE BIG MODULE TO RULE'M all

#

kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

molten solar
#

Depends how you automate

cobalt schooner
#

i just want the rolls bonuses provided by the spells to automate...

molten solar
#

Wait what

#

scrolls up

violet meadow
#

Don't I ๐Ÿค”?

#

I am out and about so I cannot share more now

molten solar
#

(Devs also don't get automatic pings in threads.)

zinc mantle
#

Wrong place. Roger roger.

cobalt schooner
#

10 dependencies intalled and the spell isn't working... lol

molten solar
#

๐ŸŽ‰

violet meadow
# cobalt schooner didn't work...

I cannot attest to that. I haven't used it! But @scarlet gale should be able to help when he is around

Edit: they decided to not automate that ๐Ÿ˜…

#

Ok I found one I shared

#

Not sure if it works

vast bane
kind cape
vast bane
#

most of them are checkboxes to enable worldscripts

violet meadow
#

Also @cobalt schooner did you get the item from the included ones or did you press the small icon on the title bar to grab the one to use with the module?

cobalt schooner
#

nevermind

#

i decided i won't automate that

vast bane
#

lol

atomic bramble
cobalt schooner
#

that's very frustrating that a simples disadvantage won't auto-roll

#

lol

vast bane
#

yo dawg prolly a wise idea

#

its not for everyone

zinc mantle
atomic bramble
#

Dont worry it happens all the time

violet meadow
#

A simple disadvantage always rolls by pressing the keybind, now to automate that you will need to pass through some necessary hoopKs...

hot flower
#

looking at the new midi changlog. Seems like it's big enough to go to 10.1!

#

and thank you, @gilded yacht for updating sneak attack and rakish audacity to reflect the ways to roll crits.

#

i have realized that I may enjoying tinkering with foundry's automation almost as much as I do actually running a game.

violet meadow
#

I have to say. I like tinkering more nowadays ๐Ÿ˜…

hot flower
#

lol

#

i've learned A LOT of javascript just diving into y'all's macros. thank you. Many of you have been very helpful and kind on my journey.

violet meadow
#

This is the way!
You come, you learn, you share

hot flower
#

This is the way. My next project I think will be tackling Danse Macabre

#

!spell Danse Macabre

#

nope.

#
The creatures are under your control until the spell ends, after which they become inanimate once more.

At higher level
When you cast this spell using a spell slotโ€˜ of 6th level or higher, you animate up to two additional corpses for each slot level above 5th.

#

ASE had a great implementation of animate dead. But I need to figure out how to extract it from the larger module, which I'm moving away from.

vast bane
#

danse macabre is pretty simple with warpgate isn't it?

#

I already made my danse macabre

thin loom
#

Can anyone help me resolve a feature of midi-qol that I want to disable but just cannot seem to find a way: Currently, every time someone makes an attack, as the DM I get spammed with a cover calculator dialogue box. I really hate this as I believe cover (1/2, 3/4, etc) is best determined by the players and DM at the map, not by software. But no matter what workflow settings I dig through and try, I cannot rid myself of this awful interruption that slows down combat. The only dialogue box I could find is a drop down to have this unwanted feature handled by another module. When I try that it changes nothing! Help from anyone who solved this issue would be lovely!

cobalt schooner
#

Does anybody knows what is wrong with MIDI ITEMS? Lay on hands is not working anymore... the midi item, with the macro I mean...

zinc mantle
#

@thin loom Are you positive it's a midi-qol feature?

#

I've never seen a coverage calculator, personally.

thin loom
#

Pretty sure, but I would be thrilled if I was wrong. ๐Ÿ˜‰

#

When I turn off midi-qol and use RSR instead, the annoying box goes away

zinc mantle
#

Is it happening on -every- attack?

thin loom
#

yes

zinc mantle
#

Whether there are walls around or not?

thin loom
#

when MQ is turned off and I use RSR it never appears. So my very simplistic deduction is that it is a workflow feature of MQ that I am simply not able to find

#

There are often wall around but this does not calcuate cover for me. This box defaults to "none" and has a drop down where I can manually apply cover.

zinc mantle
#

So I just spun up a world with only midi and nothing else

#

Put full automation

#

I don't see a cover calculator...

#

Can you take a screenshot?

dark canopy
thin loom
#

I have other cover calculators (levels, simbul, etc.) disabled.

dark canopy
#

show the chat card

thin loom
#

This is the box

zinc mantle
#

Definitely not midi

cobalt schooner
#

No midi

zinc mantle
#

Oh! Idea!

#

your F12 console

#

might tell you

#

Pop F12, hit console and then read what it does when you attack

thin loom
#

cool. Now i just have to figure out why it only goes away when I disable midi - I will check console. I am not the best at using it

zinc mantle
#

and look for the coverage

#

The first section is typically what's handling that bit as far as I can tell

thin loom
#

I am really trying to find where this is LOL (I am not the brightest bulb at using the console...but getting better

zinc mantle
#

Using chrome?

thin loom
#

yes

zinc mantle
#

Press F12. Then at the top right

#

Console

#

Scroll to the bottom, do an attack

narrow saddle
#

Got ten minutes before a session, so not the end of the world if it can't be solved immediately but you know if any one could?

When a save is prompted from an effect/spell, some characters/actors are getting the prompt window to choose advantage or normal or disadvantage, some are rolling automatically.

I have Monk's token bar as the choice in Midi Qol. It is weird how one actor can choose and the other two can't? (I am logging in as the player too, so it isn't a GM setting although it is happening both ways).

thin loom
#

I am like a monkey at a typewriter, but this appeared with the attack

zinc mantle
#

Do you get the cover popup before or after damage is applied?

thin loom
#

before

#

man... I am really hunting for any language relating to cover

zinc mantle
#

I'm trying to figure out why your console is so big

#

this is what I get when I do a simple melee attack in mine:

#

How many modules do you have installed @thin loom ?

thin loom
#

too many

#

roughly 100

#

Please don't bash me too hard LOL

zinc mantle
#

Nah. nah. was going to see if disabling all and enabling say like 10 at a time and testing would work

#

Just some brute force troubleshooting.

charred bay
#

so, if you want a midi-qol script that does GM things you can break it into two separate scripts. One is the player script that makes their choices and the second is a GM script that makes it happen.
My identify spell calls identifyTargetItem, which launches a dialog asking which item to identify. The player chooses and it calls indentifyTargetItemGM, which is set to run as GM. This is tested and works. (v9)
https://github.com/matthewbstroud/foundry_scripts/blob/main/identifyTargetItem.js
https://github.com/matthewbstroud/foundry_scripts/blob/main/identifyTargetItemGM.js

zinc mantle
#

You could always disabled everything but midi, test. See if it pops up. Then activate a group, test... See if it fails.

#

Then once you get it popping up you know it's in that group of 10.

thin loom
#

Maybe I will use Find the Culprit and whittle it down. Yall are certain that this is not MQ, yes?

zinc mantle
#

I think Midi is trying to show you information provided by another module, yes.

#

It's definitely not midi.

violet meadow
#

Oh I need to push an update for that

thin loom
#

Thank you I will give the old process of elimination a try.

vast sierra
#

you have debug turned on, in midi settings, reason for teh extra long F12

zinc mantle
#

^ that makes sense

#

I was like WHOA mine does not look like that lol

thin loom
#

This is the only thing I could find that mentions cover calculatio0n

zinc mantle
#

you can exapand it

#

via that arrow

thin loom
#

I've expanded it and looking, looking, looking for any modules listed. Nothing just yet

zinc mantle
#

I'm not 100% how to read the console, I just started using it myself for things or I'd tell you where to look

scarlet gale
cobalt schooner
kind cape
thin loom
#

Nope. Everything in the console related to the cover calculation dialogue box refers to midi qol. I will keep turning other things off and hopefully will find the culprit.

kind cape
thin loom
kind cape
#

(One important thing to remember about Foundry is that you don't have to update, if you have a setup that works you can just not update and it will continue working)

thin loom
kind cape
# thin loom Yes, but all of those are turned off.

Hmm, thats odd, the fact that it talks about a 3D distance makes me think its one of them, though never seen the dialog before ๐Ÿค” And I don't know of any others that deals with it. You are on V9 or V10?

thin loom
#

v10

kind cape
#

Hmm, a couple others it might be:

  • Simbul's Cover Calculator
  • DnD5e Helpers (through not V10 compatible)
thin loom
#

This is the entire entry... expanded

zinc mantle
#

@kind cape I tested simbuls just now, not that sadly.

thin loom
#

I have those modules turned off as well.

kind cape
#

I'm starting to wonder if Posney accidentally included some early stuff in this newest release ๐Ÿค” I have not updated for some time, so can't test it myself

thin loom
#

I just updated with his newest release, hoping that it would fix this issue, but nope.

zinc mantle
#

I just updated to v10 foto and I haven't noticed it

kind cape
#

Looking through the recent changes on GL its not Midi ๐Ÿค”

#

(The code changes that is)

kind cape
thin loom
#

I read the console about as well as I speak chinese

kind cape
#

Yeah no worries, it just looks like a chat message is being created by something through Midi, and then getting transformed to a dialog ๐Ÿค” No message appears in the chat right?

thin loom
#

only a DM whisper message about the cover calculation appears in chat

kind cape
#

Does the message look similar to the dialog?

dark canopy
#

and what does that look like?

thin loom
zinc mantle
#

So it's not using walls or terrain to determine cover, it's always asking you?

thin loom
#

correct

zinc mantle
#

Because the first picture had a drop down

#

hmmmmmmmmmm

thin loom
#

yes, the drop down is the awful dialogue box that forces me to choose cover before ANY attacks will roll. The second item is what appears to the DM in the chat window

scarlet gale
#

If you go back one midi version does it still happen?

#

I feel like find the culprit should narrow this down

thin loom
#

It will probably take quite some time to go through the process of elimination. (sigh)

violet meadow
#

Alternative Token Visibility maybe?

#

@thin loom That's the module that this box is coming from ๐Ÿ‘†

thin loom
#

OOOOHH - I am checking it now. Thanks! ๐Ÿ™‚

kind cape
#

Good spot bugbear!

thin loom
#

YES!!!! That is the culprit.

violet meadow
#

I have been playing with that a bit ๐Ÿ˜„

Had never used the 3d Area checks though

torpid kestrel
#

I'm playing around with a call lightning macro I found on MrPrimates site. I copied the macro in to my macro folder and invoked the macro by name using the effect "Macro Execute". It is creating the temp cantrip for lightning strike, and placing the template - however it's not applying any damage. I suspect I'm not invoking it correctly and it's not getting a spell level - thus defaulting to zero. Anyone know if it should be invoked differently, or if I need to add something to the macro name to pass the spell level?

thin loom
#

what a royal pain in the ass. You saved me a ton of work! โค๏ธ

violet meadow
#

If you have a message with what was going on/breaking whatever, can you link it to me?

hot flower
# violet meadow Midi srd has animate dead

I"m trying to rewrite ASE's animate dead so that it will allow you to choose from nearby corpses, and then warpgate them into the proper zombie or skelly, all while taking into account the Undead Thralls feat, if it exists.

thin loom
#

(umm, are you referring to me? I was not able to find any messages). ๐Ÿฅน

hot flower
#

this is what I have so far, which finds the corpses in range. js const lastArg = args[args.length - 1]; const actorD = lastArg.actor; const level = actorD.classes.wizard.system.levels let undeadThralls = [actorD.items.find(i => i.name === "Undead Thralls")]; undeadThralls = undeadThralls.some(item => item.name === "Undead Thralls"); const tokenD = canvas.tokens.get(lastArg.tokenId); const itemD = actorD.items.find(i => i.name === lastArg.item.name); const spellLevel = Number(lastArg.castData.castLevel || 3); const spellSaveDC = lastArg.actor?.data?.data?.attributes?.spelldc || 10; let raiseLimit = (2 * spellLevel) - 5; if (undeadThralls) { raiseLimit ++; } const detectRange = 10; let corpses = canvas.tokens.placeables.filter(function (target) { return target.actor?.data?.data?.attributes?.hp?.value == 0 && MidiQOL.findNearby({}, target, detectRange, {includeIncapacited: true}) && target !== tokenD; }); console.log("lastArg:", lastArg); console.log("actorD:", actorD); console.log("undeadThralls:", undeadThralls); console.log("tokenD:", tokenD); console.log("itemD:", itemD); console.log("spellLevel:", spellLevel); console.log("spellSaveDC:", spellSaveDC); console.log("raiseLimit:", raiseLimit); console.log("detectRange:", detectRange); console.log("corpses:", corpses); console.log("level:", level);

#

except I don't really know how to make a menu of those corpses and present a selection of either zombie or skelly. The ASE dialog subfunction is convoluted.

#

pretty sure a warpgate menu is the way to go, but I'm shaky on menus.

vast bane
#

I don't give the player a choice between them and just give them zombies

#

skeletons are typically outside combat cause you don't strip bodies of their squishy bits in combat

dark canopy
#

menu would be the approach -- use a select dropdown for each corpse found that lists "(ignore)", "zoombee", "skellington"

#

so it would look like

Animate Dead Helper
----------------------------
A Cool Gobo     |zoombee  V|
The gobo's boss |(ignore) V|
----------------------------
   [ Summon ] [ Cancel ]
kind cape
#

You mean

A Cool Gobo     |zoombee V |
The gobo's boss |(ignore) V|
Your friend     |Skeleton V|
--------------------------
   [ Summon ] [ Cancel ]

๐Ÿ˜‚

hot flower
#

yeah, exactly like that.

dark canopy
#

give it a go -- menu's are easy in comparison to actual dialogs

hot flower
#

it's making it display the choices base of corpses that is bedeviling me.

dark canopy
#

come again?

hot flower
#

basically, how do I make the menu use the corpses array for its items. Sometimes there might just be 1 corpse in rage. Sometimes 4? So it should ALL the corpses in range, but stop letting you summon once you hit the raiseLimit

dark canopy
#

the "step selecting" i would ignore and print how many can be summoned, then error out if they submit an invalid combo

#

so, grab all within range, each candidate body would be its own type: 'select' entry

scarlet gale
#

Assuming midi-qol's findnearby function doesn't ignore dead tokens, that may be a faster way to find nearby valid tokens

hot flower
#

that's what I'm using. Seems to be working well.

scarlet gale
#

ah cool

hot flower
#

like, i'm testing with live and dead tokens around, and corpses is only returning the dead ones.

#

also, i can take this another channel, since it's not that midi oriented

dark canopy
#

const {inputs, buttons} = await warpgate.menu({inputs: [{type: 'select', label: 'A Corpse', options: ['none', 'Zombie', Skeleton']}]}); if(buttons == false) return;

#

there is a template

hot flower
#

since I don't want to clutter up this channel

violet meadow
hot flower
#

yup! this is working great: ```js
let corpses = canvas.tokens.placeables.filter(function (target) {
return target.actor?.data?.data?.attributes?.hp?.value == 0 && MidiQOL.findNearby({}, target, detectRange, {includeIncapacited: true}) && target !== tokenD;
});

violet meadow
#

yeah .31

Breaking Addition to findNearby to allow inclusion of incapacitated actors, MidiQOL.findNearby(disposition, token, distance, {maxSize, includeIncapacitated}). Only breaking if you were including a maxSize before, you'll need to use {maxSize: size} instead.

kind cape
# hot flower yup! this is working great: ```js let corpses = canvas.tokens.placeables.filter(...

Some of your code seems to be doing the same thing twice ๐Ÿค”

const lastArg = args[args.length - 1];
const actorD = lastArg.actor;
const level = actorD.classes.wizard?.system?.levels ?? 0
const undeadThralls = [actorD.items.some(i => i.name === "Undead Thralls")];
const tokenD = canvas.tokens.get(lastArg.tokenId);
const itemD = actorD.items.find(i => i.name === lastArg.item.name);
const spellLevel = Number(lastArg.castData.castLevel || 3);
const spellSaveDC = lastArg.actor?.data?.data?.attributes?.spelldc || 10;
let raiseLimit = (2 * spellLevel) - 5;
if (undeadThralls) {
    raiseLimit ++;
}
const detectRange = 10;
let corpses = MidiQOL.findNearby(null, tokenD, detectRange, {includeIncapacited: true})
.filter((target) => target.actor?.data?.data?.attributes?.hp?.value == 0)
.filter((target) => target !== tokenD);

console.log(corpses);

const selectItems = corpses.map((target) => { return {type: 'select', label: target?.actor?.name, options: ['None', 'Zombie', 'Skeleton']}});

console.log(selectItems);

const inputItems = {inputs: selectItems};

const {inputs, buttons} = await warpgate.menu(inputItems);

if(buttons == false) return;
console.log("lastArg:", lastArg);
console.log("actorD:", actorD);
console.log("undeadThralls:", undeadThralls);
console.log("tokenD:", tokenD);
console.log("itemD:", itemD);
console.log("spellLevel:", spellLevel);
console.log("spellSaveDC:", spellSaveDC);
console.log("raiseLimit:", raiseLimit);
console.log("detectRange:", detectRange);
console.log("corpses:", corpses);
console.log("level:", level);

Try this

hot flower
#

that works, thank you! But i confess I still don't really understand how menus work.

vast bane
#

that homebrew is an interesting homebrew

#

instead of death saves you have vitality points

scarlet gale
dark canopy
#

maybe if formatted like this it makes a little more sense? just a list of "input lines"

await warpgate.menu({
 inputs: [{
   label: 'My Way',
   type: 'radio',
   options: 'group1'
 }, {
   label: 'The Highway',
   type: 'radio',
   options: 'group1'
 }],
 buttons: [{
   label: 'Yes',
   value: 1
 }, {
   label: 'No',
   value: 2
 }, {
   label: 'Maybe',
   value: 3
 }, {
   label: 'Eventually',
   value: 4
 }]
}, {
 options: {
   width: '100px',
   height: '100%'
 }
})
molten solar
zinc mantle
#

Is there any way to have a popup occur to inform players when an actor is out of like... actions?

#

Similar to how spell slots or daily uses are used up.

#

"You can't do this as you are out of bonus actions"

#

etc.

kind cape
#

Doesn't help that I mapped it directly from the list of targets, makes it even less readable ๐Ÿ˜‚

dark canopy
#

basically every single list of select options in foundry is mapped from another object in one way or another ๐Ÿ˜… and, as usual, its especially helpful here too

kind cape
zinc mantle
#

But also actions

#

This is specifically bonus and reactions, right?

dark canopy
#

one of the few examples i have embedded the in API docs ๐Ÿ˜…

zinc mantle
#

Like if an actor attacks, I'd like to be able to via-midi if possible, prompt them that they already did an action.

kind cape
#

AFAIK "action" tracking is not a thing in Midi

violet meadow
#

I mean when do you cross the point that something is too much ๐Ÿ˜…

hot flower
#

I think i'm going to sit this one down for a spell. I don't know how to ensure the token that is selected for "zombie" or "skeleton" can actually be made to mutate into the appropriate undead. I'm sure it's something to do with the tokens' uuids, but not sure how to match all that up.

zinc mantle
#

For the game I'll be running a couple players won't be using audio and the more I can automate without having to type it out in chat, the better.

violet meadow
zinc mantle
#

I know it's a weird use case.

hot flower
#

what's the harm in mutated the dead tokens into live zombies? Or is it just for simplicity's sake?

violet meadow
#

Extra work ๐Ÿ˜„

vast bane
#

yall puttin too much effort into this, how can a corpse have skeleton only

scarlet gale
#

I've had a DM be weirdly strict about that

vast bane
#

exactly

#

I guess I'm strict but how can you have a skeleton form a guy you killed with a stab wound

#

besides zombies are better

hot flower
#

because it's magic?

scarlet gale
#

Sounds good to me

hot flower
#

it's also scarier if a corpse's skeleton squelches out of the flesh and comes after you

hot flower
#

If I wanted to convert a applyTokenDamage to a damageOnlyWorkflow, is there an easy way to do that? This is the line I want to change: await MidiQOL.applyTokenDamage([{ damage: totalDamage.total, type: damageType }], totalDamage.total, new Set([target]), itemUuid, new Set());

#

the reason I want to do this is that another macro depends on the damageList key in the workflow. This applyTokenDamage doesn't seem to provide that

scarlet gale
#

Your other macro might be best switched to using a hook that catches the apply damage function

#

'midi-qol.damageApplied'

hot flower
#

it's an old Kandashi Grim Harvest world script. It needs the spell level as well.

scarlet gale
#

It passes the workflow too and you can get the spell level from the castData

lost estuary
#

I am attempting to have an item macro list all available artisans tools in DND 5d, allow the user to choose from a list, and have it output a roll that applies expertise if the user is proficient with the tool, or roll with disadvantage if not proficient, all in a midi friendly way.
This code appears to be working up to the point where i attempt the roll, but it fails with "Cannot read properties of undefined (reading 'data")"

let actor = game.actors.get(canvas.tokens.controlled[0].actorId);

let toolOptions = ["Alchemist's Supplies", "Brewer's Supplies", "Calligrapher's Supplies", "Carpenter's Tools", "Cartographer's Tools", "Cobbler's Tools", "Cook's Utensils", "Glassblower's Tools", "Jeweler's Tools", "Leatherworker's Tools", "Mason's Tools", "Navigator's Tools", "Painter's Supplies", "Potter's Tools", "Smith's Tools", "Thieves' Tools", "Tinker's Tools", "Weaver's Tools", "Woodcarver's Tools"];

let content = `
  <form>
    <div class="form-group">
      <label>Choose an artisan's tool:</label>
      <select id="tool-select" name="tool-select">
        ${toolOptions.map(o => `<option value="${o.replace(/'/g, "\\'").toLowerCase()}">${o}</option>`).join("")}
      </select>
    </div>
  </form>
`;

new Dialog({
  title: "Select Artisan's Tool",
  content: content,
  buttons: {
    ok: {
      label: "Roll",
      callback: async (html) => {
        let selectedTool = html.find('#tool-select')[0].value.replace(/_/g, " ");
        let ability = selectedTool === "thieves tools" ? "dex" : selectedTool === "navigator's tools" ? "wis" : "int";
        let isProficient = actor.data.data.skills[`tool-${selectedTool.replace(/'/g, "\\'").toLowerCase()}`]?.value ?? false;
        let bonus = actor.data.data.abilities[ability].mod;
        if (isProficient) {
          bonus += actor.data.data.attributes.prof * 2;
        }
        else {
          bonus -= actor.data.data.attributes.prof;
        }
        let roll = new Roll(`1d20 + ${bonus}`).roll();
        let messageContent = `
          <p><strong>${actor.name}</strong> rolls an Artisan's Tool check using ${selectedTool}:</p>
          <p>Roll: ${roll.total}</p>
          <p>Bonus: ${bonus}</p>
        `;
        roll.toMessage({
          speaker: ChatMessage.getSpeaker({ actor: actor }),
          flavor: messageContent
        });
      }
    },
    cancel: {
      label: "Cancel"
    }
  }
}).render(true);
scarlet gale
#

You on v10?

lost estuary
#

Yes

scarlet gale
#

While it shouldn't technically break it, a few things need to be converted from data to system

#

data.data becomes system

#

A lone data gets yeeted

lost estuary
#
let actor = game.actors.get(canvas.tokens.controlled[0].actorId);

let toolOptions = ["Alchemist's Supplies", "Brewer's Supplies", "Calligrapher's Supplies", "Carpenter's Tools", "Cartographer's Tools", "Cobbler's Tools", "Cook's Utensils", "Glassblower's Tools", "Jeweler's Tools", "Leatherworker's Tools", "Mason's Tools", "Navigator's Tools", "Painter's Supplies", "Potter's Tools", "Smith's Tools", "Thieves' Tools", "Tinker's Tools", "Weaver's Tools", "Woodcarver's Tools"];

let content = `
  <form>
    <div class="form-group">
      <label>Choose an artisan's tool:</label>
      <select id="tool-select" name="tool-select">
        ${toolOptions.map(o => `<option value="${o.replace(/'/g, "\\'").toLowerCase()}">${o}</option>`).join("")}
      </select>
    </div>
  </form>
`;

new Dialog({
  title: "Select Artisan's Tool",
  content: content,
  buttons: {
    ok: {
      label: "Roll",
      callback: async (html) => {
        let selectedTool = html.find('#tool-select')[0].value.replace(/_/g, " ");
        let ability = selectedTool === "thieves tools" ? "dex" : selectedTool === "navigator's tools" ? "wis" : "int";
        let isProficient = actor.system.skills[`tool-${selectedTool.replace(/'/g, "\\'").toLowerCase()}`]?.value ?? false;
        let bonus = actor.system.abilities[ability].mod;
        if (isProficient) {
          bonus += actor.system.attributes.prof * 2;
        }
        else {
          bonus -= actor.system.attributes.prof;
        }
        let roll = new Roll(`1d20 + ${bonus}`).roll();
        let messageContent = `
          <p><strong>${actor.name}</strong> rolls an Artisan's Tool check using ${selectedTool}:</p>
          <p>Roll: ${roll.total}</p>
          <p>Bonus: ${bonus}</p>
        `;
        roll.toMessage({
          speaker: ChatMessage.getSpeaker({ actor: actor }),
          flavor: messageContent
        });
      }
    },
    cancel: {
      label: "Cancel"
    }
  }
}).render(true);

Failed with Cannot read properties of undefined (reading 'system')

#

i know im so close to automating this complicated dang feature

kind cape
#

Pretty sure game.actors.get(canvas.tokens.controlled[0].actorId) is wrong ๐Ÿค”

#

Replace the first line with:

let actor = canvas.tokens.controlled[0].actor;
lost estuary
#

undefined. roll.toMessage is not a function

#

for ```
let actor = canvas.tokens.controlled[0].actor;

let toolOptions = ["Alchemist's Supplies", "Brewer's Supplies", "Calligrapher's Supplies", "Carpenter's Tools", "Cartographer's Tools", "Cobbler's Tools", "Cook's Utensils", "Glassblower's Tools", "Jeweler's Tools", "Leatherworker's Tools", "Mason's Tools", "Navigator's Tools", "Painter's Supplies", "Potter's Tools", "Smith's Tools", "Thieves' Tools", "Tinker's Tools", "Weaver's Tools", "Woodcarver's Tools"];

let content = <form> <div class="form-group"> <label>Choose an artisan's tool:</label> <select id="tool-select" name="tool-select"> ${toolOptions.map(o =><option value="${o.replace(/'/g, "\'").toLowerCase()}">${o}</option>).join("")} </select> </div> </form> ;

new Dialog({
title: "Select Artisan's Tool",
content: content,
buttons: {
ok: {
label: "Roll",
callback: async (html) => {
let selectedTool = html.find('#tool-select')[0].value.replace(/_/g, " ");
let ability = selectedTool === "thieves tools" ? "dex" : selectedTool === "navigator's tools" ? "wis" : "int";
let isProficient = actor.system.skills[tool-${selectedTool.replace(/'/g, "\\'").toLowerCase()}]?.value ?? false;
let bonus = actor.system.abilities[ability].mod;
if (isProficient) {
bonus += actor.system.attributes.prof * 2;
}
else {
bonus -= actor.system.attributes.prof;
}
let roll = new Roll(1d20 + ${bonus}).roll();
let messageContent = <p><strong>${actor.name}</strong> rolls an Artisan's Tool check using ${selectedTool}:</p> <p>Roll: ${roll.total}</p> <p>Bonus: ${bonus}</p> ;
roll.toMessage({
speaker: ChatMessage.getSpeaker({ actor: actor }),
flavor: messageContent
});
}
},
cancel: {
label: "Cancel"
}
}
}).render(true);

#

i am posting in midi, because i use it, and unfortunately not sure how to make this totally midi friendly.

#

and if i post elsewhere, Zhell might find my midi loving self and hunt me down ๐Ÿ˜‰

kind cape
#
let actor = canvas.tokens.controlled[0].actor;

let toolOptions = ["Alchemist's Supplies", "Brewer's Supplies", "Calligrapher's Supplies", "Carpenter's Tools", "Cartographer's Tools", "Cobbler's Tools", "Cook's Utensils", "Glassblower's Tools", "Jeweler's Tools", "Leatherworker's Tools", "Mason's Tools", "Navigator's Tools", "Painter's Supplies", "Potter's Tools", "Smith's Tools", "Thieves' Tools", "Tinker's Tools", "Weaver's Tools", "Woodcarver's Tools"];

let content = `
  <form>
    <div class="form-group">
      <label>Choose an artisan's tool:</label>
      <select id="tool-select" name="tool-select">
        ${toolOptions.map(o => `<option value="${o.replace(/'/g, "\\'").toLowerCase()}">${o}</option>`).join("")}
      </select>
    </div>
  </form>
`;

new Dialog({
  title: "Select Artisan's Tool",
  content: content,
  buttons: {
    ok: {
      label: "Roll",
      callback: async (html) => {
        let selectedTool = html.find('#tool-select')[0].value.replace(/_/g, " ");
        let ability = selectedTool === "thieves tools" ? "dex" : selectedTool === "navigator's tools" ? "wis" : "int";
        let isProficient = actor.system.skills[`tool-${selectedTool.replace(/'/g, "\\'").toLowerCase()}`]?.value ?? false;
        let bonus = actor.system.abilities[ability].mod;
        if (isProficient) {
          bonus += actor.system.attributes.prof * 2;
        }
        else {
          bonus -= actor.system.attributes.prof;
        }
        let roll = await new Roll(`1d20 + ${bonus}`).roll();
        let messageContent = `
          <p><strong>${actor.name}</strong> rolls an Artisan's Tool check using ${selectedTool}:</p>
          <p>Roll: ${roll.total}</p>
          <p>Bonus: ${bonus}</p>
        `;
        roll.toMessage({
          speaker: ChatMessage.getSpeaker({ actor: actor }),
          flavor: messageContent
        });
      }
    },
    cancel: {
      label: "Cancel"
    }
  }
}).render(true);
#

Was just an await missing yeah

lost estuary
#

ok, its rolling! lets test

stray bison
#

Hi everyone! I have been Googling and searching this Discord to see if this has been answered before, but Iโ€™m not finding anything. Is there a way to have rat swarms do different damage when theyโ€™re below half health? โ€œOut of the boxโ€ my rat swarm is doing 2d6+1d6 damage, instead of 2d6 when over half health, and 1d6 otherwise. Thank you!

violet meadow
scarlet gale
stray bison
violet meadow
#

Other Formula 1d6
Main damage 1d6
Activation Condition attributes.hp.value >= attributes.hp.max/2

lost estuary
#

OK, so it is supposed to roll with disadvantage if the player is not proficient, and roll normally with expertise if they are proficient. It appears to be applying just the standard ability bonus...less actually.

Here is a proficient roll. i would expect it to be a +4(dex is 18)+6 (prof doubled) for theives tools

kind cape
#

Thieves tools are not an Artisan tool, just FYI

lost estuary
#

I understand, and can remove them.

stray bison
kind cape
#

(Looking into the other part right now, looks like the tool prof lookup is wrong)

lost estuary
#

i edited the code to account for all the tools and the bonus, but receive invalid tool selected:

let actor = canvas.tokens.controlled[0].actor;

let toolOptions = ["Alchemist's Supplies", "Brewer's Supplies", "Calligrapher's Supplies", "Carpenter's Tools", "Cartographer's Tools", "Cobbler's Tools", "Cook's Utensils", "Glassblower's Tools", "Jeweler's Tools", "Leatherworker's Tools", "Mason's Tools", "Navigator's Tools", "Painter's Supplies", "Potter's Tools", "Smith's Tools", "Thieves' Tools", "Tinker's Tools", "Weaver's Tools", "Woodcarver's Tools"];

let content = `
  <form>
    <div class="form-group">
      <label>Choose an artisan's tool:</label>
      <select id="tool-select" name="tool-select">
        ${toolOptions.map(o => `<option value="${o.replace(/'/g, "\\'").toLowerCase()}">${o}</option>`).join("")}
      </select>
    </div>
  </form>
`;
new Dialog({
  title: "Select Artisan's Tool",
  content: content,
  buttons: {
    ok: {
      label: "Roll",
      callback: async (html) => {
        let selectedTool = html.find('#tool-select')[0].value;
        let ability = "";
        switch (selectedTool) {
          case "alchemist":
          case "brewer":
          case "calligrapher":
          case "cartographer":
          case "cook":
          case "glassblower":
          case "jeweler":
          case "leatherworker":
          case "mason":
          case "painter":
          case "potter":
          case "smith":
          case "weaver":
          case "woodcarver":
            ability = "int";
            break;
          case "carpenter":
          case "tinker":
            ability = "dex";
            break;
          case "navigator":
            ability = "wis";
            break;
          case "cobbler":
            ability = "str";
            break;
          case "thieves":
            ability = "dex";
            break;
          default:
            ui.notifications.error("Invalid tool selected!");
            return;
        }
        let isProficient = actor.system.skills[`tool-${selectedTool.replace(/'/g, "\\'").toLowerCase()}`]?.value ?? false;
        let bonus = actor.system.abilities[ability].mod;
        if (isProficient) {
          bonus += actor.system.attributes.prof * 2;
        }
        else {
          bonus -= actor.system.attributes.prof;
        }
        let roll = await new Roll(`1d20 + ${bonus}`).roll();
        let messageContent = `
          <p><strong>${actor.name}</strong> rolls an Artisan's Tool check using ${selectedTool}:</p>
          <p>Roll: ${roll.total}</p>
          <p>Bonus: ${bonus}</p>
        `;
        roll.toMessage({
          speaker: ChatMessage.getSpeaker({ actor: actor }),
          flavor: messageContent
        });
      }
    },
    cancel: {
      label: "Cancel"
    }
  }
}).render(true);
violet meadow
#

put a js after the first three `

lost estuary
#
let actor = canvas.tokens.controlled[0].actor;

let toolOptions = ["Alchemist's Supplies", "Brewer's Supplies", "Calligrapher's Supplies", "Carpenter's Tools", "Cartographer's Tools", "Cobbler's Tools", "Cook's Utensils", "Glassblower's Tools", "Jeweler's Tools", "Leatherworker's Tools", "Mason's Tools", "Navigator's Tools", "Painter's Supplies", "Potter's Tools", "Smith's Tools", "Thieves' Tools", "Tinker's Tools", "Weaver's Tools", "Woodcarver's Tools"];

let content = `
  <form>
    <div class="form-group">
      <label>Choose an artisan's tool:</label>
      <select id="tool-select" name="tool-select">
        ${toolOptions.map(o => `<option value="${o.replace(/'/g, "\\'").toLowerCase()}">${o}</option>`).join("")}
      </select>
    </div>
  </form>
`;
new Dialog({
  title: "Select Artisan's Tool",
  content: content,
  buttons: {
    ok: {
      label: "Roll",
      callback: async (html) => {
        let selectedTool = html.find('#tool-select')[0].value;
        let ability = "";
        switch (selectedTool) {
          case "alchemist":
          case "brewer":
          case "calligrapher":
          case "cartographer":
          case "cook":
          case "glassblower":
          case "jeweler":
          case "leatherworker":
          case "mason":
          case "painter":
          case "potter":
          case "smith":
          case "weaver":
          case "woodcarver":
            ability = "int";
            break;
          case "carpenter":
          case "tinker":
            ability = "dex";
            break;
          case "navigator":
            ability = "wis";
            break;
          case "cobbler":
            ability = "str";
            break;
          case "thieves":
            ability = "dex";
            break;
          default:
            ui.notifications.error("Invalid tool selected!");
            return;
        }
        let isProficient = actor.system.skills[`tool-${selectedTool.replace(/'/g, "\\'").toLowerCase()}`]?.value ?? false;
        let bonus = actor.system.abilities[ability].mod;
        if (isProficient) {
          bonus += actor.system.attributes.prof * 2;
        }
        else {
          bonus -= actor.system.attributes.prof;
        }
        let roll = await new Roll(`1d20 + ${bonus}`).roll();
        let messageContent = `
          <p><strong>${actor.name}</strong> rolls an Artisan's Tool check using ${selectedTool}:</p>
          <p>Roll: ${roll.total}</p>
          <p>Bonus: ${bonus}</p>
        `;
        roll.toMessage({
          speaker: ChatMessage.getSpeaker({ actor: actor }),
          flavor: messageContent
        });
      }
    },
    cancel: {
      label: "Cancel"
    }
  }
}).render(true);
#

i apologize for what is probably not great code to begin with, i do not know javascript, only enough to hackysack other code bits together. Your help is as always appreciated.

violet meadow
#
 let isProficient = actor.system.skills[`tool-${selectedTool.replace(/'/g, "\\'").toLowerCase()}`]?.value ?? false;
``` you are missing something here
kind cape
#

Yeah thats the part I am investigating right now

#

Just a moment

#

Cause that lookup there is just incorrect

stray bison
kind cape
#

@lost estuary

let actor = canvas.tokens.controlled[0].actor;

let toolOptions = ["Alchemist's Supplies", "Brewer's Supplies", "Calligrapher's Supplies", "Carpenter's Tools", "Cartographer's Tools", "Cobbler's Tools", "Cook's Utensils", "Glassblower's Tools", "Jeweler's Tools", "Leatherworker's Tools", "Mason's Tools", "Navigator's Tools", "Painter's Supplies", "Potter's Tools", "Smith's Tools", "Thieves' Tools", "Tinker's Tools", "Weaver's Tools", "Woodcarver's Tools"];

let content = `
  <form>
    <div class="form-group">
      <label>Choose an artisan's tool:</label>
      <select id="tool-select" name="tool-select">
        ${toolOptions.map(o => `<option value="${o.replace(/'/g, "\\'").toLowerCase()}">${o}</option>`).join("")}
      </select>
    </div>
  </form>
`;

new Dialog({
  title: "Select Artisan's Tool",
  content: content,
  buttons: {
    ok: {
      label: "Roll",
      callback: async (html) => {
        let selectedTool = html.find('#tool-select')[0].value.replace(/_/g, " ");
        let ability = selectedTool === "thieves tools" ? "dex" : selectedTool === "navigator's tools" ? "wis" : "int";
        let isProficient = actor.system.traits.toolProf.value.some((prof)=> selectedTool.includes(prof)) ?? false;
        let abilityMod = actor.system.abilities[ability].mod;
        let bonus = 0;
        if (isProficient) {
          bonus += actor.system.attributes.prof * 2;
        }
        else {
          bonus -= actor.system.attributes.prof;
        }
        let roll = await new Roll(`1d20 + ${abilityMod} + ${bonus}`).roll();
        let messageContent = `
          <p><strong>${actor.name}</strong> rolls an Artisan's Tool check using ${selectedTool}:</p>
          <p>Roll: ${roll.total}</p>
          <p>Modifier: ${abilityMod}</p>
          <p>Bonus: ${bonus}</p>
        `;
        roll.toMessage({
          speaker: ChatMessage.getSpeaker({ actor: actor }),
          flavor: messageContent
        });
      }
    },
    cancel: {
      label: "Cancel"
    }
  }
}).render(true);

I split the modifier and the bonus into two values in the output, just to make it more clear, you can combine them again if you want

dusky citrus
#

Well, I'll be. Unchecking it made it work.
Edit: Thanks for the tip.

lost estuary
#

The calc is still off. Character is proficient in both the Thieves tools and Tinker tools. Modifier is wrong for Thieves tools, correct for tinkers

#

not sure about the negitive bonus at all.

#

non proficient tools should be at disadvantage, not -3 bonus

#

so its wonky, but hey, further than i got.

kind cape
#

Right, didn't see the disadvantage, let me fix that

stray bison
kind cape
#

@lost estuary

let actor = canvas.tokens.controlled[0].actor;

let toolOptions = ["Alchemist's Supplies", "Brewer's Supplies", "Calligrapher's Supplies", "Carpenter's Tools", "Cartographer's Tools", "Cobbler's Tools", "Cook's Utensils", "Glassblower's Tools", "Jeweler's Tools", "Leatherworker's Tools", "Mason's Tools", "Navigator's Tools", "Painter's Supplies", "Potter's Tools", "Smith's Tools", "Thieves' Tools", "Tinker's Tools", "Weaver's Tools", "Woodcarver's Tools"];

let content = `
  <form>
    <div class="form-group">
      <label>Choose an artisan's tool:</label>
      <select id="tool-select" name="tool-select">
        ${toolOptions.map(o => `<option value="${o.replace(/'/g, "\'").toLowerCase()}">${o}</option>`).join("")}
      </select>
    </div>
  </form>
`;

new Dialog({
  title: "Select Artisan's Tool",
  content: content,
  buttons: {
    ok: {
      label: "Roll",
      callback: async (html) => {
        let selectedTool = html.find('#tool-select')[0].value.replace(/_/g, " ");
        let ability = selectedTool === "thieves\' tools" ? "dex" : selectedTool === "navigator's tools" ? "wis" : "int";
        let isProficient = actor.system.traits.toolProf.value.some((prof)=> selectedTool.includes(prof)) ?? false;
        let abilityMod = actor.system.abilities[ability].mod;
        let roll = undefined;
        let bonus = 0;
        if (isProficient) {
          bonus = actor.system.attributes.prof * 2;
          roll = await new Roll(`1d20 + ${abilityMod} + ${bonus}`).roll();
        } else {
          roll = await new Roll(`2d20kl + ${abilityMod}`).roll();
        }
        let messageContent = `
          <p><strong>${actor.name}</strong> rolls an Artisan's Tool check using ${selectedTool}:</p>
          <p>Roll: ${roll.dice[0].total}</p>
          <p>Modifier: ${abilityMod}</p>
          <p>Bonus: ${bonus}</p>
        `;
        roll.toMessage({
          speaker: ChatMessage.getSpeaker({ actor: actor }),
          flavor: messageContent
        });
      }
    },
    cancel: {
      label: "Cancel"
    }
  }
}).render(true);

Try this version, think I accounted for all of the things now ๐Ÿ˜›

hot flower
#

this may have been well answered already, but does anyone have a modern, fully v10 compliant magic missile macro/item?

#

the one i have is old.

lost estuary
#

OK, that just about works, now i need to map all the tool/ability combos. ala

case "alchemist":
          case "brewer":
          case "calligrapher":
          case "cartographer":
          case "cook":
          case "glassblower":
          case "jeweler":
          case "leatherworker":
          case "mason":
          case "painter":
          case "potter":
          case "smith":
          case "weaver":
          case "woodcarver":
            ability = "int";
            break;
          case "carpenter":
          case "tinker":
            ability = "dex";
            break;
          case "navigator":
            ability = "wis";
            break;
          case "cobbler":
            ability = "str";
            break;
          case "thieves":
            ability = "dex";
scarlet gale
stray bison
violet meadow
#

It has a checkbox down in the bottom. Crit Other

kind cape
#

@lost estuary

let actor = canvas.tokens.controlled[0].actor;

let toolOptions = ["Alchemist's Supplies", "Brewer's Supplies", "Calligrapher's Supplies", "Carpenter's Tools", "Cartographer's Tools", "Cobbler's Tools", "Cook's Utensils", "Glassblower's Tools", "Jeweler's Tools", "Leatherworker's Tools", "Mason's Tools", "Navigator's Tools", "Painter's Supplies", "Potter's Tools", "Smith's Tools", "Thieves' Tools", "Tinker's Tools", "Weaver's Tools", "Woodcarver's Tools"];

let content = `
  <form>
    <div class="form-group">
      <label>Choose an artisan's tool:</label>
      <select id="tool-select" name="tool-select">
        ${toolOptions.map(o => `<option value="${o.replace(/\'/g, "\'").toLowerCase()}">${o}</option>`).join("")}
      </select>
    </div>
  </form>
`;

new Dialog({
  title: "Select Artisan's Tool",
  content: content,
  buttons: {
    ok: {
      label: "Roll",
      callback: async (html) => {
        let selectedTool = html.find('#tool-select')[0].value.replace(/_/g, " ");
        let ability = "int";
        switch(selectedTool.split(" ")[0].split("\'")[0]) {
            case "carpenter":
            case "tinker":
            case "thieves":
                ability = "dex";
                break;
            case "navigator":
                ability = "wis";
                break;
            case "cobbler":
                ability = "str";
                break;
        }
        let isProficient = actor.system.traits.toolProf.value.some((prof)=> selectedTool.includes(prof)) ?? false;
        let abilityMod = actor.system.abilities[ability].mod;
        let roll = undefined;
        let bonus = 0;
        if (isProficient) {
          bonus = actor.system.attributes.prof * 2;
          roll = await new Roll(`1d20 + ${abilityMod} + ${bonus}`).roll();
        } else {
          roll = await new Roll(`2d20kl + ${abilityMod}`).roll();
        }
        let messageContent = `
          <p><strong>${actor.name}</strong> rolls an Artisan's Tool check using ${selectedTool}:</p>
          <p>Roll: ${roll.dice[0].total}</p>
          <p>Modifier: ${abilityMod}</p>
          <p>Bonus: ${bonus}</p>
        `;
        roll.toMessage({
          speaker: ChatMessage.getSpeaker({ actor: actor }),
          flavor: messageContent
        });
      }
    },
    cancel: {
      label: "Cancel"
    }
  }
}).render(true);
stray bison
violet meadow
#

1d12[piercing]

#

Ah that might be the extent of what you can do though

stray bison
violet meadow
thin loom
#

Thanks everyone for helping me identify the conflict! Our campaign tonight will be a great one because of you. Much gratitude ๐Ÿ™

scarlet gale
kind cape
#

Alternate Token Visibility

lost estuary
kind cape
#

Oh, they are just called "thief" in the tool profs... -_-

lost estuary
#

hmm, digging

kind cape
#
let actor = canvas.tokens.controlled[0].actor;

let toolOptions = ["Alchemist's Supplies", "Brewer's Supplies", "Calligrapher's Supplies", "Carpenter's Tools", "Cartographer's Tools", "Cobbler's Tools", "Cook's Utensils", "Glassblower's Tools", "Jeweler's Tools", "Leatherworker's Tools", "Mason's Tools", "Navigator's Tools", "Painter's Supplies", "Potter's Tools", "Smith's Tools", "Thieves' Tools", "Tinker's Tools", "Weaver's Tools", "Woodcarver's Tools"];

let content = `
  <form>
    <div class="form-group">
      <label>Choose an artisan's tool:</label>
      <select id="tool-select" name="tool-select">
        ${toolOptions.map(o => `<option value="${o.replace(/\'/g, "\'").toLowerCase()}">${o}</option>`).join("")}
      </select>
    </div>
  </form>
`;

new Dialog({
  title: "Select Artisan's Tool",
  content: content,
  buttons: {
    ok: {
      label: "Roll",
      callback: async (html) => {
        let selectedTool = html.find('#tool-select')[0].value.replace(/_/g, " ");
        let ability = "int";
        switch(selectedTool.split(" ")[0].split("\'")[0]) {
            case "carpenter":
            case "tinker":
            case "thieves":
                ability = "dex";
                break;
            case "navigator":
                ability = "wis";
                break;
            case "cobbler":
                ability = "str";
                break;
        }
        let isProficient = false;
        if(selectedTool.includes("thieves")) {
            isProficient = actor.system.traits.toolProf.value.some((prof) => prof === "thief");
        } else {
            isProficient = actor.system.traits.toolProf.value.some((prof)=> selectedTool.includes(prof)) ?? false;
        }
        let abilityMod = actor.system.abilities[ability].mod;
        let roll = undefined;
        let bonus = 0;
        if (isProficient) {
          bonus = actor.system.attributes.prof * 2;
          roll = await new Roll(`1d20 + ${abilityMod} + ${bonus}`).roll();
        } else {
          roll = await new Roll(`2d20kl + ${abilityMod}`).roll();
        }
        let messageContent = `
          <p><strong>${actor.name}</strong> rolls an Artisan's Tool check using ${selectedTool}:</p>
          <p>Roll: ${roll.dice[0].total}</p>
          <p>Modifier: ${abilityMod}</p>
          <p>Bonus: ${bonus}</p>
        `;
        roll.toMessage({
          speaker: ChatMessage.getSpeaker({ actor: actor }),
          flavor: messageContent
        });
      }
    },
    cancel: {
      label: "Cancel"
    }
  }
}).render(true);

@lost estuary

lost estuary
#

perfect.

#

Ok, that is fully automated right tool for the job with Tool expertise taken into account.

#

it would actually be perfect if it checked for the feat on the doubling of proficiency.

#

but, considering that is not a factor in my game atm, not worried about it

#

So much better than putting all the dang tools on their sheet and having them find the right one in the inventory. Yall are gems!

kind cape
#
let actor = canvas.tokens.controlled[0].actor;

let toolOptions = ["Alchemist's Supplies", "Brewer's Supplies", "Calligrapher's Supplies", "Carpenter's Tools", "Cartographer's Tools", "Cobbler's Tools", "Cook's Utensils", "Glassblower's Tools", "Jeweler's Tools", "Leatherworker's Tools", "Mason's Tools", "Navigator's Tools", "Painter's Supplies", "Potter's Tools", "Smith's Tools", "Thieves' Tools", "Tinker's Tools", "Weaver's Tools", "Woodcarver's Tools"];

let content = `
  <form>
    <div class="form-group">
      <label>Choose an artisan's tool:</label>
      <select id="tool-select" name="tool-select">
        ${toolOptions.map(o => `<option value="${o.replace(/\'/g, "\'").toLowerCase()}">${o}</option>`).join("")}
      </select>
    </div>
  </form>
`;

new Dialog({
  title: "Select Artisan's Tool",
  content: content,
  buttons: {
    ok: {
      label: "Roll",
      callback: async (html) => {
        let selectedTool = html.find('#tool-select')[0].value.replace(/_/g, " ");
        let ability = "int";
        switch(selectedTool.split(" ")[0].split("\'")[0]) {
            case "carpenter":
            case "tinker":
            case "thieves":
                ability = "dex";
                break;
            case "navigator":
                ability = "wis";
                break;
            case "cobbler":
                ability = "str";
                break;
        }
        let isProficient = false;
        if(selectedTool.includes("thieves")) {
            isProficient = actor.system.traits.toolProf.value.some((prof) => prof === "thief");
        } else {
            isProficient = actor.system.traits.toolProf.value.some((prof)=> selectedTool.includes(prof)) ?? false;
        }
        let abilityMod = actor.system.abilities[ability].mod;
        let roll = undefined;
        let bonus = 0;
        if (isProficient) {
          bonus = actor.system.attributes.prof * actor.items.some((item) => item.name === "Tool Expertise") ? 2 : 1;
          roll = await new Roll(`1d20 + ${abilityMod} + ${bonus}`).roll();
        } else {
          roll = await new Roll(`2d20kl + ${abilityMod}`).roll();
        }
          console.log(roll);
        let messageContent = `
          <p><strong>${actor.name}</strong> rolls an Artisan's Tool check using ${selectedTool}:</p>
          <p>Roll: ${roll.dice[0].total}</p>
          <p>Modifier: ${abilityMod}</p>
          <p>Bonus: ${bonus}</p>
        `;
        roll.toMessage({
          speaker: ChatMessage.getSpeaker({ actor: actor }),
          flavor: messageContent
        });
      }
    },
    cancel: {
      label: "Cancel"
    }
  }
}).render(true);

@lost estuary
Now does + prof if no feature named Tool Expertise is owned by the character, does + 2*prof if the actor does have a feature with that name.

Alright, I'mma go catch some ๐Ÿ’ค 's (Not Zhells) then, if anything breaks ping me ๐Ÿ˜‚

mighty pier
#

Is there any way to prevent hit points from dropping to 0?
As the simplest example - the spell "Death ward". In fact, I don't need it for players using this spell, but for some mobs, mostly bosses.

lost estuary
mighty pier
#

Let's say I have a berserk mob that will live on 1 hit for another turn, and I don't want to constantly return this 1 hit point to him after accidentally taking damage from AoE spells.

scarlet gale
#

Beat me to it lol

scarlet gale
#

Hooks on midi-qol.damageApplied

#

Most easily done via a world script

coarse mesa
#

Great response on the Midi-SRD @violet meadow ๐Ÿ™Œ

#

Weโ€™ll finally be able to pin it in here

hot flower
scarlet gale
#

Would need to be slightly reworked to not delete the effect

#

And instead check for remaining uses

#

or something along those lines

light sleet
#

how do i automate my players liking my campaign

violet meadow
#

pay them? ๐Ÿ’ธ

violet meadow
light sleet
#

ooooo baby a triple

#

can i have that

hot flower
#

before I go into a macro headbang, is there a core function that will automatically apply an item with an effect upon the completion of a long rest? I'm thinking of automating Relentless Endurance and Relentless Rage but thinking I might need an effect macro to apply them upon long rests?

scarlet gale
#

You can hook rest completed

stray bison
#

Hi again! ๐Ÿ™‚ I'm trying to set up Mind Sliver, and I have everything working except for the "subtract 1d4 from the next saving throw" part - I have it subtracting 1d4 from every saving throw until the duration runs out. How do I have the effect expire after the first saving throw?

scarlet gale
#

Special duration on the effect

#

set it to making any save

stray bison
#

Ooh, thanks!

#

Got it working perfectly (including if the save is for Mind Sliver on the caster's next turn, when the new Mind Sliver overwrites the previous one). Thank you so much! ๐Ÿ˜„

wind pecan
#

Is there a new/different module that contains what the DAE SRD and Midi SRD contain? (both are version 9 or older)

violet meadow
wind pecan
#

I was going to assume the DAE was obsolete. Ok good to know on the update. I had just tried to install the Midi SRD and got an install error due to a missing file. I'll stay tuned and look for future announcements ๐Ÿ™‚

scarlet gale
#

Midi srd has a working fork. You can search for it here

violet meadow
gilded yacht
violet meadow
gilded yacht
#

Hmm, I'll have to have a look - I don't call it when computing cover bonuses, but it might update the target token accordingly in which case it could work.

violet meadow
#

When I had first used it, it was working. I haven't checked for some time now though

#

Seems to work out of the box

#

but cannot test it now more

gilded yacht
#

Yes, seems to work. Total cover does not cause attacks to fail, but I'll have a look at what might be possible.

languid wave
#

had an issue today where auto roll damage wasn't working on NPCs

gilded yacht
molten solar
vast bane
#

you can induce a tool check request via lmrtfy and MTB if your players hate auto rolls

#

hell half all the time its faster for me to ask for the mtb roll than for them to find the tool check

novel gale
#

@scarlet gale Is there a good way to automatically convert all spells, items, etc on an actor or maybe a group of actors to the Chris' Premades versions?

I run a lot of one shots for random people and right now my process is pretty quick: Import their characters from D&D Beyond and then play. But clicking on the convert button on every item on all of their character sheets to see which ones have Chris' premades versions is pretty slow.

scarlet gale
coarse mesa
molten solar
#

(I would guarantee that he has.)

jovial crater
#

Hey, guys, I'm trying to automante the Stench of Death feature from the Corpse Flower, but not a little bit different from the one from the book
"Each creature that starts its turn within 10 feet of the corpse flower or one of its zombies must make a DC 16 Constitution saving throw, unless the creature is a construct or undead. On a failed save, the creature is incapacitated until the end of the turn. Creatures that are immune to poison damage or the poisoned condition automatically succeed on this saving throw. On a successful save, the creature is immune to the stench of all corpse flowers for 24 hours."

But it's not working.sometimes the effect doesn't even show up on the tokens some times it does, but it affects the Corpse Flower, even with the "ignore self" marked on the Aura settings. And when it does show up, the effect gets applied on the enemy tokens, but on the Corpse flower turn instead of the enemy's

#

How can I set it up correctly?

vast bane
#

chris has like 4 different versions of this in his module fyi

vapid meadow
#

im having an issue, i THINK with MidiQOL and Magic Items. Spells cast from magic items auto place a measured template, but i dont think midi realizes it, so it doesnt roll damage. it gives me links in chat to create a measured template and roll damage, but if i click on the roll damage button it says no measured template is done. This is only happening from spells from the magic items module.

#

ive double checked anything obvious in workflow, and i dont know if im missing anything.

violet meadow
#

I am not using Magic Items anymore, in favor of Items with Spells

#

So I am not sure what might be happening ๐Ÿค”

vapid meadow
#

so it works better with Items with Spells?

#

latest versions of both MidiQOL and MagicItems. confirmed just now.

violet meadow
#

I know that it works in my workflow with Items with Spells

kind cape
#

Magic Items (the module) has always been a bit buggy, Items with Spells generally works better with other modules

violet meadow
#

There are some discrepancies when you recast a concentration spell but I need to test it more

vapid meadow
#

ill give it a shot.

#

ill give items with spells a shot.

jovial crater
kind cape
jovial crater
vapid meadow
#

not really a midi question, but since you both use it, how do you set charges on items with spells?

#

i can drag spells to the spells, but cant seem to set charges?

molten solar
#

#dnd5e
Have you tried the edit buttons where you drag and drop spells?

untold cape
kind cape
jade gazelle
#

Can somebody help? I enabled "Allow DM to fudge damage rolls" in the settings of MidiQol but now I don't know how to turn it off. Clicking it again does not turn it off.

#

Nevermind

#

I'm not very good at smart making

vast bane
#

that has to be another module right?

#

How did I miss that one lol

scarlet gale
#

Does midi-qol with fast rolls off let you change the damage formula in the pop-up dialogue?

#

I'm trying to test locally and it appears to lock the top box out.

#

Unless I'm missing a setting somewhere.

violet meadow
#

I don't remember how customizable it is though. I remember damageType at least

scarlet gale
#

Someone's telling me editing the damage in a dialogue isn't getting respected in a setDamageRoll of mine where I'm grabbing the formula from midi-qol.

#

So trying to confirm if it's just workflow.damageRoll not picking up on changes they make

violet meadow
#

Hmm might be doing the same thing both you and that option ๐Ÿคท

#

I think you can choose between Damage formulas now that I think about it.
Like roll the normal damage formula, or versatile or other

scarlet gale
#

Either way, the workflow should have the correct damageRoll presumably right?

violet meadow
soft bane
#

Hrm, I went to try to uninstall midisrd and reinstall midisrd but got an error:
"Metadata validation failed for module "midi-srd": The file "scripts/midiSRD-styles.css" included by module midi-srd does not exist"
e: Found the manual link, that seemed to work ๐Ÿ™‚

scarlet gale
violet meadow
soft bane
#

To check what moto linked is your unofficial fork right?

violet meadow
#

yeah

soft bane
#

Well I installed it, we'll see what happens ๐Ÿ˜„

kind cape
violet meadow
#

yeah it 100% makes sense ๐Ÿคท
But what happens if you try to change the changed formula?

scarlet gale
violet meadow
#

Is this Moto?! ๐Ÿ—ž๏ธ ๐Ÿ˜„

scarlet gale
#

No lol

kind cape
violet meadow
#

Just one macro and the Enhanced Damage Dialog

scarlet gale
#

Using the enhanced dialogue seems to work fine too.

raven holly
#

I am curious why more people dont recommend/use the Foundry Gearhead server? I know it's a pain to shuttle people over to yet another server, and people inevitably will come here first (well, #dnd5e first, then here...) but wouldnt it be a bit more convenient to have a place that is better organized and searchable?

kind cape
#

Never even heard of that server ๐Ÿคทโ€โ™‚๏ธ

scarlet gale
#

Server seems pretty dead to me

raven holly
#

Its in the first pinned comment

scarlet gale
#

At least last time I looked there

violet meadow
#

Yeah there are some people asking around, but never took off.

raven holly
#

yea it's definitely underutilized. It was started by Kandashi, who's had to take a leave from Foundry stuff, but I feel like it could be a useful spot for this

violet meadow
#

Most of the time its Elwyn and me that help around in that one. Only way that takes off are if people are always sent there, like Monks discord or Mr Primates

raven holly
#

like, just trying to search alone here bothers me personally, since discord doesnt let you limit a search just in a thread you have to navigate between chatter in dnd5e and here, it's gotta be pretty challenging for yall

violet meadow
#

The search is pretty bad for the thread yeah

scarlet gale
#

Yea, but I just gloss over stuff in the dnd channel since if it's macro related it won't be something specific to midi-qol if it's in there.

raven holly
#

yea, and if it was officially endorsed by tposney on the git or something

violet meadow
#

That is another issue, as Chris says. It is too much involved with the rest of dnd5e modules

raven holly
#

well, if this works for yall, then more power to ya.
I was just curious because if I were trying to help more in here it would drive me pretty bonkers haha

#

but also if you have some suggestions as to what may make things more convenient for you, I'd be interested to hear, but I am not making any promises!

scarlet gale
#

To be fair, it would be quickly solved if Discord would just add a way to search threads specifically

kind cape
#

Tbf, Discords search is just kinda bad in general if you are looking for code, since it ignores stuff in code blocks

scarlet gale
#

That too

raven holly
#

Well, I certainly cant do anything about discord itself haha

vast bane
#

I think discord search is fine, just wish we had our own channel lol

#

we're more active than most the system channels lol

scarlet gale
#

That could also just mean we have the most problems

vast bane
#

I'm sure they will add a thread search option in the search to make it easier

#

either that or maybe the devs can put is as a thread in one of the least used systems ;p

scarlet gale
#

Threads have been around awhile, I wouldn't count on it.

#

They're not really intended to be used like what happens here

#

It's supposed to be mostly short-term split off discussions

raven holly
#

There's gotta be some discord devs that play dnd, we need to find them and pull them in here haha

dark canopy
#

i'll happily redirect to GearHeads

scarlet gale
#

ehh, from what I've seen people just don't know this thread exists

#

redirecting to another server would only make that issue worse

dark canopy
#

weren't we just discussing the issues with being a thread? ๐Ÿ˜…

scarlet gale
#

Midi-qol just needs it's own actual Discord server

dark canopy
#

but all good ๐Ÿ‘ just offering

raven holly
scarlet gale
#

The more steps you add to get to the destination the less people will be likely to do so.

vast bane
#

even if we moved there you'd still get overwhelmed with midi stuff here so I guess its damned if we do and damned if we don't

raven holly
#

yea I totally get that, but Im not really meaning to say this in a way that is "I want all chatter about midi out of my channels" haha, I'm looking at if from "If I were Moto helping people with this everyday, I would not want to do it this way"

molten solar
#

Well 'make a midi discord server' has certainly been both kindly and unkindly suggested many, many times

#

It simply hasn't been done after all these years, so no one expects it to happen.

short aurora
#

I forgot what this phenomenon is actually called, but these (visually only) duplicated effects on tokens has recently started to happen with items of the concentration variety with midi the first time they're cast a session. It does also make the game lag for like a second. Anyone experienced similar or got a solution? dnd5e 2.1.5, midi 10.0.33, dae 10.0.23

scarlet gale
#

It's been doing that for awhile

#

I don't think anyone has conclusively figured out what's causing it.

#

At least it's just a visual glitch and doesn't actually duplicate the effect.

short aurora
#

๐Ÿ‘ Thanks. I must've just been blessed and knocking over the baptising font was not kosher.

vast bane
#

its also only on your client, I have seen this in my live sessions and the players confirmed they didn't see it

dark canopy
narrow saddle
#

Hi there,

I have got a couple of odd conundrums and I am baffled to know where to look first, I have tried FTC and it shows certain modules as being the culprit but I am not sure what to change to make it how it was.

So the first one is that when a spell is cast on a PC and a save is required, two of the five players auto roll their saves, three of the players get a pop up window so they can choose adv/norm/dis. I need all five to get the pop up window.

When a player gets hit and the damage card appears with the amount of damage to take (Midi) with the little tick to click to take the damage, all the players can see this and if they wanted to could click the tick for another player. ๐Ÿ˜ฆ

Please can anyone help? ๐Ÿ™‚

MIDI with Monks Token Bar for the saves.

violet meadow
violet meadow
#

For No2, what MidiQOL version are you on?

narrow saddle
narrow saddle
violet meadow
#

For the separation.

violet meadow
narrow saddle
narrow saddle
# violet meadow GM setting. In MidiQOL settings, main window

Ok, so two PC actors, I have mirrored the options on both exactly the same, Both have enable roll automation support ticked, and on the DM client Fast Forward Ability Rolls is unticked.

One gets a pop up, the other doesn't for a Con save from the effect of a spell. ๐Ÿ˜•

#

Even more baffling is that the actor that is having their save auto rolled, is still having their save auto rolled when that player unticks Enable Roll Automation Support. ๐Ÿ˜ฆ

violet meadow
#

If you open the actual target Actor's character sheet, the doubles are not shown and if you reload the client affected, the double icons disappear too

#

@marsh ferry amd @gilded yacht just pinging you in for this

Might not be DFreds CE issue though as indicated here: <#1010273821401555087 message>

Worth noting it still happens with Convenient Effects disabled for me, tho', I only had midi and dependencies
(dae, midi, socketlib and libwrapper)

short aurora
violet meadow
#

Command is not concentration and it is affected too in my case.

short aurora
#

Strange, Mage Shield goes on without me noticing a choke or visual bugs. Only my Concentration items are affected.

violet meadow
#

The same token after reloading

violet meadow
short aurora
#

I don't think any of the spells I mentioned do...

violet meadow
#

For giggles, just try adding in a macro.CE | CUSTOM | Blinded in the Mage Shield.

#

Concentration might be auto triggering that bug, as it is handled by DFreds CE if not mistaken ๐Ÿค”

short aurora
#

That could be it, I do reproduce it by adding macro.CE to any effect, yeah.

#

Worth noting it still happens with Convenient Effects disabled for me, tho', I only had midi and dependencies

#

(dae, midi, socketlib and libwrapper)

violet meadow
#

That narrows it down then!

short aurora
#

Doing a sanity check here, it wouldn't be considered a client side visual bug if I can both see it in a browser logged in as a player and myself as a GM in the standalone client, right? Or is that more intertwined that I assume?

violet meadow
#

Ah I just saw the issue you posted! Interesting. For me it's only triggered on the client that triggers the AE.

short aurora
#

Could be a response time thing, my testing was on the local IP so maybe it was just fast enough to have the error occur on both? A little beyond my know-how of how that stuff works

mighty pier
#

Is there an easy way to make a creature gain one stack of effect at the end of each of its turns in combat?
Of course, it is possible to use DaE or other modules

#

I think this can be done using a macro and Macros Effects, but I'm sure that this can be done somehow through the effects themselves, without using macros, after the last sorting of 500+ macros, I want to do something without them when possible

languid wave
scarlet gale
#

Midi version?

mighty pier
scarlet gale
#

Was for @languid wave

languid wave
scarlet gale
#

Not the no cover bug then

languid wave
#

Here are the settings I have on the NPC rolls

scarlet gale
#

Older version had some issues with unset midi properties

languid wave
#

Player damage rolling was mostly fine

#

it was rolling Hunter's mark damage on cast and not on hit, which was a little strange

scarlet gale
#

That could just be a not setup hunter's mark

languid wave
#

that's true...

#

might not be srd, so that might've been a custom one...

#

yeah, looks like it was a weirdly set up one, so just the non auto roll is my question

lime walrus
#

when saving throw automation is disabled all targets fail the spell save, right? so why in this case the convenient effects of the spells are not being applied to the targets?

scarlet gale
#

Should be waiting for players to manually roll I think

lime walrus
#

it never applies them for me

#

I'm testing now with vicious mockery

gilded yacht
languid wave
gilded yacht
dull sinew
#

Hey guys! I'm trying to configure a aura effect that trigger every time an enemy is on the area, enters the area for the first time in their turns or start their turns there. I know I can probably configure this with OverTime, but how to do that with an aura in that way?

lime walrus
gilded yacht
languid wave
gilded yacht
# languid wave

It looks like there is a problem with the damage roll for pummel - what does the damage formula look like?

gilded yacht
# languid wave

So it looks to be just the pummel item (or some bonus on the attacker).

#

If you export and dm me the actor which has pummel I can have a look

languid wave
#

this was a R20 import character I think

gilded yacht
#

That looks ok - export and md me the actor - there's something funny going on.

gilded yacht
# languid wave

It looks to be a problem with the import - the 1d -1 has a different character for the minus sign that foundry does not recognise. If you change the minus sign in the formula to a - it works.

#

If you look closely you'll see that it is not a normal minus sign. (Thanks for mentioning it was a roll20 import - that gave me the clue to look at that)

dull sinew
#

Hey, there's something with MidiQOL that allows me to upgrade de damage category of the dice? Like, from 1d4 to 1d6, 1d8 to 1d10, etc

sudden grove
#

Second example from an earlier combat - different character, obviously

#

appears to be sourced from the spell attack, but I don't know what module would be causing it?

#

Spell attack roll??

vast bane
vast bane
#

All bets are off when a person reporting a problem is trying to use a v9 module in v10 especially ASE

languid wave
#

R20 import used a funky character for the minus sign

vast bane
#

that doesn't change the fact you are going to have a ton of problems keeping that module enabled

languid wave
#

I will look at deactivating!

foggy vigil
#

Hi people, I have some sort of weird notifications popping up whenever we use a template over a creature with 0 hit points. I guess it's related to the new Vitality optional rule but I haven't activated that as far as I know. Any ideas?

Edit: Problem went away when I selected DF templates instead of walls block in the Midi setup. Yey.

vast bane
#

@scarlet gale I really like the button on the top bar to update, but is there a way that it can pull from a custom compendium instead of yours? I see two entries for DDB compendiums in the settings, if I point those two spots at my custom compendiums would that do it?

scarlet gale
#

Those are just intended to be your ddb importer compendiums

#

They are used for things that need to pull spells I don't need to automate

vast bane
#

If I created a macro that unlocks your compendiums, and merges my own automateds into yours, would the button work for those too, I wouldn't be cutting and pasting, I'd be doing this macro everytime I update your module so as to avoid how updating deletes everything

#

I ask cause this is utterly amazing for quickly updating monsters in a bestiary

scarlet gale
#

Yea it should

#

The monster features are found by folder name then item name

#

everything else is matched by name only,

#

I can look into allowing you to add your own compendium or something

vast bane
#

I'm revisiting my Beacon of Hope macro because I found it to be broken for me in the newest midi/dae/dfreds. There is this maxheal key for midi, however I think I want the max heal key to be global but have it be an evaluation to only if the actor has the beacon of hope effect on it. Right now my only way to do this is to Ctrl A all the tokens on the map when beacon of hope is casted and give them all a passive feature for max heal if beacon of hope exists that expires when combat ends

#

Ok so following @violet meadow 's wiki examples, in the newest midi I am getting this error when trying to put an evaluation into the key for maxdamage.healing keys:

#

So either Bugbear has typos or the newest midi is a bust

scarlet gale
#

Looks like a typo

vast bane
#

I dunno what it could be then

#

I suspect it cannot take evaluations as I tried a really simple one I know works and it also threw the same problem

#

I'm gonna step down to 32 and see if its an issue in midi 33

#

yeah the max heal key just does not take evaluations, its a boolean, but you can't use the activation condition syntaxes in it

#

also something in 33 is slowing the hell out of my server, I just downgraded to 32 and the errors for the 10 tokens were super fluid and fast, but in 33 it was constantly super slow

#

This is the key I was trying to use for beacon of hope. With the above error every time no matter what I put in for an evaluation.

#

1 and 0 work though

#

sigh, I have got a bug where one of my players actors is auto applying unconscious and prone on any actor update and its midiqol doing it and I have no idea how to fix this, he cannot wake up nor get up, it will reapply it constantly if I delete it:

#

actually all of my actors are doing this now

#

Fyi for anyone who downgrades from 33, your midiqol settings go haywire, had to import my backup settings to continue.

#

Yeah I dunno how tof ix beacon of hope, this is really weird cause someone recently said they were using it, and it works for them, but I have no friikkin clue what broke

#

Actor On Use macro:

const workflow = MidiQOL.Workflow.getWorkflow(args[0].itemUuid);
const targetTokenUuid = args[0].hitTargetUuids[0];
const targetToken = await fromUuid(targetTokenUuid);
const targetActor = targetToken.actor;
const effect = targetActor.effects.find(eff => eff.label === 'Beacon of Hope');
if (args[0].macroPass === "postDamageRoll") {

    // if Target HP > 0 return 
    //if (targetActor.system.attributes.hp.value != 0) return;
    
    //If no Beacon of Hope
    if (!effect) return;

    // check to make sure only one target is selected
    //if ((args[0].targetUuids.length < 1) || (args[0].targetUuids.length > 1)) {
    //    ui.notifications.error("You need to select a single target.");
    //    return;
    //}

    // compute maximum healing for the spell cast
    let healingRollMax = 0;
    for (let i = 0; i < workflow.damageRoll.terms.length; i++)
        if (workflow.damageRoll.terms[i]?.faces) healingRollMax = healingRollMax + (workflow.damageRoll.terms[i].faces * workflow.damageRoll.terms[i].number);
        else if (workflow.damageRoll.terms[i]?.number) healingRollMax = healingRollMax + workflow.damageRoll.terms[i].number;
    let bonusHealing = (healingRollMax - workflow.damageRoll.total);
    await setProperty(workflow, "BonusHealing", bonusHealing);

    return;

} else if (args[0].tag === "DamageBonus") {
    const actorUuid = workflow.tokenUuid;
    const actorToken = canvas.tokens.get(workflow.tokenId);
    
    if (!effect) return;
    
    let bonusHealing = await getProperty(workflow, "BonusHealing");

    // Bonus Healing
    if (bonusHealing > 0) {
        await setProperty(workflow, "BonusHealing", 0);
        return { damageRoll: `${bonusHealing}[healing]`, flavor: "Beacon of Hope Bonus Healing" };
    } else return;
}
#

No errors, no functional effect on heal spells

#

Target clearly has the effect on them, healer definitely is healing

scarlet gale
#

That can be done in a much better way

vast bane
#

Probably, but what drives me nuts is that this works for another user but not me and I just have nothing to go with here, theres no error in the console, it just doesn't do anything

#

I made this, and it worked when I made it, something along the way has killed my actor on use macros

#

they just simply don't exist

#

they don't fire, they have no effect

#

this one also doesn't work

scarlet gale
#

Could be a bugged actor

#

I've had an actors that stopped respecting on use macros

#

and had to remake them

vast bane
#

oh god I do not want that to be the case

#

nah its all actors

#

its not just 1 actor, there is something wrong with the macro

#

I think I killed my world with this downgrade to midi 32 from 33

#

anytime I change a midi setting everything gets really weird

narrow saddle
# vast bane My guess for this is that you have the bug where a player does not load all of t...
  1. Itโ€™s happening when Iโ€™m controlling the player as DM and when Iโ€™m logged in as player.
  2. All players have just player permissions.

With the player with the CON save problem, I changed the Dwarven resilience to poison feature and that stopped the auto rolls. (I think it was like SRD and I changed it to DDB).
The player where every save prompted by a spell auto rolled, I deleted and reinstalled the character from DDB and they still auto rolled saves against spells.
So I created a completely new character and Iโ€™m gradually recreating the character bit by bit to see at what point the auto roll problem kicks in.

(I should be preparing for the next session, story wise, but I end up getting obsessed with these things!)

narrow saddle
#

ASE? Just remind meโ€ฆ.

#

Active Effects?

scarlet gale
#

Advanced Spell Effects

#

@vast bane Just released a beacon of hope automation

#

Hooks on midi damage application so it should catch more stuff

narrow saddle
#

I do not use ASE then.

violet meadow
#

The max/min fields do not accept conditions. Only Boolean

#

Ah I just scrolled a bit further down from the ping and saw that you had found this

pseudo turret
#

sorry, I've not much experience with the latest midi in v10 - I took a break from fvtt right around when v10 was released. I'm looking for a sanity check. Is this setup for cover calculation working as intended? With +999 AC meaning - I assume - that Levels Cover module (API mode) has returned full cover? There is a wall between attacker and target not in the screenshot btw.

frigid zinc
hard oxide
#

Hi guys is there any magic missile macro ?

solid mountain
#

Is there a way to get a midi-spell to apply Enhance Ability from Convenient effects? With the setting in midi to apply convenient effects instead it works for most spells. But for some reason it does not apply the CE version of Enhance Ability.

narrow saddle
#

Is there a way to set these settings so that when the damage card comes up, only the DM and that player that has been damaged gets to see the damage card where the tick is to apply it?

At the moment, all the players can see everyone else's damage card and can even click the tick to apply the damage on someone else's behalf. Which is a bit weird.

#

Also that last sentence, no idea what that means.

vast bane
#

cause this wasn't happening to me in my game

narrow saddle
vast bane
#

do the players have ownership to each other

narrow saddle
#

They can observe each other. Do you think that is it?

#

I will run a level one diagnostic Captain.

narrow saddle
worthy wraith
pseudo turret
vast bane
#

typically nothing made by zhell works with midi by design macrowise

#

Chris' Premade Module has the best midi divine smite imo

worthy wraith
#

where can I find that please?

vast bane
# worthy wraith where can I find that please?

Welcome to the world of midiqol:

Sources of premade stuff for Midiqol:

Midi Sample Items Compendium(comes with the module)

Midi SRD's compendiums(this is the manual install link)
https://raw.githubusercontent.com/thatlonelybugbear/midi-srd/master/module.json

More Automated Spells Items and Features compendiums
https://foundryvtt.com/packages/more-automated-spells-items-and-feats

Mr.Primates premade macros:
https://github.com/MrPrimate/ddb-importer/tree/main/macros

Chris' Premade macros:
https://github.com/chrisk123999/foundry-macros

Chris' Module form of his macros:
https://foundryvtt.com/packages/chris-premades

Activation condition examples by ThatLonelyBugbear
https://github.com/thatlonelybugbear/FoundryMacros/wiki/MidiQOL-activation-conditions-examples

frigid zinc
vast bane
#

not only does it not heal for max, it seems to also screw up the method of applying heal amount

#

I suspect maybe your module now requires midi 33?

#

nope figured it out, your blocking exploding dice
not it

vast bane
#

I am so utterly confused by this:
Why is the last bardic set to add?

And why do I get this error:

The roll works but there is no dice so nice roll? Bardic premade doesn't have this problem?

vast bane
#

well, it may have been midi actually , but it wasn't a thing I set midi to do, it was a thing dfreds did lol

delicate quartz
#

If I set a bonus to spell save DCs using Build-a-Bonus, should I be able to see it on the actor sheet or in the chat cards?

vast bane
#

thats like all of babs stuff, not visible on sheet

molten solar
#

Recap:
doesnt show on sheet
midi breaks the chat card (where it normally DOES show)
not my issue ๐Ÿ‘

vast bane
#

I don't even know what that card is he showed

#

I use MTB

#

I'm guessing thats the chat message card?

molten solar
violet meadow
#

Nope fully compatible with MidiQOL v10.0.33
@delicate quartz do you have a previous MidiQOL version? There was a now closed issue

flat gazelle
#

anyone have a clue why it offers (and uses) nonexistent 8th and 9th level spellslots on chris premade divine smite ๐Ÿ˜… ?

kind cape
#

Probably an oversight by @scarlet gale ๐Ÿค”

#

Are you using the one from the module or the one from his macro collection?

flat gazelle
#

Module

I'm not sure. In this campaign I have a 14th lvl pala where it only offered up to third level (as his 4th lvl slot was already used up) and the socradin where it suddenly goes up to 9th lvl

kind cape
#

Yeah, looking at the code right now, it should indeed only show spells that you have slots for ๐Ÿค”

flat gazelle
#

must be something with the character then ๐Ÿค”

#

it also does only apply 5d8 max, so that part works too

violet meadow
#

I see D&D Beyond importer which might have something to do with that

kind cape
#

Might be something with it being a multi-class, could you open the console (CTRL+Shift+J), select a token belonging to the character in question, and then type in the following:

_token.actor.system.spells.spell6.value
#

Actually, replace the spell6 with spell8, just realized its sorc 12 pal 2, not the other way around ๐Ÿ˜›

flat gazelle
#

"0"

kind cape
#

Oh

#

I just looked at the relevant part of the code, I know whats wrong

#

Its a bug in the macro ^^

delicate quartz
violet meadow
#

yes closed in 10.0.33

delicate quartz
#

Sweet, most likely the issue then. I'll double check updates when I'm back in front of my computer. Thanks for the help.

flat gazelle
kind cape
#

Its just a copy-paste typo ๐Ÿ˜‚

flat gazelle
#

oh ๐Ÿ˜„

#

thanks for your help btw!

scarlet gale
mighty pier
#

I have one kind of difficult question: let's say there is an attack that puts a "mark" on the enemy, and when SAME creature attacks the enemy with the mark, it deals additional damage. In theory, you can apply an effect on an enemy called "Mark", and make the condition "the enemy has an effect - mark" in the attack. Will it work? And if so, how to make such a condition?

scarlet gale
#

@vast bane Just updated it to work with exploding dice

#

You essentially want to want it to evaluate the token ids to see if they're the same

#

What feature is this for?

raven holly
#

This should work, right? Trying to execute the parent item's ItemMacro (which is just to use that item) when the actor hits 0 HP

scarlet gale
violet meadow
raven holly
#

Ok, and I did try without the =0 just to see if it would trigger on any HP change, but that didn't work either

violet meadow
raven holly
#

Yea

violet meadow
#

or you will need to construct the Effect in the macro

raven holly
#

Hmm ok, I'll give that a whirl when I get back, thanks!

violet meadow
#

One example I could find. It should be working

earnest loom
#

Just wanted to thank the wonderful folks who are helping out here. Today, I was able to create 6 homebrew feature, all fully automated. I learned a lot from all the example provided around this discord.

scarlet gale
#

Let me know if anyone runs into trouble with this.

#

I mess with the item properties a bunch on my automations and there's a chance the DDB importer doesn't pick up on my change.

deep mirage
#

is that checkbox in the DDB importer?

scarlet gale
#

yep

#

Looks like the bot didn't post about it in #package-releases but you're able to update to it.

#

Looks like not enough of my item changes are getting picked up, specifically targeting and damage changes.

deep mirage
#

is it possible to not have your automations be linked to the actor? For instance I made a "greater hezrou" and the stench didn't work

scarlet gale
#

You should just be able to copy the feature from one monster to another.

deep mirage
#

hmm ill try again. it gave me an error saying the actor name was incorrect

scarlet gale
#

Are you trying to use the med-kit icon to do it?

#

It matches based on monster name only. Pull the feature out of the compendium instead.

deep mirage
#

yep that worked from the compendium. thanks!

#

yeah i was using the medikit

scarlet gale
#

There isn't any easy way to match monsters beyond using the name

#

So if it doesn't match the compendium folder name it'll say it can't find anything.

violet meadow
#

and tag them with a CPM flag ๐Ÿ˜„

scarlet gale
#

The issue is knowing what monster the gm is trying to update

#

Finding it in the compendium works fine once I know what monster they're looking at

violet meadow
#

Are these SRD monsters?

scarlet gale
#

I suppose I could make a search dialogue

#

No clue

#

Probably not for most

violet meadow
#

Oh is it for the D&D Beyond integration? nvm

scarlet gale
#

Nah

#

It's the update button on items thing

#

To wholesale replace the items with the one in my compendium

delicate quartz
#

Here's a fun one. Is there a way using MidiQOL to create an item that automates rolling a sleep deprivation check? I was thinking of creating Dfred's Convenient Effects for the number of consecutive days a creature has foregone sleep but I don't know how to set the DC and it looks like the DC field in the actions section only accepts numerical inputs.

scarlet gale
#

With macros, sure

#

Could roll a synthetic item with the DC changed on demand based on the number of stacks

delicate quartz
#

Yeah, actually, you're right. An on use macro would be the way to go.

vast bane
# scarlet gale With macros, sure

starting my session now, but testing your beacon of hope, still no errors, still no max healing, I can't test it any further tonight though

scarlet gale
#

On the latest version I just pushed?

vast bane
scarlet gale
#

Screenshot the damage application box, not the roll formula

#

well, include the formula too

vast bane
#

oh shit it is working, its just not showing the work:

scarlet gale
#

healed 53?

vast bane
#

the card is not right but the heal is

scarlet gale
#

The card can't be right due to heals with multiple targets

#

What if you do mass cure wounds and only half the targets have beacon of hope?

#

Technically, it's maxing the exploded dice too. I can change that if that's undesired.

vast bane
#

its not maxing exploding

scarlet gale
#

uh

#

it should be?

#

It's counting the number of dice in the terms

vast bane
#

6x8+5 is 53

#

I never exploded

scarlet gale
#

gotcha

#

but if you did

#

it would add those extra dice too

vast bane
#

they wanted some sorta benefit from both features

#

thats fine

#

they had wanted some benefit on top of max heal features for exploding dice so its a happy side effect

scarlet gale
#

That's what I figured

#

Skipping the exploded dice could result in the max heal being less than the exploded dice heal otherwise

#

Would be pretty rare, but possible

celest bluff
#

I was using a third resource slot to keep track of stress levels on the character when building out the darker dungeon stress system.
Worked out fairly well with hooks evrrytime the character made successes, it would reduce stress. Every time they failed, they gain stress automatically.

celest bluff
mighty pier
odd sable
#

I'm building an ability somewhat similar to Hunter's Mark, but with a scaling damage value based on the level of the user, how would I need to change this part of the Item Macro to refer to the subclass identifier in question? let damageType = args[0].item.system.damage.parts[0][1]; const diceMult = args[0].isCritical ? 2: 1; return {damageRoll: `${diceMult}d6[${damageType}]`, flavor: "Hunters Mark Damage"};

#

The identifier in question is @scale.musketeer.fencing

#

At the moment it's written as 1d4 (and scaling), but I could easily rewrite it to just d4 if that's better?

broken wolf
#

question

so watching a video on Midi QoL and the guy mentioned something i hadnt noticed yet or cant find in the settings, does the module no longer apply advantage/disadvantage when its present? testing with two npcs using ranged weapon in melee and nada, have to do the whole ctrl or alt and roll thing

sudden crane
broken wolf
#

ahh didnt notice the checkbox lol, thanks

#

one down, next would be attacks of opportunities, does the module recognize when one is available?

sudden crane
broken wolf
#

okie dokie

#

thanks

honest osprey
#

I'm not sure why this message pops up does anyone know what that means?

#

I mean it does the roll fine I'm just not sure why it show's 9999/9987 hits?

scarlet gale
#

is your toll the dead using a damage only workflow?

#

(in the macro)

honest osprey
#

where would I find that in workflow under midi right?

scarlet gale
#

it would be in the item macro

honest osprey
#

oh okay than i honestly have no idea haha sorry not very well versed in the macro department too much

scarlet gale
#

all good

#

Is it just toll the dead doing it?

honest osprey
#

idk seems to do it with firebolt too

#

i'm just not really sure what that means

scarlet gale
#

oh I know what that is

#

It's one of your midi settings

#

Something about attack rolls I think?

honest osprey
#

hmm it probably is maybe it's like uh hmm i'll mess around a bit with the settings

#

oohhh!

#

i know what it is chris

scarlet gale
#

Yea

honest osprey
#

it's the display how much an attack missed

#

i had that checked on

scarlet gale
#

That one gets turned on when you use the quick settings for show all

honest osprey
#

ohh that makes sense now

#

thanks bud!

digital lagoon
#

Kind of love that on toll the dead they were just like โ€œletโ€™s just do the saving throw spellโ€™s attack function as an attack roll of 9999. That should hit most things.โ€

scarlet gale
#

My destroy undead feature does the same thing for damage.

#

I apply 10k typeless damage

#

Just so it can trigger other on taking damage effects that they may have

digital lagoon
#

Oh man I wonder if that does anything fun with the splatters module scaling the bloodstains with damage.

vast bane
#

it does let me pull that up

scarlet gale
#

I should check that lol

#

Might just be best to do an actor update to 0 hp.

vast bane
#

I can't find the image right now

#

I know I pasted an image for memories of when the cleric turned undead on 30 ghouls tnat were destroyed and it was gnarly

scarlet gale
#

Would be funny to do a token update and change the blood color to a gold-ish color

solid mountain
#

Is there a midi or dae attribute that can add dice to sneak attack?

scarlet gale
#

Like more dice on top of sneak attack damage?

solid mountain
#

Yes.

#

I have a custom magic item that adds a dice of sneak attack for a rogue. Wanted to put it on an effect.

scarlet gale
#

The sample item adds the dice in a macro, you could adjust the formula there I guess

solid mountain
#

What is that sample item?

scarlet gale
#

the sneak attack sample item?

#

how are you applying sneak attack damage?

solid mountain
#

usually through the midi sneak attack macro actually.

#

Yeah, just realised this is going to be a bit more involved that my mind first thought.

tribal hill
#

If so, just modify that macro's dice calculation at the end?

solid mountain
#

For some reason I just imagine some mwak like bonus, but that is not going to work. Need to adjust the macro as you say.

scarlet gale
#

Anyone here familiar with how dice so nice handles rolls modified with workflow.setDamageRoll?

#

does it display right?

#

Also, apparently not using the combined chat card means the roll chat message doesn't get changed from setDamageRoll.

solid mountain
#

Hmm... why is my MidiQOL.Workflow.getWorkflow suddenly returning undefined? Has there been a change or did I change something I didn't think of? ๐Ÿ™‚

scarlet gale
solid mountain
#

It's an item with ItemMacro and "all" as a macro trigger.

scarlet gale
#

Any macros using getWorkflow in an item macro are likely a bit dated. You can just do this to get the workflow.

#

or args[0].workflow if you really want.

solid mountain
#

Thanks, I didn't know that.

solid mountain
#

I think I solved it. With a custom script on BaB.

vast bane
#

is it possible to give a player a macro that utilizes midi to allow the player to change the name of their target tokens token to whatever they want with an open dialogue entry?

violet meadow
#

You trigger as an onUse, or a dae macro.macroName/itemMacro, depending on what you want it to do

molten solar
violet meadow
#

Tomorrow update for MidiSRD (officially) ๐Ÿ˜„

stoic seal
#

yeah!

flat gazelle
#

My warding Bond does not seem to work for magical or silvered weapons, anyone have a clue why?

vast bane
#

does the creature already have resistance?

flat gazelle
#

only against bludgeoning

#

oh wait, I have an idea

#

Yeah, so:

The player I was trying it on is a fiend warlock, and therefore can select a resistance 1/SR, although magical and silvered weapons bypass this. And because I had no better way to do it, I had him select it in his character sheet, with the physical bypasses" activated for magical and silvered weapons.

So the spell kept those. and I forgot about his feature up until you mentioned it

#

So I think I will keep the "bypassed by" thing empty and just remember to apply full damage manually when it happens.

violet meadow
#

@vast bane and anyone else that has used the fork of midiSRD.
I am doing a final pass for the included items.
If you remember any that have issues send them over to make sure that they get included.

#

Advanced macros will not be needed anymore too

honest osprey
#

i'm trying to add Frostbyte's disadvantage but it keeps expiring before the zombie has a chance to attack or it's turn comes up next and DAE get's rid of it what am I doing wrong to make it so the zombie keeps frostbite up until the end of it's next turn? or if it uses it's weapon attack

violet meadow
vast bane
#

I think active auras still requires advanced macros

honest osprey
#

is it better to give it a round?

#

or more turns?

violet meadow
#

Give it a round and one turn to be safe ๐Ÿ˜

#

That means next turn's end

honest osprey
#

gotcha so it doesn't mean the actual zombies next turn it just means anyones turn?

violet meadow
violet meadow
honest osprey
#

how do you give it a 1 day duration?

violet meadow
#

24 hours ๐Ÿ˜…

#

Figure of speech

honest osprey
#

gotcha so like 24 rounds essentially?

#

lol

mighty pier
#

How to make it so that the effect of the attack is applied only on a critical hit?

#

Activation condition and "Effect triggered when condition is met"?
If so, what condition should I write?

upd.
Solved. I guessed and found how to make this condition

vast bane
#

I noticed all effects in combat are not ending on combat end now even with seconds set

raven holly
violet meadow
#

I have other ones but will need Foundry access

raven holly
#

yea, basically when this NPC type hits 0hp, use this item

scarlet gale
#

What midi version you on? The new version has a better way to do on hit macros.

violet meadow
#

And as Chris said I will need to pay with the new MidiQol a bit

#

So many niceties

raven holly
#

nope, no CE, and Im on the latest 10.0.33

scarlet gale
#

Midi-qol has a on hit trigger for actor on use macros now

violet meadow
#

Fire shield so much easier

scarlet gale
#
flags.midi-qol.onUseMacroName CUSTOM macroName,macroPass```
#

isHit is likely the pass you want

#

or maybe isDamaged

raven holly
#

hmm actually maybe macro.itemMacro with an expiry mode of Zero HP is what I want...just need a different macro for "roll your item called Relentless" I think
because
const item = actor.items.getName("Relentless");
await item.use({ rollMode: CONST.DICE_ROLL_MODES.PRIVATE });
aint it

mighty pier
#

How to make a normal stacking effect? If I make an effect that, say, reduces max hit points (add: -3), and put on the effect "each stack increases stack count by 1", then this does not work, and putting "Stacking effects apply the effects multiple times" is bad idea in some cases, because for each stack on the token, a new effect icon appears, and if this effect is applied more than three times, then it does not look very good.

scarlet gale
#

I personally just update the effect with a new total

mighty pier
#

I doubt it will be comfortable. In this case, I have an attack that applies this effect on hit, and I would like the stacks/number to increase automatically for each hit (stack)

scarlet gale
#

Is this for a monster feature?

mighty pier
#

Yes

scarlet gale
#

A shadow?

mighty pier
#

No, homebrew

#

If you need context: this mob makes three attacks per turn, each of which reduces maximum hit points by 3 on hit

scarlet gale
#

Pretty much just look for the target effect and do a midi-qol remote update effect on it

mighty pier
#

Stupid question, but still: does this module require ALL modules from the list of dependencies to work?

scarlet gale
#

Technically no. But certain automations won't work without them

#

What one(s) are putting you off?

mighty pier
#

No, that's not the problem, it's just that now I'm going beyond a hundred modules ๐Ÿฅฒ

#

Btw, it does not turn on, I think there are other critical dependencies besides MidiQoL

scarlet gale
#

well yea

#

That's why I asked what ones were you thinking about not getting

#

As a standalone macro

dark canopy
mighty pier
#

Isn't "custom-character-sheet-sections" in the "Optional Modules" list?

scarlet gale
#

It should be working without it

#

If it's not turning on, there's another module missing

#

or the wrong version

mighty pier
#

I didnโ€™t waste time on trifles and installed all the modules from the list, but it still wonโ€™t let me turn it on ๐Ÿฅน
I'll try to update all modules

scarlet gale
#

That's strange

#

What's foundry displaying when you try to check it on your modules list?

mighty pier
#

Something like "dependency compatibility error"

scarlet gale
#

I guess that means you have an outdated module?

mighty pier
#

It seems I missed one. It is strange that it only wrote about this requirement when trying to update

#

Okay, yes, great. Now it's time to try to figure out what that huge block of code for the golem means

scarlet gale
#

the draining kiss one might be better to look at

#

it has all the helper functions embedded

mighty pier
#

A bit of a weird question: wouldn't that reduce the maximum TEMPORARY hit points?

vast bane
#

tempmax is temp max, temp hp has no max

#

tempmax is designed for ways to temporarily change the max of hp pools like aid

#

which ironically midi srd doesn't utilize hehe

mighty pier
#

Ahhh... Oh, that's handy, thanks, I didn't know about that

scarlet gale
#

Yea, different pool than temphp

violet meadow
dark canopy
mighty pier
#

Okay, in general, I understood how the macro works, but I still have one question. Let's say I take a golem attack from the compendium, it calls an item macro, which in turn calls a function that probably runs the "slam" macro. The question is, how do I edit this "slam" macro, or refer to a partially modified copy of it?

raven holly
#

haha thank you both

mighty pier
#

Actualy, everything looks like I need to create this macro directly in the files..

dark canopy
scarlet gale
#

You should just be able to use the same item macro

#

Although it'll call the effect slam

#

I'll swap it to get the item name instead of a hard-codded name

narrow saddle
#

I have a PC that is stuck on auto rolling saves (from the effect of spells only), I am here because all the settings in MIDI say there shouldn't be an auto roll.

I turned Monk's Tokenbar off as the module to use for players to roll their saves. And when the spell prompts the PC to roll a save it auto rolls with advantage.

This happens to NO other actor. And it only happens if it is a spell cast on the PC. I didn't think you could change things like this for individual characters. And I have no idea where to look for this.

I have tried FTC to no avail. ๐Ÿ˜•

violet meadow
#

For individual characters? Or clients?

mighty pier
narrow saddle
mighty pier
#

Actually, I am almost one hundred percent sure that if I find this macro as a file in the module folder, and change it there, I will get what I want, but it sounds strange

scarlet gale
dark canopy
scarlet gale
#

Also delete the first line.

mighty pier
scarlet gale
#

Place this on whatever feature you're making as the item macro

#

Use this as the item macro.

#

You mentioned it only does a set 3 damage or something? You can edit line 2 to change that.

#

If there isn't save tied to the attack, you can remove this.failedSaves.size != 1

narrow saddle
scarlet gale
#

Is the character public?

#

I wouldn't mind importing them quick to take a look

mighty pier
# scarlet gale

Yep, I think I got it, so I can just take the macro referenced by the function in the item macro, remove the first two import and export lines, and it will work

scarlet gale
#

More or less

narrow saddle
#

I have created another actor and have been gradually cloning the first one and the cloned one does not have the same effect so far.

narrow saddle
scarlet gale
#

I add them to globalthis under chrisPremades.helpers

#

Similar to how midi-qol also has it's own exported functions that a lot of us use in macros

mighty pier
#

Okay, yes, it seems to be working. I hope that the same principle applies to other macros. Thank you so much, I think that the rest of the macros will also be useful to me sooner or later, if not entirely, then parts of them as examples for other macros ๐Ÿ‘

scarlet gale
#

It should

#

I try to make the features auto grab the names from the items as much as I can. That way they can be reused for other monsters with features that work exactly the same

raven holly
# violet meadow Try using `token.actor` and not `actor`

hmm token.actor is not working when using the midi damage buttons, because the token isnt selected, I get Cannot read properties of undefined (reading 'actor')
and HB's other suggestion of item.parent doesnt seem to work either way, giving item is not defined but it works fine if the macro is manually triggered

vast bane
#

The activation condition workflow.advantage does not seem to be working anymore, anyone know whats changed?
Nevermind forgot to check the box.

raven holly
#

hmm clicking on the token will select that token, but clicking on all doesnt, maybe that could be added, kind of a pain but a work around
nope, with all tokens selected it only applies to the first token placed again.

vast bane
#

I had a monster last night that refused to die, like the dead condition would untoggle immediately and its hp was 0

violet meadow
#

Actually do you want to send me over the Item export to take a look in a bit?

violet meadow
vast bane
#

my dead status icon is impossible to apply

violet meadow
#

You might have two things that apply it at the same time and I think DFredsCEs are toggles by default. So on/off at the same time

raven holly
violet meadow
#

As the actor. Probably actor was undefined so actor.items failed

#

It's a DAE macro execute so you need the infamous lastArg ๐Ÿ˜…

violet meadow
# vast bane

Ha hmm I can see how that could trigger an update on the dead status

#

But I haven't used that yet

scarlet gale
#

remove the animation from the effect