#MidiQOL
1 messages ยท Page 78 of 1
I bet you it's some commendium item I'm missing.
Ah I found a readme in Arbon's Comp
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).
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 ^
is the dnd5e to me?
Its for the BaB question
That checkbox is added by a module and is not used by Midi
so, is there a way to do that through midi?
is there a way to make the spell PROTECTION AGAINST EVIL AND GOOD works with automation in foundry?
How are you currently triggering the spell? ๐ค
this is the script
@vast bane How much experience do you have with summons? I think I'm getting it.
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
What's the easiest way to see the roll data of an actor?
Such as what an actors spell save DC would be
I figured out a way, I will post later, have to get back to work.
Console (F12), _token.actor.getRollData() with a token selected
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 ?
Yes. Check the Chris Premades module. I think he has it there.
this is the module name?
Crispy Maids
It has 10 dependencies...
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
Depends how you automate
i just want the rolls bonuses provided by the spells to automate...
I have a protection from evil laying around someplace here probably
Don't I ๐ค?
I am out and about so I cannot share more now
Since it is not related to midi, try asking in #dnd5e
(Devs also don't get automatic pings in threads.)
didn't work...
Wrong place. Roger roger.
10 dependencies intalled and the spell isn't working... lol
๐
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
nobody is twisting your arm, if you want it all done for you, get CPR, if you wanna do it yourself with macros go ahead, to each their own
What is the race/type of that vampire?
I don't know which spell you are using but CPR has module settings fyi
most of them are checkboxes to enable worldscripts
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?
lol
Sorry for having an annoying name ๐คฃ
๐ No I'm sorry!
Dont worry it happens all the time
A simple disadvantage always rolls by pressing the keybind, now to automate that you will need to pass through some necessary hoopKs...
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.
I have to say. I like tinkering more nowadays ๐
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.
This is the way!
You come, you learn, you share
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.
danse macabre is pretty simple with warpgate isn't it?
I already made my danse macabre
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!
Does anybody knows what is wrong with MIDI ITEMS? Lay on hands is not working anymore... the midi item, with the macro I mean...
@thin loom Are you positive it's a midi-qol feature?
I've never seen a coverage calculator, personally.
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
Is it happening on -every- attack?
yes
Whether there are walls around or not?
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.
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?
its not midi, midi is using the cover calc api of another module you have installed
I have other cover calculators (levels, simbul, etc.) disabled.
show the chat card
This is the box
Definitely not midi
No midi
Oh! Idea!
your F12 console
might tell you
Pop F12, hit console and then read what it does when you attack
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
and look for the coverage
The first section is typically what's handling that bit as far as I can tell
I am really trying to find where this is LOL (I am not the brightest bulb at using the console...but getting better
Using chrome?
yes
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).
I am like a monkey at a typewriter, but this appeared with the attack
Do you get the cover popup before or after damage is applied?
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 ?
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.
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
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.
Maybe I will use Find the Culprit and whittle it down. Yall are certain that this is not MQ, yes?
I think Midi is trying to show you information provided by another module, yes.
It's definitely not midi.
Midi srd has animate dead
Oh I need to push an update for that
Thank you I will give the old process of elimination a try.
you have debug turned on, in midi settings, reason for teh extra long F12
This is the only thing I could find that mentions cover calculatio0n
I've expanded it and looking, looking, looking for any modules listed. Nothing just yet
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
If you're using the one from my module I can help you troubleshoot why it's not working.
I gave up from automation... i turned the attack window back on from midi... i will click in the windows... automation is to hard, and every update always break the codes...
Did you figure out what module this is?
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.
do you have any of the following:
- 3D Canvas
- Levels Auto Cover
- Elevated Vision
Yes, I really wish Foundry/Forge would stop constantly changing the software and instead focus on consistency and compatibility.
(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)
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?
v10
that's the point
Hmm, a couple others it might be:
- Simbul's Cover Calculator
- DnD5e Helpers (through not V10 compatible)
This is the entire entry... expanded
@kind cape I tested simbuls just now, not that sadly.
I have those modules turned off as well.
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
I just updated with his newest release, hoping that it would fix this issue, but nope.
I just updated to v10 foto and I haven't noticed it
Hold up, this looks like a chat message, but the image you sent looks like a dialog? ๐ค
I read the console about as well as I speak chinese
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?
only a DM whisper message about the cover calculation appears in chat
Does the message look similar to the dialog?
and what does that look like?
So it's not using walls or terrain to determine cover, it's always asking you?
correct
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
If you go back one midi version does it still happen?
I feel like find the culprit should narrow this down
It will probably take quite some time to go through the process of elimination. (sigh)
Alternative Token Visibility maybe?
@thin loom That's the module that this box is coming from ๐
OOOOHH - I am checking it now. Thanks! ๐
Good spot bugbear!
YES!!!! That is the culprit.
I have been playing with that a bit ๐
Had never used the 3d Area checks though
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?
what a royal pain in the ass. You saved me a ton of work! โค๏ธ
If you have a message with what was going on/breaking whatever, can you link it to me?
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.
(umm, are you referring to me? I was not able to find any messages). ๐ฅน
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.
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
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 ]
You mean
A Cool Gobo |zoombee V |
The gobo's boss |(ignore) V|
Your friend |Skeleton V|
--------------------------
[ Summon ] [ Cancel ]
๐
yeah, exactly like that.
give it a go -- menu's are easy in comparison to actual dialogs
it's making it display the choices base of corpses that is bedeviling me.
come again?
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
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
Assuming midi-qol's findnearby function doesn't ignore dead tokens, that may be a faster way to find nearby valid tokens
that's what I'm using. Seems to be working well.
ah cool
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
const {inputs, buttons} = await warpgate.menu({inputs: [{type: 'select', label: 'A Corpse', options: ['none', 'Zombie', Skeleton']}]}); if(buttons == false) return;
there is a template
thanks! I've taken this over to #macro-polo
since I don't want to clutter up this channel
I asked tposney for a parameter in the findNearby to include incapacitated actors when needed. It was added in v10.0.31 or .32 I think
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;
});
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.
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
that works, thank you! But i confess I still don't really understand how menus work.
that homebrew is an interesting homebrew
instead of death saves you have vitality points
And that's why I use warpgate menus, because I'll never understand dialogs
its just the data structure for inputs that's getting you
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%'
}
})
But once ya do... ooooh once ya do
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.
Doesn't help that I mapped it directly from the list of targets, makes it even less readable ๐
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
You mean this?
thank you, @dark canopy
one of the few examples i have embedded the in API docs ๐
Like if an actor attacks, I'd like to be able to via-midi if possible, prompt them that they already did an action.
AFAIK "action" tracking is not a thing in Midi
I mean when do you cross the point that something is too much ๐
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.
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.
Do not mutate the selected. Count the selected ones as zombies 2 skeletons 3 and spawn the totals ๐คท
I know it's a weird use case.
what's the harm in mutated the dead tokens into live zombies? Or is it just for simplicity's sake?
Extra work ๐
yall puttin too much effort into this, how can a corpse have skeleton only
I've had a DM be weirdly strict about that
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
because it's magic?
Sounds good to me
it's also scarier if a corpse's skeleton squelches out of the flesh and comes after you
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
Your other macro might be best switched to using a hook that catches the apply damage function
'midi-qol.damageApplied'
it's an old Kandashi Grim Harvest world script. It needs the spell level as well.
It passes the workflow too and you can get the spell level from the castData
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);
You on v10?
Yes
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
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
Pretty sure game.actors.get(canvas.tokens.controlled[0].actorId) is wrong ๐ค
Replace the first line with:
let actor = canvas.tokens.controlled[0].actor;
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 ๐
await the first roll
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
ok, its rolling! lets test
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!
Do you use Activation Condition of MidiQOL?
Easy dumb way is to set it up as versatile
I think so?
Other Formula 1d6
Main damage 1d6
Activation Condition attributes.hp.value >= attributes.hp.max/2
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
Thieves tools are not an Artisan tool, just FYI
I understand, and can remove them.
Oh, that definitely works as a back up, thank you!
(Looking into the other part right now, looks like the tool prof lookup is wrong)
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);
put a js after the first three `
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.
let isProficient = actor.system.skills[`tool-${selectedTool.replace(/'/g, "\\'").toLowerCase()}`]?.value ?? false;
``` you are missing something here
Yeah thats the part I am investigating right now
Just a moment
Cause that lookup there is just incorrect
That doesnโt seem to be doing what I expect, Iโm still getting 1d6 even when over half hp.
@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
Well, I'll be. Unchecking it made it work.
Edit: Thanks for the tip.
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.
Right, didn't see the disadvantage, let me fix that
I think Iโll go with the versatile workaround and rely on remembering to check. Thank you anyway, though! ๐
Do you have this setting on Activation Condition?
@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 ๐
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.
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";
I've been using the one from Crimic. But I might many my own soon to support the common homebrew rule for rolling each dice
I do, yeah. It looks like itโs kind of working now, but it rolls the โother damageโ as a separate roll, which doesnโt get doubled on a crit.
It has a checkbox down in the bottom. Crit Other
@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);
Ooh, that did it! Is there a way to make that piercing damage? It lists the first damage roll as โ(Piercing)โ and the second one as โBite. Melee Weapon Attack:โ
Perfect. Thank you so much!
Just a quick question. Which version of MidiQOL are you on?
Thanks everyone for helping me identify the conflict! Our campaign tonight will be a great one because of you. Much gratitude ๐
10.0.33
Out of curiosity what was it?
Alternate Token Visibility
theives tools are broken, maybe the ' in Thieves' Tools
Oh, they are just called "thief" in the tool profs... -_-
hmm, digging
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
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!
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 ๐
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.
you deserve all the coffees!
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.
Beat me to it lol
Oh, cool, thanks ๐
https://github.com/chrisk123999/foundry-macros/blob/main/Spells/Death Ward/Chris-DeathWardWorld.js
Non module version of it
Hooks on midi-qol.damageApplied
Most easily done via a world script
Great response on the Midi-SRD @violet meadow ๐
Weโll finally be able to pin it in here
Could this be used for Barbarians' relentless endurance?
Would need to be slightly reworked to not delete the effect
And instead check for remaining uses
or something along those lines
how do i automate my players liking my campaign
pay them? ๐ธ
Forging ahead ๐
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?
You can hook rest completed
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?
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! ๐
Is there a new/different module that contains what the DAE SRD and Midi SRD contain? (both are version 9 or older)
I am in the process of updating officially Midi SRD. DAE SRD by this point is kinda of obsolete
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 ๐
Midi srd has a working fork. You can search for it here
That too ๐
https://raw.githubusercontent.com/thatlonelybugbear/midi-srd/master/module.json
But I would wait for a tiny bit ๐
Midi uses either Simbuls cover calculator or levels auto cover to compute cover (it does not do it by itself) so check the settings for whichever of those modules you are using.
It was Alternative Token Visibility module which supposedly works with MidiQOL too
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.
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
Yes, seems to work. Total cover does not cause attacks to fail, but I'll have a look at what might be possible.
had an issue today where auto roll damage wasn't working on NPCs
I also admit running my game gets in the way of tinkering, but it's a good way to test the automation ๐
Just get the tool items the actor has and roll a tool check, not a custom roll
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
@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.
Something is in the works for that.
Have you been in talks with Mr Primate? He must be eyeing up your premades as a resource for DDB importerโฆ
(I would guarantee that he has.)
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?
chris has like 4 different versions of this in his module fyi
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.
I am not using Magic Items anymore, in favor of Items with Spells
So I am not sure what might be happening ๐ค
so it works better with Items with Spells?
latest versions of both MidiQOL and MagicItems. confirmed just now.
I know that it works in my workflow with Items with Spells
Magic Items (the module) has always been a bit buggy, Items with Spells generally works better with other modules
There are some discrepancies when you recast a concentration spell but I need to test it more
What is the name of their module?
Chris' Premades
Thanks!
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?
How would I implement something like this in my game?
This one is just a plain old macro that you can run, just stick it in a script-type macro and use it while a token is selected
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
theres a setting for that?
that has to be another module right?
How did I miss that one lol
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.
Enhanced Damage something something in the Workflow tab of the settings (a checkbox)
I don't remember how customizable it is though. I remember damageType at least
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
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
Either way, the workflow should have the correct damageRoll presumably right?
I would imagine so. When are you checking the formula?
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 ๐
postDamageRoll. I think the person with the issue has another module. I just wanted to confirm it wasn't some weird non-fast rolls thing I didn't account for
Not yet updated for v10. I am in talks of taking ownerwhip of that and updating it soon.
I have an unofficial fork for v10, but its Items have some issues so I would wait a bit if I were you ๐
yeah
Well I installed it, we'll see what happens ๐
Just tested this on my end, the damageRoll in the workflow object does change if I change it in the popup
yeah it 100% makes sense ๐คท
But what happens if you try to change the changed formula?
Thanks. It must be a module on that long list of modules Moto has posted a billion times.
Is this Moto?! ๐๏ธ ๐
No lol
As in if I have two different macros modifying the damageRoll in the same roll? ๐ค
Just one macro and the Enhanced Damage Dialog
Normally one overwrites the other. But I account for that in my module with a priority queue system that I setup to make the macros get in line.
Using the enhanced dialogue seems to work fine too.
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?
Never even heard of that server ๐คทโโ๏ธ
Server seems pretty dead to me
Its in the first pinned comment
At least last time I looked there
Yeah there are some people asking around, but never took off.
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
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
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
The search is pretty bad for the thread yeah
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.
yea, and if it was officially endorsed by tposney on the git or something
That is another issue, as Chris says. It is too much involved with the rest of dnd5e modules
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!
To be fair, it would be quickly solved if Discord would just add a way to search threads specifically
Tbf, Discords search is just kinda bad in general if you are looking for code, since it ignores stuff in code blocks
That too
Well, I certainly cant do anything about discord itself haha
I think discord search is fine, just wish we had our own channel lol
we're more active than most the system channels lol
That could also just mean we have the most problems
which isn't necessarily a disqualifier
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
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
There's gotta be some discord devs that play dnd, we need to find them and pull them in here haha
i'll happily redirect to GearHeads
ehh, from what I've seen people just don't know this thread exists
redirecting to another server would only make that issue worse
weren't we just discussing the issues with being a thread? ๐
Midi-qol just needs it's own actual Discord server
but all good ๐ just offering
yup, I agree, but thats why I was wondering why Gearheads isnt used, it's there now, if people start actually using it, tposney could "adopt" it as official
The more steps you add to get to the destination the less people will be likely to do so.
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
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"
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.
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
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.
๐ Thanks. I must've just been blessed and knocking over the baptising font was not kosher.
its also only on your client, I have seen this in my live sessions and the players confirmed they didn't see it
when you use the item, are there any animations or accessing of compendiums?
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.
Do the players have Enable roll automation support checked in their settings? It's a per client setting
I will check.
For No2, what MidiQOL version are you on?
One of them did have that ticked, but if I untick it then their attacks are not fast forwarded. I am sure you could separate attacks being fast forwarded and skills and saves be different.
10.0.33
GM setting. In MidiQOL settings, main window
For the separation.
I guess you're using one of these choices?
Yeah that is right, "Show player results + buttons" but again I am sure that this meant that the player could only see their own damage card and button. Unless I am thinking incorrectly.
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. ๐ฆ
It should be some interaction between DFreds CE and MidiQOL applying said effects (no animation, no compendium interaction afaik)
Only for the first time that the client loads in.
The AE should have at least one key for macro.CE for the issue to be triggered.
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 
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)
It happens to any item that has Concentration and applies an effect. I do have some items that have animations, they make it freeze a little longer, but anything that applies an effect and has Concentration makes the game choke.
Command is not concentration and it is affected too in my case.
Strange, Mage Shield goes on without me noticing a choke or visual bugs. Only my Concentration items are affected.
The same token after reloading
Does it have a macro.CE key in the Effects tab?
I don't think any of the spells I mentioned do...
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 ๐ค
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)
That narrows it down then!
I'll ship an issue editto: https://gitlab.com/tposney/midi-qol/-/issues/1193
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?
It appears only for the client triggering the AEs ๐คท
Ah I just saw the issue you posted! Interesting. For me it's only triggered on the client that triggers the AE.
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
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
Would love to get some thoughts on what might drive this? I do have the autoroll npc damage selected
Midi version?
The last one, if this question to me
Was for @languid wave
Not the no cover bug then
No cover bug?
Here are the settings I have on the NPC rolls
Older version had some issues with unset midi properties
Player damage rolling was mostly fine
it was rolling Hunter's mark damage on cast and not on hit, which was a little strange
That could just be a not setup hunter's mark
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
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?
Should be waiting for players to manually roll I think
Check the console for errors when rolling the attack for the NPC.
I'll test that now
If saving throw automation is disabled (i.e. auto check saves disabled) midi will not process the active effect application - you need to do it by hand.
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?
is there a way to force it, for example like with the Overtime flag?
Do you have the same problem with all NPCs
let me check
It looks like there is a problem with the damage roll for pummel - what does the damage formula look like?
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
this was a R20 import character I think
That looks ok - export and md me the actor - there's something funny going on.
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)
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
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??
My guess for this is that you have the bug where a player does not load all of the modules into their world due to browser/security software. Additionally I have a guess that the abnormal player is an assistant GM account therefore follows the GM tab of the workflow GM tab instead.
ASE
All bets are off when a person reporting a problem is trying to use a v9 module in v10 especially ASE
@gilded yacht solved it
R20 import used a funky character for the minus sign
that doesn't change the fact you are going to have a ton of problems keeping that module enabled
thanks for the heads up ๐
I will look at deactivating!
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.
@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?
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
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
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
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
Looks like a typo
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
I wonder if I've stumbled upon the same issue here that bugbear has already posted:
https://gitlab.com/tposney/midi-qol/-/issues/1192
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
That can be done in a much better way
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
Could be a bugged actor
I've had an actors that stopped respecting on use macros
and had to remake them
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
- Itโs happening when Iโm controlling the player as DM and when Iโm logged in as player.
- 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!)
are you using ASE?
Advanced Spell Effects
@vast bane Just released a beacon of hope automation
Hooks on midi damage application so it should catch more stuff
I do not use ASE then.
It's not something you can do yet
The max/min fields do not accept conditions. Only Boolean
Though this is what I have posted as an issue recently. Timing heh ๐ https://gitlab.com/tposney/midi-qol/-/issues/1192
Ah I just scrolled a bit further down from the ping and saw that you had found this
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.
Yes, +999 indicates full cover
(Levels auto cover also has a handy macro to pre-check the cover before you attack)
Hi guys is there any magic missile macro ?
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.
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.
are you sure you don't have permissions set to all players
cause this wasn't happening to me in my game
Where is the permission set to ALL players option?
do the players have ownership to each other
They can observe each other. Do you think that is it?
I will run a level one diagnostic Captain.
Just tried it and all other players do not have ownership of each other and they are still getting the card for other players pop up.
Hi, I've been given this macro https://github.com/krbz999/zhell-macros/blob/main/classes/paladin/divine_smite.js, how do I get it to apply the damage please?
I guess this answers my next question, which was can I have midi return the cover calculation in chat when a token is targeted like I can when not in API mode. Seems it's not an option.
that macro was never meant to work with midi
typically nothing made by zhell works with midi by design macrowise
Chris' Premade Module has the best midi divine smite imo
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
Amazing, thanks.
No but the macro will give you the chat message
I have tried every way to get this to work but it appears your premade for Beacon of Hope is not working, i see no errors, the spell just doesn't heal for max
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
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?
An outdated midi function
Oddly enough, it wasn't midi, it was dfreds CE, I had forgotten to not apply the CE
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
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?
he could have answered that one, that is only visible in the roll
thats like all of babs stuff, not visible on sheet
Recap:
doesnt show on sheet
midi breaks the chat card (where it normally DOES show)
not my issue ๐
I don't even know what that card is he showed
I use MTB
I'm guessing thats the chat message card?
Nope fully compatible with MidiQOL v10.0.33
@delicate quartz do you have a previous MidiQOL version? There was a now closed issue
anyone have a clue why it offers (and uses) nonexistent 8th and 9th level spellslots on chris premade divine smite ๐ ?
Probably an oversight by @scarlet gale ๐ค
Are you using the one from the module or the one from his macro collection?
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
Yeah, looking at the code right now, it should indeed only show spells that you have slots for ๐ค
must be something with the character then ๐ค
it also does only apply 5d8 max, so that part works too
I see D&D Beyond importer which might have something to do with that
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 ๐
"0"
Oh
I just looked at the relevant part of the code, I know whats wrong
Its a bug in the macro ^^
I'll double check. I thought I was to to date but perhaps not. Was this a recently closed issue?
yes closed in 10.0.33
Sweet, most likely the issue then. I'll double check updates when I'm back in front of my computer. Thanks for the help.
interesting ๐ what is happening?
There we go, submitted a fix to him https://github.com/chrisk123999/chris-premades/pull/14
Its just a copy-paste typo ๐
Did you turn on the settings as well?
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?
@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?
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
Not sure how I missed that, but I've added your fix.
nope, you should get rid of the =0 in the effect value and instead check in the ItemMacro for the newHp becoming 0
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
Is this a Transfer to actor on item equip by chance?
Yea
Hmm ok, I'll give that a whirl when I get back, thanks!
One example I could find. It should be working
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.
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.
is that checkbox in the DDB importer?
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.
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
You should just be able to copy the feature from one monster to another.
hmm ill try again. it gave me an error saying the actor name was incorrect
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.
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.
Ship a compendium with monsters ready ๐
and tag them with a CPM flag ๐
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
Are these SRD monsters?
Oh is it for the D&D Beyond integration? nvm
Nah
It's the update button on items thing
To wholesale replace the items with the one in my compendium
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.
With macros, sure
Could roll a synthetic item with the DC changed on demand based on the number of stacks
Yeah, actually, you're right. An on use macro would be the way to go.
Off to #macro-polo
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
On the latest version I just pushed?
yes
Screenshot the damage application box, not the roll formula
well, include the formula too
oh shit it is working, its just not showing the work:
healed 53?
the card is not right but the heal is
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.
nah its working fine
its not maxing exploding
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
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
You could go about this several ways. You could use some world hooks to evrrytime they submit long rest with new day checked it removes or adds a flag or an active effect. Every time it hits midnight in game, if they don't meet the condition they get a flag or active effect.
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.
You can look at hunters mark in the midi items. You'd create an affect on both the target and the caster with stores variables. Then when the marked target is attacked, on damage bonus, you'd check those variables and see if they matched. If yes, then deal the extra damage.
Wow, this really exists and looks so easy, thank you very much ๐
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?
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
There is a setting that you need to activate, it is in the optional rules
ahh didnt notice the checkbox lol, thanks
one down, next would be attacks of opportunities, does the module recognize when one is available?
There nothing handling that, that I know of in MidiQOL
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?
where would I find that in workflow under midi right?
it would be in the item macro
oh okay than i honestly have no idea haha sorry not very well versed in the macro department too much
oh I know what that is
It's one of your midi settings
Something about attack rolls I think?
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
Yea
That one gets turned on when you use the quick settings for show all
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.โ
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
Oh man I wonder if that does anything fun with the splatters module scaling the bloodstains with damage.
it does let me pull that up
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
Would be funny to do a token update and change the blood color to a gold-ish color
Is there a midi or dae attribute that can add dice to sneak attack?
Like more dice on top of sneak attack damage?
Yes.
I have a custom magic item that adds a dice of sneak attack for a rogue. Wanted to put it on an effect.
The sample item adds the dice in a macro, you could adjust the formula there I guess
What is that sample item?
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.
If so, just modify that macro's dice calculation at the end?
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.
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.
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? ๐
IIRC there was a small update with keeping old workflows in the last update
It's an item with ItemMacro and "all" as a macro trigger.
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.
Thanks, I didn't know that.
The player sometimes uses a manual sneak attack item (if for whatever reason the auto one fails).
I have a feature with @scale.rogue.sneak-attack for the damage. Is there a way to modify that value with an AE?
I think I solved it. With a custom script on BaB.
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?
yeah warpgate the name
You trigger as an onUse, or a dae macro.macroName/itemMacro, depending on what you want it to do
Effects can modify scale values in core dnd5e, as of 2.1.0.
Tomorrow update for MidiSRD (officially) ๐
yeah!
My warding Bond does not seem to work for magical or silvered weapons, anyone have a clue why?
does the creature already have resistance?
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.
@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
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
Give it a duration longer than 1 turn
I think you got most of them
I think active auras still requires advanced macros
that worked thanks!
is it better to give it a round?
or more turns?
gotcha so it doesn't mean the actual zombies next turn it just means anyones turn?
Hmmm does it? Oh well I have to check if Active Auras will be doing anything for MidiSRD then
I mean you can give it 1 day duration and let the special durations take care of the effect expiration.
how do you give it a 1 day duration?
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
I noticed all effects in combat are not ending on combat end now even with seconds set
Unfortunately this doesnt look like it works at all with Unlinked tokens, so it's not really gonna work with what I had in mind ๐ฆ
Also seeing some strangeness with a linked token as well, when I use the item to apply the effect, it creates 2 effects, one with all the uuid info that seems to be what is necessary, and a blank one. not the end of the world, but was odd looking to me
I might need to take a look at that linked example.
What was it that you wanted to do? Monitor hp change?
I have other ones but will need Foundry access
yea, basically when this NPC type hits 0hp, use this item
here's what I was seeing btw
What midi version you on? The new version has a better way to do on hit macros.
Would you also happen to have a DFreds effect getting picked up?
And as Chris said I will need to pay with the new MidiQol a bit
So many niceties
nope, no CE, and Im on the latest 10.0.33
Midi-qol has a on hit trigger for actor on use macros now
Fire shield so much easier
flags.midi-qol.onUseMacroName CUSTOM macroName,macroPass```
isHit is likely the pass you want
or maybe isDamaged
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
๐ฅน
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.
I personally just update the effect with a new total
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)
Is this for a monster feature?
Yes
A shadow?
No, homebrew
If you need context: this mob makes three attacks per turn, each of which reduces maximum hit points by 3 on hit
if you want to see how I'm doing it.
Pretty much just look for the target effect and do a midi-qol remote update effect on it
Stupid question, but still: does this module require ALL modules from the list of dependencies to work?
Technically no. But certain automations won't work without them
What one(s) are putting you off?
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
well yea
That's why I asked what ones were you thinking about not getting
https://github.com/chrisk123999/foundry-macros/blob/main/Features/Monster Features/Incubus %26 Succubus/Chris-DrainingKiss.js
This has the same thing pretty much.
As a standalone macro
tidy5e-sheet, custom-character-sheet-sections, and tokenmagic are the only optional dependencies of that module
Isn't "custom-character-sheet-sections" in the "Optional Modules" list?
It should be working without it
If it's not turning on, there's another module missing
or the wrong version
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
That's strange
What's foundry displaying when you try to check it on your modules list?
Something like "dependency compatibility error"
I guess that means you have an outdated module?
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
the draining kiss one might be better to look at
it has all the helper functions embedded
A bit of a weird question: wouldn't that reduce the maximum TEMPORARY hit points?
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
Ahhh... Oh, that's handy, thanks, I didn't know about that
Yea, different pool than temphp
Try using token.actor and not actor
โ #macro-polo message ๐
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?
Ooh well too late ๐
haha thank you both
Actualy, everything looks like I need to create this macro directly in the files..
( gemini meaning "twinsies!" , hehe )
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
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. ๐
For individual characters? Or clients?
Okay, but how do I change the name of the effect and.. the effect itself? To be more precise, the number for which the max. hit points decrease?
Is this for me?
If so, it is only affecting one character.
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
It's essentially an item macro. Just swap out workflow to this and chris to chrisPremades.helpers.
and will be erased when the module updates
Also delete the first line.
Umm.. I didn't get it.
In the item macro, it already "this", and there is only first line
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
I completely deleted the actor and downloaded it again from DDB and it still had this weird auto roll effect only when a spell is cast on it.
So I have asked in the Mr Primate channel too.
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
More or less
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.
I think it is public yeah. One sec....
You also would need to change the helper function references. I did it in the above script I dropped.
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
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 ๐
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
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
The activation condition workflow.advantage does not seem to be working anymore, anyone know whats changed?
Nevermind forgot to check the box.
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.
I had a monster last night that refused to die, like the dead condition would untoggle immediately and its hp was 0
args[0].actor for the MidiQOL provided one then
Actually do you want to send me over the Item export to take a look in a bit?
FTC time? World scripts for undead fortitude or something?
yeah I actually can reproduce it so starting FTC now
my dead status icon is impossible to apply
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
that gives me Cannot read properties of undefined (reading 'items')
yea I'll dm it to ya
const effectActor = fromUuidSync(args.at(-1).tokenUuid).actor
As the actor. Probably actor was undefined so actor.items failed
It's a DAE macro execute so you need the infamous lastArg ๐
Ha hmm I can see how that could trigger an update on the dead status
But I haven't used that yet
I just reported that on the jb2a discord sequencer thread
remove the animation from the effect