Compare commits
4 Commits
bol-v10.5.
...
bol-v10.5.
Author | SHA1 | Date | |
---|---|---|---|
05f09aa3f5 | |||
727db74545 | |||
ccb3a458c0 | |||
1ac9605f08 |
After Width: | Height: | Size: 253 KiB |
After Width: | Height: | Size: 287 KiB |
After Width: | Height: | Size: 104 KiB |
After Width: | Height: | Size: 265 KiB |
After Width: | Height: | Size: 127 KiB |
After Width: | Height: | Size: 541 KiB |
After Width: | Height: | Size: 207 KiB |
After Width: | Height: | Size: 109 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 131 KiB |
After Width: | Height: | Size: 227 KiB |
After Width: | Height: | Size: 174 KiB |
16
lang/fr.json
@ -106,8 +106,8 @@
|
||||
"BOL.ui.success": "Succès",
|
||||
"BOL.ui.failure": "Échec",
|
||||
"BOL.ui.fumble": "Échec critique",
|
||||
"BOL.ui.critical": "Succès critique",
|
||||
"BOL.ui.criticallegend": "Succès légendaire !",
|
||||
"BOL.ui.critical": "Succès Héroïque",
|
||||
"BOL.ui.criticallegend": "Succès Légendaire !",
|
||||
"BOL.ui.maneuvers": "Actions de combat",
|
||||
"BOL.ui.stacksize": "Taille de pile (max)",
|
||||
"BOL.ui.weapons": "Armes",
|
||||
@ -522,7 +522,17 @@
|
||||
"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.chat.criticaloptions": "Succès critique !! Vous pouvez faire (1 option au choix) :",
|
||||
"BOL.chat.criticalcarnage": "Faire un Carnage : vous avez une attaque gratuite supplémentaire. Cette seconde attaque ne peut bénéficier d'un Point d'Héroisme.",
|
||||
"BOL.chat.criticalplus6": "Coup Dévastateur : +6 aux dommages (cf bouton ci-dessous).",
|
||||
"BOL.chat.criticalprecise": "Coup Précis : Vous frappez pour diminuer les capacités de votre adversaire. Décrivez ce que vous faites, et si le MJ l'accepte, votre opposant subira un Dé de Malus pour les actions concernées.",
|
||||
"BOL.chat.criticalunarm": "Désarmement : Si votre adversaire a une arme en main, vous le désarmez.",
|
||||
"BOL.chat.criticalrabble": "Massacrer la piétaille : Si vous combattez de la Piétaille, les résultats des dommages indiquent le nombre d'adversaires mis hors de combat.",
|
||||
"BOL.chat.criticalpush": "Renversement : Si la taille le permet, vous poussez votre adversaire au sol, il souffrira d'1 Dé de Malus pour toutes ses actions au round suivant.",
|
||||
"BOL.chat.criticalup": "Transformer en Légendaire : En dépensant 1 point d'Héroisme, vous pouvez transformer ce Succès Héroïque en Légendaire, qui vous permet de prendre 2 options dans la liste ci-dessus (cf. bouton pour un +12 aux dommages par exemple).",
|
||||
"BOL.chat.criticalinfo": "C'est un succès Héroïque ou Légendaire ! Choisissez vos options et effets !",
|
||||
"BOL.chat.criticalbuttonjournal": "Succès Héroïque/Légendaire",
|
||||
|
||||
"BOL.dialog.soeasy": "Inmanquable (+4)",
|
||||
"BOL.dialog.veryeasy": "Trés Facile (+2)",
|
||||
"BOL.dialog.easy": "Facile (+1)",
|
||||
|
@ -153,8 +153,8 @@ export class BoLActorSheet extends ActorSheet {
|
||||
formData.bougette = this.actor.getBougette()
|
||||
formData.charType = this.actor.getCharType()
|
||||
formData.villainy = this.actor.getVillainy()
|
||||
formData.biography = await TextEditor.enrichHTML(this.object.system.details.biography, {async: true})
|
||||
formData.notes = await TextEditor.enrichHTML(this.object.system.details.notes, {async: true})
|
||||
formData.biography = await TextEditor.enrichHTML(this.object.system.details?.biography || "", {async: true})
|
||||
formData.notes = await TextEditor.enrichHTML(this.object.system.details.notes || "", {async: true})
|
||||
formData.isSorcerer = this.actor.isSorcerer()
|
||||
formData.isAlchemist = this.actor.isAlchemist()
|
||||
formData.isAstrologer = this.actor.isAstrologer()
|
||||
|
@ -756,6 +756,14 @@ export class BoLActor extends Actor {
|
||||
this.unsetFlag("world", "last-initiative" )
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
getSize() {
|
||||
if (this.system.details.size.length > 0 && game.bol.config.creatureSize[this.system.details.size]) {
|
||||
return game.bol.config.creatureSize[this.system.details.size].order
|
||||
}
|
||||
return game.bol.config.creatureSize["medium"].order // Medium size per default
|
||||
}
|
||||
|
||||
/*-------------------------------------------- */
|
||||
getInitiativeRank(rollData = undefined, isCombat = false) {
|
||||
if (!rollData) {
|
||||
@ -787,6 +795,17 @@ export class BoLActor extends Actor {
|
||||
if ( this.getCharType() == 'tough') {
|
||||
fvttInit = 6
|
||||
}
|
||||
if ( this.getCharType() == 'creature') {
|
||||
let mySize = this.getSize()
|
||||
let sizeSmall = game.bol.config.creatureSize["small"].order
|
||||
let sizeMedium = game.bol.config.creatureSize["medium"].order
|
||||
if ( mySize >= sizeSmall && mySize <= sizeMedium) {
|
||||
fvttInit = 6
|
||||
}
|
||||
if ( mySize > sizeMedium) {
|
||||
fvttInit = 7
|
||||
}
|
||||
}
|
||||
return fvttInit
|
||||
}
|
||||
|
||||
|
@ -576,8 +576,10 @@ export class BoLRoll {
|
||||
if (rollData.weapon && rollData.weapon.system.properties.onlymodifier) {
|
||||
rollbase = 0
|
||||
}
|
||||
|
||||
let diceData = BoLUtility.getDiceData()
|
||||
const modifiers = rollbase + rollData.careerBonus + rollData.mod + rollData.weaponModifier - rollData.defence - rollData.modArmorMalus + rollData.shieldMalus + rollData.attackModifier + rollData.appliedArmorMalus + rollData.effectModifier
|
||||
const formula = (isMalus) ? rollData.nbDice + "d6kl2 + " + modifiers : rollData.nbDice + "d6kh2 + " + modifiers
|
||||
const formula = (isMalus) ? rollData.nbDice + "d" + diceData.diceFormula + "kl2 + " + modifiers : rollData.nbDice + "d" + diceData.diceFormula + "kh2 + " + modifiers
|
||||
rollData.formula = formula
|
||||
rollData.modifiers = modifiers
|
||||
|
||||
@ -620,20 +622,20 @@ export class BoLDefaultRoll {
|
||||
const r = new Roll(this.rollData.formula)
|
||||
//console.log("Roll formula", this.rollData.formula)
|
||||
await r.roll({ "async": false })
|
||||
|
||||
let diceData = BoLUtility.getDiceData()
|
||||
console.log("DICEDATA", diceData)
|
||||
const activeDice = r.terms[0].results.filter(r => r.active)
|
||||
const diceTotal = activeDice.map(r => r.result).reduce((a, b) => a + b)
|
||||
this.rollData.roll = r
|
||||
this.rollData.isSuccess = (r.total >= 9)
|
||||
this.rollData.isCritical = (diceTotal === 12)
|
||||
this.rollData.isRealCritical = (diceTotal === 12)
|
||||
this.rollData.isHeroic = (diceTotal === 12)
|
||||
this.rollData.isSuccess = (r.total >= diceData.successValue)
|
||||
this.rollData.isCritical = (diceTotal >= diceData.criticalSuccessValue)
|
||||
this.rollData.isRealCritical = (diceTotal >= diceData.criticalSuccessValue)
|
||||
this.rollData.isHeroic = (diceTotal >= diceData.criticalSuccessValue)
|
||||
this.rollData.isLegendary = false
|
||||
this.rollData.isFumble = (diceTotal === 2)
|
||||
this.rollData.isFumble = (diceTotal <= diceData.criticalFailureValue)
|
||||
this.rollData.isFailure = !this.rollData.isSuccess
|
||||
|
||||
//this.rollData.isRealCritical = true
|
||||
//this.rollData.isFumble = true
|
||||
|
||||
let actor = BoLUtility.getActorFromRollData(this.rollData)
|
||||
if (this.rollData.reroll == undefined) {
|
||||
this.rollData.reroll = actor.heroReroll()
|
||||
@ -684,12 +686,15 @@ export class BoLDefaultRoll {
|
||||
/* -------------------------------------------- */
|
||||
upgradeToLegendary() {
|
||||
// Force to Critical roll
|
||||
let diceData = BoLUtility.getDiceData()
|
||||
let maxValue = Number(diceData.diceFormula) * 2
|
||||
|
||||
this.rollData.isCritical = true
|
||||
this.rollData.isLegendary = true
|
||||
this.rollData.isRealCritical = false
|
||||
this.rollData.isSuccess = true
|
||||
this.rollData.isFailure = false
|
||||
this.rollData.roll = new Roll("12+" + this.rollData.modifiers)
|
||||
this.rollData.roll = new Roll(maxValue + "+" + this.rollData.modifiers)
|
||||
this.rollData.reroll = false
|
||||
this.sendChatMessage()
|
||||
}
|
||||
@ -697,13 +702,16 @@ export class BoLDefaultRoll {
|
||||
/* -------------------------------------------- */
|
||||
upgradeToHeroic() {
|
||||
// Force to Critical roll
|
||||
let diceData = BoLUtility.getDiceData()
|
||||
let maxValue = Number(diceData.diceFormula) * 2
|
||||
|
||||
this.rollData.isCritical = true
|
||||
this.rollData.isHeroic = true
|
||||
this.rollData.isLegendary = false
|
||||
this.rollData.isRealCritical = false
|
||||
this.rollData.isSuccess = true
|
||||
this.rollData.isFailure = false
|
||||
this.rollData.roll = new Roll("12+" + this.rollData.modifiers)
|
||||
this.rollData.roll = new Roll(maxValue + "+" + this.rollData.modifiers)
|
||||
this.rollData.reroll = false
|
||||
this.sendChatMessage()
|
||||
}
|
||||
|
@ -35,7 +35,7 @@ export class BoLCombatManager extends Combat {
|
||||
nextRound() {
|
||||
let combatants = this.combatants.contents
|
||||
for (let c of combatants) {
|
||||
let actor = game.actors.get( c.data.actorId )
|
||||
let actor = game.actors.get( c.actorId )
|
||||
actor.clearRoundModifiers()
|
||||
}
|
||||
super.nextRound()
|
||||
@ -45,7 +45,7 @@ export class BoLCombatManager extends Combat {
|
||||
_onDelete() {
|
||||
let combatants = this.combatants.contents
|
||||
for (let c of combatants) {
|
||||
let actor = game.actors.get(c.data.actorId)
|
||||
let actor = game.actors.get(c.actorId)
|
||||
actor.clearInitiative()
|
||||
}
|
||||
super._onDelete()
|
||||
|
@ -28,6 +28,66 @@ export class BoLUtility {
|
||||
type: Boolean,
|
||||
onChange: lang => window.location.reload()
|
||||
})
|
||||
game.settings.register("bol", "dice-formula", {
|
||||
name: "Formule de dés",
|
||||
hint: "Sélectionne la formule de dés (par défaut 2d6)",
|
||||
scope: "world",
|
||||
config: true,
|
||||
default: "2d6",
|
||||
type: String,
|
||||
choices: { "6": "2d6", "8":"2d8", "10":"2d10", "12":"2d12", "20":"2d20"},
|
||||
onChange: value => {
|
||||
BoLUtility.setDiceFormula(value)
|
||||
}
|
||||
})
|
||||
game.settings.register("bol", "dice-success-value", {
|
||||
name: "Seuil de succès",
|
||||
hint: "Sélectionne le seuil de succès (9 par défaut pour 2d6)",
|
||||
scope: "world",
|
||||
config: true,
|
||||
default: 9,
|
||||
range: {
|
||||
min: 2,
|
||||
max: 40,
|
||||
step: 1
|
||||
},
|
||||
type: Number,
|
||||
onChange: value => {
|
||||
BoLUtility.setSuccessValue(value)
|
||||
}
|
||||
})
|
||||
game.settings.register("bol", "dice-critical-success-value", {
|
||||
name: "Valeur min de réussite critique",
|
||||
hint: "Indique le seuil minimum de réussite critique (12 par défaut pour 2d6). Si les réussites critiques sont sur 19 et 20, alors indiquez 19.",
|
||||
scope: "world",
|
||||
config: true,
|
||||
default: 12,
|
||||
range: {
|
||||
min: 2,
|
||||
max: 40,
|
||||
step: 1
|
||||
},
|
||||
type: Number,
|
||||
onChange: value => {
|
||||
BoLUtility.setCriticalSuccessValue(value)
|
||||
}
|
||||
})
|
||||
game.settings.register("bol", "dice-critical-failure-value", {
|
||||
name: "Valeur max d'échec critique",
|
||||
hint: "Indique le seuil maximum d'échec critique (2 par défaut pour 2d6). Si les échecs critiques sont sur 2 et 3, alors indiquez 3.",
|
||||
scope: "world",
|
||||
config: true,
|
||||
default: 2,
|
||||
range: {
|
||||
min: 2,
|
||||
max: 40,
|
||||
step: 1
|
||||
},
|
||||
type: Number,
|
||||
onChange: value => {
|
||||
BoLUtility.setCriticalFailureValue(value)
|
||||
}
|
||||
})
|
||||
game.settings.register("world", "character-summary-data", {
|
||||
name: "character-summary-data",
|
||||
scope: "world",
|
||||
@ -65,8 +125,34 @@ export class BoLUtility {
|
||||
this.useBougette = game.settings.get("bol", "useBougette") // Use optionnal bougette rules
|
||||
this.actorSheetLogo = game.settings.get("bol", "logoActorSheet") || "/systems/bol/ui/logo.webp"
|
||||
this.logoTopLeft = game.settings.get("bol", "logoTopLeft") || "/systems/bol/ui/logo2.webp"
|
||||
|
||||
this.diceFormula = game.settings.get("bol", "dice-formula")
|
||||
this.successValue = Number(game.settings.get("bol", "dice-success-value"))
|
||||
this.criticalSuccessValue = Number(game.settings.get("bol", "dice-critical-success-value"))
|
||||
this.criticalFailureValue = Number(game.settings.get("bol", "dice-critical-failure-value"))
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static setDiceFormula(value) {
|
||||
this.diceFormula = value
|
||||
}
|
||||
static setSuccessValue(value) {
|
||||
this.successValue = Number(value)
|
||||
}
|
||||
static setCriticalSuccessValue(value) {
|
||||
this.criticalSuccessValue = Number(value)
|
||||
}
|
||||
static setCriticalFailureValue(value) {
|
||||
this.criticalFailureValue = Number(value)
|
||||
}
|
||||
static getDiceData() {
|
||||
return {
|
||||
diceFormula: this.diceFormula,
|
||||
successValue : this.successValue,
|
||||
criticalSuccessValue: this.criticalSuccessValue,
|
||||
criticalFailureValue: this.criticalFailureValue
|
||||
}
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
static getRollArmor() {
|
||||
return this.rollArmor
|
||||
|
@ -313,18 +313,18 @@ BOL.bougetteDice = {
|
||||
}
|
||||
|
||||
BOL.creatureSize = {
|
||||
"tiny": "BOL.size.tiny",
|
||||
"verysmall": "BOL.size.verysmall",
|
||||
"small": "BOL.size.small",
|
||||
"medium": "BOL.size.medium",
|
||||
"large": "BOL.size.large",
|
||||
"verylarge": "BOL.size.verylarge",
|
||||
"huge": "BOL.size.huge",
|
||||
"massive": "BOL.size.massive",
|
||||
"enormous": "BOL.size.enormous",
|
||||
"gigantic": "BOL.size.gigantic",
|
||||
"immense": "BOL.size.immense",
|
||||
"colossal": "BOL.size.colossal"
|
||||
"tiny": {order: 1, label: "BOL.size.tiny"},
|
||||
"verysmall": {order: 2, label: "BOL.size.verysmall"},
|
||||
"small": {order: 3, label: "BOL.size.small"},
|
||||
"medium": {order: 4, label: "BOL.size.medium"},
|
||||
"large": {order: 5, label: "BOL.size.large"},
|
||||
"verylarge": {order: 6, label: "BOL.size.verylarge"},
|
||||
"huge": {order: 7, label: "BOL.size.huge"},
|
||||
"massive": {order: 8, label: "BOL.size.massive"},
|
||||
"enormous": {order: 9, label: "BOL.size.enormous"},
|
||||
"gigantic": {order: 10, label: "BOL.size.gigantic"},
|
||||
"immense": {order: 11, label: "BOL.size.immense"},
|
||||
"colossal": {order: 12, label: "BOL.size.colossal"}
|
||||
}
|
||||
|
||||
BOL.horoscopeAnswer = {
|
||||
|
@ -14,11 +14,10 @@
|
||||
],
|
||||
"url": "https://www.uberwald.me/gitea/public/bol",
|
||||
"license": "LICENSE.txt",
|
||||
"version": "10.5.0",
|
||||
"version": "10.5.3",
|
||||
"compatibility": {
|
||||
"minimum": "10",
|
||||
"verified": "10",
|
||||
"maximum": "10"
|
||||
"verified": "10"
|
||||
},
|
||||
"esmodules": [
|
||||
"module/bol.js"
|
||||
@ -203,10 +202,10 @@
|
||||
],
|
||||
"socket": true,
|
||||
"manifest": "https://www.uberwald.me/gitea/public/bol/raw/v10/system.json",
|
||||
"download": "https://www.uberwald.me/gitea/public/bol/archive/bol-v10.5.0.zip",
|
||||
"download": "https://www.uberwald.me/gitea/public/bol/archive/bol-v10.5.3.zip",
|
||||
"background": "systems/bol/ui/page_accueil.webp",
|
||||
"gridDistance": 1.5,
|
||||
"gridUnits": "m",
|
||||
"primaryTokenAttribute": "resources.hp",
|
||||
"secondaryTokenAttribute": "resources.hero"
|
||||
}
|
||||
}
|
||||
|
@ -74,9 +74,9 @@
|
||||
data-dtype='String'
|
||||
>
|
||||
{{#select details.size}}
|
||||
{{#each config.creatureSize as |value id|}}
|
||||
{{#each config.creatureSize as |sizeData id|}}
|
||||
<option value="{{id}}">
|
||||
{{localize value}}
|
||||
{{localize sizeData.label}}
|
||||
</option>
|
||||
{{/each}}
|
||||
{{/select}}
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
<button class="chat-damage-roll bol-margin-tb-2" data-damage-mode="normal-damage" data-attack-id="{{id}}">{{localize "BOL.chat.rolldamage"}}</button>
|
||||
|
||||
{{#if isCritical}}
|
||||
{{#if isCritical}}
|
||||
<button class="chat-damage-roll bol-margin-tb-2 " data-damage-mode="damage-plus-6" data-attack-id="{{id}}">{{localize "BOL.chat.rolldamage6"}}</button>
|
||||
<button class="chat-damage-roll bol-margin-tb-2" data-damage-mode="damage-plus-12" data-attack-id="{{id}}">{{localize "BOL.chat.rolldamage12"}}</button>
|
||||
{{/if}}
|
||||
|
@ -55,9 +55,13 @@
|
||||
|
||||
|
||||
|
||||
{{#if isRealCritical}}
|
||||
{{#if isCritical}}
|
||||
<div>
|
||||
{{localize "BOL.chat.criticalinfo"}}
|
||||
</div>
|
||||
<div class="bol-margin-tb-2">
|
||||
<a class="content-link" draggable="true" data-uuid="Compendium.bol.aides-de-jeu.Yl1RKQb0BjVUtilk" data-id="Yl1RKQb0BjVUtilk" data-type="JournalEntry" data-pack="bol.aides-de-jeu" data-tooltip="un journal"><i class="fas fa-book-open"></i>Succès Héroïque</a>
|
||||
<a class="content-link" draggable="true" data-uuid="Compendium.bol.aides-de-jeu.Yl1RKQb0BjVUtilk" data-id="Yl1RKQb0BjVUtilk" data-type="JournalEntry" data-pack="bol.aides-de-jeu" data-tooltip="un journal">
|
||||
<i class="fas fa-book-open"></i>{{localize "BOL.chat.criticalbuttonjournal"}}</a>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
|