Compare commits

..

9 Commits

13 changed files with 275 additions and 5089 deletions

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 372 KiB

View File

@ -182,7 +182,9 @@
"BOL.ui.armornoformula": "L'armure {protect.name} n'a pas de formule pour la protection !", "BOL.ui.armornoformula": "L'armure {protect.name} n'a pas de formule pour la protection !",
"BOL.ui.selectactor": "Selectionnez votre personnage pour utiliser la macro", "BOL.ui.selectactor": "Selectionnez votre personnage pour utiliser la macro",
"BOL.ui.itemnotfound": "Impossible de trouver l'objet de cette macro", "BOL.ui.itemnotfound": "Impossible de trouver l'objet de cette macro",
"BOL.ui.noinit": "Pas d'initiative trouvée, veuillez en enregistrer une.",
"BOL.ui.warninitiative": "Votre initiative n'est pas disponible. Effectuez un jet d'Initiative pour ce combat.",
"BOL.featureCategory.origins": "Origines", "BOL.featureCategory.origins": "Origines",
"BOL.featureCategory.races": "Races", "BOL.featureCategory.races": "Races",
"BOL.featureCategory.careers": "Carrières", "BOL.featureCategory.careers": "Carrières",
@ -477,6 +479,7 @@
"BOL.chat.rollbougette": "Jet de Bougette", "BOL.chat.rollbougette": "Jet de Bougette",
"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.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

@ -141,13 +141,14 @@ export class BoLActorSheet extends ActorSheet {
formData.ammos = this.actor.ammos formData.ammos = this.actor.ammos
formData.misc = this.actor.misc formData.misc = this.actor.misc
formData.combat = this.actor.buildCombat() formData.combat = this.actor.buildCombat()
formData.initiativeRank = this.actor.getInitiativeRank()
//formData.combatCreature = this.actor.buildCombatCreature() //formData.combatCreature = this.actor.buildCombatCreature()
formData.features = this.actor.buildFeatures() formData.features = this.actor.buildFeatures()
formData.isGM = game.user.isGM formData.isGM = game.user.isGM
formData.options = this.options formData.options = this.options
formData.owner = this.document.isOwner formData.owner = this.document.isOwner
formData.editScore = this.options.editScore formData.editScore = this.options.editScore
formData.useBougette = BoLUtility.getUseBougette() formData.useBougette = (this.actor.type == "character" && BoLUtility.getUseBougette()) || false
formData.bougette = this.actor.getBougette() formData.bougette = this.actor.getBougette()
formData.charType = this.actor.getCharType() formData.charType = this.actor.getCharType()
formData.villainy = this.actor.getVillainy() formData.villainy = this.actor.getVillainy()

View File

@ -40,26 +40,35 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
getBougette() { getBougette() {
let b = duplicate(this.system.bougette) if ( this.type == "character") {
b.label = game.i18n.localize( game.bol.config.bougetteState[String(this.system.bougette.value)] ) let b = duplicate(this.system.bougette)
b.diceImg = "icons/dice/" + game.bol.config.bougetteDice[String(this.system.bougette.value)] + "black.svg" b.label = game.i18n.localize( game.bol.config.bougetteState[String(this.system.bougette.value)] )
return b b.diceImg = "icons/dice/" + game.bol.config.bougetteDice[String(this.system.bougette.value)] + "black.svg"
return b
}
return undefined
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async rollBougette() { async rollBougette() {
//ui.notifications.info("Roll bougette done !") if ( this.type == "character") {
let attribute = duplicate(this.system.attributes.vigor) let attribute = duplicate(this.system.attributes.vigor)
let rollData = BoLRoll.getCommonRollData(this, "bougette", attribute, undefined ) let rollData = BoLRoll.getCommonRollData(this, "bougette", attribute, undefined )
rollData.formula = game.bol.config.bougetteDice[String(this.system.bougette.value)] rollData.formula = game.bol.config.bougetteDice[String(this.system.bougette.value)]
let r = new BoLDefaultRoll(rollData) let r = new BoLDefaultRoll(rollData)
r.roll() r.roll()
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
decBougette() { decBougette() {
let bougette = duplicate(this.system.bougette) if ( this.type == "character") {
bougette.value = Math.max( Number(bougette.value) - 1, 0) let bougette = duplicate(this.system.bougette)
this.update( { 'system.bougette': bougette } ) bougette.value = Math.max( Number(bougette.value) - 1, 0)
this.update( { 'system.bougette': bougette } )
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
updateResourcesData() { updateResourcesData() {
if (this.type == 'character') { if (this.type == 'character') {
@ -618,26 +627,80 @@ export class BoLActor extends Actor {
let lastHP = await this.getFlag("world", hpID) let lastHP = await this.getFlag("world", hpID)
if (lastHP != this.system.resources.hp.value && game.user.isGM) { // Only GM sends this if (lastHP != this.system.resources.hp.value && game.user.isGM) { // Only GM sends this
await this.setFlag("world", hpID, this.system.resources.hp.value) await this.setFlag("world", hpID, this.system.resources.hp.value)
let prone = this.effects.find( ef => ef.label == "EFFECT.StatusProne")
let dead = this.effects.find( ef => ef.label == "EFFECT.StatusDead")
if (this.system.resources.hp.value <= 0) { if (this.system.resources.hp.value <= 0) {
if ( !prone) {
await this.createEmbeddedDocuments("ActiveEffect", [
{label: 'EFFECT.StatusProne', icon: 'icons/svg/falling.svg', flags: { core: { statusId: 'prone' } } }
])
}
if ( this.system.resources.hp.value < -5 && !dead) {
await this.createEmbeddedDocuments("ActiveEffect", [
{label: 'EFFECT.StatusDead', icon: 'icons/svg/skull.svg', flags: { core: { statusId: 'dead' } } }
])
}
ChatMessage.create({ ChatMessage.create({
alias: this.name, alias: this.name,
whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name), whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name),
content: await renderTemplate('systems/bol/templates/chat/chat-vitality-zero.hbs', { name: this.name, img: this.img, hp: this.system.resources.hp.value }) content: await renderTemplate('systems/bol/templates/chat/chat-vitality-zero.hbs', { name: this.name, img: this.img, hp: this.system.resources.hp.value })
}) })
} else {
if ( prone ) {
await this.deleteEmbeddedDocuments("ActiveEffect", [ prone.id ] )
}
if ( dead ) {
await this.deleteEmbeddedDocuments("ActiveEffect", [ dead.id ] )
}
} }
} }
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
registerInit(initScore, isCritical, isFumble) { async registerInit(rollData) {
this.update({ 'system.combat.lastinit': initScore, 'system.combat.iscritical': isCritical, 'system.combat.isfumble': isFumble }) rollData.actor = undefined // Cleanup if present
await this.setFlag("world", "last-initiative", rollData)
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
getLastInitData() { clearInitiative() {
return this.system.combat this.unsetFlag("world", "last-initiative" )
} }
/*-------------------------------------------- */
getInitiativeRank(rollData = undefined, isCombat = false) {
if (!rollData) {
rollData = this.getFlag("world", "last-initiative")
}
let fvttInit = 4 // Pietaille par defaut
if (this.type == 'character' ) {
fvttInit = 5
if (!rollData) {
fvttInit = -1
if ( isCombat ) {
ui.notifications.warn(game.i18n.localize("BOL.ui.warninitiative"))
}
} else {
if (rollData.isLegendary) {
fvttInit = 10
} else if (rollData.isCritical) {
fvttInit = 9
} else if (rollData.isSuccess ) {
fvttInit = 8
} else if (rollData.isFumble) {
fvttInit = 3
}
}
}
if ( this.getCharType() == 'adversary') {
fvttInit = 7
}
if ( this.getCharType() == 'tough') {
fvttInit = 6
}
return fvttInit
}
/*-------------------------------------------- */ /*-------------------------------------------- */
async subHeroPoints(nb) { async subHeroPoints(nb) {
let newHeroP = this.system.resources.hero.value - nb; let newHeroP = this.system.resources.hero.value - nb;

View File

@ -41,7 +41,7 @@ Hooks.once('init', async function () {
*/ */
CONFIG.Combat.initiative = { CONFIG.Combat.initiative = {
formula: "2d6+@attributes.mind.value+@aptitudes.init.value", formula: "2d6+@attributes.mind.value+@aptitudes.init.value",
decimals: 3 decimals: 2
}; };
// Define custom Entity classes // Define custom Entity classes
@ -120,7 +120,7 @@ function welcomeMessage() {
Hooks.once('ready', async function () { Hooks.once('ready', async function () {
BoLUtility.ready() BoLUtility.ready()
BoLCharacterSummary.ready() BoLCharacterSummary.ready()
registerUsageCount('bol') registerUsageCount('bol')

View File

@ -36,6 +36,7 @@ export class BoLRoll {
let rollData = { let rollData = {
mode: mode, mode: mode,
actorId: actor.id, actorId: actor.id,
tokenId: actor.token?.id,
img: actor.img, img: actor.img,
attribute: attribute, attribute: attribute,
attrValue: attribute.value, attrValue: attribute.value,
@ -352,7 +353,7 @@ export class BoLRoll {
html.find('#attr').change((event) => { html.find('#attr').change((event) => {
let attrKey = event.currentTarget.value let attrKey = event.currentTarget.value
let actor = game.actors.get( this.rollData.actorId) let actor = BoLUtility.getActorFromRollData(this.rollData)
this.rollData.attribute = duplicate(actor.system.attributes[attrKey]) this.rollData.attribute = duplicate(actor.system.attributes[attrKey])
this.rollData.attrValue = actor.system.attributes[attrKey].value this.rollData.attrValue = actor.system.attributes[attrKey].value
this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData) this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
@ -360,7 +361,7 @@ export class BoLRoll {
}) })
html.find('#apt').change((event) => { html.find('#apt').change((event) => {
let aptKey = event.currentTarget.value let aptKey = event.currentTarget.value
let actor = game.actors.get( this.rollData.actorId) let actor = BoLUtility.getActorFromRollData(this.rollData)
this.rollData.aptitude = duplicate(actor.system.aptitudes[aptKey]) this.rollData.aptitude = duplicate(actor.system.aptitudes[aptKey])
this.rollData.aptValue = actor.system.aptitudes[aptKey].value this.rollData.aptValue = actor.system.aptitudes[aptKey].value
this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData) this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
@ -432,7 +433,7 @@ export class BoLRoll {
// initialize default flags/values // initialize default flags/values
const rollOptionTpl = `systems/bol/templates/dialogs/${rollData.mode}-roll-dialog.hbs` const rollOptionTpl = `systems/bol/templates/dialogs/${rollData.mode}-roll-dialog.hbs`
let actor = game.actors.get( rollData.actorId ) let actor = BoLUtility.getActorFromRollData(rollData)
let defender let defender
if ( rollData.targetId) { if ( rollData.targetId) {
let token = game.scenes.current.tokens.get(rollData.targetId) let token = game.scenes.current.tokens.get(rollData.targetId)
@ -547,7 +548,7 @@ export class BoLDefaultRoll {
async roll() { async roll() {
const r = new Roll(this.rollData.formula) const r = new Roll(this.rollData.formula)
// console.log("Roll formula", this.rollData.formula) //console.log("Roll formula", this.rollData.formula)
await r.roll({ "async": false }) await r.roll({ "async": false })
const activeDice = r.terms[0].results.filter(r => r.active) const activeDice = r.terms[0].results.filter(r => r.active)
const diceTotal = activeDice.map(r => r.result).reduce((a, b) => a + b) const diceTotal = activeDice.map(r => r.result).reduce((a, b) => a + b)
@ -562,14 +563,15 @@ export class BoLDefaultRoll {
//this.rollData.isRealCritical = true //this.rollData.isRealCritical = true
//this.rollData.isFumble = true //this.rollData.isFumble = true
let actor = game.actors.get( this.rollData.actorId) let actor = BoLUtility.getActorFromRollData(this.rollData)
if (this.rollData.reroll == undefined) { if (this.rollData.reroll == undefined) {
this.rollData.reroll = actor.heroReroll() this.rollData.reroll = actor.heroReroll()
} }
if (this.rollData.registerInit) { if (this.rollData.registerInit) {
actor.registerInit(r.total, this.rollData.isCritical, this.rollData.isFumble) actor.registerInit(this.rollData)
this.rollData.initiativeRank = actor.getInitiativeRank(this.rollData)
} }
if (this.rollData.isSuccess && this.rollData.mode == "spell") { // PP cost management if (this.rollData.isSuccess && this.rollData.mode == "spell") { // PP cost management
this.rollData.remainingPP = actor.spendPowerPoint(this.rollData.ppCost + this.rollData.ppCostArmor) this.rollData.remainingPP = actor.spendPowerPoint(this.rollData.ppCost + this.rollData.ppCostArmor)
@ -586,7 +588,7 @@ export class BoLDefaultRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
async sendChatMessage() { async sendChatMessage() {
let actor = game.actors.get( this.rollData.actorId) let actor = BoLUtility.getActorFromRollData(this.rollData)
this._buildChatMessage(this.rollData).then( async msgFlavor => { this._buildChatMessage(this.rollData).then( async msgFlavor => {
let msg = await this.rollData.roll.toMessage({ let msg = await this.rollData.roll.toMessage({
user: game.user.id, user: game.user.id,
@ -633,7 +635,7 @@ export class BoLDefaultRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
async sendDamageMessage() { async sendDamageMessage() {
let actor = game.actors.get( this.rollData.actorId) let actor = BoLUtility.getActorFromRollData(this.rollData)
this._buildDamageChatMessage(this.rollData).then(async msgFlavor => { this._buildDamageChatMessage(this.rollData).then(async msgFlavor => {
let msg = await this.rollData.damageRoll.toMessage({ let msg = await this.rollData.damageRoll.toMessage({
user: game.user.id, user: game.user.id,
@ -648,7 +650,7 @@ export class BoLDefaultRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
getDamageAttributeValue(attrDamage, actorId = undefined) { getDamageAttributeValue(attrDamage, actorId = undefined) {
let actor = game.actors.get( (actorId) ? actorId: this.rollData.actorId) let actor = BoLUtility.getActorFromRollData(this.rollData)
return actor.getDamageAttributeValue( attrDamage ) return actor.getDamageAttributeValue( attrDamage )
} }

View File

@ -10,6 +10,8 @@ Init order =
3 - Echec critique 3 - Echec critique
*/ */
import { BoLUtility } from "../system/bol-utility.js";
export class BoLCombatManager extends Combat { export class BoLCombatManager extends Combat {
@ -18,35 +20,12 @@ export class BoLCombatManager extends Combat {
console.log(`${game.system.title} | Combat.rollInitiative()`, ids, formula, messageOptions); console.log(`${game.system.title} | Combat.rollInitiative()`, ids, formula, messageOptions);
// Structure input data // Structure input data
ids = typeof ids === "string" ? [ids] : ids; ids = typeof ids === "string" ? [ids] : ids;
const currentId = this.combatant._id; //const currentId = this.combatant.id;
// calculate initiative // calculate initiative
for (let cId = 0; cId < ids.length; cId++) { for (let cId = 0; cId < ids.length; cId++) {
const combatant = this.combatants.get(ids[cId]); const combatant = this.combatants.get(ids[cId])
let fvttInit = 5 let fvttInit = combatant.actor.getInitiativeRank(false, true)
//console.log("TYPE", combatant.actor.type)
if (combatant.actor.type == 'character') {
let initData = combatant.actor.getLastInitData()
console.log("Init data !!!", initData)
if (initData.isLegendary) {
fvttInit = 10
} else if (initData.isCritical) {
fvttInit = 9
} else if (initData.lastinit >= 9) {
fvttInit = 8
} else if (initData.isFumble) {
fvttInit = 3
}
} else {
fvttInit = 4 // Pietaille par defautco
//console.log("ACTOR", combatant.actor.getCharType())
if ( combatant.actor.getCharType() == 'adversary') {
fvttInit = 7
}
if ( combatant.actor.getCharType() == 'tough') {
fvttInit = 6
}
}
fvttInit += (cId / 100) fvttInit += (cId / 100)
await this.updateEmbeddedDocuments("Combatant", [{ _id: ids[cId], initiative: fvttInit }]); await this.updateEmbeddedDocuments("Combatant", [{ _id: ids[cId], initiative: fvttInit }]);
} }
@ -61,7 +40,16 @@ export class BoLCombatManager extends Combat {
} }
super.nextRound() super.nextRound()
} }
/************************************************************************************/
_onDelete() {
let combatants = this.combatants.contents
for (let c of combatants) {
let actor = game.actors.get(c.data.actorId)
actor.clearInitiative()
}
super._onDelete()
}
} }

View File

@ -76,12 +76,24 @@ export class BoLUtility {
static getLogoTopLeft() { static getLogoTopLeft() {
return this.logoTopLeft return this.logoTopLeft
} }
/* -------------------------------------------- */
static getActorFromRollData(rollData) {
let actor = game.actors.get( rollData.actorId)
if (rollData.tokenId) {
let token = canvas.tokens.placeables.find(t => t.id == rollData.tokenId)
if (token) {
actor = token.actor
}
}
return actor
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static async ready() { static async ready() {
//$("#logo").attr("src", this.getLogoTopLeft() ) //$("#logo").attr("src", this.getLogoTopLeft() )
$("#logo").css("content", `url(${this.getLogoTopLeft()})`) $("#logo").css("content", `url(${this.getLogoTopLeft()})`)
CONFIG.statusEffects = duplicate(game.bol.config.statusEffects)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -166,7 +178,7 @@ export class BoLUtility {
static getOtherWhisperRecipients(name) { static getOtherWhisperRecipients(name) {
let users = [] let users = []
for (let user of game.users) { for (let user of game.users) {
if (!user.isGM && user.name != name) { if ( !user.isGM && user.name != name) {
users.push(user.id) users.push(user.id)
} }
} }

View File

@ -342,4 +342,113 @@ BOL.bolEffectModifier = {
"+6": "+6", "+6": "+6",
"+8": "+8", "+8": "+8",
} }
BOL.statusEffects = [
{
"id": "dead",
"label": "EFFECT.StatusDead",
"icon": "icons/svg/skull.svg"
},
{
"id": "unconscious",
"label": "EFFECT.StatusUnconscious",
"icon": "icons/svg/unconscious.svg"
},
{
"id": "sleep",
"label": "EFFECT.StatusAsleep",
"icon": "icons/svg/sleep.svg"
},
{
"id": "stun",
"label": "EFFECT.StatusStunned",
"icon": "icons/svg/daze.svg"
},
{
"id": "prone",
"label": "EFFECT.StatusProne",
"icon": "icons/svg/falling.svg"
},
{
"id": "restrain",
"label": "EFFECT.StatusRestrained",
"icon": "icons/svg/net.svg"
},
{
"id": "paralysis",
"label": "EFFECT.StatusParalysis",
"icon": "icons/svg/paralysis.svg"
},
{
"id": "fly",
"label": "EFFECT.StatusFlying",
"icon": "icons/svg/wing.svg"
},
{
"id": "blind",
"label": "EFFECT.StatusBlind",
"icon": "icons/svg/blind.svg"
},
{
"id": "deaf",
"label": "EFFECT.StatusDeaf",
"icon": "icons/svg/deaf.svg"
},
{
"id": "silence",
"label": "EFFECT.StatusSilenced",
"icon": "icons/svg/silenced.svg"
},
{
"id": "fear",
"label": "EFFECT.StatusFear",
"icon": "icons/svg/terror.svg"
},
{
"id": "burning",
"label": "EFFECT.StatusBurning",
"icon": "icons/svg/fire.svg"
},
{
"id": "frozen",
"label": "EFFECT.StatusFrozen",
"icon": "icons/svg/frozen.svg"
},
{
"id": "shock",
"label": "EFFECT.StatusShocked",
"icon": "icons/svg/lightning.svg"
},
{
"id": "disease",
"label": "EFFECT.StatusDisease",
"icon": "icons/svg/biohazard.svg"
},
{
"id": "poison",
"label": "EFFECT.StatusPoison",
"icon": "icons/svg/poison.svg"
},
{
"id": "curse",
"label": "EFFECT.StatusCursed",
"icon": "icons/svg/sun.svg"
},
{
"id": "invisible",
"label": "EFFECT.StatusInvisible",
"icon": "icons/svg/invisible.svg"
},
{
"id": "target",
"label": "EFFECT.StatusTarget",
"icon": "icons/svg/target.svg"
},
{
"id": "eye",
"label": "EFFECT.StatusMarked",
"icon": "icons/svg/eye.svg"
}
]
BOL.debug = false; BOL.debug = false;

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.5", "version": "10.4.13",
"compatibility": { "compatibility": {
"minimum": "10", "minimum": "10",
"verified": "10", "verified": "10",
@ -203,8 +203,8 @@
], ],
"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.5.zip", "download": "https://www.uberwald.me/gitea/public/bol/archive/bol-v10.4.13.zip",
"background": "systems/images/map_lemurie.webp", "background": "systems/bol/ui/page_accueil.webp",
"gridDistance": 1.5, "gridDistance": 1.5,
"gridUnits": "m", "gridUnits": "m",
"primaryTokenAttribute": "resources.hp", "primaryTokenAttribute": "resources.hp",

View File

@ -1,34 +1,34 @@
<!--ARMES--> <!--ARMES-->
<button class="create_item">Créer un Equipement</button> <button class="create_item">Créer un Equipement</button>
{{#if useBougette}} {{#if useBougette}}
<ol class="items-list"> <ol class="items-list">
<li class="item flexrow item-header"> <li class="item flexrow item-header">
<div class="item-name flex4 left">{{localize "BOL.ui.moneyTitle"}}</div> <div class="item-name flex4 left">{{localize "BOL.ui.moneyTitle"}}</div>
<div class="item-name flex4 left">&nbsp;</div> <div class="item-name flex4 left">&nbsp;</div>
</li> </li>
<li class="item flexrow" data-item-id="{{item._id}}"> <li class="item flexrow" data-item-id="{{item._id}}">
<h4 class="item-name flex4 left"> <h4 class="item-name flex4 left">
<div class="item-image"><img src="icons/containers/bags/coinpouch-simple-leather-brown.webp" title="{{localize "BOL.ui.money"}}" /></div> <div class="item-image"><img src="icons/containers/bags/coinpouch-simple-leather-brown.webp" title="{{localize "BOL.ui.money"}}" /></div>
{{localize "BOL.ui.money"}} {{localize "BOL.ui.money"}}
</h4> </h4>
<div class="item-image"> <div class="item-image">
<a class="bougette-roll rollable" data-roll-type="bougette"><i class="darkgreen fas fa-dice"></i></a> <a class="bougette-roll rollable" data-roll-type="bougette"><i class="darkgreen fas fa-dice"></i></a>
</div> </div>
{{#if isGM}} {{#if isGM}}
<select class="field-value" name="system.bougette.value" data-dtype="String"> <select class="field-value" name="system.bougette.value" data-dtype="String">
{{#select bougette.value}} {{#select bougette.value}}
{{#each config.bougetteState as |value id|}} {{#each config.bougetteState as |value id|}}
<option value="{{id}}">{{localize value}}</option> <option value="{{id}}">{{localize value}}</option>
{{/each}} {{/each}}
{{/select}} {{/select}}
</select> </select>
{{else}} {{else}}
<label class="">{{localize bougette.label}}</label></a> <label class="">{{localize bougette.label}}</label></a>
{{/if}} {{/if}}
</li> </li>
</ol> </ol>
{{/if}} {{/if}}
<ol class="items-list"> <ol class="items-list">
<li class="item flexrow item-header"> <li class="item flexrow item-header">

View File

@ -34,6 +34,12 @@
</div> </div>
{{/if}} {{/if}}
{{#if initiativeRank}}
<div>
{{localize "BOL.chat.initiative"}}: {{initiativeRank}}
</div>
{{/if}}
{{#if (eq mode "bougette")}} {{#if (eq mode "bougette")}}
<div> <div>
{{localize "BOL.chat.rollbougette"}} : {{localize "BOL.chat.rollbougette"}} :

BIN
ui/page_accueil.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 KiB