Compare commits

..

17 Commits

Author SHA1 Message Date
34924b07c0 Add gitea CI/CD 2023-08-26 19:04:48 +02:00
66bf299ea4 Add gitea CI/CD 2023-08-26 19:01:51 +02:00
37ab0d01dc Add gitea CI/CD 2023-08-26 19:00:25 +02:00
2e3a97de04 Add gitea CI/CD 2023-08-26 18:11:41 +02:00
01dbe76f59 Minor fixes 2023-08-26 18:03:08 +02:00
ca33defd75 Update v11 2023-06-23 09:02:45 +02:00
2e616e3e31 Update v11 2023-06-23 08:37:56 +02:00
3be7f4bf9f Update v11 2023-06-23 08:37:50 +02:00
1b8e0840b0 Update v11 2023-06-22 23:05:50 +02:00
2cdd096c98 Update v11 2023-06-22 23:05:36 +02:00
8fcb17b566 Update v11 2023-06-22 23:05:04 +02:00
ad79dbb015 New combat options 2023-06-22 20:36:40 +02:00
73ccf44dd4 New combat options 2023-06-22 20:34:17 +02:00
ec3649799f v10/v11 compat 2023-05-25 16:29:43 +02:00
3f5f090bb9 Points de creation OK again 2023-05-24 14:00:24 +02:00
268ac0a25a Review initiative 2023-05-01 18:50:32 +02:00
59ee6684ab Fix #19 - Horoscope majeur 2023-04-29 21:48:51 +02:00
26 changed files with 412 additions and 126 deletions

54
.gitea/workflows/main.yml Normal file
View 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/module.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 ./fvtt-ecryme.zip system.json template.json README.md LICENSE.txt fonts/ images/ lang/ modules/ packs/ styles/ templates/ translated/
- 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: |-
./fvtt-ecryme.zip
system.json
api_key: '${{secrets.RELEASE_TOKEN_UBERWALD}}'

15
.gitignore vendored
View File

@ -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

View File

@ -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
- Ajout de la gestion d'effets

View File

@ -1044,9 +1044,18 @@ body.system-bol img#logo {
justify-content: flex-start;
flex-direction: column;
position: absolute;
top: 2.75rem;
/*transform: translate(0, -30%);*/
top: -4rem;
max-width: 250px;
left: 4rem;
}
.tokenhudext.right2 {
justify-content: flex-start;
flex-direction: column;
position: absolute;
top: -4rem;
left: 12rem;
}
.control-icon.tokenhudicon {
width: fit-content;
height: fit-content;
@ -1063,7 +1072,7 @@ body.system-bol img#logo {
z-index: 2;
}
.bol-hud-menu label {
font-size: 0.75rem;
font-size: 0.6rem;
}
.bol-margin-tb-2 {
margin-top: 2px;

View File

@ -156,6 +156,7 @@
"BOL.ui.armorAgiMalus": "Rüschtung+Schild-Malus (Geschick)",
"BOL.ui.armorInitMalus": "Rüstungsmalus (Init)",
"BOL.ui.attackValue": "Angriffswert",
"BOL.ui.initMalus": "Init malus",
"BOL.featureCategory.origins": "Herkünfte",
"BOL.featureCategory.races": "Rassen",
@ -354,6 +355,16 @@
"BOL.vehicleCategory.boat" : "Schiff",
"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.Short": "Kurz",

View File

@ -35,6 +35,17 @@
"BOL.ui.tab.spellalchemy": "Spells & Alchemy",
"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.description": "Description",
"BOL.ui.actions": "Actions",
@ -154,6 +165,8 @@
"BOL.ui.armorInitMalus": "Armor Modifier (Init)",
"BOL.ui.attackValue": "Attack Value",
"BOL.ui.weaponbonus": "Cette arme bénéficie déja d'un Dé de Bonus (Arme Favorite prise en compte, par exemple)",
"BOL.ui.initMalus": "Init malus",
"BOL.ui.isspecial": "Spécial ?",
"BOL.featureCategory.origins": "Origins",
"BOL.featureCategory.races": "Races",
@ -185,6 +198,7 @@
"BOL.fightOptionTypes.fulldefense": "Full Defense",
"BOL.fightOptionTypes.defense": "Defensive Posture",
"BOL.fightOptionTypes.attack": "Offensive Posture",
"BOL.fightOptionTypes.other": "Other",
"BOL.itemCategory.object": "Object",
"BOL.itemCategory.equipment": "Equipment",

View File

@ -132,6 +132,7 @@
"BOL.ui.concentrate": "Concentration à maintenir ?",
"BOL.ui.aggressive": "Sort aggressif ?",
"BOL.ui.registerInit": "Enregistrer comme Init. de combat",
"BOL.ui.initMalus": "Malus d'initiative",
"BOL.ui.magicnewrules": "Règles supplémentaires (cf. supplément fan-made Sorcellerie!)",
"BOL.ui.isSorcerer": "Carrière de Sorcier ?",
@ -217,6 +218,7 @@
"BOL.ui.itemnotfound": "Impossible de trouver l'objet de cette macro",
"BOL.ui.noinit": "Pas d'initiative trouvée, veuillez en enregistrer une.",
"BOL.ui.warninitiative": "Votre initiative n'est pas disponible. Effectuez un jet d'Initiative pour ce combat.",
"BOL.ui.isspecial": "Spéciale ?",
"BOL.featureCategory.origins": "Origines",
"BOL.featureCategory.races": "Races",
@ -251,6 +253,7 @@
"BOL.fightOptionTypes.fulldefense": "Défense totale",
"BOL.fightOptionTypes.defense": "Posture défensive",
"BOL.fightOptionTypes.attack": "Posture offensive",
"BOL.fightOptionTypes.other": "Autres",
"BOL.itemCategory.object": "Objet",
"BOL.itemCategory.equipment": "Équipement",
@ -475,6 +478,7 @@
"BOL.chat.applydamagetotarget": "Appliquer les dommages à la cible",
"BOL.chat.fightoption": "Option de combat",
"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.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.hurttitle": "{name} va encaisser {damageTotal} dégats !",
@ -518,8 +522,8 @@
"BOL.chat.horoscopepoints": "Coût : {points} Points d'Astrologie",
"BOL.chat.horoscopeminorsuccess": "Votre horoscope mineur est un succès : éditez le nom de l'horoscope sur votre fiche. Vous bénéficiez d'1 dé Bonus pour cette situation.",
"BOL.chat.horoscopeminorfailure": "Votre horoscope mineur est un échec : éditez le nom de l'horoscope sur votre fiche. Vous souffrez d'1 dé Malus pour cette situation.",
"BOL.chat.horoscopemajorsuccess": "Votre horoscope majeur est un succès : vous bénéficiez d'1 point d'Héroisme pour cette aventure. Ce point a été ajouté automatiquement.",
"BOL.chat.horoscopemajorfailure": "Votre horoscope majeur est un échec : vous perdez 1 point d'Héroisme pour cette aventure. Ce point a été enlevé automatiquement.",
"BOL.chat.horoscopemajorsuccess": "Votre horoscope majeur est un succès : {horoscopeName} bénéficie d'1 point d'Héroisme de plus pour cette aventure. Ce point a été ajouté automatiquement.",
"BOL.chat.horoscopemajorfailure": "Votre horoscope majeur est un échec : {horoscopeName} a perdu 1 point d'Héroisme pour cette aventure. Ce point a été enlevé automatiquement.",
"BOL.chat.horoscopemajorgroupsuccess": "Votre horoscope majeur de groupe est un succès. Vous et vos amis bénéficiez de {careerBonus} dés bonus pendant cette aventure.",
"BOL.chat.horoscopemajorgroupfailure": "Votre horoscope majeur de groupe est un échec. Vous et vos amis souffrez de {careerBonus} dés malus pendant cette aventure.",
"BOL.chat.usedhoroscope": "Horoscope utilisé",
@ -535,7 +539,7 @@
"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.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.inforecup": "{name} vient de récupérer {recupHP} points de Vitalité après quelques minutes de repos.",

View File

@ -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 { 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.
@ -22,6 +21,18 @@ export class BoLActor extends Actor {
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() {
if (this.type === 'character') {
@ -48,7 +59,13 @@ export class BoLActor extends Actor {
}
return false
}
/* -------------------------------------------- */
getInitiativeMalus() {
if ( this.type === 'encounter' && (this.chartype == "adversary" || this.chartype == "tough")) {
return this.system.aptitudes.init.value
}
return 0
}
/* -------------------------------------------- */
getBougette() {
if (this.type == "character") {
@ -505,11 +522,17 @@ export class BoLActor extends Actor {
this.createEmbeddedDocuments('Item', [horoscope])
}
if (rollData.horoscopeType == "major") {
if (rollData.isSuccess) {
this.subHeroPoints(1)
} else {
this.addHeroPoints(1)
let actorHoroscope = this
if(rollData.targetId) {
let token = game.scenes.current.tokens.get(rollData.targetId)
actorHoroscope = token.actor
}
if (rollData.isSuccess) {
actorHoroscope.addHeroPoints(1)
} else {
actorHoroscope.subHeroPoints(1)
}
rollData.horoscopeName = actorHoroscope.name
}
if (rollData.horoscopeType == "majorgroup") {
let rID = randomID(16)
@ -741,7 +764,7 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
buildListeActions() {
return this.melee.concat(this.ranged).concat(this.natural)
return this.melee.concat(this.ranged).concat(this.natural).concat(this.fightoptions)
}
/*-------------------------------------------- */
@ -800,6 +823,7 @@ export class BoLActor extends Actor {
whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name),
content: await renderTemplate('systems/bol/templates/chat/chat-recup-information.hbs', {
name: this.name,
img: this.img,
actorId: this.id,
lossHP: lossHP,
recupHP: Math.ceil(lossHP / 2)
@ -811,7 +835,8 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
async applyRecuperation(recupHP) {
let hp = duplicate(this.system.resources.hp)
hp.value += recupHP
//console.log("RECUP !!!!", hp, recupHP)
hp.value += Number(recupHP)
hp.value = Math.min(hp.value, hp.max)
this.update({ 'system.resources.hp': hp })
let msg = await ChatMessage.create({
@ -863,17 +888,17 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
getInitiativeRank(rollData = undefined, isCombat = false, combatData) {
if (!rollData) {
rollData = this.getFlag("world", "last-initiative")
}
let fvttInit = 4 // Pietaille par defaut
if (this.type == 'character') {
fvttInit = 5
fvttInit = -1
if (!rollData) {
if (isCombat) {
if (game.user.isGM ) {
game.socket.emit("system.bol", { name: "msg_request_init_roll", data: { actorId: this.id, combatData : combatData } })
if (this.hasPlayerOwner) {
game.socket.emit("system.bol", { name: "msg_request_init_roll", data: { actorId: this.id, combatData } })
} else {
BoLRoll.aptitudeCheck(this, "init", undefined, combatData);
}
}
}
} else {

View File

@ -122,7 +122,7 @@ Hooks.once('ready', async function () {
BoLUtility.ready()
BoLCharacterSummary.ready()
registerUsageCount('bol')
registerUsageCount(game.system.id)
welcomeMessage()

View File

@ -160,7 +160,7 @@ export class BoLRoll {
// Manage specific case
let fightOption = actor.getActiveFightOption()
if (fightOption && fightOption.system.fightoptiontype == "fulldefense") {
if (fightOption && fightOption.system.properties.fightoptiontype == "fulldefense") {
ui.notifications.warn(`{{actor.name}} est en Défense Totale ! Il ne peut pas attaquer ce round.`)
return
}
@ -220,6 +220,9 @@ export class BoLRoll {
/* -------------------------------------------- */
static horoscopeCheck(actor, event, horoscopeType) {
let target = BoLUtility.getTarget()
let cost = (horoscopeType == "minor") ? 1 : 2
if (cost > actor.getAstrologyPoints()) {
ui.notifications.warn(game.i18n.localize("BOL.ui.astrologyNoPoints"))
@ -233,6 +236,7 @@ export class BoLRoll {
rollData.astrologyPointsCost = cost
rollData.label = game.i18n.localize('BOL.ui.makeHoroscope')
rollData.description = game.i18n.localize('BOL.ui.makeHoroscope') + " " + game.i18n.localize(rollData.horoscopeTypeLabel)
rollData.targetId = target?.id
console.log("HOROSCOPE!", rollData);
return this.displayRollDialog(rollData);
@ -420,6 +424,7 @@ export class BoLRoll {
} else {
this.rollData.shieldMalus = 0
}
this.updateTotalDice()
})
html.find('#career').change((event) => {
@ -488,10 +493,10 @@ export class BoLRoll {
rollData.armorMalus = defender.armorMalusValue
rollData.shieldBlock = 'none'
let shields = defender.shields
//console.log("Defender stats", defender)
for (let shield of shields) {
rollData.shieldBlock = (shield.system.properties.blocking.blockingAll) ? 'blockall' : 'blockone';
rollData.shieldAttackMalus = (shield.system.properties.blocking.malus) ? shield.system.properties.blocking.malus : 1;
rollData.applyShieldMalus = false
}
}
}
@ -524,11 +529,6 @@ export class BoLRoll {
rollData.nbFlaws = 0
rollData.nbDice = 0
rollData.isHeroAdversary = actor.isHeroAdversary()
if (rollData.shieldBlock == 'blockall') {
rollData.shieldMalus = rollData.shieldAttackMalus;
} else {
rollData.shieldMalus = 0
}
rollData.careerBonus = rollData.careerBonus ?? 0
rollData.modRanged = rollData.modRanged ?? 0
rollData.mod = rollData.mod ?? 0
@ -541,6 +541,12 @@ export class BoLRoll {
this.preProcessFightOption(rollData)
this.updateArmorMalus(rollData)
this.updatePPCost(rollData)
// Prepare blocking case
if (rollData.shieldBlock == 'blockall') {
rollData.shieldMalus = rollData.shieldAttackMalus;
} else {
rollData.shieldMalus = 0
}
// Save
this.rollData = rollData
console.log("ROLLDATA", rollData)
@ -567,23 +573,21 @@ export class BoLRoll {
ui.notifications.warn("Pas assez de Points de Pouvoir !")
return
}
//console.log("ROLLMALUS", rollData)
rollData.registerInit = (rollData.aptitude && rollData.aptitude.key == 'init') ? $('#register-init').is(":checked") : false;
const isMalus = (rollData.bmDice < 0)
//rollData.nbDice += (rollData.attackBonusDice) ? 1 : 0
let rollbase = rollData.attrValue + rollData.aptValue
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
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 formula = (isMalus) ? rollData.nbDice + "d" + diceData.diceFormula + "kl2 + " + modifiers : rollData.nbDice + "d" + diceData.diceFormula + "kh2 + " + modifiers
rollData.formula = formula
rollData.modifiers = modifiers
console.log("Rolldata before", rollData)
let r = new BoLDefaultRoll(rollData);
r.roll();
@ -643,10 +647,11 @@ export class BoLDefaultRoll {
this.rollData.reroll = actor.heroReroll()
}
if (this.rollData.registerInit) {
actor.registerInit(this.rollData)
await actor.registerInit(this.rollData)
this.rollData.initiativeRank = actor.getInitiativeRank(this.rollData)
if (this.rollData.combatData) { // If combatData present
let combat = game.combats.get(this.rollData.combatData.combatId)
console.log("SET INIT!!!!!", this.rollData.initiativeRank)
combat.setInitiative(this.rollData.combatData.combatantId, this.rollData.initiativeRank)
}
}
@ -685,6 +690,7 @@ export class BoLDefaultRoll {
flavor: msgFlavor,
speaker: ChatMessage.getSpeaker({ actor: actor }),
})
this.rollData.roll = duplicate(this.rollData.roll) // Remove object, keep data (v111 ready)
msg.setFlag("world", "bol-roll-data", this.rollData)
})
}
@ -737,6 +743,7 @@ export class BoLDefaultRoll {
speaker: ChatMessage.getSpeaker({ actor: actor }),
flags: { msgType: "default" }
})
this.rollData.damageRoll = duplicate(this.rollData.damageRoll)
this.rollData.actor = undefined // Cleanup
msg.setFlag("world", "bol-roll-data", this.rollData)
})

View File

@ -27,23 +27,23 @@ export class BoLItemSheet extends ItemSheet {
data.category = itemData.system.category
data.isGM = game.user.isGM;
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
if (itemData.type == "item") {
if (!itemData.system.category) {
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) {
itemData.system.properties.slot = "-"
}
}
if (itemData.system.category == 'spell') {
if(!itemData.system.properties.mandatoryconditions) {
if (!itemData.system.properties.mandatoryconditions) {
itemData.system.properties.mandatoryconditions = []
}
if(!itemData.system.properties.optionnalconditions) {
if (!itemData.system.properties.optionnalconditions) {
itemData.system.properties.optionnalconditions = []
}
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 */
setPosition(options = {}) {
const position = super.setPosition(options);

View File

@ -1,5 +1,6 @@
/* -------------------------------------------- */
import { BoLRoll } from "../controllers/bol-rolls.js";
import { BoLUtility } from "../system/bol-utility.js";
/* -------------------------------------------- */
export class BoLTokenHud {
@ -30,10 +31,17 @@ export class BoLTokenHud {
(event) => {
let actionIndex = Number(event.currentTarget.attributes['data-action-index'].value)
let action = hudData.actionsList[actionIndex]
const weapon = actor.items.get( action._id )
BoLRoll.weaponCheckWithWeapon(hudData.actor, duplicate(weapon))
//console.log("Clicked", action)
} )
const actionItem = actor.items.get(action._id)
if (actionItem.system.subtype == "weapon") {
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]');
// att+apt+career
@ -41,18 +49,18 @@ export class BoLTokenHud {
(event) => {
let rollIndex = Number(event.currentTarget.attributes['data-roll-index'].value)
let roll = hudData.rollsList[rollIndex]
if ( roll.type == "aptitude") {
BoLRoll.aptitudeCheck(actor, roll.key )
} else if ( roll.type == "attribute") {
BoLRoll.attributeCheck(actor, roll.key )
if (roll.type == "aptitude") {
BoLRoll.aptitudeCheck(actor, roll.key)
} else if (roll.type == "attribute") {
BoLRoll.attributeCheck(actor, roll.key)
}
})
}
/* -------------------------------------------- */
static async addTokenHudExtensions(app, html, tokenId) {
const controlIconCombat = html.find('.control-icon[data-action=combat]')
if (controlIconCombat.length>0 ) {
const controlIconCombat = html.find('.control-icon[data-action=combat]')
if (controlIconCombat.length > 0) {
BoLTokenHud.addExtensionHud(app, html, tokenId);
}
}
@ -61,9 +69,9 @@ export class BoLTokenHud {
static async _configureSubMenu(insertionPoint, template, hudData, onMenuItem) {
const hud = $(await renderTemplate(template, hudData))
const list = hud.find('div.bol-hud-list')
BoLTokenHud._toggleHudListActive(hud, list);
hud.find('img.bol-hud-togglebutton').click(event => BoLTokenHud._toggleHudListActive(hud, list));
list.find('.bol-hud-menu').click(onMenuItem);

View File

@ -20,12 +20,15 @@ export class BoLCombatManager extends Combat {
console.log(`${game.system.title} | Combat.rollInitiative()`, ids, formula, messageOptions);
// Structure input data
ids = typeof ids === "string" ? [ids] : ids;
//const currentId = this.combatant.id;
// Get initiative malus from tough/adversary
let malusInit = 0
for (let combatant of this.combatants) {
malusInit = Math.max(malusInit, combatant.actor.getInitiativeMalus())
}
// calculate initiative
for (let cId = 0; cId < ids.length; cId++) {
for (let cId = 0; cId < ids.length; cId++) {
const combatant = this.combatants.get(ids[cId])
let fvttInit = combatant.actor.getInitiativeRank(false, true, { combatId: this.id, combatantId: combatant.id })
let fvttInit = combatant.actor.getInitiativeRank(false, true, { combatId: this.id, combatantId: combatant.id, malusInit })
fvttInit += (cId / 100)
await this.updateEmbeddedDocuments("Combatant", [{ _id: ids[cId], initiative: fvttInit }]);
}
@ -33,18 +36,20 @@ export class BoLCombatManager extends Combat {
/************************************************************************************/
nextRound() {
let combatants = this.combatants.contents
let autoRemoveDead = game.settings.get("bol", "auto-remove-dead") // Optionnal auto-removal of dead char.
for (let c of combatants) {
//let actor = game.actors.get(c.actorId)
c.actor.clearRoundModifiers()
let toRemove = []
if (autoRemoveDead && c.actor.type == "encounter" && (c.actor.system.chartype == "tough" || c.actor.system.chartype == "creature" || c.actor.system.chartype == "base") && c.actor.system.resources.hp.value <= 0) {
toRemove.push( c.id || c._id)
}
//console.log("REM", autoRemoveDead, toRemove, c.actor)
if (toRemove.length>0) {
this.deleteEmbeddedDocuments('Combatant', toRemove)
if (game.user.isGM) {
let combatants = this.combatants.contents
let autoRemoveDead = game.settings.get("bol", "auto-remove-dead") // Optionnal auto-removal of dead char.
for (let c of combatants) {
//let actor = game.actors.get(c.actorId)
c.actor.clearRoundModifiers()
let toRemove = []
if (autoRemoveDead && c.actor.type == "encounter" && (c.actor.system.chartype == "tough" || c.actor.system.chartype == "creature" || c.actor.system.chartype == "base") && c.actor.system.resources.hp.value <= 0) {
toRemove.push(c.id || c._id)
}
//console.log("REM", autoRemoveDead, toRemove, c.actor)
if (toRemove.length > 0) {
this.deleteEmbeddedDocuments('Combatant', toRemove)
}
}
}
super.nextRound()
@ -52,21 +57,25 @@ export class BoLCombatManager extends Combat {
/************************************************************************************/
startCombat() {
let combatants = this.combatants.contents
for (let c of combatants) {
let actor = game.actors.get(c.actorId)
actor.storeVitaliteCombat()
if (game.user.isGM) {
let combatants = this.combatants.contents
for (let c of combatants) {
let actor = game.actors.get(c.actorId)
actor.storeVitaliteCombat()
}
}
return super.startCombat()
}
/************************************************************************************/
/*-***********************************************************************************/
_onDelete() {
let combatants = this.combatants.contents
for (let c of combatants) {
let actor = game.actors.get(c.actorId)
actor.clearInitiative()
actor.displayRecuperation()
if (game.user.isGM) {
let combatants = this.combatants.contents
for (let c of combatants) {
let actor = game.actors.get(c.actorId)
actor.clearInitiative()
actor.displayRecuperation()
}
}
super._onDelete()
}

View File

@ -2,7 +2,7 @@ import { BoLRoll, BoLDefaultRoll } from "../controllers/bol-rolls.js";
// Spell circle to min PP cost
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 {
@ -27,8 +27,8 @@ export class BoLUtility {
onChange: lang => window.location.reload()
})
game.settings.register("bol", "auto-remove-dead", {
name: "Enlever les PNJs morts automatiquement",
hint: "Supprime les PNJ (piétaille, créatures, coriaces) automatiquement du combat lorsqu'ils sont à 0 Vitalité ou moins",
name: "Enlever les PNJs morts automatiquement au round suivant",
hint: "Supprime les PNJ (piétaille, créatures, coriaces) automatiquement du combat lorsqu'ils sont à 0 Vitalité ou moins, lors du passage au round suivant",
scope: "world",
config: true,
default: false,
@ -41,8 +41,8 @@ export class BoLUtility {
config: true,
default: "6",
type: String,
choices: { "6": "2d6", "8":"2d8", "10":"2d10", "12":"2d12", "20":"2d20"},
onChange: value => {
choices: { "6": "2d6", "8": "2d8", "10": "2d10", "12": "2d12", "20": "2d20" },
onChange: value => {
BoLUtility.setDiceFormula(value)
}
})
@ -58,7 +58,7 @@ export class BoLUtility {
step: 1
},
type: Number,
onChange: value => {
onChange: value => {
BoLUtility.setSuccessValue(value)
}
})
@ -74,7 +74,7 @@ export class BoLUtility {
step: 1
},
type: Number,
onChange: value => {
onChange: value => {
BoLUtility.setCriticalSuccessValue(value)
}
})
@ -90,7 +90,7 @@ export class BoLUtility {
step: 1
},
type: Number,
onChange: value => {
onChange: value => {
BoLUtility.setCriticalFailureValue(value)
}
})
@ -153,12 +153,12 @@ export class BoLUtility {
}
static getDiceData() {
let df = this.diceFormula
if ( !__validDices[String(this.diceFormula)]) {
if (!__validDices[String(this.diceFormula)]) {
df = "6"
}
return {
diceFormula: df,
successValue : this.successValue,
successValue: this.successValue,
criticalSuccessValue: this.criticalSuccessValue,
criticalFailureValue: this.criticalFailureValue
}
@ -199,6 +199,44 @@ export class BoLUtility {
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) {
let options = {};
@ -314,11 +352,11 @@ export class BoLUtility {
return message.getFlag("world", "bol-roll-data")
}
/* -------------------------------------------- */
static requestInitRoll(actorId, combatData ) {
let actor = game.actors.get( actorId )
static requestInitRoll(actorId, combatData) {
let actor = game.actors.get(actorId)
if (actor && actor.isOwner) {
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 => {
event.preventDefault()
event.preventDefault()
let actorId = event.currentTarget.attributes['data-actor-id'].value
let recupHP = event.currentTarget.attributes['data-recup-hp'].value
let actor = game.actors.get(actorId)
@ -422,7 +460,7 @@ export class BoLUtility {
rollData.defenseMode = defenseMode
let token = game.scenes.current.tokens.get(rollData.targetId)
let defender = token.actor
if (defenseMode == 'damage-with-armor') {
let armorFormula = defender.getArmorFormula()
rollData.rollArmor = new Roll(armorFormula)
@ -591,7 +629,7 @@ export class BoLUtility {
$(`#${sockmsg.data.id}`).hide() // Hide the options roll buttons
}
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") {
BoLUtility.processDamageHandling(sockmsg.data.attackId, sockmsg.data.defenseMode, sockmsg.data.weaponId, sockmsg.data.msgId)
@ -620,7 +658,7 @@ export class BoLUtility {
let formula = damageString
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 nbDice = parseInt(res[1])
let postForm = 'kh' + nbDice

View File

@ -281,6 +281,7 @@ BOL.fightOptionTypes = {
"fulldefense": "BOL.fightOptionTypes.fulldefense",
"defense": "BOL.fightOptionTypes.defense",
"attack": "BOL.fightOptionTypes.attack",
"other": "BOL.fightOptionTypes.other"
}
BOL.itemIcons = {

View File

@ -1,7 +1,30 @@
{"_id":"4VsEmcj4YpdAaaZY","name":"Attaque au Défaut d'armure","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","data":{"category":null,"subtype":"fightoption","description":"<p>Vous visez une zone du corps non prot&eacute;g&eacute;e ou&nbsp;un point faible de l&rsquo;armure de votre adversaire.</p>\n<p>Appliquez la valeur de protection fixe de l&rsquo;armure comme malus &agrave; votre jet d&rsquo;attaque (-1 pour une armure l&eacute;g&egrave;re, -2 pour une armure moyenne et -3 pour une armure lourde). Si votre attaque passe malgr&eacute; ce malus, les d&eacute;g&acirc;ts de votre coup ignorent la protection de l&rsquo;armure.</p>\n<p>Si le MJ l&rsquo;accepte, cette option de combat pourra &eacute;galement permettre de trouver le d&eacute;faut de l&rsquo;armure naturelle d&rsquo;une cr&eacute;ature.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"armordefault","activated":false},"rank":0,"fightoptiontype":"armordefault"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.3nzfQvMvkK4ujRqI"}}}
{"name":"Posture Défensive","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","data":{"category":null,"subtype":"fightoption","description":"<p>Vous choisissez d&rsquo;adopter une attitude prudente, en restant toujours pr&ecirc;t &agrave; parer ou &agrave; esquiver l&rsquo;attaque de votre adversaire. Combattre en posture d&eacute;fensive vous conf&egrave;re un bonus de +1 en d&eacute;fense, mais vous subissez un malus de -1 &agrave; votre jet d&rsquo;attaque.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"defense","activated":false},"rank":0,"fightoptiontype":"defense"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.CS1fCtHTxp5v1krr"}},"_id":"FQPqaB86ZkRzsKwG"}
{"name":"Défense Totale","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","data":{"category":null,"subtype":"fightoption","description":"<p>Vous consacrez votre round &agrave; esquiver, parer et vous prot&eacute;ger des coups. Vous n&rsquo; effectuez pas d&rsquo;attaque durant le round, mais b&eacute;n&eacute;ficiez d&rsquo;un bonus de +2 en d&eacute;fense, qui s&rsquo;ajoute &eacute;ventuellement &agrave; celui que pourrait vous apporter un bouclier ou une arme secondaire de parade.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"fulldefense","activated":false},"rank":0,"fightoptiontype":"fulldefense"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.t8v7isBpnFzAbmUI"}},"_id":"JRboSn5RuGILpH0B"}
{"name":"Combat à Deux Armes (Défensif)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","data":{"category":null,"subtype":"fightoption","description":"<p>Vous ne pouvez utiliser que des armes l&eacute;g&egrave;res&nbsp;ou moyennes.</p>\n<p>Vous attaquez avec une arme et parez avec l&rsquo;autre. Vous consid&eacute;rez l&rsquo;arme de parade comme l&rsquo;&eacute;quivalent d&rsquo;un petit bouclier (+1 en d&eacute;fense contre une attaque), mais vous subissez un malus de -1 sur votre jet d&rsquo;attaque avec votre autre arme.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"twoweaponsdef","activated":false},"rank":0,"fightoptiontype":"twoweapons"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"_id":"JtU8EmKuda0M4Onv"}
{"_id":"a3Ev9xm8aM9kAmi3","name":"Attaque Intrépide","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","data":{"category":null,"subtype":"fightoption","description":"<p>Vous attaquez avec la plus extr&ecirc;me t&eacute;m&eacute;rit&eacute;.</p>\n<p>Vous ne b&eacute;n&eacute;ficiez pas de l&rsquo;&eacute;ventuel bonus d&rsquo;un&nbsp;bouclier ou d&rsquo;une arme secondaire de parade et subissez un malus de -2 &agrave; la d&eacute;fense. En revanche,&nbsp;vous b&eacute;n&eacute;ficiez d&rsquo;un bonus de +2 au jet d&rsquo;attaque.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"intrepid","activated":false},"rank":0,"fightoptiontype":"intrepid"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.589BS9KBGnUazrFA"}}}
{"name":"Posture Offensive","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","data":{"category":null,"subtype":"fightoption","description":"<p>Vous vous concentrez sur l&rsquo;attaque, au d&eacute;triment&nbsp;de votre d&eacute;fense. Cette option vous conf&egrave;re un bonus de +1 au jet d&rsquo;attaque, mais vous subissez un malus de -1 en d&eacute;fense.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"attack","activated":false},"rank":0,"fightoptiontype":"attack"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.BF7F5WvL1pbWVHNq"}},"_id":"hgUHJP6JFxbeiRQL"}
{"name":"Combat à Deux Armes (Offensif)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","data":{"category":null,"subtype":"fightoption","description":"<p>Vous ne pouvez utiliser que des armes l&eacute;g&egrave;res&nbsp;ou moyennes.</p>\n<p><span style=\"font-family: var(--font-primary); font-size: var(--font-size-14);\">Vous attaquez avec vos deux armes. </span><span style=\"font-family: var(--font-primary); font-size: var(--font-size-14);\">Vous n&rsquo;effectuez qu&rsquo;un seul jet d&rsquo;attaque avec un </span>malus de -1, mais vous infligez des d&eacute;g&acirc;ts comme&nbsp;si vous maniez une arme moyenne (si vous utilisez deux armes l&eacute;g&egrave;res) ou une arme lourde (si vous&nbsp;utilisez une arme moyenne et une arme l&eacute;g&egrave;re, ou deux armes moyennes).</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"twoweaponsatt","activated":false},"rank":0,"fightoptiontype":"twoweapons"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"_id":"wM4ZIVSSKApgzEmN"}
{"name":"La Passe du Khastok","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Uniquement avec un Khastok de Malakut. Vous fauchez les jambes (ou les membres inf&eacute;rieurs) de<br>votre adversaire.</p>\n<p>Votre attaque souffre d&rsquo;un malus de -2, mais si elle occasionne des d&eacute;g&acirc;ts, la cible doit r&eacute;ussir un test d&rsquo;Agilit&eacute;, avec votre score de M&ecirc;l&eacute;e en malus ou tomber au sol.</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":1687457965170,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"4EmWdK1cv7EX0X3E"}
{"name":"Le Saut du Voleur (Distraire)","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 une man&oelig;uvre ayant pour &nbsp;objectif de distraire l&rsquo;adversaire. Vous ne portez pas<br>d&rsquo;attaque.</p>\n<p>Si vous r&eacute;ussissez un test de R&eacute;action (Esprit+Initiative) avec l&rsquo;Esprit de votre cible en malus, elle<br>subit un malus de -1 pour toutes ses actions dans le round 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":1687457965165,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"5L42okgdCMC8MZb6"}
{"name":"La Fureur de Charkond (Intimider)","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 une man&oelig;uvre physique dans l&rsquo;objectif d&rsquo;impressionner votre adversaire en lieu et place de votre attaque.</p>\n<p>Si vous r&eacute;ussissez un test de Vigueur+M&ecirc;l&eacute;e, avec l&rsquo;Esprit de votre cible en malus, elle subit un malus de -2 sur tout ses tests d&rsquo;attaque pour le reste du round. Ne fonctionne que sur un adversaire sur lequel l&rsquo;Intimidation est applicable, donc en g&eacute;n&eacute;ral ne fonctionne pas sur les cr&eacute;atures.</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":1687457965166,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"6D42OgoKxwtV5tDD"}
{"name":"Les Poignards de Karyzon (Lancer 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>Uniquement avec deux Couteaux ou Poignards de lancer. Arm&eacute; d&rsquo;un Poignard dans chaque main, vous<br>les lancez sur 2 cibles diff&eacute;rentes en m&ecirc;me temps</p>\n<p>Chaque attaque &nbsp;est &nbsp;r&eacute;solue s&eacute;par&eacute;ment et souffre d&rsquo;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":1687457965173,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"6tiu12ROxOPE31qU"}
{"name":"Le Halakh-Kriss (Spéciale Kriss)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Uniquement avec un Kriss d&rsquo;Halakh. Vous portez un coup vicieux &agrave; votre adversaire.</p>\n<p>Votre attaque souffre d&rsquo;un malus de -1, mais si elle r&eacute;ussit, vous augmentez les d&eacute;g&acirc;ts de 1 point.</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":1687457965169,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"6zSkgyYkk7EV4BGU"}
{"name":"Le Plomb de lAxos (Fronde Axos)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Uniquement avec une Fronde de l&rsquo;Axos. Vous faites tournoyer votre fronde &agrave; grande vitesse.</p>\n<p>Votre tir souffre d&rsquo;un malus de -2, mais vos d&eacute;g&acirc;ts b&eacute;n&eacute;ficient de la vigueur enti&egrave;re &agrave; la place de la moiti&eacute; de la Vigueur.</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":1687457965169,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"8p1EsWyLxvmrXc7p"}
{"name":"Le Coup de Mangaï (Entraver - Fouet)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Uniquement avec un fouet. Vous fouettez votre adversaire pour le g&ecirc;ner et l&rsquo;entraver.</p>\n<p>Votre attaque souffre d&rsquo;un malus de -2, mais si elle r&eacute;ussit, votre fouet s&rsquo;enroule autour d&rsquo;un membre de votre cible. Tant que vous maintenez le fouet, elle subit un malus de -2 pour toutes ses actions, et -1 en d&eacute;fense. En lieu et place d&rsquo;une attaque, la cible peut tenter de se lib&eacute;rer en r&eacute;ussissant un jet de Vigueur+Initiative, avec votre Vigueur en malus.</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":"9My3kH5KeAdFmF1F"}
{"name":"Le Trait du Beshaar (Javelot)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Uniquement avec un Javelot. Vous lancez votre javelot &agrave; une distance plus grande que la plupart des<br>autres aventuriers.</p>\n<p>Votre tir souffre d&rsquo;un malus de -1, mais la port&eacute;e du javelot est doubl&eacute;e (12m au lieu de 6m).</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":"9d4rHBS7CMZI0t4E","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"name":"La pose de lEsclave (Posture Défensive)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.CS1fCtHTxp5v1krr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous choisissez d&rsquo;adopter une attitude prudente, en restant toujours pr&ecirc;t &agrave; parer ou &agrave; esquiver l&rsquo;attaque de votre adversaire. Combattre en posture d&eacute;fensive vous conf&egrave;re un bonus de +1 en d&eacute;fense, mais vous subissez un malus de -1 &agrave; votre jet d&rsquo;attaque.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"defense","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"defense"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310228,"modifiedTime":1687457965159,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"AoT2c0af4lY6aBsx"}
{"name":"La Passe de Charkond (Feinte)","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 placez une botte sp&eacute;ciale, pour tromper et profiter de la d&eacute;fense de votre adversaire. Uniquement possible avec un dague ou une arme de type &eacute;p&eacute;e (sabre, cimeterre, etc.).</p>\n<p>Si vous r&eacute;ussissez un jet d&rsquo;Esprit +Carri&egrave;re guerri&egrave;re (mercenaire, soldat, etc.) en plus de votre<br>attaque, la d&eacute;fense de votre adversaire s&rsquo;ajoute &agrave; vos d&eacute;g&acirc;ts.</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":1687457965167,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"Cs2yV3V8D7kHBTmT"}
{"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&eacute;g&egrave;res ou moyennes. Vous visez l&rsquo;arme de votre adversaire<br>pour la faire tomber.</p>\n<p>Vous portez une attaque sur l&rsquo;arme, avec pour malus l&rsquo;Agilit&eacute;+M&ecirc;l&eacute;e de votre adversaire. En cas de r&eacute;ussite, l&rsquo;arme vis&eacute;e tombe au sol &agrave; 1d6-2 m&egrave;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 dAfyra (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&ecirc;me. Vous<br>ne pouvez pas attaquer ce round.</p>\n<p>Si vous r&eacute;ussissez un jet de Vigueur, vous r&eacute;cup&eacute;rez 2 Points de Vitalit&eacute;, 4 sur un succ&egrave;s H&eacute;ro&iuml;que. Ces points ne peuvent &ecirc;tre r&eacute;cup&eacute;r&eacute;s que si ils ont &eacute;t&eacute; 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&icirc;nez 2 tirs au lieu d&rsquo;un, sans pr&eacute;cision. Uniquement avec armes de jet et arcs.</p>\n<p>Vous tirez (ou lancer) tr&egrave;s rapidement, sans pr&eacute;cision, sur la m&ecirc;me cible. Chaque tir/lancer souffre d&rsquo;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&rsquo;attaque, au d&eacute;triment&nbsp;de votre d&eacute;fense. Cette option vous conf&egrave;re un bonus de +1 au jet d&rsquo;attaque, mais vous subissez un malus de -1 en d&eacute;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 lAssassin (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&egrave;re &agrave; obtenir &nbsp;une &nbsp;position &nbsp;plus avantageuse pour portez vos attaques.</p>\n<p>En plus de votre attaque normale, vous devez r&eacute;ussir un jet de R&eacute;action (Esprit+Initiative). Sur une<br>r&eacute;ussite, vous b&eacute;n&eacute;ficiez d&rsquo;un d&eacute; bonus pour votre prochaine attaque. Si vous renoncez &agrave; votre attaque, vous b&eacute;n&eacute;ficiez d&rsquo;un bonus de +2 pour le jet de R&eacute;action. Sur un &eacute;chec, c&rsquo;est votre adversaire qui b&eacute;n&eacute;ficie d&rsquo;un d&eacute; 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&ccedil;oit un malus suppl&eacute;mentaire de -1 et n&rsquo;occasionne pas de d&eacute;g&acirc;ts. En cas<br>de succ&egrave;s, votre adversaire ne peut pas attaquer ce round. Uniquement sur des adversaires au maximum de de taille sup&eacute;rieure d&rsquo;un cran &agrave; la v&ocirc;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&eacute;ussissez un test d&rsquo;Esprit+Carri&egrave;re appropri&eacute;e, avec l&rsquo;Esprit de votre cible en malus, elle<br>subit un malus de -2 en d&eacute;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 Tranchant de Parsool (Hache de Parsool)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Uniquement avec une Hache d&rsquo;Abordage de Parsool. Vous placez une attaque visant l&rsquo;armure de votre adversaire pour la d&eacute;truire.</p>\n<p>Votre attaque souffre d&rsquo;un malus de -1, mais si elle r&eacute;ussit, vous faites sauter une pi&egrave;ce d&rsquo;armure de votre adversaire au lieu de faire des d&eacute;g&acirc;ts. L&rsquo;armure touch&eacute;e se d&eacute;grade d&rsquo;un rang de protection. Uniquement valable sur des adversaires portant une armure artificielle.</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":"VfTa073U4xhs1JWp","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"name":"La Corde de Tyrus (Arc de Tyrus)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Uniquement avec un arc long de Tyrus. Vous tendez la corde si fort que votre fl&egrave;che porte plus loin.</p>\n<p>Votre attaque souffre d&rsquo;un malus de -2, mais si elle r&eacute;ussit, vous doublez la distance de tir de l&rsquo;Arc (44m au lieu de 22m).</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":1687457942169,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"WQkzlwaww7KgarAt","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"name":"Loeil du Mercenaire (Observer)","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 observez attentivement l&rsquo;un des adversaires ou un groupe d&rsquo;adversaires similaires. Vous ne<br>portez pas d&rsquo;attaque.</p>\n<p>Si vous r&eacute;ussissez un jet d&rsquo;Esprit + Carri&egrave;re &nbsp;guerri&egrave;re (mercenaire, soldat, etc.) en observant l&rsquo;adversaire, vous pouvez donner un bonus de +2 &agrave; l&rsquo;attaque ou &agrave; la d&eacute;fense &agrave; l&rsquo;un de vos alli&eacute; contre ce m&ecirc;me adversaire pour sa prochaine action de ce type. Une seule assistance peut &ecirc;tre obtenue pour un m&ecirc;me adversaire.</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":1687458428494,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"X7mIyzm1ad543fLY","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"name":"La Force de Grondil (Frappe Brutale)","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 placez une attaque brutale, sans finesse, mais avec toute votre force. Uniquement avec des armes moyenne ou plus (minimum d6 d&eacute;g&acirc;ts).</p>\n<p>Votre attaque souffre d&rsquo;un malus de -2, mais si elle r&eacute;ussit, vous pouvez ajouter la moiti&eacute; de votre Vigueur pour le calcul des d&eacute;g&acirc;ts (minimum 1). Ce bonus vient en plus du bonus de Vigueur de base d&eacute;j&agrave; applicable.</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":1687457965167,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"Xeoqf4YtG7Yh9GUz"}
{"name":"La Ruade de lAxos (Déséquilibrer)","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 cherchez &agrave; d&eacute;s&eacute;quilibrer votre adversaire. Vous ne portez pas d&rsquo;attaque.</p>\n<p>Si vous r&eacute;ussissez un jet de R&eacute;action (Esprit+Initiative) avec l&rsquo;Agilit&eacute; de votre cible comme malus, elle re&ccedil;oit un d&eacute; malus pour sa prochaine action et un malus de -1 en d&eacute;fense sur la prochaine attaque. Sur un succ&egrave;s h&eacute;ro&iuml;que et que votre cible est de la pi&eacute;taille ou un coriace, elle tombe au sol.</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":"aYGjdR5eWrIEq842","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"name":"La Feinte du Druide (Attaque au Défaut d'armure)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.3nzfQvMvkK4ujRqI"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous visez une zone du corps non prot&eacute;g&eacute;e ou&nbsp;un point faible de l&rsquo;armure de votre adversaire.</p>\n<p>Appliquez la valeur de protection fixe de l&rsquo;armure comme malus &agrave; votre jet d&rsquo;attaque (-1 pour une armure l&eacute;g&egrave;re, -2 pour une armure moyenne et -3 pour une armure lourde). Si votre attaque passe malgr&eacute; ce malus, les d&eacute;g&acirc;ts de votre coup ignorent la protection de l&rsquo;armure.</p>\n<p>Si le MJ l&rsquo;accepte, cette option de combat pourra &eacute;galement permettre de trouver le d&eacute;faut de l&rsquo;armure naturelle d&rsquo;une cr&eacute;ature.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"armordefault","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"armordefault"},"_stats":{"systemId":"bol","systemVersion":"11.0.1","coreVersion":"10.291","createdTime":1687456310227,"modifiedTime":1687458575673,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"bfQMXfvqS236M0OJ"}
{"name":"La Frappe Lémurienne (Attaque Standard)","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 portez une attaque &agrave; votre adversaire, avec votre arme. Au contact ou &agrave; distance.</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":"cqvDDFdlc6oOICxl","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"name":"La Folie du Gladiateur (Attaque Intrépide)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.589BS9KBGnUazrFA"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Vous attaquez avec la plus extr&ecirc;me t&eacute;m&eacute;rit&eacute;.</p>\n<p>Vous ne b&eacute;n&eacute;ficiez pas de l&rsquo;&eacute;ventuel bonus d&rsquo;un&nbsp;bouclier ou d&rsquo;une arme secondaire de parade et subissez un malus de -2 &agrave; la d&eacute;fense. En revanche,&nbsp;vous b&eacute;n&eacute;ficiez d&rsquo;un bonus de +2 au jet d&rsquo;attaque.</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"intrepid","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"intrepid"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310230,"modifiedTime":1687457965158,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"fTNUNRlUmfoNTkil"}
{"name":"Le Coup du Gladiateur (Combat à Deux Armes - Offensif)","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&eacute;g&egrave;res&nbsp;ou moyennes.</p>\n<p><span style=\"font-family: var(--font-primary); font-size: var(--font-size-14);\">Vous attaquez avec vos deux armes. </span><span style=\"font-family: var(--font-primary); font-size: var(--font-size-14);\">Vous n&rsquo;effectuez qu&rsquo;un seul jet d&rsquo;attaque avec un </span>malus de -1, mais vous infligez des d&eacute;g&acirc;ts comme&nbsp;si vous maniez une arme moyenne (si vous utilisez deux armes l&eacute;g&egrave;res) ou une arme lourde (si vous&nbsp;utilisez une arme moyenne et une arme l&eacute;g&egrave;re, ou deux armes moyennes).</p>","properties":{"ismalusdice":false,"isbonusdice":false,"fightoptiontype":"twoweaponsatt","isspecial":false,"activated":false},"rank":0,"fightoptiontype":"twoweapons"},"_stats":{"systemId":"bol","systemVersion":"11.0.0","coreVersion":"10.291","createdTime":1687456310231,"modifiedTime":1687457965160,"lastModifiedBy":"kQghu0tL1dft5xLu"},"folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3},"_id":"iWIttyo2UIafVsRB"}
{"name":"La Vengeance du Valgard (Epee Valgardienne)","type":"feature","img":"icons/skills/melee/weapons-crossed-poleaxes-white.webp","effects":[],"flags":{"core":{"sourceId":"Item.lyMbLMPnFk0oXaSr"}},"system":{"category":null,"subtype":"fightoption","description":"<p>Uniquement avec une &eacute;p&eacute;e Valgardienne. Si vous avez subit des d&eacute;g&acirc;ts lors de l&rsquo;attaque pr&eacute;c&eacute;dente, vous profitez du poids de votre arme pour appuyer votre coup.</p>\n<p>Si vous avez perdu des Points de Vitalit&eacute; &nbsp;lors &nbsp;de &nbsp;l&rsquo;attaque pr&eacute;c&eacute;dente, vous pouvez faire un<br>jet de Vigueur+Barbare en plus de votre attaque. Si les deux jets sont r&eacute;ussis, vous augmentez les d&eacute;g&acirc;ts de 2 points. Si seule l&rsquo;attaque est r&eacute;ussi, appliquez les d&eacute;g&acirc;ts normaux.</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":1687457942169,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"ixpHCL4Uc9DUoBJ4","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"name":"LOeil 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 &agrave; viser. Vous b&eacute;n&eacute;ficiez d&rsquo;un bonus de +2 &agrave; 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&eacute;g&egrave;res&nbsp;ou moyennes.</p>\n<p>Vous attaquez avec une arme et parez avec l&rsquo;autre. Vous consid&eacute;rez l&rsquo;arme de parade comme l&rsquo;&eacute;quivalent d&rsquo;un petit bouclier (+1 en d&eacute;fense contre une attaque), mais vous subissez un malus de -1 sur votre jet d&rsquo;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 lErudit (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 &agrave; esquiver, parer et vous prot&eacute;ger des coups. Vous n&rsquo; effectuez pas d&rsquo;attaque durant le round, mais b&eacute;n&eacute;ficiez d&rsquo;un bonus de +2 en d&eacute;fense, qui s&rsquo;ajoute &eacute;ventuellement &agrave; 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"}

View File

@ -1,7 +1,7 @@
{
"id": "bol",
"title": "Barbarians of Lemuria",
"description": "The Barbarians of Lemuria system for FoundryVTT!",
"description": "The Barbarians of Lemuria system for FoundryVTT !",
"authors": [
{
"name": "LeRatierBretonnien",
@ -14,10 +14,10 @@
],
"url": "https://www.uberwald.me/gitea/public/bol",
"license": "LICENSE.txt",
"version": "10.5.14",
"version": "11.0.7",
"compatibility": {
"minimum": "10",
"verified": "10"
"maximum": "11"
},
"esmodules": [
"module/bol.js"
@ -202,7 +202,7 @@
],
"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.14.zip",
"download": "https://www.uberwald.me/gitea/public/bol/archive/bol-v11.0.7.zip",
"background": "systems/bol/ui/page_accueil.webp",
"gridDistance": 1.5,
"gridUnits": "m",

View File

@ -30,6 +30,14 @@
{{/if}}
{{#if isAlchemist}}
<ol class="items-list">
<li class="item flexrow item-header">
<div class="item-name flex4 left">{{localize "BOL.resources.alchemypoints"}}</div>
<input class="field-value" type="text" name="system.resources.alchemypoints.value" value="{{resources.alchemypoints.value}}" data-dtype="Number"/>
</li>
</ol>
<ol class="items-list">
<li class="item flexrow item-header">
<div class="item-name flex4 left">{{localize "BOL.ui.alchemy"}}</div>

View File

@ -3,5 +3,7 @@
{{#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}}
{{#if isRealCritical}}
<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}}
{{/if}}

View File

@ -60,11 +60,17 @@
<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 (and isCritical weapon)}}
<div>
{{{localize "BOL.chat.heroicreminder"}}}
</div>
{{/if}}
{{/if}}
{{#if (and isSuccess weapon)}}
{{> "systems/bol/templates/chat/rolls/attack-damage-card.hbs"}}
{{/if}}
{{#if (and isSuccess spell)}}
{{> "systems/bol/templates/chat/rolls/spell-roll-card.hbs"}}
{{/if}}

View File

@ -11,9 +11,9 @@
{{#if (eq horoscopeType "major")}}
{{#if isSuccess}}
{{localize "BOL.chat.horoscopemajorsuccess"}}
{{localize "BOL.chat.horoscopemajorsuccess" horoscopeName=horoscopeName}}
{{else}}
{{localize "BOL.chat.horoscopemajorfailure"}}
{{localize "BOL.chat.horoscopemajorfailure" horoscopeName=horoscopeName}}
{{/if}}
{{/if}}

View File

@ -22,8 +22,13 @@
<input class="field-value" type="checkbox" name="register-init" id="register-init" checked />
</label>
</div>
</div>
</div>
<div class="flexrow" style="margin-bottom: 1px;">
<div class="flex1 center bg-darkred">
<label for="mod">{{localize 'BOL.ui.initMalus'}}</label>
</div>
<div class="flex1 center cell">{{combatData.malusInit}}</div>
</div>
{{/if}}
{{> "systems/bol/templates/dialogs/career-roll-part.hbs"}}

View File

@ -1,19 +1,25 @@
<h3 class="form-header">{{localize "BOL.ui.fightOption"}}</h3>
<div class="form-group">
<label class="property-label">{{localize "BOL.ui.fightOptionType"}}</label>
<div class="form-fields">
<select name="system.properties.fightoptiontype" data-dtype="String">
{{#select item.system.properties.fightoptiontype}}
{{#each config.fightOptionTypes as |item id|}}
<option value="{{id}}">{{localize item}}</option>
{{/each}}
{{/select}}
</select>
</div>
</div>
<div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.activated"}}</label>
<input class="field-value" type="checkbox" name="system.properties.activated" {{checked item.system.properties.activated}}>
<label class="property-label">{{localize "BOL.ui.fightOptionType"}}</label>
<div class="form-fields">
<select name="system.properties.fightoptiontype" data-dtype="String">
{{#select item.system.properties.fightoptiontype}}
{{#each config.fightOptionTypes as |item id|}}
<option value="{{id}}">{{localize item}}</option>
{{/each}}
{{/select}}
</select>
</div>
</div>
<div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.activated"}}</label>
<input class="field-value" type="checkbox" name="system.properties.activated" {{checked
item.system.properties.activated}}>
</div>
<div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.isspecial"}}</label>
<input class="field-value" type="checkbox" name="system.properties.isspecial" {{checked
item.system.properties.isspecial}}>
</div>

View File

@ -76,7 +76,7 @@
<div class="form-group">
<label class="property-label">{{localize "BOL.itemModifiers.init"}}</label>
<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 class="form-group">

View 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>

View File

@ -2,9 +2,20 @@
<img class="bol-hud-togglebutton" src="icons/svg/sword.svg" width="36" height="36" title="Action" />
<div class="bol-hud-list tokenhudext right">
{{#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}}">
<label>{{action.name}}</label>
</div>
{{/if}}
{{/each}}
</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>