Fix options de combat

This commit is contained in:
LeRatierBretonnien 2023-04-04 13:41:22 +02:00
parent e7f3851daa
commit 5b91041a3f
9 changed files with 55 additions and 59 deletions

View File

@ -22,6 +22,17 @@ export class BoLActor extends Actor {
super.prepareData() super.prepareData()
} }
/* -------------------------------------------- */
isHeroAdversary() {
if (this.type === 'character') {
return true
}
if (this.type === 'encounter' && this.chartype == "adversary") {
return true
}
return false
}
/* -------------------------------------------- */ /* -------------------------------------------- */
getCharType() { getCharType() {
if (this.type === 'character') { if (this.type === 'character') {
@ -32,10 +43,10 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
getVillainy() { getVillainy() {
if (this.type === 'character') { if (this.type === 'encounter' && this.chartype == "adversary") {
return false return true
} }
return true return false
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -734,7 +745,7 @@ export class BoLActor extends Actor {
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, isHeroAdversary: this.isHeroAdversary() })
}) })
} else { } else {
if (prone) { if (prone) {

View File

@ -523,6 +523,7 @@ export class BoLRoll {
rollData.nbBoons = 0 rollData.nbBoons = 0
rollData.nbFlaws = 0 rollData.nbFlaws = 0
rollData.nbDice = 0 rollData.nbDice = 0
rollData.isHeroAdversary = actor.isHeroAdversary()
if (rollData.shieldBlock == 'blockall') { if (rollData.shieldBlock == 'blockall') {
rollData.shieldMalus = rollData.shieldAttackMalus; rollData.shieldMalus = rollData.shieldAttackMalus;
} else { } else {

View File

@ -191,29 +191,6 @@ export class BoLUtility {
CONFIG.statusEffects = duplicate(game.bol.config.statusEffects) CONFIG.statusEffects = duplicate(game.bol.config.statusEffects)
} }
/* -------------------------------------------- */
static templateData(it) {
return BoLUtility.data(it)?.data ?? {}
}
/* -------------------------------------------- */
static data(it) {
if (it instanceof Actor || it instanceof Item || it instanceof Combatant) {
return it.data;
}
return it;
}
/* -------------------------------------------- */
static storeRoll(roll) {
this.rollTab[roll.id] = roll
}
/* -------------------------------------------- */
static getRoll(rollId) {
return this.rollTab[roll.id]
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static createDirectOptionList(min, max) { static createDirectOptionList(min, max) {
let options = {}; let options = {};
@ -258,7 +235,7 @@ export class BoLUtility {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static getUsers(filter) { static getUsers(filter) {
return game.users.filter(filter).map(user => user.data._id); return game.users.filter(filter).map(user => user.id);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static getWhisperRecipients(rollMode, name) { static getWhisperRecipients(rollMode, name) {
@ -522,7 +499,7 @@ export class BoLUtility {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static isRangedWeapon(weapon) { static isRangedWeapon(weapon) {
return weapon.data.type == 'ranged' || weapon.data.thrown; return weapon.system.type == 'ranged' || weapon.system.thrown;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -604,15 +581,15 @@ export class BoLUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static computeSpellCost(spell, nbOptCond = 0) { static computeSpellCost(spell, nbOptCond = 0) {
let pp = spell.data.properties.ppcost let pp = spell.system.properties.ppcost
let minpp = __circle2minpp[spell.data.properties.circle] let minpp = __circle2minpp[spell.system.properties.circle]
pp = (pp - nbOptCond < minpp) ? minpp : pp - nbOptCond pp = (pp - nbOptCond < minpp) ? minpp : pp - nbOptCond
return pp return pp
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static getDamageFormula(weaponData, fightOption) { static getDamageFormula(weaponData, fightOption) {
let upgradeDamage = (fightOption && fightOption.data.properties.fightoptiontype == "twoweaponsatt") let upgradeDamage = (fightOption && fightOption.system.properties.fightoptiontype == "twoweaponsatt")
let damageString = weaponData.properties.damage let damageString = weaponData.properties.damage
let modifier = weaponData.properties.damageModifiers ?? 0 let modifier = weaponData.properties.damageModifiers ?? 0
let multiplier = weaponData.properties.damageMultiplier ?? 1 let multiplier = weaponData.properties.damageMultiplier ?? 1

View File

@ -118,7 +118,7 @@ export const registerHandlebarsHelpers = function () {
}) })
Handlebars.registerHelper('includesKey', function (items, type, key) { Handlebars.registerHelper('includesKey', function (items, type, key) {
// console.log(items); // console.log(items);
return items.filter(i => i.type === type).map(i => i.data.key).includes(key); return items.filter(i => i.type === type).map(i => i.system.key).includes(key);
}) })
Handlebars.registerHelper('includes', function (array, val) { Handlebars.registerHelper('includes', function (array, val) {
return array.includes(val); return array.includes(val);

View File

@ -49,7 +49,7 @@ export default function registerHooks() {
let macro = game.macros.entities.find(m => (m.name === actor.name) && (m.command === command)); let macro = game.macros.entities.find(m => (m.name === actor.name) && (m.command === command));
if (!macro) { if (!macro) {
macro = await Macro.create({ macro = await Macro.create({
name: actor.data.name, name: actor.name,
type: "script", type: "script",
img: "icons/svg/dice-target.svg", img: "icons/svg/dice-target.svg",
command: command command: command
@ -65,9 +65,9 @@ export default function registerHooks() {
let macro = game.macros.entities.find(m => (m.name === journal.name) && (m.command === command)); let macro = game.macros.entities.find(m => (m.name === journal.name) && (m.command === command));
if (!macro) { if (!macro) {
macro = await Macro.create({ macro = await Macro.create({
name: journal.data.name, name: journal.name,
type: "script", type: "script",
img: (journal.data.img) ? journal.data.img : "icons/svg/book.svg", img: (journal.img) ? journal.img : "icons/svg/book.svg",
command: command command: command
}, {displaySheet: false}) }, {displaySheet: false})
game.user.assignHotbarMacro(macro, slot); game.user.assignHotbarMacro(macro, slot);

View File

@ -37,13 +37,13 @@ export class Macros {
}; };
if(rollType === "attribute") { if(rollType === "attribute") {
let attribute = eval(`actor.data.data.attributes.${key}`); let attribute = eval(`actor.system.attributes.${key}`);
let rollLabel = (attribute.label) ? game.i18n.localize(attribute.label) : null; let rollLabel = (attribute.label) ? game.i18n.localize(attribute.label) : null;
let description = actor.name + " - " + game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label) ; let description = actor.name + " - " + game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label) ;
BoLRoll.attributeRollDialog(actor, actorData, attribute, rollLabel, description, adv, mod); BoLRoll.attributeRollDialog(actor, actorData, attribute, rollLabel, description, adv, mod);
} }
else if(rollType === "aptitude") { else if(rollType === "aptitude") {
let aptitude = eval(`actor.data.data.aptitudes.${key}`); let aptitude = eval(`actor.system.aptitudes.${key}`);
let rollLabel = (aptitude.label) ? game.i18n.localize(aptitude.label) : null; let rollLabel = (aptitude.label) ? game.i18n.localize(aptitude.label) : null;
let description = actor.name + " - " + game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label) ; let description = actor.name + " - " + game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label) ;
BoLRoll.aptitudeRollDialog(actor, actorData, aptitude, rollLabel, description, adv, mod); BoLRoll.aptitudeRollDialog(actor, actorData, aptitude, rollLabel, description, adv, mod);

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.5.12", "version": "10.5.13",
"compatibility": { "compatibility": {
"minimum": "10", "minimum": "10",
"verified": "10" "verified": "10"
@ -202,7 +202,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.5.12.zip", "download": "https://www.uberwald.me/gitea/public/bol/archive/bol-v10.5.13.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

@ -4,20 +4,25 @@
</div> </div>
<div class="flexrow"> <div class="flexrow">
{{#if (eq hp 0)}}
{{localize "BOL.chat.vitalityzero" name=name hp=hp}}
<br>{{localize "BOL.chat.vitalityheroism"}}
<br>{{localize "BOL.chat.vitalityheroismhint"}}
{{else}}
{{localize "BOL.chat.vitalitydying" name=name hp=hp}}
<br>{{localize "BOL.chat.vitalitydyingheroism"}}
{{/if}}
{{#if (lt hp -5)}} {{#if isHeroAdversary}}
<br><strong>{{localize "BOL.chat.isdead" name=name}}</strong> {{#if (eq hp 0)}}
<br>{{localize "BOL.chat.epitaph"}} {{localize "BOL.chat.vitalityzero" name=name hp=hp}}
{{/if}} <br>{{localize "BOL.chat.vitalityheroism"}}
<br>{{localize "BOL.chat.vitalityheroismhint"}}
{{else}}
{{localize "BOL.chat.vitalitydying" name=name hp=hp}}
<br>{{localize "BOL.chat.vitalitydyingheroism"}}
{{/if}}
{{#if (lt hp -5)}}
<br><strong>{{localize "BOL.chat.isdead" name=name}}</strong>
<br>{{localize "BOL.chat.epitaph"}}
{{/if}}
{{else}}
<br><strong>{{localize "BOL.chat.isdead" name=name}}</strong>
<br>{{localize "BOL.chat.epitaph"}}
{{/if}}
</div> </div>

View File

@ -8,13 +8,15 @@
<button class="damage-handling" data-defense-mode="damage-with-armor" data-attack-id="{{attackId}}">{{localize "BOL.chat.witharmor"}}</button> <button class="damage-handling" data-defense-mode="damage-with-armor" data-attack-id="{{attackId}}">{{localize "BOL.chat.witharmor"}}</button>
<button class="damage-handling" data-defense-mode="damage-without-armor" data-attack--id="{{attackId}}">{{localize "BOL.chat.withoutarmor"}}</button> <button class="damage-handling" data-defense-mode="damage-without-armor" data-attack--id="{{attackId}}">{{localize "BOL.chat.withoutarmor"}}</button>
{{#if defender.system.resources.hero.value}} {{#if isHeroAdversary}}
<button class="damage-handling" data-defense-mode="hero-reduce-damage" data-attack-id="{{attackId}}">{{localize "BOL.chat.shakeoff"}}</button> {{#if (gt defender.system.resources.hero.value 0)}}
<button class="damage-handling" data-defense-mode="hero-reduce-damage" data-attack-id="{{attackId}}">{{localize "BOL.chat.shakeoff"}}</button>
{{#each defenderWeapons as |weapon idx|}} {{#each defenderWeapons as |weapon idx|}}
<button class="damage-handling" data-defense-mode="hero-in-extremis" data-attack-id="{{@root.attackId}}" data-weapon-id="{{weapon._id}}">{{localize "BOL.chat.splinteredshield" name=weapon.name}}</button> <button class="damage-handling" data-defense-mode="hero-in-extremis" data-attack-id="{{@root.attackId}}" data-weapon-id="{{weapon._id}}">{{localize "BOL.chat.splinteredshield" name=weapon.name}}</button>
{{/each}} {{/each}}
{{/if}}
{{/if}}
<button class="damage-handling" data-defense-mode="damage-not-applied" data-attack-id="{{attackId}}">{{localize "BOL.chat.nodamage"}}</button> <button class="damage-handling" data-defense-mode="damage-not-applied" data-attack-id="{{attackId}}">{{localize "BOL.chat.nodamage"}}</button>
{{/if}}