Compare commits
17 Commits
bol-v11.0.
...
v10
Author | SHA1 | Date | |
---|---|---|---|
8a87f6deab | |||
759b099bdf | |||
ade88fb54b | |||
f1a3f2df36 | |||
a357c6ddfc | |||
26a6c7fc28 | |||
6fcac36580 | |||
34924b07c0 | |||
66bf299ea4 | |||
37ab0d01dc | |||
2e3a97de04 | |||
01dbe76f59 | |||
ca33defd75 | |||
2e616e3e31 | |||
3be7f4bf9f | |||
1b8e0840b0 | |||
2cdd096c98 |
54
.gitea/workflows/main.yml
Normal file
54
.gitea/workflows/main.yml
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
name: Release Creation
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- run: echo "💡 The ${{ gitea.repository }} repository will cloned to the runner."
|
||||||
|
|
||||||
|
#- uses: actions/checkout@v3
|
||||||
|
- uses: RouxAntoine/checkout@v3.5.4
|
||||||
|
with:
|
||||||
|
ref: 'v10'
|
||||||
|
|
||||||
|
# get part of the tag after the `v`
|
||||||
|
- name: Extract tag version number
|
||||||
|
id: get_version
|
||||||
|
uses: battila7/get-version-action@v2
|
||||||
|
|
||||||
|
# Substitute the Manifest and Download URLs in the module.json
|
||||||
|
- name: Substitute Manifest and Download Links For Versioned Ones
|
||||||
|
id: sub_manifest_link_version
|
||||||
|
uses: microsoft/variable-substitution@v1
|
||||||
|
with:
|
||||||
|
files: 'system.json'
|
||||||
|
env:
|
||||||
|
version: ${{steps.get_version.outputs.version-without-v}}
|
||||||
|
url: https://www.uberwald.me/gitea/public/bol
|
||||||
|
manifest: https://www.uberwald.me/gitea/public/bol/releases/latest/system.json
|
||||||
|
download: https://www.uberwald.me/gitea/public/bol/releases/download/${{github.event.release.tag_name}}/bol.zip
|
||||||
|
|
||||||
|
# Create a zip file with all files required by the module to add to the release
|
||||||
|
- run: |
|
||||||
|
apt update -y
|
||||||
|
apt install -y zip
|
||||||
|
|
||||||
|
- run: zip -r ./bol.zip system.json template.json README.md LICENSE assets/ css/ fonts/ images/ lang/ module/ packs/ styles/ templates/ ui/
|
||||||
|
|
||||||
|
- name: setup go
|
||||||
|
uses: https://github.com/actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: '>=1.20.1'
|
||||||
|
|
||||||
|
- name: Use Go Action
|
||||||
|
id: use-go-action
|
||||||
|
uses: https://gitea.com/actions/release-action@main
|
||||||
|
with:
|
||||||
|
files: |-
|
||||||
|
./bol.zip
|
||||||
|
system.json
|
||||||
|
api_key: '${{secrets.RELEASE_TOKEN_UBERWALD}}'
|
15
.gitignore
vendored
15
.gitignore
vendored
@ -1 +1,14 @@
|
|||||||
.history/
|
.vscode/settings.json
|
||||||
|
.idea
|
||||||
|
.history
|
||||||
|
todo.md
|
||||||
|
/.vscode
|
||||||
|
/ignored/
|
||||||
|
/node_modules/
|
||||||
|
/jsconfig.json
|
||||||
|
/package.json
|
||||||
|
/package-lock.json
|
||||||
|
/packs/*/
|
||||||
|
/packs/*/CURRENT
|
||||||
|
/packs/*/LOG
|
||||||
|
/packs/*/LOCK
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
# v11.0.8
|
||||||
|
|
||||||
|
- Correction sur les malus de bouclier (blocage)
|
||||||
|
- Corrrection sur le malus d'init des boucliers qui était mal affiché dans la fiche d'item
|
||||||
# v10.4.0
|
# v10.4.0
|
||||||
|
|
||||||
- Ajout de la gestion d'effets
|
- Ajout de la gestion d'effets
|
||||||
|
14
css/bol.css
14
css/bol.css
@ -1,7 +1,6 @@
|
|||||||
/* ----------------------------------------- */
|
/* ----------------------------------------- */
|
||||||
/* LOCAL FONTS */
|
/* LOCAL FONTS */
|
||||||
/* ----------------------------------------- */
|
/* ----------------------------------------- */
|
||||||
@import "../node_modules/rpg-awesome/css/rpg-awesome.min.css";
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Contrail One';
|
font-family: 'Contrail One';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
@ -1044,9 +1043,18 @@ body.system-bol img#logo {
|
|||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 2.75rem;
|
/*transform: translate(0, -30%);*/
|
||||||
|
top: -4rem;
|
||||||
|
max-width: 250px;
|
||||||
left: 4rem;
|
left: 4rem;
|
||||||
}
|
}
|
||||||
|
.tokenhudext.right2 {
|
||||||
|
justify-content: flex-start;
|
||||||
|
flex-direction: column;
|
||||||
|
position: absolute;
|
||||||
|
top: -4rem;
|
||||||
|
left: 12rem;
|
||||||
|
}
|
||||||
.control-icon.tokenhudicon {
|
.control-icon.tokenhudicon {
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
height: fit-content;
|
height: fit-content;
|
||||||
@ -1063,7 +1071,7 @@ body.system-bol img#logo {
|
|||||||
z-index: 2;
|
z-index: 2;
|
||||||
}
|
}
|
||||||
.bol-hud-menu label {
|
.bol-hud-menu label {
|
||||||
font-size: 0.75rem;
|
font-size: 0.6rem;
|
||||||
}
|
}
|
||||||
.bol-margin-tb-2 {
|
.bol-margin-tb-2 {
|
||||||
margin-top: 2px;
|
margin-top: 2px;
|
||||||
|
10
lang/de.json
10
lang/de.json
@ -355,6 +355,16 @@
|
|||||||
"BOL.vehicleCategory.boat" : "Schiff",
|
"BOL.vehicleCategory.boat" : "Schiff",
|
||||||
"BOL.vehicleCategory.other" : "Anderes",
|
"BOL.vehicleCategory.other" : "Anderes",
|
||||||
|
|
||||||
|
"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.range.PointBlank": "Direkt",
|
"BOL.range.PointBlank": "Direkt",
|
||||||
"BOL.range.Short": "Kurz",
|
"BOL.range.Short": "Kurz",
|
||||||
|
11
lang/en.json
11
lang/en.json
@ -35,6 +35,17 @@
|
|||||||
"BOL.ui.tab.spellalchemy": "Spells & Alchemy",
|
"BOL.ui.tab.spellalchemy": "Spells & Alchemy",
|
||||||
"BOL.ui.tab.astrologer": "Astrologer",
|
"BOL.ui.tab.astrologer": "Astrologer",
|
||||||
|
|
||||||
|
"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": "Properties",
|
"BOL.ui.properties": "Properties",
|
||||||
"BOL.ui.description": "Description",
|
"BOL.ui.description": "Description",
|
||||||
"BOL.ui.actions": "Actions",
|
"BOL.ui.actions": "Actions",
|
||||||
|
25
lang/fr.json
25
lang/fr.json
@ -1,12 +1,17 @@
|
|||||||
{
|
{
|
||||||
"ACTOR.TypeCharacter": "Personnage",
|
"TYPES": {
|
||||||
"ACTOR.TypeEncounter": "Rencontre",
|
"Actor": {
|
||||||
"ACTOR.TypeVehicle": "Véhicule",
|
"character": "Personnage",
|
||||||
"ITEM.TypeItem": "Objet",
|
"npc": "PNJ",
|
||||||
"ITEM.TypeFeature": "Trait",
|
"vehicle": "Véhicule"
|
||||||
"ITEM.TypeWeapon": "Arme",
|
},
|
||||||
"ITEM.TypeArmor": "Armure",
|
"Item": {
|
||||||
|
"item": "Objet",
|
||||||
|
"feature": "Trait",
|
||||||
|
"weapon": "Arme",
|
||||||
|
"armure": "Armure"
|
||||||
|
}
|
||||||
|
},
|
||||||
"BOL.attributes.vigor": "Vigueur",
|
"BOL.attributes.vigor": "Vigueur",
|
||||||
"BOL.attributes.halfvigor": "Demi-vigueur",
|
"BOL.attributes.halfvigor": "Demi-vigueur",
|
||||||
"BOL.attributes.agility": "Agilité",
|
"BOL.attributes.agility": "Agilité",
|
||||||
@ -478,7 +483,7 @@
|
|||||||
"BOL.chat.applydamagetotarget": "Appliquer les dommages à la cible",
|
"BOL.chat.applydamagetotarget": "Appliquer les dommages à la cible",
|
||||||
"BOL.chat.fightoption": "Option de combat",
|
"BOL.chat.fightoption": "Option de combat",
|
||||||
"BOL.chat.reroll": "Relancer (1 P. Heroisme)",
|
"BOL.chat.reroll": "Relancer (1 P. Heroisme)",
|
||||||
"BOL.chat.heroicreminder": "En plus des actions indiquées sur les boutons ci-dessous, vous pouvez : <ul><li>Carnage : Attaquer une seconde fois le même adversaire</li><li>Coup précis : Un dé de malus à votre adversaire sur une localisation choisie</li><li>Désarmement</li><li>Massacrer la piétaille</li><li>Renversement : Renversez votre adversaire (1 taille de plus max)</li></ul>Si vous dépensez un Point dh'Eheoisme en plus, tout ces effets peuvent être doublés",
|
"BOL.chat.heroicreminder": "En plus des actions indiquées sur les boutons ci-dessous, vous pouvez : <ul><li>Carnage : Attaquer une seconde fois le même adversaire</li><li>Coup précis : Un dé de malus à votre adversaire sur une localisation choisie</li><li>Désarmement</li><li>Massacrer la piétaille</li><li>Renversement : Renversez votre adversaire (1 taille de plus max)</li></ul>Si vous dépensez un Point d'Héroisme en plus, tout ces effets peuvent être doublés",
|
||||||
"BOL.chat.toheroic": "Transformer en succés Héroïque (1 P. Héroisme/Vilainie)",
|
"BOL.chat.toheroic": "Transformer en succés Héroïque (1 P. Héroisme/Vilainie)",
|
||||||
"BOL.chat.tolegend": "Transformer en succes Légendaire (1 P. Heroisme/Vilainie)",
|
"BOL.chat.tolegend": "Transformer en succes Légendaire (1 P. Heroisme/Vilainie)",
|
||||||
"BOL.chat.hurttitle": "{name} va encaisser {damageTotal} dégats !",
|
"BOL.chat.hurttitle": "{name} va encaisser {damageTotal} dégats !",
|
||||||
@ -539,7 +544,7 @@
|
|||||||
"BOL.chat.criticalinfo": "C'est un succès Héroïque ou Légendaire ! Choisissez vos options et effets !",
|
"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.chat.criticalbuttonjournal": "Succès Héroïque/Légendaire",
|
||||||
|
|
||||||
"BOL.chat.losshp": "{{name}} a perdu {lossHP} points de Vitalité. Si il se repose quelques minutes, il peut récupérer {recupHP} points de Vitalité.",
|
"BOL.chat.losshp": "{name} a perdu {lossHP} points de Vitalité. Si il se repose quelques minutes, il peut récupérer {recupHP} points de Vitalité.",
|
||||||
"BOL.chat.applyrecup": "Récupérer pendant quelques minutes (+{recupHP} Vitalité)",
|
"BOL.chat.applyrecup": "Récupérer pendant quelques minutes (+{recupHP} Vitalité)",
|
||||||
"BOL.chat.inforecup": "{name} vient de récupérer {recupHP} points de Vitalité après quelques minutes de repos.",
|
"BOL.chat.inforecup": "{name} vient de récupérer {recupHP} points de Vitalité après quelques minutes de repos.",
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import { BoLDefaultRoll } from "../controllers/bol-rolls.js";
|
import { BoLDefaultRoll, BoLRoll } from "../controllers/bol-rolls.js";
|
||||||
import { BoLUtility } from "../system/bol-utility.js";
|
import { BoLUtility } from "../system/bol-utility.js";
|
||||||
import { BoLRoll } from "../controllers/bol-rolls.js";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system.
|
* Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system.
|
||||||
@ -22,6 +21,18 @@ export class BoLActor extends Actor {
|
|||||||
super.prepareData()
|
super.prepareData()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async _preCreate(data, options, user) {
|
||||||
|
await super._preCreate(data, options, user);
|
||||||
|
|
||||||
|
// Configure prototype token settings
|
||||||
|
const prototypeToken = {};
|
||||||
|
if (this.type === "character") Object.assign(prototypeToken, {
|
||||||
|
sight: { enabled: true }, actorLink: true, disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY
|
||||||
|
});
|
||||||
|
this.updateSource({ prototypeToken });
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
isHeroAdversary() {
|
isHeroAdversary() {
|
||||||
if (this.type === 'character') {
|
if (this.type === 'character') {
|
||||||
@ -50,7 +61,7 @@ export class BoLActor extends Actor {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getInitiativeMalus() {
|
getInitiativeMalus() {
|
||||||
if ( this.type === 'encounter' && (this.chartype == "adversary" || this.chartype == "tough")) {
|
if (this.type === 'encounter' && (this.chartype == "adversary" || this.chartype == "tough")) {
|
||||||
return this.system.aptitudes.init.value
|
return this.system.aptitudes.init.value
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
@ -92,12 +103,12 @@ export class BoLActor extends Actor {
|
|||||||
let newVitality = 10 + this.system.attributes.vigor.value + this.system.resources.hp.bonus
|
let newVitality = 10 + this.system.attributes.vigor.value + this.system.resources.hp.bonus
|
||||||
if (this.system.resources.hp.max != newVitality) {
|
if (this.system.resources.hp.max != newVitality) {
|
||||||
let actor = this
|
let actor = this
|
||||||
setTimeout( function() { actor.update({ 'system.resources.hp.max': newVitality }) }, 800 )
|
setTimeout(function () { actor.update({ 'system.resources.hp.max': newVitality }) }, 800)
|
||||||
}
|
}
|
||||||
let newPower = 10 + this.system.attributes.mind.value + this.system.resources.power.bonus
|
let newPower = 10 + this.system.attributes.mind.value + this.system.resources.power.bonus
|
||||||
if (this.system.resources.power.max != newPower) {
|
if (this.system.resources.power.max != newPower) {
|
||||||
let actor = this
|
let actor = this
|
||||||
setTimeout( function() { actor.update({ 'system.resources.power.max': newPower }) }, 800 )
|
setTimeout(function () { actor.update({ 'system.resources.power.max': newPower }) }, 800)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -110,7 +121,7 @@ export class BoLActor extends Actor {
|
|||||||
super.prepareDerivedData()
|
super.prepareDerivedData()
|
||||||
if (this.id) {
|
if (this.id) {
|
||||||
this.updateResourcesData()
|
this.updateResourcesData()
|
||||||
this.manageHealthState()
|
this.manageHealthState()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -119,16 +130,16 @@ export class BoLActor extends Actor {
|
|||||||
get details() {
|
get details() {
|
||||||
return this.system.details
|
return this.system.details
|
||||||
}
|
}
|
||||||
addEffectModifiers( myList, dataPath) {
|
addEffectModifiers(myList, dataPath) {
|
||||||
for (let attr of myList) {
|
for (let attr of myList) {
|
||||||
attr.numModifier = 0
|
attr.numModifier = 0
|
||||||
attr.diceModifier = ""
|
attr.diceModifier = ""
|
||||||
let effects = this.items.filter( i => i.type === "feature" && i.system.subtype === "boleffect" && i.system.properties.identifier == dataPath+attr.key)
|
let effects = this.items.filter(i => i.type === "feature" && i.system.subtype === "boleffect" && i.system.properties.identifier == dataPath + attr.key)
|
||||||
for (let effect of effects) {
|
for (let effect of effects) {
|
||||||
if ( Number(effect.system.properties.modifier)) {
|
if (Number(effect.system.properties.modifier)) {
|
||||||
attr.numModifier += Number(effect.system.properties.modifier)
|
attr.numModifier += Number(effect.system.properties.modifier)
|
||||||
} else {
|
} else {
|
||||||
attr.diceModifier += "+"+effect.system.properties.modifier
|
attr.diceModifier += "+" + effect.system.properties.modifier
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -512,16 +523,16 @@ export class BoLActor extends Actor {
|
|||||||
}
|
}
|
||||||
if (rollData.horoscopeType == "major") {
|
if (rollData.horoscopeType == "major") {
|
||||||
let actorHoroscope = this
|
let actorHoroscope = this
|
||||||
if(rollData.targetId) {
|
if (rollData.targetId) {
|
||||||
let token = game.scenes.current.tokens.get(rollData.targetId)
|
let token = game.scenes.current.tokens.get(rollData.targetId)
|
||||||
actorHoroscope = token.actor
|
actorHoroscope = token.actor
|
||||||
}
|
}
|
||||||
if (rollData.isSuccess) {
|
if (rollData.isSuccess) {
|
||||||
actorHoroscope.addHeroPoints(1)
|
actorHoroscope.addHeroPoints(1)
|
||||||
} else {
|
} else {
|
||||||
actorHoroscope.subHeroPoints(1)
|
actorHoroscope.subHeroPoints(1)
|
||||||
}
|
}
|
||||||
rollData.horoscopeName = actorHoroscope.name
|
rollData.horoscopeName = actorHoroscope.name
|
||||||
}
|
}
|
||||||
if (rollData.horoscopeType == "majorgroup") {
|
if (rollData.horoscopeType == "majorgroup") {
|
||||||
let rID = randomID(16)
|
let rID = randomID(16)
|
||||||
@ -596,16 +607,18 @@ export class BoLActor extends Actor {
|
|||||||
|
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
heroReroll() {
|
heroReroll() {
|
||||||
if (this.type == 'character') {
|
if (this.type == 'character' || this.system.villainy == 'adversary') {
|
||||||
return this.system.resources.hero.value > 0;
|
return this.system.resources.hero.value > 0;
|
||||||
} else {
|
|
||||||
if (this.system.villainy == 'adversary') {
|
|
||||||
return this.system.resources.hero.value > 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
/*-------------------------------------------- */
|
||||||
|
getHeroPoints() {
|
||||||
|
if (this.type == 'character' || this.system.villainy == 'adversary') {
|
||||||
|
return this.system.resources.hero.value
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
getResourcesFromType() {
|
getResourcesFromType() {
|
||||||
let resources = {};
|
let resources = {};
|
||||||
@ -753,7 +766,7 @@ export class BoLActor extends Actor {
|
|||||||
|
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
buildListeActions() {
|
buildListeActions() {
|
||||||
return this.melee.concat(this.ranged).concat(this.natural)
|
return this.melee.concat(this.ranged).concat(this.natural).concat(this.fightoptions)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
@ -831,7 +844,7 @@ export class BoLActor extends Actor {
|
|||||||
let msg = await ChatMessage.create({
|
let msg = await ChatMessage.create({
|
||||||
alias: this.name,
|
alias: this.name,
|
||||||
whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name),
|
whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name),
|
||||||
content: game.i18n.format( "BOL.chat.inforecup", {name: this.name, recupHP: recupHP} )
|
content: game.i18n.format("BOL.chat.inforecup", { name: this.name, recupHP: recupHP })
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -849,12 +862,12 @@ export class BoLActor extends Actor {
|
|||||||
}
|
}
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
checkNumeric(myObject) {
|
checkNumeric(myObject) {
|
||||||
if ( myObject) {
|
if (myObject) {
|
||||||
for (let key in myObject) {
|
for (let key in myObject) {
|
||||||
if ( myObject[key].value === null ) {
|
if (myObject[key].value === null) {
|
||||||
myObject[key].value = 0
|
myObject[key].value = 0
|
||||||
}
|
}
|
||||||
if ( myObject[key].value === NaN ) {
|
if (myObject[key].value === NaN) {
|
||||||
myObject[key].value = 0
|
myObject[key].value = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -882,7 +895,7 @@ export class BoLActor extends Actor {
|
|||||||
fvttInit = 5
|
fvttInit = 5
|
||||||
if (!rollData) {
|
if (!rollData) {
|
||||||
if (isCombat) {
|
if (isCombat) {
|
||||||
if (game.user.isGM ) {
|
if (game.user.isGM) {
|
||||||
if (this.hasPlayerOwner) {
|
if (this.hasPlayerOwner) {
|
||||||
game.socket.emit("system.bol", { name: "msg_request_init_roll", data: { actorId: this.id, combatData } })
|
game.socket.emit("system.bol", { name: "msg_request_init_roll", data: { actorId: this.id, combatData } })
|
||||||
} else {
|
} else {
|
||||||
@ -938,7 +951,7 @@ export class BoLActor extends Actor {
|
|||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
incDecResources(target, value) {
|
incDecResources(target, value) {
|
||||||
let newValue = this.system.resources[target].value + value
|
let newValue = this.system.resources[target].value + value
|
||||||
this.update({ [`system.resources.${target}.value`]: newValue })
|
this.update({ [`system.resources.${target}.value`]: newValue })
|
||||||
}
|
}
|
||||||
/*-------------------------------------------- */
|
/*-------------------------------------------- */
|
||||||
async sufferDamage(damage) {
|
async sufferDamage(damage) {
|
||||||
|
@ -424,6 +424,7 @@ export class BoLRoll {
|
|||||||
} else {
|
} else {
|
||||||
this.rollData.shieldMalus = 0
|
this.rollData.shieldMalus = 0
|
||||||
}
|
}
|
||||||
|
this.updateTotalDice()
|
||||||
})
|
})
|
||||||
|
|
||||||
html.find('#career').change((event) => {
|
html.find('#career').change((event) => {
|
||||||
@ -490,12 +491,13 @@ export class BoLRoll {
|
|||||||
if (defender) { // If target is selected
|
if (defender) { // If target is selected
|
||||||
rollData.defence = defender.defenseValue
|
rollData.defence = defender.defenseValue
|
||||||
rollData.armorMalus = defender.armorMalusValue
|
rollData.armorMalus = defender.armorMalusValue
|
||||||
|
rollData.defenderHeroPoints = defender.getHeroPoints()
|
||||||
rollData.shieldBlock = 'none'
|
rollData.shieldBlock = 'none'
|
||||||
let shields = defender.shields
|
let shields = defender.shields
|
||||||
|
//console.log("Defender stats", defender)
|
||||||
for (let shield of shields) {
|
for (let shield of shields) {
|
||||||
rollData.shieldBlock = (shield.system.properties.blocking.blockingAll) ? 'blockall' : 'blockone';
|
rollData.shieldBlock = (shield.system.properties.blocking.blockingAll) ? 'blockall' : 'blockone';
|
||||||
rollData.shieldAttackMalus = (shield.system.properties.blocking.malus) ? shield.system.properties.blocking.malus : 1;
|
rollData.shieldAttackMalus = (shield.system.properties.blocking.malus) ? shield.system.properties.blocking.malus : 1;
|
||||||
rollData.applyShieldMalus = false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -528,11 +530,6 @@ export class BoLRoll {
|
|||||||
rollData.nbFlaws = 0
|
rollData.nbFlaws = 0
|
||||||
rollData.nbDice = 0
|
rollData.nbDice = 0
|
||||||
rollData.isHeroAdversary = actor.isHeroAdversary()
|
rollData.isHeroAdversary = actor.isHeroAdversary()
|
||||||
if (rollData.shieldBlock == 'blockall') {
|
|
||||||
rollData.shieldMalus = rollData.shieldAttackMalus;
|
|
||||||
} else {
|
|
||||||
rollData.shieldMalus = 0
|
|
||||||
}
|
|
||||||
rollData.careerBonus = rollData.careerBonus ?? 0
|
rollData.careerBonus = rollData.careerBonus ?? 0
|
||||||
rollData.modRanged = rollData.modRanged ?? 0
|
rollData.modRanged = rollData.modRanged ?? 0
|
||||||
rollData.mod = rollData.mod ?? 0
|
rollData.mod = rollData.mod ?? 0
|
||||||
@ -545,6 +542,12 @@ export class BoLRoll {
|
|||||||
this.preProcessFightOption(rollData)
|
this.preProcessFightOption(rollData)
|
||||||
this.updateArmorMalus(rollData)
|
this.updateArmorMalus(rollData)
|
||||||
this.updatePPCost(rollData)
|
this.updatePPCost(rollData)
|
||||||
|
// Prepare blocking case
|
||||||
|
if (rollData.shieldBlock == 'blockall') {
|
||||||
|
rollData.shieldMalus = rollData.shieldAttackMalus;
|
||||||
|
} else {
|
||||||
|
rollData.shieldMalus = 0
|
||||||
|
}
|
||||||
// Save
|
// Save
|
||||||
this.rollData = rollData
|
this.rollData = rollData
|
||||||
console.log("ROLLDATA", rollData)
|
console.log("ROLLDATA", rollData)
|
||||||
@ -571,24 +574,21 @@ export class BoLRoll {
|
|||||||
ui.notifications.warn("Pas assez de Points de Pouvoir !")
|
ui.notifications.warn("Pas assez de Points de Pouvoir !")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
//console.log("ROLLMALUS", rollData)
|
|
||||||
|
|
||||||
rollData.registerInit = (rollData.aptitude && rollData.aptitude.key == 'init') ? $('#register-init').is(":checked") : false;
|
rollData.registerInit = (rollData.aptitude && rollData.aptitude.key == 'init') ? $('#register-init').is(":checked") : false;
|
||||||
|
|
||||||
const isMalus = (rollData.bmDice < 0)
|
const isMalus = (rollData.bmDice < 0)
|
||||||
//rollData.nbDice += (rollData.attackBonusDice) ? 1 : 0
|
|
||||||
|
|
||||||
let rollbase = rollData.attrValue + rollData.aptValue
|
let rollbase = rollData.attrValue + rollData.aptValue
|
||||||
if (rollData.weapon && rollData.weapon.system.properties.onlymodifier) {
|
if (rollData.weapon?.system.properties.onlymodifier) {
|
||||||
rollbase = 0
|
rollbase = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
let diceData = BoLUtility.getDiceData()
|
let diceData = BoLUtility.getDiceData()
|
||||||
let malusInit = rollData.combatData?.malusInit || 0
|
let malusInit = rollData.combatData?.malusInit || 0
|
||||||
const modifiers = rollbase + rollData.careerBonus + rollData.mod + rollData.weaponModifier - rollData.defence - rollData.modArmorMalus + rollData.shieldMalus + rollData.attackModifier + rollData.appliedArmorMalus + rollData.effectModifier - malusInit
|
const modifiers = rollbase + rollData.careerBonus + rollData.mod + rollData.weaponModifier - rollData.defence - rollData.modArmorMalus + rollData.shieldMalus + rollData.attackModifier + rollData.appliedArmorMalus + rollData.effectModifier - malusInit
|
||||||
const formula = (isMalus) ? rollData.nbDice + "d" + diceData.diceFormula + "kl2 + " + modifiers : rollData.nbDice + "d" + diceData.diceFormula + "kh2 + " + modifiers
|
const formula = (isMalus) ? rollData.nbDice + "d" + diceData.diceFormula + "kl2 + " + modifiers : rollData.nbDice + "d" + diceData.diceFormula + "kh2 + " + modifiers
|
||||||
rollData.formula = formula
|
rollData.formula = formula
|
||||||
rollData.modifiers = modifiers
|
rollData.modifiers = modifiers
|
||||||
|
console.log("Rolldata before", rollData)
|
||||||
|
|
||||||
let r = new BoLDefaultRoll(rollData);
|
let r = new BoLDefaultRoll(rollData);
|
||||||
r.roll();
|
r.roll();
|
||||||
|
@ -27,23 +27,23 @@ export class BoLItemSheet extends ItemSheet {
|
|||||||
data.category = itemData.system.category
|
data.category = itemData.system.category
|
||||||
data.isGM = game.user.isGM;
|
data.isGM = game.user.isGM;
|
||||||
data.itemProperties = this.item.itemProperties;
|
data.itemProperties = this.item.itemProperties;
|
||||||
data.description = await TextEditor.enrichHTML(this.object.system.description, {async: true})
|
data.description = await TextEditor.enrichHTML(this.object.system.description, { async: true })
|
||||||
|
|
||||||
// Dynamic default data fix/adapt
|
// Dynamic default data fix/adapt
|
||||||
if (itemData.type == "item") {
|
if (itemData.type == "item") {
|
||||||
if (!itemData.system.category) {
|
if (!itemData.system.category) {
|
||||||
itemData.system.category = "equipment"
|
itemData.system.category = "equipment"
|
||||||
}
|
}
|
||||||
if ( itemData.system.category == "equipment" && itemData.system.properties.equipable) {
|
if (itemData.system.category == "equipment" && itemData.system.properties.equipable) {
|
||||||
if (!itemData.system.properties.slot) {
|
if (!itemData.system.properties.slot) {
|
||||||
itemData.system.properties.slot = "-"
|
itemData.system.properties.slot = "-"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (itemData.system.category == 'spell') {
|
if (itemData.system.category == 'spell') {
|
||||||
if(!itemData.system.properties.mandatoryconditions) {
|
if (!itemData.system.properties.mandatoryconditions) {
|
||||||
itemData.system.properties.mandatoryconditions = []
|
itemData.system.properties.mandatoryconditions = []
|
||||||
}
|
}
|
||||||
if(!itemData.system.properties.optionnalconditions) {
|
if (!itemData.system.properties.optionnalconditions) {
|
||||||
itemData.system.properties.optionnalconditions = []
|
itemData.system.properties.optionnalconditions = []
|
||||||
}
|
}
|
||||||
for (let i = 0; i < 4; i++) {
|
for (let i = 0; i < 4; i++) {
|
||||||
@ -64,7 +64,27 @@ export class BoLItemSheet extends ItemSheet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
_getHeaderButtons() {
|
||||||
|
let buttons = super._getHeaderButtons();
|
||||||
|
buttons.unshift({
|
||||||
|
class: "post",
|
||||||
|
icon: "fas fa-comment",
|
||||||
|
onclick: ev => this.postItem()
|
||||||
|
});
|
||||||
|
return buttons
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
postItem() {
|
||||||
|
let chatData = duplicate(this.item)
|
||||||
|
if (this.actor) {
|
||||||
|
chatData.actor = { id: this.actor.id };
|
||||||
|
}
|
||||||
|
BoLUtility.postItem(chatData);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
/** @override */
|
/** @override */
|
||||||
setPosition(options = {}) {
|
setPosition(options = {}) {
|
||||||
const position = super.setPosition(options);
|
const position = super.setPosition(options);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
import { BoLRoll } from "../controllers/bol-rolls.js";
|
import { BoLRoll } from "../controllers/bol-rolls.js";
|
||||||
|
import { BoLUtility } from "../system/bol-utility.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class BoLTokenHud {
|
export class BoLTokenHud {
|
||||||
@ -30,10 +31,17 @@ export class BoLTokenHud {
|
|||||||
(event) => {
|
(event) => {
|
||||||
let actionIndex = Number(event.currentTarget.attributes['data-action-index'].value)
|
let actionIndex = Number(event.currentTarget.attributes['data-action-index'].value)
|
||||||
let action = hudData.actionsList[actionIndex]
|
let action = hudData.actionsList[actionIndex]
|
||||||
const weapon = actor.items.get( action._id )
|
const actionItem = actor.items.get(action._id)
|
||||||
BoLRoll.weaponCheckWithWeapon(hudData.actor, duplicate(weapon))
|
if (actionItem.system.subtype == "weapon") {
|
||||||
//console.log("Clicked", action)
|
BoLRoll.weaponCheckWithWeapon(hudData.actor, duplicate(actionItem))
|
||||||
} )
|
} else if (actionItem.system.subtype == "fightoption") {
|
||||||
|
let chatData = duplicate(actionItem)
|
||||||
|
if (actionItem.actor) {
|
||||||
|
chatData.actor = { id: actionItem.actor._id };
|
||||||
|
}
|
||||||
|
BoLUtility.postItem(chatData);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const controlIconTarget = html.find('.control-icon[data-action=target]');
|
const controlIconTarget = html.find('.control-icon[data-action=target]');
|
||||||
// att+apt+career
|
// att+apt+career
|
||||||
@ -41,18 +49,18 @@ export class BoLTokenHud {
|
|||||||
(event) => {
|
(event) => {
|
||||||
let rollIndex = Number(event.currentTarget.attributes['data-roll-index'].value)
|
let rollIndex = Number(event.currentTarget.attributes['data-roll-index'].value)
|
||||||
let roll = hudData.rollsList[rollIndex]
|
let roll = hudData.rollsList[rollIndex]
|
||||||
if ( roll.type == "aptitude") {
|
if (roll.type == "aptitude") {
|
||||||
BoLRoll.aptitudeCheck(actor, roll.key )
|
BoLRoll.aptitudeCheck(actor, roll.key)
|
||||||
} else if ( roll.type == "attribute") {
|
} else if (roll.type == "attribute") {
|
||||||
BoLRoll.attributeCheck(actor, roll.key )
|
BoLRoll.attributeCheck(actor, roll.key)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async addTokenHudExtensions(app, html, tokenId) {
|
static async addTokenHudExtensions(app, html, tokenId) {
|
||||||
const controlIconCombat = html.find('.control-icon[data-action=combat]')
|
const controlIconCombat = html.find('.control-icon[data-action=combat]')
|
||||||
if (controlIconCombat.length>0 ) {
|
if (controlIconCombat.length > 0) {
|
||||||
BoLTokenHud.addExtensionHud(app, html, tokenId);
|
BoLTokenHud.addExtensionHud(app, html, tokenId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -61,9 +69,9 @@ export class BoLTokenHud {
|
|||||||
static async _configureSubMenu(insertionPoint, template, hudData, onMenuItem) {
|
static async _configureSubMenu(insertionPoint, template, hudData, onMenuItem) {
|
||||||
const hud = $(await renderTemplate(template, hudData))
|
const hud = $(await renderTemplate(template, hudData))
|
||||||
const list = hud.find('div.bol-hud-list')
|
const list = hud.find('div.bol-hud-list')
|
||||||
|
|
||||||
BoLTokenHud._toggleHudListActive(hud, list);
|
BoLTokenHud._toggleHudListActive(hud, list);
|
||||||
|
|
||||||
hud.find('img.bol-hud-togglebutton').click(event => BoLTokenHud._toggleHudListActive(hud, list));
|
hud.find('img.bol-hud-togglebutton').click(event => BoLTokenHud._toggleHudListActive(hud, list));
|
||||||
list.find('.bol-hud-menu').click(onMenuItem);
|
list.find('.bol-hud-menu').click(onMenuItem);
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ import { BoLRoll, BoLDefaultRoll } from "../controllers/bol-rolls.js";
|
|||||||
|
|
||||||
// Spell circle to min PP cost
|
// Spell circle to min PP cost
|
||||||
const __circle2minpp = { 0: 0, 1: 2, 2: 6, 3: 11 }
|
const __circle2minpp = { 0: 0, 1: 2, 2: 6, 3: 11 }
|
||||||
const __validDices = {"6": 1, "8": 1, "10": 1, "12": 1}
|
const __validDices = { "6": 1, "8": 1, "10": 1, "12": 1 }
|
||||||
export class BoLUtility {
|
export class BoLUtility {
|
||||||
|
|
||||||
|
|
||||||
@ -41,8 +41,8 @@ export class BoLUtility {
|
|||||||
config: true,
|
config: true,
|
||||||
default: "6",
|
default: "6",
|
||||||
type: String,
|
type: String,
|
||||||
choices: { "6": "2d6", "8":"2d8", "10":"2d10", "12":"2d12", "20":"2d20"},
|
choices: { "6": "2d6", "8": "2d8", "10": "2d10", "12": "2d12", "20": "2d20" },
|
||||||
onChange: value => {
|
onChange: value => {
|
||||||
BoLUtility.setDiceFormula(value)
|
BoLUtility.setDiceFormula(value)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -58,7 +58,7 @@ export class BoLUtility {
|
|||||||
step: 1
|
step: 1
|
||||||
},
|
},
|
||||||
type: Number,
|
type: Number,
|
||||||
onChange: value => {
|
onChange: value => {
|
||||||
BoLUtility.setSuccessValue(value)
|
BoLUtility.setSuccessValue(value)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -74,7 +74,7 @@ export class BoLUtility {
|
|||||||
step: 1
|
step: 1
|
||||||
},
|
},
|
||||||
type: Number,
|
type: Number,
|
||||||
onChange: value => {
|
onChange: value => {
|
||||||
BoLUtility.setCriticalSuccessValue(value)
|
BoLUtility.setCriticalSuccessValue(value)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -90,7 +90,7 @@ export class BoLUtility {
|
|||||||
step: 1
|
step: 1
|
||||||
},
|
},
|
||||||
type: Number,
|
type: Number,
|
||||||
onChange: value => {
|
onChange: value => {
|
||||||
BoLUtility.setCriticalFailureValue(value)
|
BoLUtility.setCriticalFailureValue(value)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -153,12 +153,12 @@ export class BoLUtility {
|
|||||||
}
|
}
|
||||||
static getDiceData() {
|
static getDiceData() {
|
||||||
let df = this.diceFormula
|
let df = this.diceFormula
|
||||||
if ( !__validDices[String(this.diceFormula)]) {
|
if (!__validDices[String(this.diceFormula)]) {
|
||||||
df = "6"
|
df = "6"
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
diceFormula: df,
|
diceFormula: df,
|
||||||
successValue : this.successValue,
|
successValue: this.successValue,
|
||||||
criticalSuccessValue: this.criticalSuccessValue,
|
criticalSuccessValue: this.criticalSuccessValue,
|
||||||
criticalFailureValue: this.criticalFailureValue
|
criticalFailureValue: this.criticalFailureValue
|
||||||
}
|
}
|
||||||
@ -199,6 +199,44 @@ export class BoLUtility {
|
|||||||
CONFIG.statusEffects = duplicate(game.bol.config.statusEffects)
|
CONFIG.statusEffects = duplicate(game.bol.config.statusEffects)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static chatDataSetup(content, modeOverride, isRoll = false, forceWhisper) {
|
||||||
|
let chatData = {
|
||||||
|
user: game.user.id,
|
||||||
|
rollMode: modeOverride || game.settings.get("core", "rollMode"),
|
||||||
|
content: content
|
||||||
|
};
|
||||||
|
|
||||||
|
if (["gmroll", "blindroll"].includes(chatData.rollMode)) chatData["whisper"] = ChatMessage.getWhisperRecipients("GM").map(u => u.id);
|
||||||
|
if (chatData.rollMode === "blindroll") chatData["blind"] = true;
|
||||||
|
else if (chatData.rollMode === "selfroll") chatData["whisper"] = [game.user];
|
||||||
|
|
||||||
|
if (forceWhisper) { // Final force !
|
||||||
|
chatData["speaker"] = ChatMessage.getSpeaker();
|
||||||
|
chatData["whisper"] = ChatMessage.getWhisperRecipients(forceWhisper);
|
||||||
|
}
|
||||||
|
|
||||||
|
return chatData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static postItem(chatData) {
|
||||||
|
// Don't post any image for the item (which would leave a large gap) if the default image is used
|
||||||
|
if (chatData.img.includes("/blank.png")) {
|
||||||
|
chatData.img = null;
|
||||||
|
}
|
||||||
|
// JSON object for easy creation
|
||||||
|
chatData.jsondata = JSON.stringify(
|
||||||
|
{
|
||||||
|
compendium: "postedItem",
|
||||||
|
payload: chatData,
|
||||||
|
});
|
||||||
|
|
||||||
|
renderTemplate('systems/bol/templates/item/post-item.hbs', chatData).then(html => {
|
||||||
|
let chatOptions = BoLUtility.chatDataSetup(html);
|
||||||
|
ChatMessage.create(chatOptions, "selfroll")
|
||||||
|
});
|
||||||
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static createDirectOptionList(min, max) {
|
static createDirectOptionList(min, max) {
|
||||||
let options = {};
|
let options = {};
|
||||||
@ -314,11 +352,11 @@ export class BoLUtility {
|
|||||||
return message.getFlag("world", "bol-roll-data")
|
return message.getFlag("world", "bol-roll-data")
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static requestInitRoll(actorId, combatData ) {
|
static requestInitRoll(actorId, combatData) {
|
||||||
let actor = game.actors.get( actorId )
|
let actor = game.actors.get(actorId)
|
||||||
if (actor && actor.isOwner) {
|
if (actor && actor.isOwner) {
|
||||||
ui.notifications.info(game.i18n.localize("BOL.ui.warninitiative"))
|
ui.notifications.info(game.i18n.localize("BOL.ui.warninitiative"))
|
||||||
BoLRoll.aptitudeCheck(actor, "init", undefined, combatData)
|
BoLRoll.aptitudeCheck(actor, "init", undefined, combatData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -390,7 +428,7 @@ export class BoLUtility {
|
|||||||
})
|
})
|
||||||
|
|
||||||
html.on("click", '.recup-vitalite', event => {
|
html.on("click", '.recup-vitalite', event => {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
let actorId = event.currentTarget.attributes['data-actor-id'].value
|
let actorId = event.currentTarget.attributes['data-actor-id'].value
|
||||||
let recupHP = event.currentTarget.attributes['data-recup-hp'].value
|
let recupHP = event.currentTarget.attributes['data-recup-hp'].value
|
||||||
let actor = game.actors.get(actorId)
|
let actor = game.actors.get(actorId)
|
||||||
@ -422,7 +460,7 @@ export class BoLUtility {
|
|||||||
rollData.defenseMode = defenseMode
|
rollData.defenseMode = defenseMode
|
||||||
let token = game.scenes.current.tokens.get(rollData.targetId)
|
let token = game.scenes.current.tokens.get(rollData.targetId)
|
||||||
let defender = token.actor
|
let defender = token.actor
|
||||||
|
|
||||||
if (defenseMode == 'damage-with-armor') {
|
if (defenseMode == 'damage-with-armor') {
|
||||||
let armorFormula = defender.getArmorFormula()
|
let armorFormula = defender.getArmorFormula()
|
||||||
rollData.rollArmor = new Roll(armorFormula)
|
rollData.rollArmor = new Roll(armorFormula)
|
||||||
@ -573,6 +611,7 @@ export class BoLUtility {
|
|||||||
attackId: rollData.id,
|
attackId: rollData.id,
|
||||||
attacker: rollData.attacker,
|
attacker: rollData.attacker,
|
||||||
defender: defender,
|
defender: defender,
|
||||||
|
defenderHeroPoints:defender.getHeroPoints(),
|
||||||
defenderWeapons: defenderWeapons,
|
defenderWeapons: defenderWeapons,
|
||||||
damageTotal: rollData.damageTotal,
|
damageTotal: rollData.damageTotal,
|
||||||
damagesIgnoresArmor: rollData.damagesIgnoresArmor,
|
damagesIgnoresArmor: rollData.damagesIgnoresArmor,
|
||||||
@ -591,7 +630,7 @@ export class BoLUtility {
|
|||||||
$(`#${sockmsg.data.id}`).hide() // Hide the options roll buttons
|
$(`#${sockmsg.data.id}`).hide() // Hide the options roll buttons
|
||||||
}
|
}
|
||||||
if (sockmsg.name == "msg_request_init_roll") {
|
if (sockmsg.name == "msg_request_init_roll") {
|
||||||
this.requestInitRoll( sockmsg.data.actorId, sockmsg.data.combatData)
|
this.requestInitRoll(sockmsg.data.actorId, sockmsg.data.combatData)
|
||||||
}
|
}
|
||||||
if (sockmsg.name == "msg_damage_handling") {
|
if (sockmsg.name == "msg_damage_handling") {
|
||||||
BoLUtility.processDamageHandling(sockmsg.data.attackId, sockmsg.data.defenseMode, sockmsg.data.weaponId, sockmsg.data.msgId)
|
BoLUtility.processDamageHandling(sockmsg.data.attackId, sockmsg.data.defenseMode, sockmsg.data.weaponId, sockmsg.data.msgId)
|
||||||
@ -620,7 +659,7 @@ export class BoLUtility {
|
|||||||
|
|
||||||
let formula = damageString
|
let formula = damageString
|
||||||
if (damageString.includes("d") || damageString.includes("D")) {
|
if (damageString.includes("d") || damageString.includes("D")) {
|
||||||
var myReg = new RegExp('(\\d+)[dD]([\\d]+)([MB]*)?([\\+\\d]*)?', 'g')
|
let myReg = new RegExp('(\\d+)[dD]([\\d]+)([MB]*)?([\\+\\d]*)?', 'g')
|
||||||
let res = myReg.exec(damageString)
|
let res = myReg.exec(damageString)
|
||||||
let nbDice = parseInt(res[1])
|
let nbDice = parseInt(res[1])
|
||||||
let postForm = 'kh' + nbDice
|
let postForm = 'kh' + nbDice
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
{"name":"Le Coup du Soldat (Désarmer)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous ne pouvez utiliser que des armes légères ou moyennes. Vous visez l’arme de votre adversaire<br>pour la faire tomber.</p>\n<p>Vous portez une attaque sur l’arme, avec pour malus l’Agilité+Mêlée de votre adversaire. En cas de réussite, l’arme visée tombe au sol à 1d6-2 mètres de votre opposant.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"other","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687457942165,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"EN3xW64gAAj6GxZs","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
|
{"name":"Le Coup du Soldat (Désarmer)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous ne pouvez utiliser que des armes légères ou moyennes. Vous visez l’arme de votre adversaire<br>pour la faire tomber.</p>\n<p>Vous portez une attaque sur l’arme, avec pour malus l’Agilité+Mêlée de votre adversaire. En cas de réussite, l’arme visée tombe au sol à 1d6-2 mètres de votre opposant.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"other","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687457942165,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"EN3xW64gAAj6GxZs","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
|
||||||
{"name":"La Main d’Afyra (Se Reposer)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous restez au contact de votre adversaire, mais vous vous concentrez sur vous-même. Vous<br>ne pouvez pas attaquer ce round.</p>\n<p>Si vous réussissez un jet de Vigueur, vous récupérez 2 Points de Vitalité, 4 sur un succès Héroïque. Ces points ne peuvent être récupérés que si ils ont été perdus lors du combat en cours.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"other","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687457942166,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"EvADUhFjuz7G7ts9","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
|
{"name":"La Main d’Afyra (Se Reposer)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous restez au contact de votre adversaire, mais vous vous concentrez sur vous-même. Vous<br>ne pouvez pas attaquer ce round.</p>\n<p>Si vous réussissez un jet de Vigueur, vous récupérez 2 Points de Vitalité, 4 sur un succès Héroïque. Ces points ne peuvent être récupérés que si ils ont été perdus lors du combat en cours.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"other","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687457942166,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"EvADUhFjuz7G7ts9","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
|
||||||
{"name":"Le Doigt de Karyzon (Tir x2)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous enchaînez 2 tirs au lieu d’un, sans précision. Uniquement avec armes de jet et arcs.</p>\n<p>Vous tirez (ou lancer) très rapidement, sans précision, sur la même cible. Chaque tir/lancer souffre d’un malus de -2.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"other","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687457965168,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"FMJGgMYdXztCBTtc"}
|
{"name":"Le Doigt de Karyzon (Tir x2)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous enchaînez 2 tirs au lieu d’un, sans précision. Uniquement avec armes de jet et arcs.</p>\n<p>Vous tirez (ou lancer) très rapidement, sans précision, sur la même cible. Chaque tir/lancer souffre d’un malus de -2.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"other","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687457965168,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"FMJGgMYdXztCBTtc"}
|
||||||
|
{"name":"La Rage du Barbare (Posture Offensive)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.BF7F5WvL1pbWVHNq"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous vous concentrez sur l’attaque, au détriment de votre défense. Cette option vous confère un bonus de +1 au jet d’attaque, mais vous subissez un malus de -1 en défense.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"attack","activated":false},"rank":0,"fightoptiontype":"attack"},"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_stats":{"systemId":"bol","systemVersion":"11.0.2","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687467695919,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"_id":"MMcnWBowztvbmXgN"}
|
||||||
{"name":"La Passe de l’Assassin (Avantage)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous vous placez de manière à obtenir une position plus avantageuse pour portez vos attaques.</p>\n<p>En plus de votre attaque normale, vous devez réussir un jet de Réaction (Esprit+Initiative). Sur une<br>réussite, vous bénéficiez d’un dé bonus pour votre prochaine attaque. Si vous renoncez à votre attaque, vous bénéficiez d’un bonus de +2 pour le jet de Réaction. Sur un échec, c’est votre adversaire qui bénéficie d’un dé bonus pour sa prochaine attaque.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"other","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687457942165,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"PCa0SQruR9VZUbPh","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
|
{"name":"La Passe de l’Assassin (Avantage)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous vous placez de manière à obtenir une position plus avantageuse pour portez vos attaques.</p>\n<p>En plus de votre attaque normale, vous devez réussir un jet de Réaction (Esprit+Initiative). Sur une<br>réussite, vous bénéficiez d’un dé bonus pour votre prochaine attaque. Si vous renoncez à votre attaque, vous bénéficiez d’un bonus de +2 pour le jet de Réaction. Sur un échec, c’est votre adversaire qui bénéficie d’un dé bonus pour sa prochaine attaque.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"other","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687457942165,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"PCa0SQruR9VZUbPh","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
|
||||||
{"name":"La Folie de Dyr (Occuper)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous faites tournoyer votre arme dans tout les sens, pour faire reculer votre adversaire.</p>\n<p>Votre attaque reçoit un malus supplémentaire de -1 et n’occasionne pas de dégâts. En cas<br>de succès, votre adversaire ne peut pas attaquer ce round. Uniquement sur des adversaires au maximum de de taille supérieure d’un cran à la vôtre.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"other","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687457942168,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"PENp7jlG0DirTQeo","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
|
{"name":"La Folie de Dyr (Occuper)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous faites tournoyer votre arme dans tout les sens, pour faire reculer votre adversaire.</p>\n<p>Votre attaque reçoit un malus supplémentaire de -1 et n’occasionne pas de dégâts. En cas<br>de succès, votre adversaire ne peut pas attaquer ce round. Uniquement sur des adversaires au maximum de de taille supérieure d’un cran à la vôtre.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"other","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687457942168,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"PENp7jlG0DirTQeo","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
|
||||||
{"name":"Le Dit de Iondal (Moquer)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous moquez votre adversaire avec une phrase bien sentie.</p>\n<p>Si vous réussissez un test d’Esprit+Carrière appropriée, avec l’Esprit de votre cible en malus, elle<br>subit un malus de -2 en défense pour le reste du round.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"other","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687457942166,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"VSOjm28jhFhyWk6b","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
|
{"name":"Le Dit de Iondal (Moquer)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous moquez votre adversaire avec une phrase bien sentie.</p>\n<p>Si vous réussissez un test d’Esprit+Carrière appropriée, avec l’Esprit de votre cible en malus, elle<br>subit un malus de -2 en défense pour le reste du round.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"other","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687457942166,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"VSOjm28jhFhyWk6b","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
|
||||||
@ -27,4 +28,3 @@
|
|||||||
{"name":"L’Oeil du Chasseur (Viser)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Armes de jet ou de tir uniquement. Vous passez le round à viser. Vous bénéficiez d’un bonus de +2 à votre prochain jet de tir ou de lancer.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"other","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.2","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687458793253,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"leslYWbb3hfGHPlX"}
|
{"name":"L’Oeil du Chasseur (Viser)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Armes de jet ou de tir uniquement. Vous passez le round à viser. Vous bénéficiez d’un bonus de +2 à votre prochain jet de tir ou de lancer.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"other","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.2","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687458793253,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"leslYWbb3hfGHPlX"}
|
||||||
{"name":"La Danseuse (Combat à Deux Armes - Défensif)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous ne pouvez utiliser que des armes légères ou moyennes.</p>\n<p>Vous attaquez avec une arme et parez avec l’autre. Vous considérez l’arme de parade comme l’équivalent d’un petit bouclier (+1 en défense contre une attaque), mais vous subissez un malus de -1 sur votre jet d’attaque avec votre autre arme.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"twoweaponsdef","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310229,"modifiedTime":1687457965157,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"uRuOskeAALWwxDEM"}
|
{"name":"La Danseuse (Combat à Deux Armes - Défensif)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous ne pouvez utiliser que des armes légères ou moyennes.</p>\n<p>Vous attaquez avec une arme et parez avec l’autre. Vous considérez l’arme de parade comme l’équivalent d’un petit bouclier (+1 en défense contre une attaque), mais vous subissez un malus de -1 sur votre jet d’attaque avec votre autre arme.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"twoweaponsdef","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310229,"modifiedTime":1687457965157,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"uRuOskeAALWwxDEM"}
|
||||||
{"name":"La Parade de l’Erudit (Défense Totale)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.t8v7isBpnFzAbmUI"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous consacrez votre round à esquiver, parer et vous protéger des coups. Vous n’ effectuez pas d’attaque durant le round, mais bénéficiez d’un bonus de +2 en défense, qui s’ajoute éventuellement à celui que pourrait vous apporter un bouclier ou une arme secondaire de parade.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"fulldefense","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"fulldefense"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310229,"modifiedTime":1687457965159,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"vGydqADwTsHZ9B3j"}
|
{"name":"La Parade de l’Erudit (Défense Totale)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.t8v7isBpnFzAbmUI"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous consacrez votre round à esquiver, parer et vous protéger des coups. Vous n’ effectuez pas d’attaque durant le round, mais bénéficiez d’un bonus de +2 en défense, qui s’ajoute éventuellement à celui que pourrait vous apporter un bouclier ou une arme secondaire de parade.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"fulldefense","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"fulldefense"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310229,"modifiedTime":1687457965159,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"vGydqADwTsHZ9B3j"}
|
||||||
{"name":"La Rage du Barbare (Posture Offensive)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.BF7F5WvL1pbWVHNq"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous vous concentrez sur l’attaque, au détriment de votre défense. Cette option vous confère un bonus de +1 au jet d’attaque, mais vous subissez un malus de -1 en défense.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"attack","activated":false},"rank":0,"fightoptiontype":"attack"},"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_stats":{"systemId":"bol","systemVersion":"11.0.2","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687467695919,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"_id":"MMcnWBowztvbmXgN"}
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"id": "bol",
|
"id": "bol",
|
||||||
"title": "Barbarians of Lemuria",
|
"title": "Barbarians of Lemuria",
|
||||||
"description": "The Barbarians of Lemuria system for FoundryVTT!",
|
"description": "The Barbarians of Lemuria system for FoundryVTT !",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "LeRatierBretonnien",
|
"name": "LeRatierBretonnien",
|
||||||
@ -14,10 +14,9 @@
|
|||||||
],
|
],
|
||||||
"url": "https://www.uberwald.me/gitea/public/bol",
|
"url": "https://www.uberwald.me/gitea/public/bol",
|
||||||
"license": "LICENSE.txt",
|
"license": "LICENSE.txt",
|
||||||
"version": "11.0.4",
|
"version": "11.0.14",
|
||||||
"compatibility": {
|
"compatibility": {
|
||||||
"minimum": "10",
|
"minimum": "10",
|
||||||
"maximum": "11",
|
|
||||||
"verified": "11"
|
"verified": "11"
|
||||||
},
|
},
|
||||||
"esmodules": [
|
"esmodules": [
|
||||||
@ -203,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-v11.0.4.zip",
|
"download": "https://www.uberwald.me/gitea/public/bol/archive/bol-v11.0.14.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",
|
||||||
|
@ -8,14 +8,12 @@
|
|||||||
<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 isHeroAdversary}}
|
{{#if (gt defenderHeroPoints 0)}}
|
||||||
{{#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>
|
||||||
<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}}
|
{{/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>
|
||||||
|
@ -76,7 +76,7 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="property-label">{{localize "BOL.itemModifiers.init"}}</label>
|
<label class="property-label">{{localize "BOL.itemModifiers.init"}}</label>
|
||||||
<div class="form-fields">
|
<div class="form-fields">
|
||||||
<input class="field-value" type="text" name="system.properties.modifiers.init" value="{{item.system.properties.modifiers.c}}" data-dtype="Number"/>
|
<input class="field-value" type="text" name="system.properties.modifiers.init" value="{{item.system.properties.modifiers.init}}" data-dtype="Number"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
8
templates/item/post-item.hbs
Normal file
8
templates/item/post-item.hbs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<div class="post-item" data-transfer="{{transfer}}">
|
||||||
|
<h3><b>{{name}}</b></h3>
|
||||||
|
{{#if img}}
|
||||||
|
<img class="chat-icon" src="{{img}}" title="{{name}}" />
|
||||||
|
{{/if}}
|
||||||
|
<h4><b>Description : </b></h4>
|
||||||
|
<p class="card-content">{{{system.description}}}</p>
|
||||||
|
</div>
|
@ -2,9 +2,20 @@
|
|||||||
<img class="bol-hud-togglebutton" src="icons/svg/sword.svg" width="36" height="36" title="Action" />
|
<img class="bol-hud-togglebutton" src="icons/svg/sword.svg" width="36" height="36" title="Action" />
|
||||||
<div class="bol-hud-list tokenhudext right">
|
<div class="bol-hud-list tokenhudext right">
|
||||||
{{#each actionsList as |action key|}}
|
{{#each actionsList as |action key|}}
|
||||||
|
{{#if (eq system.subtype "weapon")}}
|
||||||
<div class="control-icon tokenhudicon bol-hud-menu" data-action-index="{{key}}" title="{{action.name}}">
|
<div class="control-icon tokenhudicon bol-hud-menu" data-action-index="{{key}}" title="{{action.name}}">
|
||||||
<label>{{action.name}}</label>
|
<label>{{action.name}}</label>
|
||||||
</div>
|
</div>
|
||||||
|
{{/if}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="bol-hud-list tokenhudext right2">
|
||||||
|
{{#each actionsList as |action key|}}
|
||||||
|
{{#if (eq system.subtype "fightoption")}}
|
||||||
|
<div class="control-icon tokenhudicon bol-hud-menu" data-action-index="{{key}}" title="{{action.name}}">
|
||||||
|
<label>{{action.name}}</label>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
Reference in New Issue
Block a user