Version 0.0.6
Fixed rolling of rituals
Fixed skill dialog for rituals
Fixed chat message for rituals
Fixed chat message for opposed spell rolls
Co-Authored-By: erebus <erebus@rikspolisen.se>
Co-Committed-By: erebus <erebus@rikspolisen.se>
This commit was merged in pull request #6.
This commit is contained in:
2021-03-19 04:22:29 +00:00
parent 3fd49d32bc
commit 77806b38c4
13 changed files with 681 additions and 134 deletions

View File

@@ -271,10 +271,69 @@ export class ActorSheetKH extends ActorSheet {
skillName = _item.name + " (" + skill.name + ")"
}
this.khRoller.rollSkillDialogInChat(skillName, skillValue, showValue, this.actor, difficulty)
let opposite = []
// Retrieve skill based on name
if(_item.data.data.roll.oppositeskill !== "") {
let skill1 = this.actor.items.find((element) => element.name === _item.data.data.roll.oppositeskill);
opposite.push(skill1.name)
}
if(_item.data.data.roll.oppositeskilltwo !== "") {
let skill2 = this.actor.items.find((element) => element.name === _item.data.data.roll.oppositeskilltwo);
opposite.push(skill2.name)
}
this.khRoller.rollSkillDialogInChat(skillName, skillValue, showValue, this.actor, difficulty, opposite)
} else if(_item.data.data.roll.value === "ritual") {
console.log("Not supported yet")
this.khRoller.rollSkillDialogInChat("Ritual", -1, showValue, this.actor, difficulty)
let skills = []
if(_item.data.data.roll.ritual.skillone !== "") {
let skill1 = this.actor.items.find((element) => element.name === _item.data.data.roll.ritual.skillone);
skills.push({
name: skill1.name,
value: skill1.data.data.value
});
}
if(_item.data.data.roll.ritual.skilltwo !== "") {
let skill2 = this.actor.items.find((element) => element.name === _item.data.data.roll.ritual.skilltwo);
skills.push({
name: skill2.name,
value: skill2.data.data.value
});
}
if(_item.data.data.roll.ritual.skillthree !== "") {
let skill3 = this.actor.items.find((element) => element.name === _item.data.data.roll.ritual.skillthree);
skills.push({
name: skill3.name,
value: skill3.data.data.value
});
}
if(_item.data.data.roll.ritual.skillfour !== "") {
let skill4 = this.actor.items.find((element) => element.name === _item.data.data.roll.ritual.skillfour);
skills.push({
name: skill4.name,
value: skill4.data.data.value
});
}
if(_item.data.data.roll.ritual.skillfive !== "") {
let skill5 = this.actor.items.find((element) => element.name === _item.data.data.roll.ritual.skillfive);
skills.push({
name: skill5.name,
value: skill5.data.data.value
});
}
this.khRoller.rollSkillChallangeDialogInChat(_item.name, skills, showValue, this.actor, difficulty)
}
},
},
@@ -474,9 +533,20 @@ export class ActorSheetKH extends ActorSheet {
this.khRoller.rollSkillInChat(skillName, skillValue, showValue, this.actor, difficulty)
} else if(spell.data.data.roll.value === "opposite") {
let opposite = []
// Retrieve skill based on name
let skill = this.actor.items.find((element) => element.name === spell.data.data.roll.skill);
if(spell.data.data.roll.oppositeskill !== "") {
let skill1 = this.actor.items.find((element) => element.name === spell.data.data.roll.oppositeskill);
opposite.push(skill1.name)
}
if(spell.data.data.roll.oppositeskilltwo !== "") {
let skill2 = this.actor.items.find((element) => element.name === spell.data.data.roll.oppositeskilltwo);
opposite.push(skill2.name)
}
let skillName = spell.name
let skillValue = skill.data.data.value
@@ -484,9 +554,60 @@ export class ActorSheetKH extends ActorSheet {
skillName = spell.name + " (" + skill.name + ")"
}
this.khRoller.rollSkillInChat(skillName, skillValue, showValue, this.actor, difficulty)
this.khRoller.rollSkillInChat(skillName, skillValue, showValue, this.actor, difficulty, opposite)
} else if(spell.data.data.roll.value === "ritual") {
console.log("Not supported yet")
let skill1, skill2, skill3, skill4, skill5;
let skills = []
// Retrieve skill based on name
if(spell.data.data.roll.ritual.skillone !== "") {
skill1 = this.actor.items.find((element) => element.name === spell.data.data.roll.ritual.skillone);
skills.push({
name: skill1.name,
value: skill1.data.data.value
});
}
if(spell.data.data.roll.ritual.skilltwo !== "") {
skill2 = this.actor.items.find((element) => element.name === spell.data.data.roll.ritual.skilltwo);
skills.push({
name: skill2.name,
value: skill2.data.data.value
});
}
if(spell.data.data.roll.ritual.skillthree !== "") {
skill3 = this.actor.items.find((element) => element.name === spell.data.data.roll.ritual.skillthree);
skills.push({
name: skill3.name,
value: skill3.data.data.value
});
}
if(spell.data.data.roll.ritual.skillfour !== "") {
skill4 = this.actor.items.find((element) => element.name === spell.data.data.roll.ritual.skillfour);
skills.push({
name: skill4.name,
value: skill4.data.data.value
});
}
if(spell.data.data.roll.ritual.skillfive !== "") {
skill5 = this.actor.items.find((element) => element.name === spell.data.data.roll.ritual.skillfive);
skills.push({
name: skill5.name,
value: skill5.data.data.value
});
}
let skillName = spell.name
this.khRoller.rollSkillRitualInChat(skillName, skills, showValue, this.actor, difficulty)
}
});

View File

@@ -90,7 +90,7 @@ export default class KHDiceRoller {
});
}
async rollSkillInChat(skillName, skillValue, showValue, speaker, openclosed) {
async rollSkillInChat(skillName, skillValue, showValue, speaker, openclosed, opposite) {
const roll = new Roll(`1d100`);
let res = roll.roll();
@@ -105,9 +105,23 @@ export default class KHDiceRoller {
openclosed = 0
}
if(opposite === undefined) {
opposite = []
}
let oppositeValue = ""
opposite.forEach(function(skill) {
if(oppositeValue !== "") {
oppositeValue = oppositeValue + " " + game.i18n.localize("ROLL.OR") + " "
}
oppositeValue = oppositeValue + skill
})
let rollData = {
name: computedName,
res: res
res: res,
opposite: oppositeValue
};
if(skillValue > 0) {
@@ -155,7 +169,7 @@ export default class KHDiceRoller {
});
}
async rollSkillDialogInChat(skillName, skillValue, showValue, speaker, startopen) {
async rollSkillDialogInChat(skillName, skillValue, showValue, speaker, startopen, opposite) {
const id = randomID();
if(startopen === undefined) {
@@ -180,6 +194,9 @@ export default class KHDiceRoller {
const container = document.getElementById(id);
let openclosed = container.querySelector('[name="openclosed"]').value
await this.rollSkillInChat(skillName, skillValue, showValue, speaker, openclosed, opposite)
/*
const roll = new Roll(`1d100`);
let res = roll.roll();
@@ -239,6 +256,7 @@ export default class KHDiceRoller {
alias: speaker.name,
},
});
*/
},
},
two: {
@@ -251,4 +269,208 @@ export default class KHDiceRoller {
classes: ["dialog", "kopparhavet"],
}).render(true);
}
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,
user: game.user._id,
speaker: {
actor: speaker._id,
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,
user: game.user._id,
speaker: {
actor: speaker._id,
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);
}
}

View File

@@ -204,6 +204,40 @@ function registerHandlebarsHelpers() {
}
});
// Allows {if X = Y} type syntax in html using handlebars
Handlebars.registerHelper("iff", function (a, operator, b, opts) {
var bool = false;
switch (operator) {
case "==":
bool = a == b;
break;
case ">":
bool = a > b;
break;
case "<":
bool = a < b;
break;
case "!=":
bool = a != b;
break;
case "contains":
if (a && b) {
bool = a.includes(b);
} else {
bool = false;
}
break;
default:
throw "Unknown operator " + operator;
}
if (bool) {
return opts.fn(this);
} else {
return opts.inverse(this);
}
});
Handlebars.registerHelper('plaintextToHTML', function(value) {
// strip tags, add <br/> tags
return new Handlebars.SafeString(value.replace(/(<([^>]+)>)/gi, "").replace(/(?:\r\n|\r|\n)/g, '<br/>'));