Compare commits

...

12 Commits

Author SHA1 Message Date
815b5ff2ac Ajout distance 2022-10-08 17:43:09 +02:00
edf8325109 Inc version 2022-09-28 23:26:41 +02:00
895aa01419 Enable links in editor 2022-09-27 20:47:30 +02:00
9631e5e72a Merge conteneur 2022-09-26 08:28:47 +02:00
716cc53b29 Merge conteneur 2022-09-26 08:24:39 +02:00
44952d4410 Fix hotbar + tooltip 2022-09-25 21:14:39 +02:00
a7991bce92 Fix hotbar + tooltip 2022-09-25 21:13:15 +02:00
a1c20019e8 v10 init fix 2022-09-19 23:23:54 +02:00
af8576a4a1 Fix initfor combat 2022-09-09 23:49:01 +02:00
6c35ddfb0b rework ID 2022-09-02 17:31:12 +02:00
0cbcaee45e rework ID 2022-09-02 16:21:18 +02:00
904ff821e1 rework ID 2022-09-02 16:19:16 +02:00
17 changed files with 128 additions and 72 deletions

View File

@ -40,4 +40,4 @@ Maps : Emmanuel Roudier.
# Developmement
Zigmund, LeRatierBretonnien
LeRatierBretonnien, Zigmund (historical)

View File

@ -389,16 +389,16 @@ ul.no-bullets {
background-color: lightgray;
}
.bol h1.form-header {
font-size: 2.5em;
font-size: 2.2em;
font-weight: 700;
}
.bol h2.form-header {
font-size: 2em;
font-size: 1.8em;
font-weight: 500;
border-bottom: 1px groove #eeede0;
}
.bol h3.form-header {
font-size: 1.5em;
font-size: 1.2em;
font-weight: 500;
border-bottom: 1px groove #eeede0;
}

View File

@ -392,6 +392,20 @@
"BOL.chat.nodamagesummary": "Aucun dégats n'a été subi ....",
"BOL.chat.damageresume": "{name} a subi des blessures ...",
"BOL.chat.fumblemessage": "Si vous acceptez les conséquences d'un echec catastrophique (au choix du MJ), vous pourrez bénéficier d'1 point d'Héroïsme supplémentaire",
"BOL.chat.rangeinfo": "Tir/Lancer de {attackerName} vers {defenderName}",
"BOL.chat.rangeweaponinfo": "Arme : {weaponName} - Portée de base {weaponRange}",
"BOL.chat.rangeout": "Modificateur : Hors de portée",
"BOL.chat.range0": "Modificateur : Bout portant (+1)",
"BOL.chat.range1": "Modificateur : Portée courte (0)",
"BOL.chat.range2": "Modificateur : Portée moyenne (-1)",
"BOL.chat.range3": "Modificateur : Portée longue (-2)",
"BOL.chat.range4": "Modificateur : Portée très longue (-4)",
"BOL.chat.range5": "Modificateur : Portée extrême (-6)",
"BOL.chat.range6": "Modificateur : Portée maximale (-8)",
"BOL.chat.rangeprefix": "Distance évaluée : ",
"BOL.chat.rangevisible": "La ligne de vue est dégagée entre les protagonistes.",
"BOL.chat.rangenotvisible": "La ligne de vue est bloquée entre les protagonistes.",
"BOL.chat.rangetitle": "Information MJ",
"BOL.dialog.soeasy": "Inmanquable (+4)",
"BOL.dialog.veryeasy": "Trés Facile (+2)",

View File

@ -12,7 +12,7 @@ export class BoLActorSheet extends ActorSheet {
return mergeObject(super.defaultOptions, {
classes: ["bol", "sheet", "actor"],
template: "systems/bol/templates/actor/actor-sheet.hbs",
width: 600,
width: 860,
height: 600,
dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }],
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "stats" }]
@ -114,7 +114,7 @@ export class BoLActorSheet extends ActorSheet {
/* -------------------------------------------- */
/** @override */
getData(options) {
async getData(options) {
const data = super.getData(options)
const actorData = duplicate(data)
let formData = duplicate(data)
@ -148,8 +148,9 @@ export class BoLActorSheet extends ActorSheet {
formData.editScore = this.options.editScore
formData.useBougette = BoLUtility.getUseBougette()
formData.charType = this.actor.getCharType()
formData.villainy = this.actor.getVillainy()
formData.villainy = this.actor.getVillainy()
formData.biography = await TextEditor.enrichHTML(this.object.system.details.biography, {async: true})
formData.notes = await TextEditor.enrichHTML(this.object.system.details.notes, {async: true})
formData.isSorcerer = this.actor.isSorcerer()
formData.isAlchemist = this.actor.isAlchemist()
formData.isPriest = this.actor.isPriest()

View File

@ -67,6 +67,44 @@ export class BoLRoll {
})
}
/* -------------------------------------------- */
static async detectDistance( weapon, target ) {
let visible, dist
if (weapon.system.properties.ranged || weapon.system.properties.throwing) {
console.log("target", target, weapon)
visible = canvas.effects.visibility.testVisibility(target.center, { object: _token })
dist = Number(canvas.grid.measureDistances([{ ray: new Ray(_token.center, target.center) }], { gridSpaces: false })).toFixed(2)
let range = Number(weapon.system.properties.range)
let rangeMsg = "BOL.chat.rangeout"
if ( dist <= range) {
rangeMsg = "BOL.chat.range0"
} else if (dist < range*2) {
rangeMsg = "BOL.chat.range1"
} else if (dist < range*3) {
rangeMsg = "BOL.chat.range2"
} else if (dist < range*4) {
rangeMsg = "BOL.chat.range3"
} else if (dist < range*5) {
rangeMsg = "BOL.chat.range4"
} else if (dist < range*6) {
rangeMsg = "BOL.chat.range5"
} else if (dist < range*7) {
rangeMsg = "BOL.chat.range6"
}
ChatMessage.create({
content: await renderTemplate('systems/bol/templates/chat/chat-info-range.hbs', {
weapon: weapon,
attackerName: _token.actor.name,
defenderName: target.actor.name,
weaponRange: weapon.system.properties.range,
visible: visible,
distance: dist,
rangeMsg: rangeMsg
})
})
}
}
/* -------------------------------------------- */
static weaponCheckWithWeapon(actor, weapon) {
@ -76,6 +114,9 @@ export class BoLRoll {
let attribute = eval(`actor.system.attributes.${weaponData.properties.attackAttribute}`)
let aptitude = eval(`actor.system.aptitudes.${weaponData.properties.attackAptitude}`)
// Compute distance
this.detectDistance( weapon, target)
// Manage specific case
let fightOption = actor.getActiveFightOption()
if (fightOption && fightOption.system.fightoptiontype == "fulldefense") {

View File

@ -19,7 +19,7 @@ export class BoLItemSheet extends ItemSheet {
/* -------------------------------------------- */
/** @override */
getData(options) {
async getData(options) {
const data = super.getData(options)
let itemData = duplicate(data.document)
data.config = game.bol.config
@ -27,6 +27,7 @@ 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})
// Dynamic default data fix/adapt
if (itemData.type == "item") {

View File

@ -15,7 +15,7 @@ export class BoLCombatManager extends Combat {
/************************************************************************************/
async rollInitiative(ids, formula = undefined, messageOptions = {}) {
console.log(`${game.data.system.data.title} | Combat.rollInitiative()`, ids, formula, messageOptions);
console.log(`${game.system.title} | Combat.rollInitiative()`, ids, formula, messageOptions);
// Structure input data
ids = typeof ids === "string" ? [ids] : ids;
const currentId = this.combatant._id;
@ -24,6 +24,7 @@ export class BoLCombatManager extends Combat {
for (let cId = 0; cId < ids.length; cId++) {
const combatant = this.combatants.get(ids[cId]);
let fvttInit = 5
//console.log("TYPE", combatant.actor.type)
if (combatant.actor.type == 'character') {
let initData = combatant.actor.getLastInitData()
console.log("Init data !!!", initData)
@ -37,11 +38,12 @@ export class BoLCombatManager extends Combat {
fvttInit = 3
}
} else {
fvttInit = 4 // Pietaille par defaut
if ( combatant.actor.getSubtype == 'adversary') {
fvttInit = 4 // Pietaille par defautco
//console.log("ACTOR", combatant.actor.getCharType())
if ( combatant.actor.getCharType() == 'adversary') {
fvttInit = 7
}
if ( combatant.actor.getSubtype == 'tough') {
if ( combatant.actor.getCharType() == 'tough') {
fvttInit = 6
}
}

View File

@ -2,6 +2,21 @@ import { BoLRoll } from "../controllers/bol-rolls.js";
export class BoLHotbar {
static async assignToHotBar( item, slot) {
let command = `game.bol.BoLHotbar.rollMacro("${item.name}", "${item.type}");`
let macro = game.macros.contents.find(m => (m.name === item.name) && (m.command === command))
if (!macro) {
macro = await Macro.create({
name: item.name,
type: "script",
img: item.img,
command: command
}, { displaySheet: false })
}
await game.user.assignHotbarMacro(macro, slot);
}
/**
* Create a macro when dropping an entity on the hotbar
* Item - open roll dialog for item
@ -10,55 +25,20 @@ export class BoLHotbar {
*/
static init( ) {
Hooks.on("hotbarDrop", async (bar, documentData, slot) => {
Hooks.on("hotbarDrop", (bar, documentData, slot) => {
// Create item macro if rollable item - weapon, spell, prayer, trait, or skill
if (documentData.type == "Item") {
console.log("Drop done !!!", bar, documentData, slot)
let item = documentData.data
let command = `game.bol.BoLHotbar.rollMacro("${item.name}", "${item.type}");`
let macro = game.macros.contents.find(m => (m.name === item.name) && (m.command === command))
if (!macro) {
macro = await Macro.create({
name: item.name,
type: "script",
img: item.img,
command: command
}, { displaySheet: false })
let item = fromUuidSync(documentData.uuid)
if (item == undefined) {
item = this.actor.items.get(documentData.uuid)
}
game.user.assignHotbarMacro(macro, slot);
}
// Create a macro to open the actor sheet of the actor dropped on the hotbar
else if (documentData.type == "Actor") {
let actor = game.actors.get(documentData.id);
let command = `game.actors.get("${documentData.id}").sheet.render(true)`
let macro = game.macros.contents.find(m => (m.name === actor.name) && (m.command === command));
if (!macro) {
macro = await Macro.create({
name: actor.data.name,
type: "script",
img: actor.data.img,
command: command
}, { displaySheet: false })
game.user.assignHotbarMacro(macro, slot);
if (item && (item.system.subtype === "weapon" || item.system.category === "spell")) {
this.assignToHotBar( item, slot )
return false
}
}
// Create a macro to open the journal sheet of the journal dropped on the hotbar
else if (documentData.type == "JournalEntry") {
let journal = game.journal.get(documentData.id);
let command = `game.journal.get("${documentData.id}").sheet.render(true)`
let macro = game.macros.contents.find(m => (m.name === journal.name) && (m.command === command));
if (!macro) {
macro = await Macro.create({
name: journal.data.name,
type: "script",
img: "systems/bol/icons/images/icone_parchement_vierge.webp",
command: command
}, { displaySheet: false })
game.user.assignHotbarMacro(macro, slot);
}
}
return false;
});
return true
})
}
/** Roll macro */
@ -76,10 +56,10 @@ export class BoLHotbar {
return ui.notifications.warn(`Impossible de trouver l'objet de cette macro`)
}
// Trigger the item roll
if (item.data.data.category === "equipment" && item.data.data.subtype === "weapon") {
if (item.system.category === "equipment" && item.system.subtype === "weapon") {
return BoLRoll.weaponCheckWithWeapon( actor, item)
}
if (item.data.data.category === "spell") {
if (item.system.category === "spell") {
return BoLRoll.spellCheckWithSpell( actor, item)
}
}

View File

@ -14,11 +14,9 @@
],
"url": "https://www.uberwald.me/gitea/public/bol",
"license": "LICENSE.txt",
"version": "10.0.7",
"version": "10.2.1",
"compatibility": {
"minimum": "10",
"verified": "10.284",
"maximum": "10"
"minimum": "10"
},
"esmodules": [
"module/bol.js"
@ -194,7 +192,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.0.7.zip",
"download": "https://www.uberwald.me/gitea/public/bol/archive/bol-v10.2.1.zip",
"background": "systems/images/map_lemurie.webp",
"gridDistance": 1.5,
"gridUnits": "m",

View File

@ -40,7 +40,7 @@
</li>
</ol>
{{editor details.biography target="system.details.biography" button=true owner=owner
{{editor biography target="system.details.biography" button=true owner=owner
editable=editable}}
<ol class="items-list">
@ -49,4 +49,4 @@ editable=editable}}
<div class="item-field flex1 right"></div>
</li>
</ol>
{{editor details.notes target="system.details.notes" button=true owner=owner editable=editable}}
{{editor notes target="system.details.notes" button=true owner=owner editable=editable}}

View File

@ -0,0 +1,19 @@
<div>
<img class="chat-icon" src="{{weapon.img}}" alt="{{weapon.name}}"/>
<h2 class="bad"><strong>{{localize "BOL.chat.rangetitle"}}</strong></h2>
</div>
<div class="flexrow">
{{localize "BOL.chat.rangeinfo" attackerName=attackerName defenderName=defenderName}}
{{#if visible}}
<br>{{localize "BOL.chat.rangevisible"}}
{{else}}
<br>{{localize "BOL.chat.rangenotvisible"}}
{{/if}}
<br>{{localize "BOL.chat.rangeweaponinfo" weaponName=weapon.name weaponRange=weaponRange}} m.
<br>{{localize "BOL.chat.rangeprefix"}} {{distance}} m.
<br>{{localize rangeMsg}}
</div>

View File

@ -1,5 +1,5 @@
<div class="flexrow box-roll">
<div class="flex1 center bg-darkred">
<div class="flex1 center bg-darkred" >
<label for="attr">{{localize 'BOL.ui.attribute'}}</label>
</div>
<div class="flex1 center cell">

View File

@ -1,6 +1,6 @@
{{#if (count boons)}}
<div class="flexrow roll-box" >
<div class="flex1 center bg-darkred">
<div class="flex1 center bg-darkred" data-tooltip-direction="LEFT" data-tooltip="Click-gauche pour sélectionner, CTRL+Click gauche pour déselectionner">
<label for="mod">{{localize 'BOL.ui.boons'}}</label>
</div>
<div class="flex1 center cell">

View File

@ -1,6 +1,6 @@
{{#if careers}}
<div class="flexrow roll-box">
<div class="flex1 center bg-darkred">
<div class="flex1 center bg-darkred" data-tooltip-direction="LEFT" data-tooltip="Click-gauche pour selectionner, CTRL+Click gauche pour déselectionner">
<label for="mod">{{localize 'BOL.ui.careers'}}</label>
</div>
<div class="flex1 center cell">

View File

@ -1,6 +1,6 @@
{{#if (count flaws)}}
<div class="flexrow roll-box">
<div class="flex1 center bg-darkred">
<div class="flex1 center bg-darkred" data-tooltip-direction="LEFT" data-tooltip="Click-gauche pour selectionner, CTRL+Click gauche pour déselectionner">
<label for="mod">{{localize 'BOL.ui.flaws'}}</label>
</div>
<div class="flex1 center cell">

View File

@ -8,7 +8,7 @@
</div>
</header>
{{#if weapon.data.data.properties.onlymodifier}}
{{#if weapon.system.properties.onlymodifier}}
{{else}}
{{> "systems/bol/templates/dialogs/attribute-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/aptitude-roll-part.hbs"}}

View File

@ -20,7 +20,7 @@
</div>
{{/if}}
{{editor item.system.description target="system.description" button=true owner=owner editable=editable}}
{{editor description target="system.description" button=true owner=owner editable=editable}}
</div>
<div class="tab properties" data-group="primary" data-tab="properties">
{{#if (eq item.type "item")}}