2020-11-28 19:12:19 +01:00
|
|
|
export default class KHDiceRoller {
|
|
|
|
async rollSpellCostInChat(cost, speaker) {
|
|
|
|
let formula = cost + "d6"
|
|
|
|
|
|
|
|
const roll = new Roll(formula);
|
|
|
|
|
|
|
|
let res = roll.roll();
|
|
|
|
|
|
|
|
let rollData = {
|
|
|
|
name: "SPELL.COST",
|
|
|
|
res: res,
|
|
|
|
showFormula: true
|
|
|
|
};
|
|
|
|
|
|
|
|
const html = await renderTemplate("systems/kopparhavet/templates/dice/roll.html", rollData);
|
|
|
|
|
2020-12-04 03:45:09 +01:00
|
|
|
if(game.settings.get("kopparhavet", "applySpellCost")) {
|
|
|
|
let totalCostForActor = speaker.data.data.mana.value + roll.total
|
|
|
|
|
|
|
|
speaker.update({ ["data.mana.value"]: totalCostForActor });
|
|
|
|
}
|
|
|
|
|
2020-11-28 19:12:19 +01:00
|
|
|
await roll.toMessage({
|
|
|
|
create: true,
|
|
|
|
content: html,
|
2021-07-28 12:51:13 +02:00
|
|
|
user: game.user.id,
|
2020-11-28 19:12:19 +01:00
|
|
|
speaker: {
|
2021-07-28 12:51:13 +02:00
|
|
|
actor: speaker.id,
|
2020-11-28 19:12:19 +01:00
|
|
|
token: speaker.token,
|
|
|
|
alias: speaker.name,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async rollDamageInChat(facesNr, speaker) {
|
|
|
|
let formula = facesNr + "d6x6"
|
|
|
|
|
|
|
|
const roll = new Roll(formula);
|
|
|
|
|
|
|
|
let res = roll.roll();
|
|
|
|
|
|
|
|
let rollData = {
|
|
|
|
name: "ITEM.DAMAGE",
|
|
|
|
res: res,
|
|
|
|
showFormula: true
|
|
|
|
};
|
|
|
|
|
|
|
|
const html = await renderTemplate("systems/kopparhavet/templates/dice/roll.html", rollData);
|
|
|
|
|
|
|
|
await roll.toMessage({
|
|
|
|
create: true,
|
|
|
|
content: html,
|
2021-07-28 12:51:13 +02:00
|
|
|
user: game.user.id,
|
2020-11-28 19:12:19 +01:00
|
|
|
speaker: {
|
2021-07-28 12:51:13 +02:00
|
|
|
actor: speaker.id,
|
2020-11-28 19:12:19 +01:00
|
|
|
token: speaker.token,
|
|
|
|
alias: speaker.name,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async rollArmorInChat(armor, hasHelmet, speaker) {
|
|
|
|
let formula = armor + "d6"
|
|
|
|
|
|
|
|
if(hasHelmet) {
|
|
|
|
formula += "x6"
|
|
|
|
}
|
|
|
|
|
|
|
|
const roll = new Roll(formula);
|
|
|
|
|
|
|
|
let res = roll.roll();
|
|
|
|
|
|
|
|
let rollData = {
|
|
|
|
name: "ITEM.DEFENCE",
|
|
|
|
res: res,
|
|
|
|
showFormula: true
|
|
|
|
};
|
|
|
|
|
|
|
|
const html = await renderTemplate("systems/kopparhavet/templates/dice/roll.html", rollData);
|
|
|
|
|
|
|
|
await roll.toMessage({
|
|
|
|
create: true,
|
|
|
|
content: html,
|
2021-07-28 12:51:13 +02:00
|
|
|
user: game.user.id,
|
2020-11-28 19:12:19 +01:00
|
|
|
speaker: {
|
2021-07-28 12:51:13 +02:00
|
|
|
actor: speaker.id,
|
2020-11-28 19:12:19 +01:00
|
|
|
token: speaker.token,
|
|
|
|
alias: speaker.name,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-03-19 05:08:28 +01:00
|
|
|
async rollSkillInChat(skillName, skillValue, showValue, speaker, openclosed, opposite) {
|
2020-11-28 19:12:19 +01:00
|
|
|
const roll = new Roll(`1d100`);
|
|
|
|
|
|
|
|
let res = roll.roll();
|
|
|
|
|
|
|
|
let computedName = skillName
|
|
|
|
|
|
|
|
if(showValue) {
|
|
|
|
computedName += " (" + skillValue + ")"
|
|
|
|
}
|
|
|
|
|
2020-12-01 04:12:47 +01:00
|
|
|
if(openclosed === undefined) {
|
|
|
|
openclosed = 0
|
|
|
|
}
|
|
|
|
|
2021-03-19 05:08:28 +01:00
|
|
|
if(opposite === undefined) {
|
|
|
|
opposite = []
|
|
|
|
}
|
|
|
|
|
|
|
|
let oppositeValue = ""
|
|
|
|
|
|
|
|
opposite.forEach(function(skill) {
|
|
|
|
if(oppositeValue !== "") {
|
|
|
|
oppositeValue = oppositeValue + " " + game.i18n.localize("ROLL.OR") + " "
|
|
|
|
}
|
|
|
|
oppositeValue = oppositeValue + skill
|
|
|
|
})
|
|
|
|
|
2020-11-28 19:12:19 +01:00
|
|
|
let rollData = {
|
|
|
|
name: computedName,
|
2021-03-19 05:08:28 +01:00
|
|
|
res: res,
|
|
|
|
opposite: oppositeValue
|
2020-11-28 19:12:19 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
if(skillValue > 0) {
|
2020-12-01 04:12:47 +01:00
|
|
|
let oneRes = Math.floor((res.total / 1) % 10);
|
|
|
|
let tenRes = Math.floor((res.total / 10) % 10);
|
|
|
|
|
|
|
|
if(openclosed < 0) {
|
|
|
|
rollData.closed = Math.abs(openclosed)
|
|
|
|
}
|
|
|
|
|
|
|
|
if(openclosed > 0) {
|
|
|
|
rollData.opened = Math.abs(openclosed)
|
|
|
|
}
|
|
|
|
|
|
|
|
if(openclosed < 0 && oneRes !== 0 && Math.abs(openclosed) >= oneRes) {
|
|
|
|
// roll is closed
|
|
|
|
rollData.failure = true
|
|
|
|
} else if(openclosed > 0 && oneRes !== 0 && Math.abs(openclosed) >= oneRes){
|
|
|
|
// roll is opened
|
2020-11-28 19:12:19 +01:00
|
|
|
rollData.success = true
|
|
|
|
} else {
|
2020-12-01 04:12:47 +01:00
|
|
|
if (res.total <= skillValue) {
|
|
|
|
rollData.success = true
|
|
|
|
} else {
|
|
|
|
rollData.failure = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(oneRes === tenRes) {
|
|
|
|
rollData.excetional = true
|
2020-11-28 19:12:19 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const html = await renderTemplate("systems/kopparhavet/templates/dice/roll.html", rollData);
|
|
|
|
|
|
|
|
await roll.toMessage({
|
|
|
|
create: true,
|
|
|
|
content: html,
|
2021-07-28 12:51:13 +02:00
|
|
|
user: game.user.id,
|
2020-11-28 19:12:19 +01:00
|
|
|
speaker: {
|
2021-07-28 12:51:13 +02:00
|
|
|
actor: speaker.id,
|
2020-11-28 19:12:19 +01:00
|
|
|
token: speaker.token,
|
|
|
|
alias: speaker.name,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
2020-12-01 04:12:47 +01:00
|
|
|
|
2021-03-19 05:08:28 +01:00
|
|
|
async rollSkillDialogInChat(skillName, skillValue, showValue, speaker, startopen, opposite) {
|
2020-12-01 04:12:47 +01:00
|
|
|
const id = randomID();
|
|
|
|
|
|
|
|
if(startopen === undefined) {
|
|
|
|
startopen = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
const content = await renderTemplate("systems/kopparhavet/templates/roll-dialog.html", {
|
|
|
|
id,
|
|
|
|
startopen,
|
|
|
|
skillName,
|
|
|
|
skillValue,
|
|
|
|
});
|
|
|
|
|
|
|
|
await new Dialog({
|
|
|
|
title: game.i18n.localize("ROLL.TITLE"),
|
|
|
|
content,
|
|
|
|
buttons: {
|
|
|
|
one: {
|
|
|
|
icon: '<i class="fas fa-check"></i>',
|
|
|
|
label: game.i18n.localize("BUTTON.ROLL"),
|
|
|
|
callback: async () => {
|
|
|
|
const container = document.getElementById(id);
|
|
|
|
let openclosed = container.querySelector('[name="openclosed"]').value
|
|
|
|
|
2021-03-19 05:08:28 +01:00
|
|
|
await this.rollSkillInChat(skillName, skillValue, showValue, speaker, openclosed, opposite)
|
|
|
|
|
|
|
|
/*
|
2020-12-01 04:12:47 +01:00
|
|
|
const roll = new Roll(`1d100`);
|
|
|
|
|
|
|
|
let res = roll.roll();
|
|
|
|
|
|
|
|
let computedName = skillName
|
|
|
|
|
|
|
|
if(showValue) {
|
|
|
|
computedName += " (" + skillValue + ")"
|
|
|
|
}
|
|
|
|
|
|
|
|
let rollData = {
|
|
|
|
name: computedName,
|
|
|
|
res: res
|
|
|
|
};
|
|
|
|
|
|
|
|
// Evaluate result only if we have a positive skillvalue
|
|
|
|
if(skillValue > 0) {
|
|
|
|
let oneRes = Math.floor((res.total / 1) % 10);
|
|
|
|
let tenRes = Math.floor((res.total / 10) % 10);
|
|
|
|
|
|
|
|
if(openclosed < 0) {
|
|
|
|
rollData.closed = Math.abs(openclosed)
|
|
|
|
}
|
|
|
|
|
|
|
|
if(openclosed > 0) {
|
|
|
|
rollData.opened = Math.abs(openclosed)
|
|
|
|
}
|
|
|
|
|
|
|
|
if(openclosed < 0 && oneRes !== 0 && Math.abs(openclosed) >= oneRes) {
|
|
|
|
// roll is closed
|
|
|
|
rollData.failure = true
|
|
|
|
} else if(openclosed > 0 && oneRes !== 0 && Math.abs(openclosed) >= oneRes){
|
|
|
|
// roll is opened
|
|
|
|
rollData.success = true
|
|
|
|
} else {
|
|
|
|
if (res.total <= skillValue) {
|
|
|
|
rollData.success = true
|
|
|
|
} else {
|
|
|
|
rollData.failure = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(oneRes === tenRes) {
|
|
|
|
rollData.excetional = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const html = await renderTemplate("systems/kopparhavet/templates/dice/roll.html", rollData);
|
|
|
|
|
|
|
|
await roll.toMessage({
|
|
|
|
create: true,
|
|
|
|
content: html,
|
|
|
|
user: game.user._id,
|
|
|
|
speaker: {
|
|
|
|
actor: speaker._id,
|
|
|
|
token: speaker.token,
|
|
|
|
alias: speaker.name,
|
|
|
|
},
|
|
|
|
});
|
2021-03-19 05:08:28 +01:00
|
|
|
*/
|
2020-12-01 04:12:47 +01:00
|
|
|
},
|
|
|
|
},
|
|
|
|
two: {
|
|
|
|
icon: '<i class="fas fa-times"></i>',
|
|
|
|
label: game.i18n.localize("BUTTON.CANCEL"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
classes: ["dialog", "kopparhavet"],
|
|
|
|
}).render(true);
|
|
|
|
}
|
2021-03-19 05:08:28 +01:00
|
|
|
|
|
|
|
async rollSkillRitualInChat(ritualName, skills, showValue, speaker, openclosed) {
|
|
|
|
let rollData = {
|
|
|
|
name: ritualName,
|
|
|
|
res: []
|
|
|
|
};
|
|
|
|
|
|
|
|
if(openclosed === undefined) {
|
|
|
|
openclosed = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
if(openclosed < 0) {
|
|
|
|
rollData.closed = Math.abs(openclosed)
|
|
|
|
}
|
|
|
|
|
|
|
|
if(openclosed > 0) {
|
|
|
|
rollData.opened = Math.abs(openclosed)
|
|
|
|
}
|
|
|
|
|
|
|
|
let successes = 0
|
|
|
|
let totalrolls = 0
|
|
|
|
|
|
|
|
for (const skill of skills) {
|
|
|
|
totalrolls++
|
|
|
|
const roll = new Roll(`1d100`);
|
|
|
|
|
|
|
|
let res = roll.roll();
|
|
|
|
|
|
|
|
let skillName = skill.name
|
|
|
|
let success = false
|
|
|
|
let failure = false
|
|
|
|
|
|
|
|
if(showValue) {
|
|
|
|
skillName = skillName + " (" + skill.value + ")"
|
|
|
|
}
|
|
|
|
|
|
|
|
let rollData2 = {
|
|
|
|
name: skillName,
|
|
|
|
res: res,
|
|
|
|
};
|
|
|
|
|
|
|
|
if(openclosed < 0) {
|
|
|
|
rollData2.closed = Math.abs(openclosed)
|
|
|
|
}
|
|
|
|
|
|
|
|
if(openclosed > 0) {
|
|
|
|
rollData2.opened = Math.abs(openclosed)
|
|
|
|
}
|
|
|
|
|
|
|
|
if(skill.value > 0) {
|
|
|
|
let oneRes = Math.floor((res.total / 1) % 10);
|
|
|
|
//let tenRes = Math.floor((res.total / 10) % 10);
|
|
|
|
|
|
|
|
if(openclosed < 0 && oneRes !== 0 && Math.abs(openclosed) >= oneRes) {
|
|
|
|
// roll is closed
|
|
|
|
failure = true
|
|
|
|
} else if(openclosed > 0 && oneRes !== 0 && Math.abs(openclosed) >= oneRes){
|
|
|
|
// roll is opened
|
|
|
|
success = true
|
|
|
|
successes++
|
|
|
|
} else {
|
|
|
|
if (res.total <= skill.value) {
|
|
|
|
success = true
|
|
|
|
successes++
|
|
|
|
} else {
|
|
|
|
failure = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
rollData.res.push({
|
|
|
|
name: skillName,
|
|
|
|
failure: failure,
|
|
|
|
success: success,
|
|
|
|
result: res,
|
|
|
|
})
|
|
|
|
|
|
|
|
rollData2.success = success
|
|
|
|
rollData2.failure = failure
|
|
|
|
|
|
|
|
const html = await renderTemplate("systems/kopparhavet/templates/dice/roll.html", rollData2);
|
|
|
|
|
|
|
|
await roll.toMessage({
|
|
|
|
create: true,
|
|
|
|
content: html,
|
2021-07-28 12:51:13 +02:00
|
|
|
user: game.user.id,
|
2021-03-19 05:08:28 +01:00
|
|
|
speaker: {
|
2021-07-28 12:51:13 +02:00
|
|
|
actor: speaker.id,
|
2021-03-19 05:08:28 +01:00
|
|
|
token: speaker.token,
|
|
|
|
alias: speaker.name,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (totalrolls) {
|
|
|
|
case 0:
|
|
|
|
case 1:
|
|
|
|
case 2:
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
if(successes === 0) {
|
|
|
|
rollData.result = "0"
|
|
|
|
} else if(successes === 1) {
|
|
|
|
rollData.result = "2"
|
|
|
|
} else if(successes === 2) {
|
|
|
|
rollData.result = "3"
|
|
|
|
} else if(successes === 3) {
|
|
|
|
rollData.result = "4"
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
if(successes === 0) {
|
|
|
|
rollData.result = "0"
|
|
|
|
} else if(successes === 1) {
|
|
|
|
rollData.result = "1"
|
|
|
|
} else if(successes === 2) {
|
|
|
|
rollData.result = "2"
|
|
|
|
} else if(successes === 3) {
|
|
|
|
rollData.result = "3"
|
|
|
|
} else if(successes === 4) {
|
|
|
|
rollData.result = "4"
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
if(successes === 0) {
|
|
|
|
rollData.result = "0"
|
|
|
|
} else if(successes === 1) {
|
|
|
|
rollData.result = "1"
|
|
|
|
} else if(successes === 2) {
|
|
|
|
rollData.result = "1"
|
|
|
|
} else if(successes === 3) {
|
|
|
|
rollData.result = "2"
|
|
|
|
} else if(successes === 4) {
|
|
|
|
rollData.result = "3"
|
|
|
|
} else if(successes === 5) {
|
|
|
|
rollData.result = "4"
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
const html = await renderTemplate("systems/kopparhavet/templates/dice/ritual-roll.html", rollData);
|
|
|
|
|
|
|
|
/*
|
|
|
|
await roll.toMessage({
|
|
|
|
create: true,
|
|
|
|
content: html,
|
|
|
|
user: game.user._id,
|
|
|
|
speaker: {
|
|
|
|
actor: speaker._id,
|
|
|
|
token: speaker.token,
|
|
|
|
alias: speaker.name,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
*/
|
|
|
|
|
|
|
|
await ChatMessage.create({
|
|
|
|
create: true,
|
|
|
|
content: html,
|
2021-07-28 12:51:13 +02:00
|
|
|
user: game.user.id,
|
2021-03-19 05:08:28 +01:00
|
|
|
speaker: {
|
2021-07-28 12:51:13 +02:00
|
|
|
actor: speaker.id,
|
2021-03-19 05:08:28 +01:00
|
|
|
token: speaker.token,
|
|
|
|
alias: speaker.name,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async rollSkillChallangeDialogInChat(name, skills, showValue, speaker, startopen) {
|
|
|
|
const id = randomID();
|
|
|
|
|
|
|
|
if(startopen === undefined) {
|
|
|
|
startopen = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
const content = await renderTemplate("systems/kopparhavet/templates/roll-dialog.html", {
|
|
|
|
id,
|
|
|
|
startopen,
|
|
|
|
name,
|
|
|
|
});
|
|
|
|
|
|
|
|
await new Dialog({
|
|
|
|
title: game.i18n.localize("ROLL.TITLE"),
|
|
|
|
content,
|
|
|
|
buttons: {
|
|
|
|
one: {
|
|
|
|
icon: '<i class="fas fa-check"></i>',
|
|
|
|
label: game.i18n.localize("BUTTON.ROLL"),
|
|
|
|
callback: async () => {
|
|
|
|
const container = document.getElementById(id);
|
|
|
|
let openclosed = container.querySelector('[name="openclosed"]').value
|
|
|
|
|
|
|
|
await this.rollSkillRitualInChat(name, skills, showValue, speaker, openclosed)
|
|
|
|
},
|
|
|
|
},
|
|
|
|
two: {
|
|
|
|
icon: '<i class="fas fa-times"></i>',
|
|
|
|
label: game.i18n.localize("BUTTON.CANCEL"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
classes: ["dialog", "kopparhavet"],
|
|
|
|
}).render(true);
|
|
|
|
}
|
2020-11-28 19:12:19 +01:00
|
|
|
}
|