mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 03:40:32 +00:00
Added grenade-like missile to monster sheet and used correct output based on settings
This commit is contained in:
+210
-201
@@ -72600,215 +72600,224 @@ on('change:repeating_monsterweapons:weaponname', function(eventInfo) {
|
||||
});
|
||||
//#endregion
|
||||
|
||||
on('clicked:grenade-miss', async function(eventInfo) {
|
||||
let rollBuilder = new RollTemplateBuilder('2Egrenademiss');
|
||||
const query = '?{What grenade have been thrown?'.concat(
|
||||
'|Acid',
|
||||
'|Holy water',
|
||||
'|Oil (lit)',
|
||||
'|Poison',
|
||||
'|Boulder',
|
||||
'|--------',
|
||||
'|Fire Seed missile',
|
||||
'|Ice Knife',
|
||||
'|Melf’s Minute Meteor',
|
||||
'|Otiluke’s Freezing Sphere - Globe of cold',
|
||||
'|Produce Flame',
|
||||
'|Puffball',
|
||||
'|Sol’s Searing Orb',
|
||||
'|Other',
|
||||
'}'
|
||||
);
|
||||
let grenade = await extractQueryResult(query);
|
||||
switch (grenade) {
|
||||
case 'Acid': {
|
||||
rollBuilder.push(
|
||||
'name=Acid',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[1+6]]',
|
||||
'hitdmg=[Damage](`/em rolls [[2d4]] acid damage using their Acid! (Direct Hit))',
|
||||
'splashdmg=[Damage](`/em rolls [[1]] acid damage using their Acid! (Splash))'
|
||||
);
|
||||
break;
|
||||
on('clicked:grenade-miss', function(eventInfo) {
|
||||
getAttrs(['tab11','wtype'], async function(values) {
|
||||
let templateVisibility = '';
|
||||
let rollVisibility = '/em';
|
||||
if (values['tab11'] === '2') {
|
||||
templateVisibility = values['wtype'];
|
||||
rollVisibility = values['wtype'];
|
||||
}
|
||||
case 'Holy water': {
|
||||
rollBuilder.push(
|
||||
'name=Holy water',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[1+6]]',
|
||||
'hitdmg=[Damage](`/em rolls [[1d6+1]] damage using their Holy water! (Direct Hit))',
|
||||
'splashdmg=[Damage](`/em rolls [[2]] damage using their Holy water! (Splash))'
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Oil (lit)': {
|
||||
rollBuilder.push(
|
||||
'name=Oil (lit)',
|
||||
'aoe=[[3]]',
|
||||
'aoesplash=[[3+6]]',
|
||||
'hitdmg=[Round 1](`/em rolls [[2d6]] fire damage using their Oil (lit)! (Direct Hit, first round)) [Round 2](`/em rolls [[1d6]] fire damage using their Oil (lit)! (Direct Hit, second round))',
|
||||
'splashdmg=[Damage](`/em rolls [[1d3]] fire damage using their Oil (lit)! (Splash))'
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Poison': {
|
||||
rollBuilder.push(
|
||||
'name=Poison',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[1+6]]',
|
||||
'hitdmg=[Special](`/em affects the target creature with Poison! Consult DMG p. 101 for the effect. (Direct Hit))',
|
||||
'splashdmg=[Special](`/em affects the target creature with Poison! Consult DMG p. 101 for the effect. (Splash))'
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Boulder': {
|
||||
let damage = await extractQueryResult('?{Direct Hit damage|3d10}');
|
||||
rollBuilder.push(
|
||||
'name=Boulder',
|
||||
'aoe=[[2]]',
|
||||
'aoesplash=[[2]]',
|
||||
`hitdmg=[Damage](\`/em rolls [[${damage}]] damage using their Boulder! (Direct Hit))`,
|
||||
`splashdmg=[Damage](\`/em rolls [[${damage}]] minus the distance the boulder has bounced in feet since it first hit the ground, using their Boulder! (Scatter))`,
|
||||
'bounce=[[3d10]]'
|
||||
);
|
||||
break;
|
||||
}
|
||||
case '--------': return;
|
||||
case 'Fire Seed missile': {
|
||||
rollBuilder.push(
|
||||
'name=Fire Seed missile',
|
||||
'aoe=[[10]]',
|
||||
'aoesplash=',
|
||||
'hitdmg=[Damage](`/em causes creatures failing a save vs. spell [[2d8]] fire damage (one-half damage if a saving throw vs. spell is successful) using their Fire Seed missile! (Direct Hit))',
|
||||
'splashdmg='
|
||||
);
|
||||
break
|
||||
}
|
||||
case 'Ice Knife': {
|
||||
rollBuilder.push(
|
||||
'name=Ice Knife',
|
||||
'aoe=[[10]]',
|
||||
'aoesplash=',
|
||||
'hitdmg=[Damage](`/em causes creatures failing a save vs. paralyzation to suffer [[1d4]] cold damage and [[1d3]] rounds of numbness using their Ice Knife! (Direct Hit))',
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Melf’s Minute Meteor': {
|
||||
rollBuilder.push(
|
||||
'name=Melf’s Minute Meteor',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[6]]',
|
||||
'hitdmg=[Damage](`/em rolls [[1d4]] fire damage using their Melf’s Minute Meteor! (Direct Hit))',
|
||||
'splashdmg=[Damage](`/em rolls [[1]] fire damage using their Melf’s Minute Meteor! (Splash))'
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Otiluke’s Freezing Sphere - Globe of cold': {
|
||||
rollBuilder.push(
|
||||
'name=Otiluke’s Freezing Sphere (Globe of cold)',
|
||||
'aoe=[[20]]',
|
||||
'aoesplash=',
|
||||
'hitdmg=[Damage](`/em causes creatures failing a save vs. spell [[6d6]] cold damage (one-half damage if a saving throw vs. spell is successful) using their Otiluke’s Freezing Sphere - Globe of cold! (Direct Hit))',
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Produce Flame': {
|
||||
rollBuilder.push(
|
||||
'name=Produce Flame',
|
||||
'aoe=[[3]]',
|
||||
'aoesplash=',
|
||||
'hitdmg=[Damage](`/em rolls [[1d4+1]] fire damage using their Produce Flame! (Direct Hit))',
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Puffball': {
|
||||
rollBuilder.push(
|
||||
'name=Puffball',
|
||||
'aoe=[[10]]',
|
||||
'aoesplash=',
|
||||
'hitdmg=[Effect](`/em causes creatures failing a save vs. poison to be unable to attack and lose all Dexterity bonuses to Armor Class and saving throws using their Puffball! (Direct Hit))',
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Sol’s Searing Orb': {
|
||||
rollBuilder.push(
|
||||
'name=Sol’s Searing Orb',
|
||||
'aoe=[[6]]',
|
||||
'aoesplash=',
|
||||
'hitdmg=[Damage](`/em causes normal creatures failing a saving throw vs. spell [[3d6]] fire damage and [[1d3]] rounds of blindness. Or causes undead [[6d6]] fire damage and [[1d6]] rounds of blindness. All victims are allowed a saving throw vs. spell, with success indicating half damage and no blindness. Using their Sol’s Searing Orb! (Direct Hit))',
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Other': {
|
||||
let name = await extractQueryResult('?{Grenade name}');
|
||||
let aoe = await extractQueryResult('?{Area of effect (Diameter in feet)|1}');
|
||||
let damage = await extractQueryResult('?{Direct Hit damage|1d6}');
|
||||
let splash = await extractQueryResult('?{Splash damage|1d3}');
|
||||
splash = splash.trim();
|
||||
|
||||
let escapedName = name.replaceAll('(','(')
|
||||
.replaceAll(')',')')
|
||||
.replaceAll('[','[')
|
||||
.replaceAll(']',']');
|
||||
let rollBuilder = new RollTemplateBuilder('2Egrenademiss');
|
||||
const query = '?{What grenade have been thrown?'.concat(
|
||||
'|Acid',
|
||||
'|Holy water',
|
||||
'|Oil (lit)',
|
||||
'|Poison',
|
||||
'|Boulder',
|
||||
'|--------',
|
||||
'|Fire Seed missile',
|
||||
'|Ice Knife',
|
||||
'|Melf’s Minute Meteor',
|
||||
'|Otiluke’s Freezing Sphere - Globe of cold',
|
||||
'|Produce Flame',
|
||||
'|Puffball',
|
||||
'|Sol’s Searing Orb',
|
||||
'|Other',
|
||||
'}'
|
||||
);
|
||||
let grenade = await extractQueryResult(query);
|
||||
switch (grenade) {
|
||||
case 'Acid': {
|
||||
rollBuilder.push(
|
||||
'name=Acid',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[1+6]]',
|
||||
`hitdmg=[Damage](\`${rollVisibility} rolls [[2d4]] acid damage using their Acid! (Direct Hit))`,
|
||||
`splashdmg=[Damage](\`${rollVisibility} rolls [[1]] acid damage using their Acid! (Splash))`
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Holy water': {
|
||||
rollBuilder.push(
|
||||
'name=Holy water',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[1+6]]',
|
||||
`hitdmg=[Damage](\`${rollVisibility} rolls [[1d6+1]] damage using their Holy water! (Direct Hit))`,
|
||||
`splashdmg=[Damage](\`${rollVisibility} rolls [[2]] damage using their Holy water! (Splash))`
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Oil (lit)': {
|
||||
rollBuilder.push(
|
||||
'name=Oil (lit)',
|
||||
'aoe=[[3]]',
|
||||
'aoesplash=[[3+6]]',
|
||||
`hitdmg=[Round 1](\`${rollVisibility} rolls [[2d6]] fire damage using their Oil (lit)! (Direct Hit, first round)) [Round 2]({rollVisibility}\`$ rolls [[1d6]] fire damage using their Oil (lit)! (Direct Hit, second round))`,
|
||||
`splashdmg=[Damage](\`${rollVisibility} rolls [[1d3]] fire damage using their Oil (lit)! (Splash))`
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Poison': {
|
||||
rollBuilder.push(
|
||||
'name=Poison',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[1+6]]',
|
||||
`hitdmg=[Special](\`${rollVisibility} affects the target creature with Poison! Consult DMG p. 101 for the effect. (Direct Hit))`,
|
||||
`splashdmg=[Special](\`${rollVisibility} affects the target creature with Poison! Consult DMG p. 101 for the effect. (Splash))`
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Boulder': {
|
||||
let damage = await extractQueryResult('?{Direct Hit damage|3d10}');
|
||||
rollBuilder.push(
|
||||
'name=Boulder',
|
||||
'aoe=[[2]]',
|
||||
'aoesplash=[[2]]',
|
||||
`hitdmg=[Damage](\`${rollVisibility} rolls [[${damage}]] damage using their Boulder! (Direct Hit))`,
|
||||
`splashdmg=[Damage](\`${rollVisibility} rolls [[${damage}]] minus the distance the boulder has bounced in feet since it first hit the ground, using their Boulder! (Scatter))`,
|
||||
'bounce=[[3d10]]'
|
||||
);
|
||||
break;
|
||||
}
|
||||
case '--------': return;
|
||||
case 'Fire Seed missile': {
|
||||
rollBuilder.push(
|
||||
'name=Fire Seed missile',
|
||||
'aoe=[[10]]',
|
||||
'aoesplash=',
|
||||
`hitdmg=[Damage](\`${rollVisibility} causes creatures failing a save vs. spell [[2d8]] fire damage (one-half damage if a saving throw vs. spell is successful) using their Fire Seed missile! (Direct Hit))`,
|
||||
'splashdmg='
|
||||
);
|
||||
break
|
||||
}
|
||||
case 'Ice Knife': {
|
||||
rollBuilder.push(
|
||||
'name=Ice Knife',
|
||||
'aoe=[[10]]',
|
||||
'aoesplash=',
|
||||
`hitdmg=[Damage](\`${rollVisibility} causes creatures failing a save vs. paralyzation to suffer [[1d4]] cold damage and [[1d3]] rounds of numbness using their Ice Knife! (Direct Hit))`,
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Melf’s Minute Meteor': {
|
||||
rollBuilder.push(
|
||||
'name=Melf’s Minute Meteor',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[6]]',
|
||||
`hitdmg=[Damage](\`${rollVisibility} rolls [[1d4]] fire damage using their Melf’s Minute Meteor! (Direct Hit))`,
|
||||
`splashdmg=[Damage](\`${rollVisibility} rolls [[1]] fire damage using their Melf’s Minute Meteor! (Splash))`
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Otiluke’s Freezing Sphere - Globe of cold': {
|
||||
rollBuilder.push(
|
||||
'name=Otiluke’s Freezing Sphere (Globe of cold)',
|
||||
'aoe=[[20]]',
|
||||
'aoesplash=',
|
||||
`hitdmg=[Damage](\`${rollVisibility} causes creatures failing a save vs. spell [[6d6]] cold damage (one-half damage if a saving throw vs. spell is successful) using their Otiluke’s Freezing Sphere - Globe of cold! (Direct Hit))`,
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Produce Flame': {
|
||||
rollBuilder.push(
|
||||
'name=Produce Flame',
|
||||
'aoe=[[3]]',
|
||||
'aoesplash=',
|
||||
`hitdmg=[Damage](\`${rollVisibility} rolls [[1d4+1]] fire damage using their Produce Flame! (Direct Hit))`,
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Puffball': {
|
||||
rollBuilder.push(
|
||||
'name=Puffball',
|
||||
'aoe=[[10]]',
|
||||
'aoesplash=',
|
||||
`hitdmg=[Effect](\`${rollVisibility} causes creatures failing a save vs. poison to be unable to attack and lose all Dexterity bonuses to Armor Class and saving throws using their Puffball! (Direct Hit))`,
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Sol’s Searing Orb': {
|
||||
rollBuilder.push(
|
||||
'name=Sol’s Searing Orb',
|
||||
'aoe=[[6]]',
|
||||
'aoesplash=',
|
||||
`hitdmg=[Damage](\`${rollVisibility} causes normal creatures failing a saving throw vs. spell [[3d6]] fire damage and [[1d3]] rounds of blindness. Or causes undead [[6d6]] fire damage and [[1d6]] rounds of blindness. All victims are allowed a saving throw vs. spell, with success indicating half damage and no blindness. Using their Sol’s Searing Orb! (Direct Hit))`,
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Other': {
|
||||
let name = await extractQueryResult('?{Grenade name}');
|
||||
let aoe = await extractQueryResult('?{Area of effect (Diameter in feet)|1}');
|
||||
let damage = await extractQueryResult('?{Direct Hit damage|1d6}');
|
||||
let splash = await extractQueryResult('?{Splash damage|1d3}');
|
||||
splash = splash.trim();
|
||||
|
||||
rollBuilder.push(
|
||||
`name=${name}`,
|
||||
`aoe=[[${aoe}]]`,
|
||||
`aoesplash=[[${aoe}+6]]`,
|
||||
`hitdmg=[Damage](\`/em rolls [[${damage}]] damage using their ${escapedName}! (Direct Hit))`,
|
||||
);
|
||||
let escapedName = name.replaceAll('(','(')
|
||||
.replaceAll(')',')')
|
||||
.replaceAll('[','[')
|
||||
.replaceAll(']',']');
|
||||
|
||||
if (splash === '' || splash === '0') {
|
||||
rollBuilder.push('splashdmg=');
|
||||
} else {
|
||||
rollBuilder.push(`splashdmg=[Damage](\`/em rolls [[${splash}]] damage using their ${escapedName}! (Splash))`);
|
||||
rollBuilder.push(
|
||||
`name=${name}`,
|
||||
`aoe=[[${aoe}]]`,
|
||||
`aoesplash=[[${aoe}+6]]`,
|
||||
`hitdmg=[Damage](\`${rollVisibility} rolls [[${damage}]] damage using their ${escapedName}! (Direct Hit))`,
|
||||
);
|
||||
|
||||
if (splash === '' || splash === '0') {
|
||||
rollBuilder.push('splashdmg=');
|
||||
} else {
|
||||
rollBuilder.push(`splashdmg=[Damage](\`${rollVisibility} rolls [[${splash}]] damage using their ${escapedName}! (Splash))`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let distanceName;
|
||||
switch (grenade) {
|
||||
case 'Fire Seed missile':
|
||||
case 'Melf’s Minute Meteor':
|
||||
case 'Produce Flame':
|
||||
case 'Sol’s Searing Orb':
|
||||
distanceName = 'Short';
|
||||
break;
|
||||
default:
|
||||
distanceName = await extractQueryResult('?{How far was it thrown?|Short|Medium|Long}');
|
||||
}
|
||||
rollBuilder.push('direction=[[1d10]]', `distancename=${distanceName}`);
|
||||
let distanceRoll;
|
||||
switch (distanceName) {
|
||||
case 'Short': distanceRoll='1d6cs1cf6'; break;
|
||||
case 'Medium': distanceRoll='1d10cs1cf10'; break;
|
||||
case 'Long': distanceRoll='2d10cs1cf10'; break;
|
||||
}
|
||||
if (grenade === 'Boulder') {
|
||||
distanceRoll = distanceRoll + '*2';
|
||||
}
|
||||
rollBuilder.push(`distance=[[${distanceRoll}]]`);
|
||||
rollBuilder.push('hit=[[0]]','splash=[[0]]');
|
||||
let finalRollText = rollBuilder.string();
|
||||
console.log(finalRollText);
|
||||
startRoll(finalRollText, function (roll) {
|
||||
let computedRolls = {
|
||||
hit: 0,
|
||||
splash: 0
|
||||
};
|
||||
|
||||
// See if monster is within direct hit
|
||||
if (roll.results.aoe && roll.results.distance.result <= roll.results.aoe.result / 2) {
|
||||
computedRolls.hit = 1;
|
||||
} else if (roll.results.aoesplash && roll.results.distance.result <= roll.results.aoesplash.result / 2) {
|
||||
computedRolls.splash = 1;
|
||||
let distanceName;
|
||||
switch (grenade) {
|
||||
case 'Fire Seed missile':
|
||||
case 'Melf’s Minute Meteor':
|
||||
case 'Produce Flame':
|
||||
case 'Sol’s Searing Orb':
|
||||
distanceName = 'Short';
|
||||
break;
|
||||
default:
|
||||
distanceName = await extractQueryResult('?{How far was it thrown?|Short|Medium|Long}');
|
||||
}
|
||||
finishRoll(roll.rollId, computedRolls);
|
||||
rollBuilder.push('direction=[[1d10]]', `distancename=${distanceName}`);
|
||||
let distanceRoll;
|
||||
switch (distanceName) {
|
||||
case 'Short': distanceRoll='1d6cs1cf6'; break;
|
||||
case 'Medium': distanceRoll='1d10cs1cf10'; break;
|
||||
case 'Long': distanceRoll='2d10cs1cf10'; break;
|
||||
}
|
||||
if (grenade === 'Boulder') {
|
||||
distanceRoll = distanceRoll + '*2';
|
||||
}
|
||||
rollBuilder.push(`distance=[[${distanceRoll}]]`);
|
||||
rollBuilder.push('hit=[[0]]','splash=[[0]]');
|
||||
let finalRollText = `${templateVisibility} ${rollBuilder.string()}`;
|
||||
console.log(finalRollText);
|
||||
startRoll(finalRollText, function (roll) {
|
||||
let computedRolls = {
|
||||
hit: 0,
|
||||
splash: 0
|
||||
};
|
||||
|
||||
// See if monster is within direct hit
|
||||
if (roll.results.aoe && roll.results.distance.result <= roll.results.aoe.result / 2) {
|
||||
computedRolls.hit = 1;
|
||||
} else if (roll.results.aoesplash && roll.results.distance.result <= roll.results.aoesplash.result / 2) {
|
||||
computedRolls.splash = 1;
|
||||
}
|
||||
finishRoll(roll.rollId, computedRolls);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -2094,215 +2094,224 @@ on('change:repeating_monsterweapons:weaponname', function(eventInfo) {
|
||||
});
|
||||
//#endregion
|
||||
|
||||
on('clicked:grenade-miss', async function(eventInfo) {
|
||||
let rollBuilder = new RollTemplateBuilder('2Egrenademiss');
|
||||
const query = '?{What grenade have been thrown?'.concat(
|
||||
'|Acid',
|
||||
'|Holy water',
|
||||
'|Oil (lit)',
|
||||
'|Poison',
|
||||
'|Boulder',
|
||||
'|--------',
|
||||
'|Fire Seed missile',
|
||||
'|Ice Knife',
|
||||
'|Melf’s Minute Meteor',
|
||||
'|Otiluke’s Freezing Sphere - Globe of cold',
|
||||
'|Produce Flame',
|
||||
'|Puffball',
|
||||
'|Sol’s Searing Orb',
|
||||
'|Other',
|
||||
'}'
|
||||
);
|
||||
let grenade = await extractQueryResult(query);
|
||||
switch (grenade) {
|
||||
case 'Acid': {
|
||||
rollBuilder.push(
|
||||
'name=Acid',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[1+6]]',
|
||||
'hitdmg=[Damage](`/em rolls [[2d4]] acid damage using their Acid! (Direct Hit))',
|
||||
'splashdmg=[Damage](`/em rolls [[1]] acid damage using their Acid! (Splash))'
|
||||
);
|
||||
break;
|
||||
on('clicked:grenade-miss', function(eventInfo) {
|
||||
getAttrs(['tab11'], async function(values) {
|
||||
let templateVisibility = '';
|
||||
let rollVisibility = '/em';
|
||||
if (values['tab11'] === '2') {
|
||||
templateVisibility = values['wtype'];
|
||||
rollVisibility = values['wtype'];
|
||||
}
|
||||
case 'Holy water': {
|
||||
rollBuilder.push(
|
||||
'name=Holy water',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[1+6]]',
|
||||
'hitdmg=[Damage](`/em rolls [[1d6+1]] damage using their Holy water! (Direct Hit))',
|
||||
'splashdmg=[Damage](`/em rolls [[2]] damage using their Holy water! (Splash))'
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Oil (lit)': {
|
||||
rollBuilder.push(
|
||||
'name=Oil (lit)',
|
||||
'aoe=[[3]]',
|
||||
'aoesplash=[[3+6]]',
|
||||
'hitdmg=[Round 1](`/em rolls [[2d6]] fire damage using their Oil (lit)! (Direct Hit, first round)) [Round 2](`/em rolls [[1d6]] fire damage using their Oil (lit)! (Direct Hit, second round))',
|
||||
'splashdmg=[Damage](`/em rolls [[1d3]] fire damage using their Oil (lit)! (Splash))'
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Poison': {
|
||||
rollBuilder.push(
|
||||
'name=Poison',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[1+6]]',
|
||||
'hitdmg=[Special](`/em affects the target creature with Poison! Consult DMG p. 101 for the effect. (Direct Hit))',
|
||||
'splashdmg=[Special](`/em affects the target creature with Poison! Consult DMG p. 101 for the effect. (Splash))'
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Boulder': {
|
||||
let damage = await extractQueryResult('?{Direct Hit damage|3d10}');
|
||||
rollBuilder.push(
|
||||
'name=Boulder',
|
||||
'aoe=[[2]]',
|
||||
'aoesplash=[[2]]',
|
||||
`hitdmg=[Damage](\`/em rolls [[${damage}]] damage using their Boulder! (Direct Hit))`,
|
||||
`splashdmg=[Damage](\`/em rolls [[${damage}]] minus the distance the boulder has bounced in feet since it first hit the ground, using their Boulder! (Scatter))`,
|
||||
'bounce=[[3d10]]'
|
||||
);
|
||||
break;
|
||||
}
|
||||
case '--------': return;
|
||||
case 'Fire Seed missile': {
|
||||
rollBuilder.push(
|
||||
'name=Fire Seed missile',
|
||||
'aoe=[[10]]',
|
||||
'aoesplash=',
|
||||
'hitdmg=[Damage](`/em causes creatures failing a save vs. spell [[2d8]] fire damage (one-half damage if a saving throw vs. spell is successful) using their Fire Seed missile! (Direct Hit))',
|
||||
'splashdmg='
|
||||
);
|
||||
break
|
||||
}
|
||||
case 'Ice Knife': {
|
||||
rollBuilder.push(
|
||||
'name=Ice Knife',
|
||||
'aoe=[[10]]',
|
||||
'aoesplash=',
|
||||
'hitdmg=[Damage](`/em causes creatures failing a save vs. paralyzation to suffer [[1d4]] cold damage and [[1d3]] rounds of numbness using their Ice Knife! (Direct Hit))',
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Melf’s Minute Meteor': {
|
||||
rollBuilder.push(
|
||||
'name=Melf’s Minute Meteor',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[6]]',
|
||||
'hitdmg=[Damage](`/em rolls [[1d4]] fire damage using their Melf’s Minute Meteor! (Direct Hit))',
|
||||
'splashdmg=[Damage](`/em rolls [[1]] fire damage using their Melf’s Minute Meteor! (Splash))'
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Otiluke’s Freezing Sphere - Globe of cold': {
|
||||
rollBuilder.push(
|
||||
'name=Otiluke’s Freezing Sphere (Globe of cold)',
|
||||
'aoe=[[20]]',
|
||||
'aoesplash=',
|
||||
'hitdmg=[Damage](`/em causes creatures failing a save vs. spell [[6d6]] cold damage (one-half damage if a saving throw vs. spell is successful) using their Otiluke’s Freezing Sphere - Globe of cold! (Direct Hit))',
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Produce Flame': {
|
||||
rollBuilder.push(
|
||||
'name=Produce Flame',
|
||||
'aoe=[[3]]',
|
||||
'aoesplash=',
|
||||
'hitdmg=[Damage](`/em rolls [[1d4+1]] fire damage using their Produce Flame! (Direct Hit))',
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Puffball': {
|
||||
rollBuilder.push(
|
||||
'name=Puffball',
|
||||
'aoe=[[10]]',
|
||||
'aoesplash=',
|
||||
'hitdmg=[Effect](`/em causes creatures failing a save vs. poison to be unable to attack and lose all Dexterity bonuses to Armor Class and saving throws using their Puffball! (Direct Hit))',
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Sol’s Searing Orb': {
|
||||
rollBuilder.push(
|
||||
'name=Sol’s Searing Orb',
|
||||
'aoe=[[6]]',
|
||||
'aoesplash=',
|
||||
'hitdmg=[Damage](`/em causes normal creatures failing a saving throw vs. spell [[3d6]] fire damage and [[1d3]] rounds of blindness. Or causes undead [[6d6]] fire damage and [[1d6]] rounds of blindness. All victims are allowed a saving throw vs. spell, with success indicating half damage and no blindness. Using their Sol’s Searing Orb! (Direct Hit))',
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Other': {
|
||||
let name = await extractQueryResult('?{Grenade name}');
|
||||
let aoe = await extractQueryResult('?{Area of effect (Diameter in feet)|1}');
|
||||
let damage = await extractQueryResult('?{Direct Hit damage|1d6}');
|
||||
let splash = await extractQueryResult('?{Splash damage|1d3}');
|
||||
splash = splash.trim();
|
||||
|
||||
let escapedName = name.replaceAll('(','(')
|
||||
.replaceAll(')',')')
|
||||
.replaceAll('[','[')
|
||||
.replaceAll(']',']');
|
||||
let rollBuilder = new RollTemplateBuilder('2Egrenademiss');
|
||||
const query = '?{What grenade have been thrown?'.concat(
|
||||
'|Acid',
|
||||
'|Holy water',
|
||||
'|Oil (lit)',
|
||||
'|Poison',
|
||||
'|Boulder',
|
||||
'|--------',
|
||||
'|Fire Seed missile',
|
||||
'|Ice Knife',
|
||||
'|Melf’s Minute Meteor',
|
||||
'|Otiluke’s Freezing Sphere - Globe of cold',
|
||||
'|Produce Flame',
|
||||
'|Puffball',
|
||||
'|Sol’s Searing Orb',
|
||||
'|Other',
|
||||
'}'
|
||||
);
|
||||
let grenade = await extractQueryResult(query);
|
||||
switch (grenade) {
|
||||
case 'Acid': {
|
||||
rollBuilder.push(
|
||||
'name=Acid',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[1+6]]',
|
||||
`hitdmg=[Damage](\`${rollVisibility} rolls [[2d4]] acid damage using their Acid! (Direct Hit))`,
|
||||
`splashdmg=[Damage](\`${rollVisibility} rolls [[1]] acid damage using their Acid! (Splash))`
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Holy water': {
|
||||
rollBuilder.push(
|
||||
'name=Holy water',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[1+6]]',
|
||||
`hitdmg=[Damage](\`${rollVisibility} rolls [[1d6+1]] damage using their Holy water! (Direct Hit))`,
|
||||
`splashdmg=[Damage](\`${rollVisibility} rolls [[2]] damage using their Holy water! (Splash))`
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Oil (lit)': {
|
||||
rollBuilder.push(
|
||||
'name=Oil (lit)',
|
||||
'aoe=[[3]]',
|
||||
'aoesplash=[[3+6]]',
|
||||
`hitdmg=[Round 1](\`${rollVisibility} rolls [[2d6]] fire damage using their Oil (lit)! (Direct Hit, first round)) [Round 2]({rollVisibility}\`$ rolls [[1d6]] fire damage using their Oil (lit)! (Direct Hit, second round))`,
|
||||
`splashdmg=[Damage](\`${rollVisibility} rolls [[1d3]] fire damage using their Oil (lit)! (Splash))`
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Poison': {
|
||||
rollBuilder.push(
|
||||
'name=Poison',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[1+6]]',
|
||||
`hitdmg=[Special](\`${rollVisibility} affects the target creature with Poison! Consult DMG p. 101 for the effect. (Direct Hit))`,
|
||||
`splashdmg=[Special](\`${rollVisibility} affects the target creature with Poison! Consult DMG p. 101 for the effect. (Splash))`
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Boulder': {
|
||||
let damage = await extractQueryResult('?{Direct Hit damage|3d10}');
|
||||
rollBuilder.push(
|
||||
'name=Boulder',
|
||||
'aoe=[[2]]',
|
||||
'aoesplash=[[2]]',
|
||||
`hitdmg=[Damage](\`${rollVisibility} rolls [[${damage}]] damage using their Boulder! (Direct Hit))`,
|
||||
`splashdmg=[Damage](\`${rollVisibility} rolls [[${damage}]] minus the distance the boulder has bounced in feet since it first hit the ground, using their Boulder! (Scatter))`,
|
||||
'bounce=[[3d10]]'
|
||||
);
|
||||
break;
|
||||
}
|
||||
case '--------': return;
|
||||
case 'Fire Seed missile': {
|
||||
rollBuilder.push(
|
||||
'name=Fire Seed missile',
|
||||
'aoe=[[10]]',
|
||||
'aoesplash=',
|
||||
`hitdmg=[Damage](\`${rollVisibility} causes creatures failing a save vs. spell [[2d8]] fire damage (one-half damage if a saving throw vs. spell is successful) using their Fire Seed missile! (Direct Hit))`,
|
||||
'splashdmg='
|
||||
);
|
||||
break
|
||||
}
|
||||
case 'Ice Knife': {
|
||||
rollBuilder.push(
|
||||
'name=Ice Knife',
|
||||
'aoe=[[10]]',
|
||||
'aoesplash=',
|
||||
`hitdmg=[Damage](\`${rollVisibility} causes creatures failing a save vs. paralyzation to suffer [[1d4]] cold damage and [[1d3]] rounds of numbness using their Ice Knife! (Direct Hit))`,
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Melf’s Minute Meteor': {
|
||||
rollBuilder.push(
|
||||
'name=Melf’s Minute Meteor',
|
||||
'aoe=[[1]]',
|
||||
'aoesplash=[[6]]',
|
||||
`hitdmg=[Damage](\`${rollVisibility} rolls [[1d4]] fire damage using their Melf’s Minute Meteor! (Direct Hit))`,
|
||||
`splashdmg=[Damage](\`${rollVisibility} rolls [[1]] fire damage using their Melf’s Minute Meteor! (Splash))`
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Otiluke’s Freezing Sphere - Globe of cold': {
|
||||
rollBuilder.push(
|
||||
'name=Otiluke’s Freezing Sphere (Globe of cold)',
|
||||
'aoe=[[20]]',
|
||||
'aoesplash=',
|
||||
`hitdmg=[Damage](\`${rollVisibility} causes creatures failing a save vs. spell [[6d6]] cold damage (one-half damage if a saving throw vs. spell is successful) using their Otiluke’s Freezing Sphere - Globe of cold! (Direct Hit))`,
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Produce Flame': {
|
||||
rollBuilder.push(
|
||||
'name=Produce Flame',
|
||||
'aoe=[[3]]',
|
||||
'aoesplash=',
|
||||
`hitdmg=[Damage](\`${rollVisibility} rolls [[1d4+1]] fire damage using their Produce Flame! (Direct Hit))`,
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Puffball': {
|
||||
rollBuilder.push(
|
||||
'name=Puffball',
|
||||
'aoe=[[10]]',
|
||||
'aoesplash=',
|
||||
`hitdmg=[Effect](\`${rollVisibility} causes creatures failing a save vs. poison to be unable to attack and lose all Dexterity bonuses to Armor Class and saving throws using their Puffball! (Direct Hit))`,
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Sol’s Searing Orb': {
|
||||
rollBuilder.push(
|
||||
'name=Sol’s Searing Orb',
|
||||
'aoe=[[6]]',
|
||||
'aoesplash=',
|
||||
`hitdmg=[Damage](\`${rollVisibility} causes normal creatures failing a saving throw vs. spell [[3d6]] fire damage and [[1d3]] rounds of blindness. Or causes undead [[6d6]] fire damage and [[1d6]] rounds of blindness. All victims are allowed a saving throw vs. spell, with success indicating half damage and no blindness. Using their Sol’s Searing Orb! (Direct Hit))`,
|
||||
'splashdmg='
|
||||
);
|
||||
break;
|
||||
}
|
||||
case 'Other': {
|
||||
let name = await extractQueryResult('?{Grenade name}');
|
||||
let aoe = await extractQueryResult('?{Area of effect (Diameter in feet)|1}');
|
||||
let damage = await extractQueryResult('?{Direct Hit damage|1d6}');
|
||||
let splash = await extractQueryResult('?{Splash damage|1d3}');
|
||||
splash = splash.trim();
|
||||
|
||||
rollBuilder.push(
|
||||
`name=${name}`,
|
||||
`aoe=[[${aoe}]]`,
|
||||
`aoesplash=[[${aoe}+6]]`,
|
||||
`hitdmg=[Damage](\`/em rolls [[${damage}]] damage using their ${escapedName}! (Direct Hit))`,
|
||||
);
|
||||
let escapedName = name.replaceAll('(','(')
|
||||
.replaceAll(')',')')
|
||||
.replaceAll('[','[')
|
||||
.replaceAll(']',']');
|
||||
|
||||
if (splash === '' || splash === '0') {
|
||||
rollBuilder.push('splashdmg=');
|
||||
} else {
|
||||
rollBuilder.push(`splashdmg=[Damage](\`/em rolls [[${splash}]] damage using their ${escapedName}! (Splash))`);
|
||||
rollBuilder.push(
|
||||
`name=${name}`,
|
||||
`aoe=[[${aoe}]]`,
|
||||
`aoesplash=[[${aoe}+6]]`,
|
||||
`hitdmg=[Damage](\`${rollVisibility} rolls [[${damage}]] damage using their ${escapedName}! (Direct Hit))`,
|
||||
);
|
||||
|
||||
if (splash === '' || splash === '0') {
|
||||
rollBuilder.push('splashdmg=');
|
||||
} else {
|
||||
rollBuilder.push(`splashdmg=[Damage](\`${rollVisibility} rolls [[${splash}]] damage using their ${escapedName}! (Splash))`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let distanceName;
|
||||
switch (grenade) {
|
||||
case 'Fire Seed missile':
|
||||
case 'Melf’s Minute Meteor':
|
||||
case 'Produce Flame':
|
||||
case 'Sol’s Searing Orb':
|
||||
distanceName = 'Short';
|
||||
break;
|
||||
default:
|
||||
distanceName = await extractQueryResult('?{How far was it thrown?|Short|Medium|Long}');
|
||||
}
|
||||
rollBuilder.push('direction=[[1d10]]', `distancename=${distanceName}`);
|
||||
let distanceRoll;
|
||||
switch (distanceName) {
|
||||
case 'Short': distanceRoll='1d6cs1cf6'; break;
|
||||
case 'Medium': distanceRoll='1d10cs1cf10'; break;
|
||||
case 'Long': distanceRoll='2d10cs1cf10'; break;
|
||||
}
|
||||
if (grenade === 'Boulder') {
|
||||
distanceRoll = distanceRoll + '*2';
|
||||
}
|
||||
rollBuilder.push(`distance=[[${distanceRoll}]]`);
|
||||
rollBuilder.push('hit=[[0]]','splash=[[0]]');
|
||||
let finalRollText = rollBuilder.string();
|
||||
console.log(finalRollText);
|
||||
startRoll(finalRollText, function (roll) {
|
||||
let computedRolls = {
|
||||
hit: 0,
|
||||
splash: 0
|
||||
};
|
||||
|
||||
// See if monster is within direct hit
|
||||
if (roll.results.aoe && roll.results.distance.result <= roll.results.aoe.result / 2) {
|
||||
computedRolls.hit = 1;
|
||||
} else if (roll.results.aoesplash && roll.results.distance.result <= roll.results.aoesplash.result / 2) {
|
||||
computedRolls.splash = 1;
|
||||
let distanceName;
|
||||
switch (grenade) {
|
||||
case 'Fire Seed missile':
|
||||
case 'Melf’s Minute Meteor':
|
||||
case 'Produce Flame':
|
||||
case 'Sol’s Searing Orb':
|
||||
distanceName = 'Short';
|
||||
break;
|
||||
default:
|
||||
distanceName = await extractQueryResult('?{How far was it thrown?|Short|Medium|Long}');
|
||||
}
|
||||
finishRoll(roll.rollId, computedRolls);
|
||||
rollBuilder.push('direction=[[1d10]]', `distancename=${distanceName}`);
|
||||
let distanceRoll;
|
||||
switch (distanceName) {
|
||||
case 'Short': distanceRoll='1d6cs1cf6'; break;
|
||||
case 'Medium': distanceRoll='1d10cs1cf10'; break;
|
||||
case 'Long': distanceRoll='2d10cs1cf10'; break;
|
||||
}
|
||||
if (grenade === 'Boulder') {
|
||||
distanceRoll = distanceRoll + '*2';
|
||||
}
|
||||
rollBuilder.push(`distance=[[${distanceRoll}]]`);
|
||||
rollBuilder.push('hit=[[0]]','splash=[[0]]');
|
||||
let finalRollText = `${templateVisibility} ${rollBuilder.string()}`;
|
||||
console.log(finalRollText);
|
||||
startRoll(finalRollText, function (roll) {
|
||||
let computedRolls = {
|
||||
hit: 0,
|
||||
splash: 0
|
||||
};
|
||||
|
||||
// See if monster is within direct hit
|
||||
if (roll.results.aoe && roll.results.distance.result <= roll.results.aoe.result / 2) {
|
||||
computedRolls.hit = 1;
|
||||
} else if (roll.results.aoesplash && roll.results.distance.result <= roll.results.aoesplash.result / 2) {
|
||||
computedRolls.splash = 1;
|
||||
}
|
||||
finishRoll(roll.rollId, computedRolls);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user