Gestion de l'astrologie

This commit is contained in:
LeRatierBretonnien 2022-12-23 23:24:09 +01:00
parent 7a8cf9f8fd
commit bcb377db7a
24 changed files with 521 additions and 91 deletions

View File

@ -33,6 +33,7 @@
"BOL.ui.tab.description": "Description", "BOL.ui.tab.description": "Description",
"BOL.ui.tab.details": "Details", "BOL.ui.tab.details": "Details",
"BOL.ui.tab.spellalchemy": "Spells & Alchemy", "BOL.ui.tab.spellalchemy": "Spells & Alchemy",
"BOL.ui.tab.astrologer": "Astrologer",
"BOL.ui.properties": "Properties", "BOL.ui.properties": "Properties",
"BOL.ui.description": "Description", "BOL.ui.description": "Description",
@ -115,6 +116,7 @@
"BOL.ui.isSorcerer": "Is Sorcerer ?", "BOL.ui.isSorcerer": "Is Sorcerer ?",
"BOL.ui.isAlchemist": "Is Alchemist ?", "BOL.ui.isAlchemist": "Is Alchemist ?",
"BOL.ui.isPriest": "Is Priest/Druid ?", "BOL.ui.isPriest": "Is Priest/Druid ?",
"BOL.ui.isAstrologer": "Is Astrologer?",
"BOL.ui.circle": "Circle", "BOL.ui.circle": "Circle",
"BOL.ui.spells": "Spells", "BOL.ui.spells": "Spells",
"BOL.ui.focusSpell": "Cast a spell", "BOL.ui.focusSpell": "Cast a spell",

View File

@ -28,7 +28,9 @@
"BOL.resources.power": "Pouvoir", "BOL.resources.power": "Pouvoir",
"BOL.resources.villainy": "Vilénie", "BOL.resources.villainy": "Vilénie",
"BOL.resources.alchemypoints": "Points de Creation", "BOL.resources.alchemypoints": "Points de Creation",
"BOL.resources.astrologypoints": "Points d'Astrologie",
"BOL.traits.xp": "Expérience", "BOL.traits.xp": "Expérience",
"BOL.ui.tab.stats": "Attributs", "BOL.ui.tab.stats": "Attributs",
"BOL.ui.tab.combat": "Combat", "BOL.ui.tab.combat": "Combat",
"BOL.ui.tab.actions": "Actions", "BOL.ui.tab.actions": "Actions",
@ -36,7 +38,19 @@
"BOL.ui.tab.equipment": "Equipement", "BOL.ui.tab.equipment": "Equipement",
"BOL.ui.tab.description": "Description", "BOL.ui.tab.description": "Description",
"BOL.ui.tab.details": "Details", "BOL.ui.tab.details": "Details",
"BOL.ui.tab.spellalchemy": "Sorts&Alchimie", "BOL.ui.tab.spellalchemy": "Mystères",
"BOL.ui.astrologerPoints": "Points d'Astrologie",
"BOL.ui.astrologerPointsLabel": "Points d'Astrologie actuels",
"BOL.ui.ishoroscopemajor": "Horoscope Majeur (ie de groupe) ?",
"BOL.ui.answer": "Réponse",
"BOL.ui.horoscopefavorable": "Favorable (1dB)",
"BOL.ui.horoscopeunfavorable": "Défavorable (1dM)",
"BOL.ui.horoscopes": "Horoscopes",
"BOL.ui.horoscopesBonus": "Horoscopes (Bonus)",
"BOL.ui.horoscopesMalus": "Horoscopes (Malus)",
"BOL.ui.groupHoroscope": "Horoscrope de Groupe de ",
"BOL.ui.properties": "Propriétés", "BOL.ui.properties": "Propriétés",
"BOL.ui.description": "Description", "BOL.ui.description": "Description",
"BOL.ui.actions": "Actions", "BOL.ui.actions": "Actions",
@ -117,9 +131,11 @@
"BOL.ui.spellkeep": "Prolongation", "BOL.ui.spellkeep": "Prolongation",
"BOL.ui.concentrate": "Concentration", "BOL.ui.concentrate": "Concentration",
"BOL.ui.registerInit": "Enregistrer comme Init. de combat", "BOL.ui.registerInit": "Enregistrer comme Init. de combat",
"BOL.ui.isSorcerer": "Carrière de Sorcier ?", "BOL.ui.isSorcerer": "Carrière de Sorcier ?",
"BOL.ui.isAlchemist": "Carrière d'Alchimiste ?", "BOL.ui.isAlchemist": "Carrière d'Alchimiste ?",
"BOL.ui.isPriest": "Carrière de Prêtre/Druide ?", "BOL.ui.isPriest": "Carrière de Prêtre/Druide ?",
"BOL.ui.isAstrologer": "Carrière d'Astrologue?",
"BOL.ui.circle": "Cercle", "BOL.ui.circle": "Cercle",
"BOL.ui.spells": "Sorts", "BOL.ui.spells": "Sorts",
"BOL.ui.focusSpell": "Lance un sort", "BOL.ui.focusSpell": "Lance un sort",
@ -137,6 +153,17 @@
"BOL.ui.alchemyCostTotal": "Points de Création nécessaires pour la Préparation", "BOL.ui.alchemyCostTotal": "Points de Création nécessaires pour la Préparation",
"BOL.ui.alchemyInvest": "Points de Création investis", "BOL.ui.alchemyInvest": "Points de Création investis",
"BOL.ui.alchemyCurrent": "Points de Création actuel dans la Préparation", "BOL.ui.alchemyCurrent": "Points de Création actuel dans la Préparation",
"BOL.ui.astrology": "Astrologie et Horoscopes",
"BOL.ui.astrologyMinor": "Etablir un Horoscope Mineur",
"BOL.ui.astrologyMajor": "Etablir un Horoscope Majeur",
"BOL.ui.astrologyMajorGroup": "Etablir un Horoscope Majeur de Groupe",
"BOL.ui.makeHoroscope": "Etablir un Horoscope",
"BOL.ui.astrologerRank": "Rang de l'Astrologue",
"BOL.ui.horoscopeCost": "Cout en Points d'Astrologie",
"BOL.ui.minor": "Mineur",
"BOL.ui.major": "Majeur",
"BOL.ui.majorgroup": "Majeur de Groupe",
"BOL.ui.advance": "Avancement", "BOL.ui.advance": "Avancement",
"BOL.ui.isbonusdice": "Fourni un dé bonus?", "BOL.ui.isbonusdice": "Fourni un dé bonus?",
"BOL.ui.ismalusdice": "Fourni un dé malus?", "BOL.ui.ismalusdice": "Fourni un dé malus?",
@ -209,6 +236,7 @@
"BOL.featureSubtypes.effect": "Effet", "BOL.featureSubtypes.effect": "Effet",
"BOL.featureSubtypes.effects": "Effets", "BOL.featureSubtypes.effects": "Effets",
"BOL.featureSubtypes.boleffect": "Effet", "BOL.featureSubtypes.boleffect": "Effet",
"BOL.featureSubtypes.horoscope": "Horoscope",
"BOL.fightOptionTypes.armor": "Attaque au défaut d'armure", "BOL.fightOptionTypes.armor": "Attaque au défaut d'armure",
"BOL.fightOptionTypes.intrepid": "Attaque intrépide", "BOL.fightOptionTypes.intrepid": "Attaque intrépide",
@ -480,6 +508,16 @@
"BOL.chat.bougettesuccess": "Votre bougette reste inchangée !", "BOL.chat.bougettesuccess": "Votre bougette reste inchangée !",
"BOL.chat.bougettefailure": "Vous avez trop dépensé, votre bougette s'est réduite...", "BOL.chat.bougettefailure": "Vous avez trop dépensé, votre bougette s'est réduite...",
"BOL.chat.initiative": "Rang d'intiative (10 à 1)", "BOL.chat.initiative": "Rang d'intiative (10 à 1)",
"BOL.chat.horoscope": "Horoscope",
"BOL.chat.horoscopepoints": "Coût : {points} Points d'Astrologie",
"BOL.chat.horoscopeminorsuccess": "Votre horoscope mineur est un succès : éditez le nom de l'horoscope sur votre fiche. Vous bénéficiez d'1 dé Bonus pour cette situation.",
"BOL.chat.horoscopeminorfailure": "Votre horoscope mineur est un échec : éditez le nom de l'horoscope sur votre fiche. Vous souffrez d'1 dé Malus pour cette situation.",
"BOL.chat.horoscopemajorsuccess": "Votre horoscope majeur est un succès : vous bénéficiez d'1 point d'Héroisme pour cette aventure. Ce point a été ajouté automatiquement.",
"BOL.chat.horoscopemajorfailure": "Votre horoscope majeur est un échec : vous perdez 1 point d'Héroisme pour cette aventure. Ce point a été enlevé automatiquement.",
"BOL.chat.horoscopemajorgroupsuccess": "Votre horoscope majeur de groupe est un succès. Vous et vos amis bénéficiez de {careerBonus} dés bonus pendant cette aventure.",
"BOL.chat.horoscopemajorgroupfailure": "Votre horoscope majeur de groupe est un échec. Vous et vos amis souffrez de {careerBonus} dés malus pendant cette aventure.",
"BOL.chat.usedhoroscope": "Horoscope utilisé",
"BOL.chat.horoscopedeleted": "Le(s) Horoscopes utilisé(s) a/ont été supprimé(s) automatiquement.",
"BOL.dialog.soeasy": "Inmanquable (+4)", "BOL.dialog.soeasy": "Inmanquable (+4)",
"BOL.dialog.veryeasy": "Trés Facile (+2)", "BOL.dialog.veryeasy": "Trés Facile (+2)",

View File

@ -136,6 +136,7 @@ export class BoLActorSheet extends ActorSheet {
formData.treasure = this.actor.treasure formData.treasure = this.actor.treasure
formData.boleffects = this.actor.boleffects formData.boleffects = this.actor.boleffects
formData.alchemyrecipe = this.actor.alchemyrecipe formData.alchemyrecipe = this.actor.alchemyrecipe
formData.horoscopes = this.actor.horoscopes
formData.vehicles = this.actor.vehicles formData.vehicles = this.actor.vehicles
formData.fightoptions = this.actor.fightoptions formData.fightoptions = this.actor.fightoptions
formData.ammos = this.actor.ammos formData.ammos = this.actor.ammos
@ -156,6 +157,8 @@ export class BoLActorSheet extends ActorSheet {
formData.notes = await TextEditor.enrichHTML(this.object.system.details.notes, {async: true}) formData.notes = await TextEditor.enrichHTML(this.object.system.details.notes, {async: true})
formData.isSorcerer = this.actor.isSorcerer() formData.isSorcerer = this.actor.isSorcerer()
formData.isAlchemist = this.actor.isAlchemist() formData.isAlchemist = this.actor.isAlchemist()
formData.isAstrologer = this.actor.isAstrologer()
formData.isMysteries = formData.isSorcerer || formData.isAlchemist || formData.isAstrologer
formData.isPriest = this.actor.isPriest() formData.isPriest = this.actor.isPriest()
formData.isGM = game.user.isGM formData.isGM = game.user.isGM
@ -244,6 +247,15 @@ export class BoLActorSheet extends ActorSheet {
case "careerxp": case "careerxp":
this.actor.incCareerXP( li.data("item-id")) this.actor.incCareerXP( li.data("item-id"))
break; break;
case "horoscope-minor":
BoLRoll.horoscopeCheck(this.actor, event, "minor")
break
case "horoscope-major":
BoLRoll.horoscopeCheck(this.actor, event, "major")
break
case "horoscope-major-group":
BoLRoll.horoscopeCheck(this.actor, event, "majorgroup")
break
default: break; default: break;
} }

View File

@ -25,7 +25,7 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
getCharType() { getCharType() {
if (this.type === 'character') { if (this.type === 'character') {
return 'player' return "player"
} }
return this.system.chartype return this.system.chartype
} }
@ -249,6 +249,9 @@ export class BoLActor extends Actor {
get boleffects() { get boleffects() {
return this.items.filter(i => i.type === "feature" && i.system.subtype === "boleffect") return this.items.filter(i => i.type === "feature" && i.system.subtype === "boleffect")
} }
get horoscopes() {
return this.items.filter(i => i.type === "feature" && i.system.subtype === "horoscope")
}
get boons() { get boons() {
return duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "boon") || []); return duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "boon") || []);
} }
@ -354,6 +357,11 @@ export class BoLActor extends Actor {
return true return true
return false return false
} }
isAstrologer() {
if (this.careers.find(item => item.system.properties.astrologer == true))
return true
return false
}
isPriest() { isPriest() {
if (this.careers.find(item => item.system.properties.priest == true)) if (this.careers.find(item => item.system.properties.priest == true))
return true return true
@ -425,6 +433,74 @@ export class BoLActor extends Actor {
} }
} }
/*-------------------------------------------- */
spentAstrologyPoints(points) {
let astrology = duplicate(this.system.resources.astrologypoints)
astrology.value -= points
astrology.value = Math.max(astrology.value,0)
this.update( { 'system.resources.astrologypoints': astrology} )
}
/*-------------------------------------------- */
getHoroscopesBonus() {
let astro = this.items.filter(it => it.type == "feature" && it.system.subtype == "horoscope" && !it.system.properties.ishoroscopemajor
&& it.system.properties.horoscopeanswer == "favorable")
return astro
}
/*-------------------------------------------- */
getHoroscopesMalus() {
let astro = this.items.filter(it => it.type == "feature" && it.system.subtype == "horoscope" && !it.system.properties.ishoroscopemajor
&& it.system.properties.horoscopeanswer == "unfavorable")
return astro
}
/*-------------------------------------------- */
manageHoroscope(rollData) {
//Spent points
this.spentAstrologyPoints(rollData.astrologyPointsCost)
if ( rollData.horoscopeType == "minor") {
let horoscope = { name: "SITUATION A SPECIFIER", type :"feature",
img: "icons/magic/perception/eye-ringed-glow-angry-large-red.webp",
system :{subtype: "horoscope", properties: {
ishoroscopemajor: false,
horoscopeanswer: (rollData.isSuccess) ? "favorable": "unfavorable",
rank: rollData.careerBonus
}
}
}
this.createEmbeddedDocuments('Item', [horoscope])
}
if ( rollData.horoscopeType == "major" ) {
if ( rollData.isSuccess) {
this.subHeroPoints(1)
} else {
this.addHeroPoints(1)
}
}
if ( rollData.horoscopeType == "majorgroup" ) {
let rID = randomID(16)
let horoscopes = duplicate(game.settings.get("bol", "horoscope-group"))
horoscopes[rID] = {
name: game.i18n.localize("BOL.ui.groupHoroscope") + this.name,
maxDice: rollData.careerBonus,
availableDice: rollData.careerBonus,
type: (rollData.isSuccess) ? "bonus": "malus"
}
}
}
/*-------------------------------------------- */
removeHoroscopeMinor( rollData) {
let toDel = []
for(let horo of rollData.selectedHoroscope) {
toDel.push( horo._id )
}
if (toDel.length > 0) {
this.deleteEmbeddedDocuments('Item', toDel)
}
}
/*-------------------------------------------- */ /*-------------------------------------------- */
async spendAlchemyPoint(alchemyId, pcCost) { async spendAlchemyPoint(alchemyId, pcCost) {
let alchemy = this.items.get(alchemyId) let alchemy = this.items.get(alchemyId)
@ -441,7 +517,14 @@ export class BoLActor extends Actor {
} }
} }
} }
/*-------------------------------------------- */
getAstrologerBonus() {
let astrologer = this.careers.find(item => item.system.properties.astrologer == true)
if (astrologer) {
return astrologer.system.rank
}
return 0;
}
/*-------------------------------------------- */ /*-------------------------------------------- */
getAlchemistBonus() { getAlchemistBonus() {
let sorcerer = this.careers.find(item => item.system.properties.alchemist == true) let sorcerer = this.careers.find(item => item.system.properties.alchemist == true)
@ -536,6 +619,11 @@ export class BoLActor extends Actor {
"label": "BOL.featureSubtypes.effects", "label": "BOL.featureSubtypes.effects",
"ranked": false, "ranked": false,
"items": this.boleffects "items": this.boleffects
},
"horoscopes": {
"label": "BOL.featureSubtypes.horoscope",
"ranked": false,
"items": this.horoscopes
} }
} }
} }
@ -707,6 +795,12 @@ export class BoLActor extends Actor {
newHeroP = (newHeroP < 0) ? 0 : newHeroP; newHeroP = (newHeroP < 0) ? 0 : newHeroP;
await this.update({ 'system.resources.hero.value': newHeroP }); await this.update({ 'system.resources.hero.value': newHeroP });
} }
/*-------------------------------------------- */
async addHeroPoints(nb) {
let newHeroP = this.system.resources.hero.value + nb;
newHeroP = (newHeroP < 0) ? 0 : newHeroP;
await this.update({ 'system.resources.hero.value': newHeroP });
}
/*-------------------------------------------- */ /*-------------------------------------------- */
async sufferDamage(damage) { async sufferDamage(damage) {

View File

@ -42,8 +42,13 @@ export class BoLRoll {
attrValue: attribute.value, attrValue: attribute.value,
aptValue: 0, aptValue: 0,
careerBonus: 0, careerBonus: 0,
horoscopeBonus: 0,
horoscopeMalus: 0,
selectedHoroscope: [],
armorAgiMalus: actor.getArmorAgiMalus(), armorAgiMalus: actor.getArmorAgiMalus(),
armorInitMalus: actor.getArmorInitMalus(), armorInitMalus: actor.getArmorInitMalus(),
horoscopeBonusList: actor.getHoroscopesBonus(),
horoscopeMalusList: actor.getHoroscopesMalus(),
adv: "0", adv: "0",
mod: 0, mod: 0,
modRanged: 0, modRanged: 0,
@ -194,8 +199,23 @@ export class BoLRoll {
rollData.label = alchemy.name rollData.label = alchemy.name
rollData.description = game.i18n.localize('BOL.ui.makeAlchemy') + "+" + alchemy.name rollData.description = game.i18n.localize('BOL.ui.makeAlchemy') + "+" + alchemy.name
console.log("ALCHEMY!", alchemyDef); console.log("ALCHEMY!", rollData);
return this.displayRollDialog(alchemyDef); return this.displayRollDialog(rollData);
}
/* -------------------------------------------- */
static horoscopeCheck(actor, event, horoscopeType) {
let rollData = this.getCommonRollData(actor, "horoscope", actor.system.attributes.mind)
rollData.careerBonus = actor.getAstrologerBonus()
rollData.horoscopeType = horoscopeType
rollData.horoscopeTypeLabel = "BOL.ui."+horoscopeType
rollData.astrologyPointsCost = (horoscopeType == "minor") ? 1 : 2
rollData.label = game.i18n.localize('BOL.ui.makeHoroscope')
rollData.description = game.i18n.localize('BOL.ui.makeHoroscope') + " " + game.i18n.localize(rollData.horoscopeTypeLabel)
console.log("HOROSCOPE!", rollData);
return this.displayRollDialog(rollData);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -254,6 +274,9 @@ export class BoLRoll {
effectModifier += Number(effect.system.properties.modifier) effectModifier += Number(effect.system.properties.modifier)
} }
} }
this.rollData.bmDice += this.rollData.horoscopeBonus
this.rollData.bmDice -= this.rollData.horoscopeMalus
// Keep track of the final effect modifier // Keep track of the final effect modifier
this.rollData.effectModifier = effectModifier this.rollData.effectModifier = effectModifier
@ -401,6 +424,23 @@ export class BoLRoll {
this.rollData.mDice = Number(event.currentTarget.value) this.rollData.mDice = Number(event.currentTarget.value)
this.updateTotalDice() this.updateTotalDice()
}) })
html.find('#horoscope-bonus-applied').change((event) => {
if (event.currentTarget.value != undefined) {
this.rollData.selectedHoroscope.push( duplicate(this.rollData.horoscopeBonusList[Number(event.currentTarget.value)]) )
}
let horoscopes = $('#horoscope-bonus-applied').val()
this.rollData.horoscopeBonus = (!horoscopes || horoscopes.length == 0) ? 0 : horoscopes.length
this.updateTotalDice()
})
html.find('#horoscope-malus-applied').change((event) => {
if (event.currentTarget.value != undefined) {
this.rollData.selectedHoroscope.push( duplicate(this.rollData.horoscopeMalusList[Number(event.currentTarget.value)]) )
}
let horoscopes = $('#horoscope-malus-applied').val()
this.rollData.horoscopeMalus = (!horoscopes || horoscopes.length == 0) ? 0 : horoscopes.length
this.updateTotalDice()
})
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -582,6 +622,12 @@ export class BoLDefaultRoll {
if (this.rollData.mode == "bougette" && this.rollData.isFailure) { if (this.rollData.mode == "bougette" && this.rollData.isFailure) {
actor.decBougette() actor.decBougette()
} }
if (this.rollData.mode == "horoscope") { // PP cost management
actor.manageHoroscope(this.rollData)
}
if (this.rollData.selectedHoroscope.length > 0) { // PP cost management
actor.removeHoroscopeMinor(this.rollData)
}
await this.sendChatMessage() await this.sendChatMessage()
} }

View File

@ -53,6 +53,13 @@ export class BoLUtility {
type: String, type: String,
onChange: lang => window.location.reload() onChange: lang => window.location.reload()
}) })
game.settings.register("bol", "horoscope-group", {
name: "horoscope-group",
scope: "world",
config: false,
default: {},
type: Object
})
this.rollArmor = game.settings.get("bol", "rollArmor") // Roll armor or not this.rollArmor = game.settings.get("bol", "rollArmor") // Roll armor or not
this.useBougette = game.settings.get("bol", "useBougette") // Use optionnal bougette rules this.useBougette = game.settings.get("bol", "useBougette") // Use optionnal bougette rules

View File

@ -270,6 +270,7 @@ BOL.featureSubtypes = {
"godsfaith" : "BOL.featureSubtypes.gods", "godsfaith" : "BOL.featureSubtypes.gods",
"fightoption" : "BOL.featureSubtypes.fightOption", "fightoption" : "BOL.featureSubtypes.fightOption",
"boleffect": "BOL.featureSubtypes.effect", "boleffect": "BOL.featureSubtypes.effect",
"horoscope": "BOL.featureSubtypes.horoscope",
} }
BOL.fightOptionTypes = { BOL.fightOptionTypes = {
@ -326,6 +327,11 @@ BOL.creatureSize = {
"colossal": "BOL.size.colossal" "colossal": "BOL.size.colossal"
} }
BOL.horoscopeAnswer = {
"favorable": "BOL.ui.horoscopefavorable",
"unfavorable": "BOL.ui.horoscopeunfavorable",
}
BOL.bolEffectModifier = { BOL.bolEffectModifier = {
"-8": "-8", "-8": "-8",
"-6": "-6", "-6": "-6",

View File

@ -41,11 +41,14 @@ export const preloadHandlebarsTemplates = async function () {
"systems/bol/templates/item/parts/properties/feature/race-properties.hbs", "systems/bol/templates/item/parts/properties/feature/race-properties.hbs",
"systems/bol/templates/item/parts/properties/feature/fightoption-properties.hbs", "systems/bol/templates/item/parts/properties/feature/fightoption-properties.hbs",
"systems/bol/templates/item/parts/properties/item/weapon-vehicle-properties.hbs", "systems/bol/templates/item/parts/properties/item/weapon-vehicle-properties.hbs",
"systems/bol/templates/item/parts/properties/feature/horoscope-properties.hbs",
// DIALOGS // DIALOGS
"systems/bol/templates/chat/rolls/attack-damage-card.hbs", "systems/bol/templates/chat/rolls/attack-damage-card.hbs",
"systems/bol/templates/chat/rolls/spell-roll-card.hbs", "systems/bol/templates/chat/rolls/spell-roll-card.hbs",
"systems/bol/templates/chat/rolls/alchemy-roll-card.hbs", "systems/bol/templates/chat/rolls/alchemy-roll-card.hbs",
"systems/bol/templates/chat/rolls/selected-horoscope-roll-card.hbs",
"systems/bol/templates/chat/rolls/horoscope-roll-card.hbs",
"systems/bol/templates/dialogs/aptitude-roll-part.hbs", "systems/bol/templates/dialogs/aptitude-roll-part.hbs",
"systems/bol/templates/dialogs/attribute-roll-part.hbs", "systems/bol/templates/dialogs/attribute-roll-part.hbs",
"systems/bol/templates/dialogs/mod-roll-part.hbs", "systems/bol/templates/dialogs/mod-roll-part.hbs",
@ -56,6 +59,7 @@ export const preloadHandlebarsTemplates = async function () {
"systems/bol/templates/dialogs/flaws-roll-part.hbs", "systems/bol/templates/dialogs/flaws-roll-part.hbs",
"systems/bol/templates/dialogs/total-roll-part.hbs", "systems/bol/templates/dialogs/total-roll-part.hbs",
"systems/bol/templates/dialogs/fightoptions-roll-part.hbs", "systems/bol/templates/dialogs/fightoptions-roll-part.hbs",
"systems/bol/templates/dialogs/horoscope-roll-part.hbs"
]; ];
// Load the template parts // Load the template parts

File diff suppressed because one or more lines are too long

View File

@ -14,7 +14,7 @@
], ],
"url": "https://www.uberwald.me/gitea/public/bol", "url": "https://www.uberwald.me/gitea/public/bol",
"license": "LICENSE.txt", "license": "LICENSE.txt",
"version": "10.4.13", "version": "10.4.15",
"compatibility": { "compatibility": {
"minimum": "10", "minimum": "10",
"verified": "10", "verified": "10",
@ -203,7 +203,7 @@
], ],
"socket": true, "socket": true,
"manifest": "https://www.uberwald.me/gitea/public/bol/raw/v10/system.json", "manifest": "https://www.uberwald.me/gitea/public/bol/raw/v10/system.json",
"download": "https://www.uberwald.me/gitea/public/bol/archive/bol-v10.4.13.zip", "download": "https://www.uberwald.me/gitea/public/bol/archive/bol-v10.4.15.zip",
"background": "systems/bol/ui/page_accueil.webp", "background": "systems/bol/ui/page_accueil.webp",
"gridDistance": 1.5, "gridDistance": 1.5,
"gridUnits": "m", "gridUnits": "m",

View File

@ -102,6 +102,7 @@
"hp": { "hp": {
"key": "hp", "key": "hp",
"label": "BOL.resources.hp", "label": "BOL.resources.hp",
"ismain": true,
"base": 1, "base": 1,
"value": 1, "value": 1,
"bonus": 0, "bonus": 0,
@ -110,18 +111,21 @@
"hero": { "hero": {
"key": "hero", "key": "hero",
"label": "BOL.resources.hero", "label": "BOL.resources.hero",
"ismain": true,
"value": 5, "value": 5,
"max": 5 "max": 5
}, },
"faith": { "faith": {
"key": "faith", "key": "faith",
"label": "BOL.resources.faith", "label": "BOL.resources.faith",
"ismain": true,
"value": 0, "value": 0,
"max": 0 "max": 0
}, },
"power": { "power": {
"key": "power", "key": "power",
"label": "BOL.resources.power", "label": "BOL.resources.power",
"ismain": true,
"value": 0, "value": 0,
"bonus": 0, "bonus": 0,
"max": 0 "max": 0
@ -129,6 +133,15 @@
"alchemypoints": { "alchemypoints": {
"key": "alchemypoints", "key": "alchemypoints",
"label": "BOL.resources.alchemypoints", "label": "BOL.resources.alchemypoints",
"ismain": false,
"value": 0,
"bonus": 0,
"max": 0
},
"astrologypoints": {
"key": "astrologypoints",
"label": "BOL.resources.astrologypoints",
"ismain": false,
"value": 0, "value": 0,
"bonus": 0, "bonus": 0,
"max": 0 "max": 0

View File

@ -37,7 +37,7 @@
<a class="item" data-tab="actions">{{localize "BOL.ui.tab.actions"}}</a> <a class="item" data-tab="actions">{{localize "BOL.ui.tab.actions"}}</a>
<a class="item" data-tab="features">{{localize "BOL.ui.tab.features"}}</a> <a class="item" data-tab="features">{{localize "BOL.ui.tab.features"}}</a>
<a class="item" data-tab="equipment">{{localize "BOL.ui.tab.equipment"}}</a> <a class="item" data-tab="equipment">{{localize "BOL.ui.tab.equipment"}}</a>
{{#if (or isSorcerer isAlchemist)}} {{#if isMysteries}}
<a class="item" data-tab="spellalchemy">{{localize "BOL.ui.tab.spellalchemy"}}</a> <a class="item" data-tab="spellalchemy">{{localize "BOL.ui.tab.spellalchemy"}}</a>
{{/if}} {{/if}}
{{/if}} {{/if}}
@ -66,7 +66,7 @@
{{> "systems/bol/templates/actor/parts/tabs/actor-features.hbs"}} {{> "systems/bol/templates/actor/parts/tabs/actor-features.hbs"}}
</div> </div>
{{#if (or isSorcerer isAlchemist)}} {{#if isMysteries}}
<div class="tab features" data-group="primary" data-tab="spellalchemy"> <div class="tab features" data-group="primary" data-tab="spellalchemy">
{{> "systems/bol/templates/actor/parts/tabs/actor-spellalchemy.hbs"}} {{> "systems/bol/templates/actor/parts/tabs/actor-spellalchemy.hbs"}}
</div> </div>

View File

@ -21,6 +21,7 @@
</div> </div>
<div class="item-field flex1 right"> <div class="item-field flex1 right">
<a class="item-control item-edit" title="{{localize "BOL.ui.edit"}}"><i class="fas fa-square"></i></a> <a class="item-control item-edit" title="{{localize "BOL.ui.edit"}}"><i class="fas fa-square"></i></a>
&nbsp;
<a class="item-control item-delete" title="{{localize "BOL.ui.delete"}}"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" title="{{localize "BOL.ui.delete"}}"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
@ -57,6 +58,71 @@
</div> </div>
<div class="item-field flex1 right"> <div class="item-field flex1 right">
<a class="item-control item-edit" title="{{localize "BOL.ui.edit"}}"><i class="fas fa-square"></i></a> <a class="item-control item-edit" title="{{localize "BOL.ui.edit"}}"><i class="fas fa-square"></i></a>
&nbsp;
<a class="item-control item-delete" title="{{localize "BOL.ui.delete"}}"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ol>
{{/if}}
<!--ASTROLOGIE-->
{{#if isAstrologer}}
<ol class="items-list">
<li class="item flexrow item-header">
<div class="item-name flex4 left">{{localize "BOL.ui.astrologerPoints"}}</div>
<div class="item-name flex4 left">&nbsp;</div>
</li>
<li class="item flexrow" data-item-id="{{item._id}}">
<h4 class="item-name flex4 left">
<div class="item-image"><img src="icons/magic/perception/hand-eye-fire-blue.webp" /></div>
{{localize "BOL.ui.astrologerPointsLabel"}}
</h4>
<input class="field-value" type="text" name="system.resources.astrologypoints.value" value="{{resources.astrologypoints.value}}" data-dtype="Number"/>
</li>
<li class="item flexrow" data-item-id="{{item._id}}">
<h4 class="item-name flex4 left">
<div class="item-image"><img src="icons/magic/perception/eye-ringed-glow-angry-large-teal.webp" /></div>
<a class="rollable" data-roll-type="horoscope-minor">{{localize "BOL.ui.astrologyMinor"}} <i class="darkgreen fas fa-dice"></i></a>
</h4>
<h4 class="item-name flex4 left">
<div class="item-image"><img src="icons/magic/perception/eye-ringed-glow-angry-large-red.webp" /></div>
<a class="rollable" data-roll-type="horoscope-major">{{localize "BOL.ui.astrologyMajor"}} <i class="darkgreen fas fa-dice"></i></a>
</h4>
</li>
<li class="item flexrow" data-item-id="{{item._id}}">
<h4 class="item-name flex4 left">
<div class="item-image"><img src="icons/magic/perception/eye-ringed-glow-angry-large-red.webp" /></div>
<a class="rollable" data-roll-type="horoscope-major-group">{{localize "BOL.ui.astrologyMajorGroup"}} <i class="darkgreen fas fa-dice"></i></a>
</h4>
</li>
</ol>
<ol class="items-list">
<li class="item flexrow item-header">
<div class="item-name flex4 left">{{localize "BOL.ui.astrology"}}</div>
<div class="item-field flex2 center">{{localize "BOL.ui.type"}}</div>
<div class="item-field flex2 center">{{localize "BOL.ui.answer"}}</div>
<div class="item-field flex1 right"></div>
</li>
{{#each horoscopes as |item id|}}
<li class="item flexrow" data-item-id="{{item._id}}">
<h4 class="item-name flex4 left">
<div class="item-image"><img src="{{item.img}}" title="{{item.name}}"/></div>{{item.name}}
</h4>
<div class="item-field flex2 center">
{{#if item.system.properties.ishoroscopemajor}}
<span class="item-field">Majeur (de groupe)</span>
{{else}}
<span class="item-field">Mineur</span>
{{/if}}
</div>
<div class="item-field flex2 center">
<span class="item-field">{{localize (concat 'BOL.ui.horoscope' item.system.properties.horoscopeanswer)}}</span>
</div>
<div class="item-field flex1 right">
<a class="item-control item-edit" title="{{localize "BOL.ui.edit"}}"><i class="fas fa-square"></i></a>
&nbsp;
<a class="item-control item-delete" title="{{localize "BOL.ui.delete"}}"><i class="fas fa-trash"></i></a> <a class="item-control item-delete" title="{{localize "BOL.ui.delete"}}"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>

View File

@ -46,26 +46,11 @@
<hr/> <hr/>
<div class="resources flexrow"> <div class="resources flexrow">
{{#each resources as |resource id|}} {{#each resources as |resource id|}}
{{#if (eq resource.key "alchemypoints")}} {{#if resource.ismain}}
{{#if @root.isAlchemist}}
<div class="resource stat flex1 flex-group-center"> <div class="resource stat flex1 flex-group-center">
<label class="stat-label">{{localize label}}</label><br/> <label class="stat-label">{{localize label}}</label><br/>
<input class="stat-value resources-value" type="text" name="system.resources.{{key}}.value" value="{{numberFormat value decimals=0 sign=false}}" data-dtype="Number"/> <input class="stat-value resources-value" type="text" name="system.resources.{{key}}.value" value="{{numberFormat value decimals=0 sign=false}}" data-dtype="Number"/>
{{#if (eq @root.chartype 'player')}} {{#if (eq @root.charType 'player')}}
{{#if (exists bonus)}}
<span class="flexrow"><label class="stat-max bonus-text">Bonus</label><input class="resource-bonus resources-value" type="text" name="system.resources.{{key}}.bonus" value="{{numberFormat bonus decimals=0 sign=false}}" data-dtype="Number"/></span>
{{else}}
<span class="flexrow"><label class="stat-max resources-value">&nbsp;</label><input class="resource-bonus resources-novalue" type="text" value="" disabled></span>
{{/if}}
{{/if}}
<input class="resources-value" type="text" name="system.resources.{{key}}.max" value="{{numberFormat max decimals=0 sign=false}}" data-dtype="Number"/>
</div>
{{/if}}
{{else}}
<div class="resource stat flex1 flex-group-center">
<label class="stat-label">{{localize label}}</label><br/>
<input class="stat-value resources-value" type="text" name="system.resources.{{key}}.value" value="{{numberFormat value decimals=0 sign=false}}" data-dtype="Number"/>
{{#if (eq @root.chartype 'player')}}
{{#if (exists bonus)}} {{#if (exists bonus)}}
<span class="flexrow"><label class="stat-max bonus-text">Bonus</label><input class="resource-bonus resources-value" type="text" name="system.resources.{{key}}.bonus" value="{{numberFormat bonus decimals=0 sign=false}}" data-dtype="Number"/></span> <span class="flexrow"><label class="stat-max bonus-text">Bonus</label><input class="resource-bonus resources-value" type="text" name="system.resources.{{key}}.bonus" value="{{numberFormat bonus decimals=0 sign=false}}" data-dtype="Number"/></span>
{{else}} {{else}}

View File

@ -70,6 +70,13 @@
{{#if alchemy}} {{#if alchemy}}
{{> "systems/bol/templates/chat/rolls/alchemy-roll-card.hbs"}} {{> "systems/bol/templates/chat/rolls/alchemy-roll-card.hbs"}}
{{/if}} {{/if}}
{{#if (eq mode "horoscope")}}
{{> "systems/bol/templates/chat/rolls/horoscope-roll-card.hbs"}}
{{/if}}
{{#if (count selectedHoroscope)}}
{{> "systems/bol/templates/chat/rolls/selected-horoscope-roll-card.hbs"}}
{{/if}}
{{#if reroll}} {{#if reroll}}
<button class="chat-button button hero-reroll bol-margin-tb-2" data-roll-id=="{{rollId}}" data-actor-id="{{actor.id}}">{{localize "BOL.chat.reroll"}}</button> <button class="chat-button button hero-reroll bol-margin-tb-2" data-roll-id=="{{rollId}}" data-actor-id="{{actor.id}}">{{localize "BOL.chat.reroll"}}</button>

View File

@ -0,0 +1,26 @@
<h4><strong>{{localize "BOL.chat.horoscope"}} {{localize horoscopeTypeLabel}}</strong></h4>
<h4><strong>{{localize "BOL.chat.horoscopepoints" points=astrologyPointsCost}}</strong></h4>
{{#if (eq horoscopeType "minor")}}
{{#if isSuccess}}
{{localize "BOL.chat.horoscopeminorsuccess"}}
{{else}}
{{localize "BOL.chat.horoscopeminorfailure"}}
{{/if}}
{{/if}}
{{#if (eq horoscopeType "major")}}
{{#if isSuccess}}
{{localize "BOL.chat.horoscopemajorsuccess"}}
{{else}}
{{localize "BOL.chat.horoscopemajorfailure"}}
{{/if}}
{{/if}}
{{#if (eq horoscopeType "majorgroup")}}
{{#if isSuccess}}
{{localize "BOL.chat.horoscopemajorgroupsuccess" careerBonus=careerBonus}}
{{else}}
{{localize "BOL.chat.horoscopemajorgroupfailure" careerBonus=careerBonus}}
{{/if}}
{{/if}}

View File

@ -0,0 +1,8 @@
<div>
{{#each selectedHoroscope as |horo id|}}
{{localize "BOL.chat.usedhoroscope"}} : {{horo.name}}
{{/each}}
</div>
<div>{{localize "BOL.chat.horoscopedeleted"}}</div>

View File

@ -34,6 +34,8 @@
{{> "systems/bol/templates/dialogs/effect-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/effect-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/horoscope-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/adv-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/adv-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/mod-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/mod-roll-part.hbs"}}

View File

@ -16,6 +16,8 @@
{{> "systems/bol/templates/dialogs/flaws-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/flaws-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/horoscope-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/effect-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/effect-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/adv-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/adv-roll-part.hbs"}}

View File

@ -0,0 +1,39 @@
<form class="{{cssClass}}" autocomplete="off">
{{!-- Sheet Header --}}
<header class="sheet-header">
<div class="row flexrow table-header">
<div class="flex1 center">
<h3>{{localize 'BOL.ui.makeHoroscope'}} {{localize horoscopeTypeLabel}}</h3>
</div>
</div>
</header>
{{> "systems/bol/templates/dialogs/attribute-roll-part.hbs"}}
<div class="flexrow" style="margin-bottom: 1px;">
<div class="flex1 center bg-darkred">
<label for="mod">{{localize 'BOL.ui.astrologerRank'}}</label>
</div>
<div class="flex1 center cell">{{careerBonus}}</div>
</div>
<div class="flexrow" style="margin-bottom: 1px;">
<div class="flex1 center bg-darkred">
<label for="mod">{{localize 'BOL.ui.horoscopeCost'}}</label>
</div>
<div class="flex1 center cell" id="astrologyPointsCost">{{astrologyPointsCost}}</div>
</div>
{{> "systems/bol/templates/dialogs/boons-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/flaws-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/effect-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/adv-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/mod-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/total-roll-part.hbs"}}
</form>

View File

@ -0,0 +1,49 @@
{{#if (count horoscopeBonusList)}}
<div class='flexrow roll-box'>
<div class='flex1 center bg-darkred'>
<label for='mod'>
{{localize 'BOL.ui.horoscopesBonus'}}
</label>
</div>
<div class='flex1 center cell'>
<select
class='flex1'
name='horoscope-bonus-applied'
id='horoscope-bonus-applied'
data-type='String'
multiple
>
{{#each horoscopeBonusList as |horoscope id|}}
<option value="{{id}}">
{{horoscope.name}}
</option>
{{/each}}
</select>
</div>
</div>
{{/if}}
{{#if (count horoscopeMalusList)}}
<div class='flexrow roll-box'>
<div class='flex1 center bg-darkred'>
<label for='mod'>
{{localize 'BOL.ui.horoscopesMalus'}}
</label>
</div>
<div class='flex1 center cell'>
<select
class='flex1'
name='horoscope-malus-applied'
id='horoscope-malus-applied'
data-type='String'
multiple
>
{{#each horoscopeMalusList as |horoscope id|}}
<option value="{{id}}">
{{horoscope.name}}
</option>
{{/each}}
</select>
</div>
</div>
{{/if}}

View File

@ -27,3 +27,6 @@
{{#if (equals item.system.subtype "boleffect")}} {{#if (equals item.system.subtype "boleffect")}}
{{> "systems/bol/templates/item/parts/properties/feature/effect-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/feature/effect-properties.hbs"}}
{{/if}} {{/if}}
{{#if (equals item.system.subtype "horoscope")}}
{{> "systems/bol/templates/item/parts/properties/feature/horoscope-properties.hbs"}}
{{/if}}

View File

@ -15,3 +15,7 @@
<label class="property-label">{{localize "BOL.ui.isPriest"}}</label> <label class="property-label">{{localize "BOL.ui.isPriest"}}</label>
<input class="field-value" type="checkbox" name="system.properties.priest" {{checked item.system.properties.priest}}> <input class="field-value" type="checkbox" name="system.properties.priest" {{checked item.system.properties.priest}}>
</div> </div>
<div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.isAstrologer"}}</label>
<input class="field-value" type="checkbox" name="system.properties.astrologer" {{checked item.system.properties.astrologer}}>
</div>

View File

@ -0,0 +1,17 @@
<h3 class="form-header">{{localize 'BOL.featureSubtypes.horoscope'}}</h3>
<div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.answer"}}</label>
<select name="system.properties.horoscopeanswer" data-dtype="String">
{{#select item.system.properties.horoscopeanswer}}
{{#each config.horoscopeAnswer as |item id|}}
<option value="{{id}}">{{localize item}}</option>
{{/each}}
{{/select}}
</select>
</div>
<div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.rank"}}</label>
<input class="field-value" type="text" name="system.properties.rank" value={{item.system.properties.rank}} data-type="Number">
</div>