Compare commits

..

53 Commits

Author SHA1 Message Date
871a18a0ee Correction sur talent Dragon 2025-11-21 21:21:45 +01:00
264c49eb06 Fix release mess 2025-11-07 00:30:31 +01:00
9349c54966 Enhance CSS+fonts 2025-10-26 21:39:25 +01:00
274efac2b5 Enhance CSS+fonts 2025-10-26 15:39:08 +01:00
7a7398f8ca Correction sur styles CSS 2025-10-20 22:30:15 +02:00
93600f7e13 Correction sur styles CSS 2025-10-20 22:29:22 +02:00
a6fa3afbee Double adversités 2025-08-24 17:00:06 +02:00
1051349dd0 Correction sur usage BA sur un jet impair au D20 2025-06-24 21:04:58 +02:00
a245b0e87c Corrections sur couleur des pages dans les journaux 2025-06-03 13:32:11 +02:00
c9ce3367ed Corrections sur couleur des pages dans les journaux 2025-06-03 13:31:17 +02:00
e95e068112 Fix perte de combatitivité sur action d'un joueur 2025-06-03 09:37:50 +02:00
6dd63a2c54 Hawkmoon : Foundry v13 migration 2025-04-30 23:26:24 +02:00
650e4b7449 Hawkmoon : Foundry v13 migration 2025-04-30 23:24:55 +02:00
3f27482ad9 Hawkmoon : Foundry v13 migraton 2025-04-30 23:23:32 +02:00
436b282ff5 Correction sur se désengager 2025-03-28 18:09:36 +01:00
39f8cfdbcc Correction sur 2 attaques avec ambidextrie 2025-03-28 14:56:52 +01:00
24a57a906e Fix protection pour creatures 2025-02-07 20:43:03 +01:00
667f3678fb Fix protection pour creatures 2025-02-07 20:42:14 +01:00
d5dd9e5bf7 Cleanup welcome scene 2024-08-23 13:49:57 +02:00
3403b72d1f ajout item sur cellule + augmentation bonus et difficultés 2024-08-22 14:39:42 +02:00
8a4487c833 ajout item sur cellule + augmentation bonus et difficultés 2024-08-22 14:39:30 +02:00
4eece5aaf4 Correction sur carte europe 2024-06-18 17:26:55 +02:00
b574ba76ef Fix combativite 2024-06-01 09:17:57 +02:00
0b9e1a80af Fix talents + artefacts 2024-05-31 23:25:43 +02:00
6505b1c969 Fix talents + artefacts 2024-05-31 23:16:28 +02:00
280e90d7a6 Fix initiative 2024-05-31 14:03:36 +02:00
4fa9a911a0 Ameliorations creatures 2024-05-30 08:30:29 +02:00
b8c61f8f12 Fix sheets 2024-05-24 08:25:25 +02:00
b47b14a4b1 Fix sheets 2024-05-24 08:24:40 +02:00
9391acf6ee Add v12 support 2024-05-23 11:33:02 +02:00
8af9c582bf Preparation du passage en v12 2024-05-05 18:06:29 +02:00
fac158e0ad Fix v11/v12 2024-05-02 09:27:16 +02:00
69a2f81ede Correction sur SD à distance 2024-04-24 20:39:39 +02:00
005d390941 Support de toutes les options de combat 2024-04-01 22:48:18 +02:00
3327109f7e Compendiusm again 2024-02-24 17:03:57 +01:00
b38bfc97c2 Compendiusm again 2024-02-24 17:03:31 +01:00
89a7730d43 Ajout des mutations 2024-02-24 15:55:29 +01:00
2ebd1bd1fd Ajout des mutations 2024-02-24 15:54:47 +01:00
9e023d3f01 Fix calcul defense 2024-02-15 11:47:15 +01:00
2c12ec38fb Enhance stats 2024-02-08 12:51:41 +01:00
38059232cb Automatisations de combats, WIP 2023-12-28 18:40:46 +01:00
c331604393 Predilections et warning 2023-12-21 21:02:11 +01:00
71c1e1cd29 Affichage des specialisations 2023-12-19 21:52:59 +01:00
4a2ca5fab5 CSS fixes 2023-11-26 14:07:55 +01:00
ea8c82256c v11 ready 2023-08-21 22:46:12 +02:00
7df8aad4dc v11 ready 2023-08-16 13:02:06 +02:00
bb38705d52 Fix arme à distance + modificateur de vigueur 2023-08-16 10:51:19 +02:00
4344a5fbd3 v11 ready 2023-08-16 10:32:02 +02:00
df461fecf9 Fix css for compendiums 2023-05-29 17:08:21 +02:00
3aeb51c8ac Fix css for compendiums 2023-05-29 16:35:16 +02:00
154e9d3da5 Fix css for compendiums 2023-05-29 16:07:59 +02:00
9b58acc058 v10/v11 compatibility 2023-05-25 07:24:34 +02:00
189411eef8 v10/v11 compatibility 2023-05-25 07:23:25 +02:00
152 changed files with 3655 additions and 2143 deletions

11
.gitignore vendored
View File

@@ -1 +1,10 @@
.history/ .vscode/settings.json
.idea
.history
todo.md
/.vscode
/ignored/
/node_modules/
/jsconfig.json
/package.json
/package-lock.json

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/icons/mutation.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

View File

@@ -1,25 +1,25 @@
{ {
"ACTOR": { "TYPES": {
"TypePersonnage": "Personnage", "Actor": {
"TypeCellule": "Cellule", "personnage": "Personnage",
"TypeCreature": "Créature" "cellule": "Cellule",
"creature": "Créature"
},
"Item": {
"artefact": "Artefact",
"arme": "Arme",
"talent": "Talent",
"historique": "Historique",
"profil": "Profil",
"competence": "Compétence",
"protection": "Protection",
"monnaie": "Monnaie",
"equipement": "Equipement",
"ressource": "Ressource",
"contact": "Contact",
"mutation": "Mutation"
}
}, },
"ITEM": {
"TypeArtefact": "Artefact",
"TypeArme": "Arme",
"TypeTalent": "Talent",
"TypeHistorique": "Historique",
"TypeProfil": "Profil",
"TypeCompetence": "Compétence",
"TypeProtection": "Protection",
"TypeMonnaie": "Monnaie",
"TypeEquipement": "Equipement",
"TypeRessource": "Ressource",
"TypeContact": "Contact"
},
"HAWKMOON": { "HAWKMOON": {
"ui": { "ui": {
"editContact": "Modifier le contact", "editContact": "Modifier le contact",

View File

@@ -7,12 +7,12 @@ import { HawkmoonUtility } from "./hawkmoon-utility.js";
import { HawkmoonAutomation } from "./hawkmoon-automation.js"; import { HawkmoonAutomation } from "./hawkmoon-automation.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
export class HawkmoonActorSheet extends ActorSheet { export class HawkmoonActorSheet extends foundry.appv1.sheets.ActorSheet {
/** @override */ /** @override */
static get defaultOptions() { static get defaultOptions() {
return mergeObject(super.defaultOptions, { return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["fvtt-hawkmoon-cyd", "sheet", "actor"], classes: ["fvtt-hawkmoon-cyd", "sheet", "actor"],
template: "systems/fvtt-hawkmoon-cyd/templates/actor-sheet.html", template: "systems/fvtt-hawkmoon-cyd/templates/actor-sheet.html",
width: 640, width: 640,
@@ -25,7 +25,7 @@ export class HawkmoonActorSheet extends ActorSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async getData() { async getData() {
const objectData = duplicate(this.object) const objectData = foundry.utils.duplicate(this.object)
let formData = { let formData = {
title: this.title, title: this.title,
@@ -39,26 +39,30 @@ export class HawkmoonActorSheet extends ActorSheet {
effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)), effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)),
limited: this.object.limited, limited: this.object.limited,
skills: this.actor.getSkills(), skills: this.actor.getSkills(),
armes: duplicate(this.actor.getWeapons()), armes: foundry.utils.duplicate(this.actor.getWeapons()),
monnaies: duplicate(this.actor.getMonnaies()), monnaies: foundry.utils.duplicate(this.actor.getMonnaies()),
protections: duplicate(this.actor.getArmors()), protections: foundry.utils.duplicate(this.actor.getArmors()),
historiques: duplicate(this.actor.getHistoriques() || []), historiques: foundry.utils.duplicate(this.actor.getHistoriques() || []),
talents: duplicate(this.actor.getTalents() || []), talents: foundry.utils.duplicate(this.actor.getTalents() || []),
mutations: foundry.utils.duplicate(this.actor.getMutations() || []),
talentsCell: this.getCelluleTalents(), talentsCell: this.getCelluleTalents(),
profils: duplicate(this.actor.getProfils() || []), profils: foundry.utils.duplicate(this.actor.getProfils() || []),
combat: this.actor.getCombatValues(), combat: this.actor.getCombatValues(),
equipements: duplicate(this.actor.getEquipments()), equipements: foundry.utils.duplicate(this.actor.getEquipments()),
artefacts: duplicate(this.actor.getArtefacts()), artefacts: foundry.utils.duplicate(this.actor.getArtefacts()),
monnaies: duplicate(this.actor.getMonnaies()),
richesse: this.actor.computeRichesse(), richesse: this.actor.computeRichesse(),
coupDevastateur: this.actor.items.find(it => it.type =="talent" && it.name.toLowerCase() == "coup devastateur" && !it.system.used),
valeurEquipement: this.actor.computeValeurEquipement(), valeurEquipement: this.actor.computeValeurEquipement(),
nbCombativite: this.actor.system.sante.nbcombativite,
combativiteList: HawkmoonUtility.getCombativiteList(this.actor.system.sante.nbcombativite),
initiative: this.actor.getFlag("world", "last-initiative") || -1, initiative: this.actor.getFlag("world", "last-initiative") || -1,
description: await TextEditor.enrichHTML(this.object.system.biodata.description, {async: true}), description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.description, {async: true}),
habitat: await TextEditor.enrichHTML(this.object.system.biodata.habitat, {async: true}), habitat: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.habitat, {async: true}),
options: this.options, options: this.options,
owner: this.document.isOwner, owner: this.document.isOwner,
editScore: this.options.editScore, editScore: this.options.editScore,
isGM: game.user.isGM isGM: game.user.isGM,
config: game.system.hawkmoon.config
} }
this.formData = formData; this.formData = formData;
@@ -87,14 +91,14 @@ export class HawkmoonActorSheet extends ActorSheet {
// Everything below here is only needed if the sheet is editable // Everything below here is only needed if the sheet is editable
if (!this.options.editable) return; if (!this.options.editable) return;
// Update Inventory Item // Update Inventory Item
html.find('.item-edit').click(ev => { html.find('.item-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item") const li = $(ev.currentTarget).parents(".item")
let itemId = li.data("item-id") let itemId = li.data("item-id")
const item = this.actor.items.get( itemId ) const item = this.actor.items.get( itemId )
item.sheet.render(true) item.sheet.render(true)
}) })
// Delete Inventory Item // Delete Inventory Item
html.find('.item-delete').click(ev => { html.find('.item-delete').click(ev => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item");
@@ -116,7 +120,7 @@ export class HawkmoonActorSheet extends ActorSheet {
let value = Number($(event.currentTarget).data("adversite-value")) let value = Number($(event.currentTarget).data("adversite-value"))
this.actor.incDecAdversite(adv, value) this.actor.incDecAdversite(adv, value)
}) })
html.find('.quantity-modify').click(event => { html.find('.quantity-modify').click(event => {
const li = $(event.currentTarget).parents(".item") const li = $(event.currentTarget).parents(".item")
const value = Number($(event.currentTarget).data("quantite-value")) const value = Number($(event.currentTarget).data("quantite-value"))
@@ -126,7 +130,7 @@ export class HawkmoonActorSheet extends ActorSheet {
html.find('.roll-initiative').click((event) => { html.find('.roll-initiative').click((event) => {
this.actor.rollAttribut("adr", true) this.actor.rollAttribut("adr", true)
}) })
html.find('.roll-attribut').click((event) => { html.find('.roll-attribut').click((event) => {
const li = $(event.currentTarget).parents(".item") const li = $(event.currentTarget).parents(".item")
let attrKey = li.data("attr-key") let attrKey = li.data("attr-key")
@@ -143,29 +147,46 @@ export class HawkmoonActorSheet extends ActorSheet {
let armeId = li.data("item-id") let armeId = li.data("item-id")
this.actor.rollArmeOffensif(armeId) this.actor.rollArmeOffensif(armeId)
}) })
html.find('.roll-assommer').click((event) => {
this.actor.rollAssommer()
})
html.find('.roll-coup-bas').click((event) => {
this.actor.rollCoupBas()
})
html.find('.roll-immobiliser').click((event) => {
this.actor.rollImmobiliser()
})
html.find('.roll-repousser').click((event) => {
this.actor.rollRepousser()
})
html.find('.roll-desengager').click((event) => {
this.actor.rollDesengager()
})
html.find('.roll-arme-degats').click((event) => { html.find('.roll-arme-degats').click((event) => {
const li = $(event.currentTarget).parents(".item") const li = $(event.currentTarget).parents(".item")
let armeId = li.data("item-id") let armeId = li.data("item-id")
this.actor.rollArmeDegats(armeId) this.actor.rollArmeDegats(armeId)
}) })
html.find('.item-add').click((event) => { html.find('.item-add').click((event) => {
const itemType = $(event.currentTarget).data("type") const itemType = $(event.currentTarget).data("type")
this.actor.createEmbeddedDocuments('Item', [{ name: `Nouveau ${itemType}`, type: itemType }], { renderSheet: true }) this.actor.createEmbeddedDocuments('Item', [{ name: `Nouveau ${itemType}`, type: itemType }], { renderSheet: true })
}) })
html.find('.lock-unlock-sheet').click((event) => { html.find('.lock-unlock-sheet').click((event) => {
this.options.editScore = !this.options.editScore; this.options.editScore = !this.options.editScore;
this.render(true); this.render(true);
}); });
html.find('.item-equip').click(ev => { html.find('.item-equip').click(ev => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item");
this.actor.equipItem( li.data("item-id") ); this.actor.equipItem( li.data("item-id") );
this.render(true); this.render(true);
}); });
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
/** @override */ /** @override */
setPosition(options = {}) { setPosition(options = {}) {

View File

@@ -17,8 +17,8 @@ export class HawkmoonActor extends Actor {
/** /**
* Override the create() function to provide additional SoS functionality. * Override the create() function to provide additional SoS functionality.
* *
* This overrided create() function adds initial items * This overrided create() function adds initial items
* Namely: Basic skills, money, * Namely: Basic skills, money,
* *
* @param {Object} data Barebones actor data which this function adds onto. * @param {Object} data Barebones actor data which this function adds onto.
* @param {Object} options (Unused) Additional options which customize the creation workflow. * @param {Object} options (Unused) Additional options which customize the creation workflow.
@@ -67,21 +67,26 @@ export class HawkmoonActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
prepareArme(arme) { prepareArme(arme) {
arme = duplicate(arme) if (this.type == "cellule") {
return arme
}
arme = foundry.utils.duplicate(arme)
let combat = this.getCombatValues() let combat = this.getCombatValues()
if (arme.system.typearme == "contact" || arme.system.typearme == "contactjet") { if (arme.system.typearme == "contact" || arme.system.typearme == "contactjet") {
let bonusDefense = this.getBonusDefenseFromTalents() let bonusDefense = this.getBonusDefenseFromTalents()
arme.system.competence = duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "mêlée")) arme.system.competence = foundry.utils.duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "mêlée"))
arme.system.attrKey = "pui" arme.system.attrKey = "pui"
arme.system.totalDegats = arme.system.degats + "+" + combat.bonusDegatsTotal arme.system.totalDegats = arme.system.degats + "+" + combat.bonusDegatsTotal
arme.system.totalOffensif = this.system.attributs.pui.value + arme.system.competence.system.niveau + arme.system.bonusmaniementoff arme.system.totalOffensif = this.system.attributs.pui.value + arme.system.competence.system.niveau + arme.system.bonusmaniementoff + (this.system.combat.monte ? 3 : 0)
arme.system.totalDefensif = combat.defenseTotal + arme.system.competence.system.niveau + arme.system.seuildefense + bonusDefense arme.system.totalDefensif = combat.defenseTotal + arme.system.competence.system.niveau + arme.system.seuildefense + bonusDefense + (this.system.combat.monte ? 3 : 0)
console.log("Arme", arme.system.totalDefensif, combat, arme.system.competence.system.niveau, arme.system.seuildefense, bonusDefense)
arme.system.isdefense = true arme.system.isdefense = true
arme.system.isMelee = true arme.system.isMelee = true
arme.system.isDistance = false arme.system.isDistance = false
} }
if (arme.system.typearme == "jet" || arme.system.typearme == "tir") { if (arme.system.typearme == "jet" || arme.system.typearme == "tir") {
arme.system.competence = duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "armes à distance")) arme.system.competence = foundry.utils.duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "armes à distance"))
arme.system.attrKey = "adr" arme.system.attrKey = "adr"
arme.system.totalOffensif = this.system.attributs.adr.value + arme.system.competence.system.niveau + arme.system.bonusmaniementoff arme.system.totalOffensif = this.system.attributs.adr.value + arme.system.competence.system.niveau + arme.system.bonusmaniementoff
arme.system.totalDegats = arme.system.degats arme.system.totalDegats = arme.system.degats
@@ -118,7 +123,7 @@ export class HawkmoonActor extends Actor {
} }
getArtefacts() { getArtefacts() {
return this.getItemSorted(["artefact"]) return this.getItemSorted(["artefact"])
} }
getArmors() { getArmors() {
return this.getItemSorted(["protection"]) return this.getItemSorted(["protection"])
} }
@@ -137,12 +142,15 @@ export class HawkmoonActor extends Actor {
getContacts() { getContacts() {
return this.getItemSorted(["contact"]) return this.getItemSorted(["contact"])
} }
getMutations() {
return this.getItemSorted(["mutation"])
}
/* -------------------------------------------- */ /* -------------------------------------------- */
getSkills() { getSkills() {
let comp = [] let comp = []
for (let item of this.items) { for (let item of this.items) {
item = duplicate(item) item = foundry.utils.duplicate(item)
if (item.type == "competence") { if (item.type == "competence") {
item.system.attribut1total = item.system.niveau + (this.system.attributs[item.system.attribut1]?.value || 0) item.system.attribut1total = item.system.niveau + (this.system.attributs[item.system.attribut1]?.value || 0)
item.system.attribut2total = item.system.niveau + (this.system.attributs[item.system.attribut2]?.value || 0) item.system.attribut2total = item.system.niveau + (this.system.attributs[item.system.attribut2]?.value || 0)
@@ -164,7 +172,7 @@ export class HawkmoonActor extends Actor {
/* ----------------------- --------------------- */ /* ----------------------- --------------------- */
addMember(actorId) { addMember(actorId) {
let members = duplicate(this.system.members) let members = foundry.utils.duplicate(this.system.members)
members.push({ id: actorId }) members.push({ id: actorId })
this.update({ 'system.members': members }) this.update({ 'system.members': members })
} }
@@ -175,7 +183,7 @@ export class HawkmoonActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
getDefenseBase() { getDefenseBase() {
return Math.max(this.system.attributs.tre.value, this.system.attributs.pui.value) return Math.max(this.system.attributs.tre.value, this.system.attributs.adr.value)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -185,7 +193,7 @@ export class HawkmoonActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
getProtection() { getProtection() {
let equipProtection = 0 let equipProtection = 0
for (let armor in this.items) { for (let armor of this.items) {
if (armor.type == "protection" && armor.system.equipped) { if (armor.type == "protection" && armor.system.equipped) {
equipProtection += Number(armor.system.protection) equipProtection += Number(armor.system.protection)
} }
@@ -198,6 +206,20 @@ export class HawkmoonActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
getCombatValues() { getCombatValues() {
if (this.type == "cellule") {
return {
initBase: 0,
initTotal: 0,
bonusDegats: 0,
bonusDegatsTotal: 0,
vitesseBase: 0,
vitesseTotal: 0,
defenseBase: 0,
protection: 0,
defenseTotal: 0
}
}
let combat = { let combat = {
initBase: this.system.attributs.adr.value, initBase: this.system.attributs.adr.value,
initTotal: this.system.attributs.adr.value + this.system.combat.initbonus, initTotal: this.system.attributs.adr.value + this.system.combat.initbonus,
@@ -207,7 +229,7 @@ export class HawkmoonActor extends Actor {
vitesseTotal: this.getVitesseBase() + this.system.combat.vitessebonus, vitesseTotal: this.getVitesseBase() + this.system.combat.vitessebonus,
defenseBase: this.getDefenseBase(), defenseBase: this.getDefenseBase(),
protection: this.getProtection(), protection: this.getProtection(),
defenseTotal: this.getDefenseBase() + this.system.combat.defensebonus + this.getProtection() - this.getTotalAdversite() defenseTotal: this.getDefenseBase() + this.system.combat.defensebonus + this.getProtection() - this.getTotalAdversite() + (this.system.combat.defensetotale ? 3 : 0)
} }
return combat return combat
} }
@@ -226,26 +248,33 @@ export class HawkmoonActor extends Actor {
if (this.type == 'personnage') { if (this.type == 'personnage') {
let talentBonus = this.getVigueurBonus() let talentBonus = this.getVigueurBonus()
let vigueur = Math.floor((this.system.attributs.pui.value + this.system.attributs.tre.value) / 2) + talentBonus let vigueur = Math.floor((this.system.attributs.pui.value + this.system.attributs.tre.value) / 2) + talentBonus + this.system.sante.vigueurmodifier
if (vigueur != this.system.sante.vigueur) { if (vigueur != this.system.sante.vigueur) {
this.update({ 'system.sante.vigueur': vigueur }) this.update({ 'system.sante.vigueur': vigueur })
} }
} }
super.prepareDerivedData() super.prepareDerivedData()
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_preUpdate(changed, options, user) { _preUpdate(changed, options, user) {
if (changed?.system?.sante?.etat && changed?.system?.sante?.etat != this.system.sante.etat) {
setTimeout(() => {
this.processCombativite(changed.system.sante)
}, 800)
}
super._preUpdate(changed, options, user); super._preUpdate(changed, options, user);
} }
/* -------------------------------------------- */
_onUpdate(data, options, user) {
super._onUpdate(data, options, user);
}
/* -------------------------------------------- */ /* -------------------------------------------- */
getItemById(id) { getItemById(id) {
let item = this.items.find(item => item.id == id); let item = this.items.find(item => item.id == id);
if (item) { if (item) {
item = duplicate(item) item = foundry.utils.duplicate(item)
} }
return item; return item;
} }
@@ -278,7 +307,7 @@ export class HawkmoonActor extends Actor {
checkAttribut(attribut, minLevel) { checkAttribut(attribut, minLevel) {
let attr = this.system.attributs.find(at => at.labelnorm == attribut.toLowerCase()) let attr = this.system.attributs.find(at => at.labelnorm == attribut.toLowerCase())
if (attr && attr.value >= minLevel) { if (attr && attr.value >= minLevel) {
return { isValid: true, attr: duplicate(attr) } return { isValid: true, attr: foundry.utils.duplicate(attr) }
} }
return { isValid: false } return { isValid: false }
} }
@@ -286,11 +315,11 @@ export class HawkmoonActor extends Actor {
checkAttributOrCompetenceLevel(compName, minLevel) { checkAttributOrCompetenceLevel(compName, minLevel) {
let comp = this.items.find(i => i.type == "competence" && i.name.toLowerCase() == compName.toLowerCase() && i.system.niveau >= minLevel) let comp = this.items.find(i => i.type == "competence" && i.name.toLowerCase() == compName.toLowerCase() && i.system.niveau >= minLevel)
if (comp) { if (comp) {
return { isValid: true, item: duplicate(comp) } return { isValid: true, item: foundry.utils.duplicate(comp) }
} else { } else {
for (let attrKey in this.system.attributs) { for (let attrKey in this.system.attributs) {
if (this.system.attributs[attrKey].label.toLowerCase() == compName.toLowerCase() && this.system.attributs[attrKey].value >= minLevel) { if (this.system.attributs[attrKey].label.toLowerCase() == compName.toLowerCase() && this.system.attributs[attrKey].value >= minLevel) {
return { isValid: true, item: duplicate(this.system.attributs[attrKey]) } return { isValid: true, item: foundry.utils.duplicate(this.system.attributs[attrKey]) }
} }
} }
} }
@@ -300,7 +329,7 @@ export class HawkmoonActor extends Actor {
addCompetenceBonus(compName, bonus, baCost) { addCompetenceBonus(compName, bonus, baCost) {
let comp = this.items.find(i => i.type == "competence" && i.name.toLowerCase() == compName.toLowerCase()) let comp = this.items.find(i => i.type == "competence" && i.name.toLowerCase() == compName.toLowerCase())
if (comp) { if (comp) {
comp = duplicate(comp) comp = foundry.utils.duplicate(comp)
comp.system.bonus = bonus comp.system.bonus = bonus
comp.system.baCost = baCost comp.system.baCost = baCost
return { isValid: true, item: comp } return { isValid: true, item: comp }
@@ -382,10 +411,42 @@ export class HawkmoonActor extends Actor {
return 0; return 0;
} }
/* -------------------------------------------- */
changeEtatCombativite(value) {
if (value === "vaincu") {
value = 200
}
let sante = foundry.utils.duplicate(this.system.sante)
sante.etat += Number(value)
sante.etat = Math.max(sante.etat, 0)
sante.etat = Math.min(sante.etat, this.system.sante.nbcombativite)
this.update({ 'system.sante': sante })
if (sante.etat == this.system.sante.nbcombativite) {
ChatMessage.create({ content: `<strong>${this.name} est vaincu !</strong>` })
}
// Duplicated ! this.processCombativite(sante)
}
/* -------------------------------------------- */
processCombativite(sante) {
sante = sante || foundry.utils.duplicate(this.system.sante)
// Gestion des états affaibli et très affaibli
if (sante.etat == this.system.sante.nbcombativite - 2 || sante.etat == this.system.sante.nbcombativite - 1) {
if (sante.etat == this.system.sante.nbcombativite - 2 && this.items.find(item => item.type == "talent" && item.name.toLowerCase() == "encaissement")) {
ChatMessage.create({ content: `<strong>${this.name} ne subit pas les 2 adversités rouge grâce à Encaissement. Pensez à les ajouter à la fin de la scène !</strong>` })
} else if (sante.etat == this.system.sante.nbcombativite - 1 && this.items.find(item => item.type == "talent" && item.name.toLowerCase().includes("vaillant"))) {
ChatMessage.create({ content: `<strong>${this.name} ne subit pas les 2 adversités rouge grâce à Vaillant. Pensez à les ajouter à la fin de la scène !</strong>` })
} else {
ChatMessage.create({ content: `<strong>${this.name} subit 2 adversités rouge !</strong>` })
this.incDecAdversite("rouge", 2)
}
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async equipGear(equipmentId) { async equipGear(equipmentId) {
let item = this.items.find(item => item.id == equipmentId); let item = this.items.find(item => item.id == equipmentId);
if (item && item.system.data) { if (item?.system?.data) {
let update = { _id: item.id, "system.equipped": !item.system.equipped }; let update = { _id: item.id, "system.equipped": !item.system.equipped };
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
} }
@@ -395,13 +456,13 @@ export class HawkmoonActor extends Actor {
getSubActors() { getSubActors() {
let subActors = []; let subActors = [];
for (let id of this.system.subactors) { for (let id of this.system.subactors) {
subActors.push(duplicate(game.actors.get(id))); subActors.push(foundry.utils.duplicate(game.actors.get(id)));
} }
return subActors; return subActors;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async addSubActor(subActorId) { async addSubActor(subActorId) {
let subActors = duplicate(this.system.subactors); let subActors = foundry.utils.duplicate(this.system.subactors);
subActors.push(subActorId); subActors.push(subActorId);
await this.update({ 'system.subactors': subActors }); await this.update({ 'system.subactors': subActors });
} }
@@ -423,9 +484,10 @@ export class HawkmoonActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async incDecAdversite(adv, incDec = 0) { async incDecAdversite(adv, incDec = 0) {
let adversite = duplicate(this.system.adversite) let adversite = foundry.utils.duplicate(this.system.adversite)
adversite[adv] += Number(incDec) adversite[adv] += Number(incDec)
adversite[adv] = Math.max(adversite[adv], 0) adversite[adv] = Math.max(adversite[adv], 0)
adversite[adv] = Math.min(adversite[adv], 20)
this.update({ 'system.adversite': adversite }) this.update({ 'system.adversite': adversite })
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -434,7 +496,7 @@ export class HawkmoonActor extends Actor {
if (objetQ) { if (objetQ) {
let newQ = objetQ.system.quantite + incDec let newQ = objetQ.system.quantite + incDec
newQ = Math.max(newQ, 0) newQ = Math.max(newQ, 0)
const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantite': newQ }]); // pdates one EmbeddedEntity await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantite': newQ }]); // pdates one EmbeddedEntity
} }
} }
@@ -470,7 +532,7 @@ export class HawkmoonActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async setPredilectionUsed(compId, predIdx) { async setPredilectionUsed(compId, predIdx) {
let comp = this.items.get(compId) let comp = this.items.get(compId)
let pred = duplicate(comp.system.predilections) let pred = foundry.utils.duplicate(comp.system.predilections)
pred[predIdx].used = true pred[predIdx].used = true
await this.updateEmbeddedDocuments('Item', [{ _id: compId, 'system.predilections': pred }]) await this.updateEmbeddedDocuments('Item', [{ _id: compId, 'system.predilections': pred }])
} }
@@ -481,6 +543,23 @@ export class HawkmoonActor extends Actor {
return init || -1 return init || -1
} }
/* -------------------------------------------- */
getBestAttackValue() {
let attackList = this.items.filter(item => (item.type == "arme" || item.type == "talent") && item.system.equipped)
let maxOff = 0
let bestArme
for (let arme of attackList) {
if (arme.type == "arme") {
arme = this.prepareArme(arme)
}
if (arme.system.totalOffensif > maxOff) {
maxOff = arme.system.totalOffensif
bestArme = foundry.utils.duplicate(arme)
}
}
return bestArme
}
/* -------------------------------------------- */ /* -------------------------------------------- */
getBestDefenseValue() { getBestDefenseValue() {
let defenseList = this.items.filter(item => (item.type == "arme") && item.system.equipped) let defenseList = this.items.filter(item => (item.type == "arme") && item.system.equipped)
@@ -492,7 +571,7 @@ export class HawkmoonActor extends Actor {
} }
if (arme.system.totalDefensif > maxDef) { if (arme.system.totalDefensif > maxDef) {
maxDef = arme.system.totalDefensif maxDef = arme.system.totalDefensif
bestArme = duplicate(arme) bestArme = foundry.utils.duplicate(arme)
} }
} }
return bestArme return bestArme
@@ -507,7 +586,7 @@ export class HawkmoonActor extends Actor {
for (let auto of talent.system.automations) { for (let auto of talent.system.automations) {
if (auto.eventtype === "prepare-roll") { if (auto.eventtype === "prepare-roll") {
if (auto.competence.toLowerCase() == competence.name.toLowerCase()) { if (auto.competence.toLowerCase() == competence.name.toLowerCase()) {
talent = duplicate(talent) talent = foundry.utils.duplicate(talent)
talent.system.bonus = auto.bonus talent.system.bonus = auto.bonus
talent.system.baCost = auto.baCost talent.system.baCost = auto.baCost
talents.push(talent) talents.push(talent)
@@ -538,22 +617,34 @@ export class HawkmoonActor extends Actor {
rollData.nbBA = this.system.bonneaventure.actuelle rollData.nbBA = this.system.bonneaventure.actuelle
rollData.nbAdversites = this.getTotalAdversite() rollData.nbAdversites = this.getTotalAdversite()
rollData.talents = [] rollData.talents = []
rollData.attrKey2 = "none"
rollData.coupDevastateur = this.items.find(it => it.type == "talent" && it.name.toLowerCase() == "coup dévastateur" && !it.system.used)
rollData.hasAmbidextre = this.items.find(it => it.type == "talent" && it.name.toLowerCase() == "ambidextre")
rollData.hasFeinte = this.system.bonneaventure.actuelle > 0 && this.items.find(it => it.type == "talent" && it.name.toLowerCase() == "feinte")
rollData.isMonte = this.system.combat.monte
rollData.config = game.system.hawkmoon.config
if (attrKey) { if (attrKey) {
rollData.attrKey = attrKey rollData.attrKey = attrKey
if (attrKey != "tochoose") { if (attrKey != "tochoose") {
rollData.actionImg = "systems/fvtt-hawkmoon-cyd/assets/icons/" + this.system.attributs[attrKey].labelnorm + ".webp" rollData.actionImg = "systems/fvtt-hawkmoon-cyd/assets/icons/" + this.system.attributs[attrKey].labelnorm + ".webp"
rollData.attr = duplicate(this.system.attributs[attrKey]) rollData.attr = foundry.utils.duplicate(this.system.attributs[attrKey])
} }
} }
if (compId) { if (compId) {
rollData.competence = duplicate(this.items.get(compId) || {}) rollData.competence = foundry.utils.duplicate(this.items.get(compId) || {})
rollData.maitrises = rollData.competence.system.predilections.filter(p => p.maitrise) let maitrises = [{ key: "none", label: "Aucune" }]
rollData.competence.system.predilections.forEach(function (item) {
if (item.maitrise) {
maitrises.push({ key: item.id, label: item.name });
}
})
rollData.maitrises = maitrises // rollData.competence.system.predilections.filter(p => p.maitrise)
rollData.actionImg = rollData.competence?.img rollData.actionImg = rollData.competence?.img
rollData.talents = this.searchRelevantTalents(rollData.competence) rollData.talents = this.searchRelevantTalents(rollData.competence)
} }
if (compName) { if (compName) {
rollData.competence = duplicate(this.items.find(item => item.name.toLowerCase() == compName.toLowerCase()) || {}) rollData.competence = foundry.utils.duplicate(this.items.find(item => item.name.toLowerCase() == compName.toLowerCase()) || {})
rollData.actionImg = rollData.competence?.img rollData.actionImg = rollData.competence?.img
} }
return rollData return rollData
@@ -590,6 +681,53 @@ export class HawkmoonActor extends Actor {
let rollDialog = await HawkmoonRollDialog.create(this, rollData) let rollDialog = await HawkmoonRollDialog.create(this, rollData)
rollDialog.render(true) rollDialog.render(true)
} }
/* -------------------------------------------- */
async rollAssommer() {
let rollData = this.getCommonRollData("pui", undefined, "Filouterie")
rollData.assomer = true
rollData.conditionsCommunes = true
HawkmoonUtility.updateWithTarget(rollData)
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
rollDialog.render(true)
}
/* -------------------------------------------- */
async rollCoupBas() {
let rollData = this.getCommonRollData("pui", undefined, "Mêlée")
rollData.coupBas = true
rollData.conditionsCommunes = true
HawkmoonUtility.updateWithTarget(rollData)
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
rollDialog.render(true)
}
/* -------------------------------------------- */
async rollImmobiliser() {
let rollData = this.getCommonRollData("pui", undefined, "Mêlée")
rollData.immobiliser = true
rollData.conditionsCommunes = true
rollData.cibleconsciente = true
HawkmoonUtility.updateWithTarget(rollData)
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
rollDialog.render(true)
}
/* -------------------------------------------- */
async rollRepousser() {
let rollData = this.getCommonRollData("pui", undefined, "Mêlée")
rollData.repousser = true
rollData.conditionsCommunes = true
rollData.cibleconsciente = true
HawkmoonUtility.updateWithTarget(rollData)
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
rollDialog.render(true)
}
/* -------------------------------------------- */
async rollDesengager() {
let rollData = this.getCommonRollData("adr", undefined, "Mouvements")
rollData.desengager = true
rollData.conditionsCommunes = true
HawkmoonUtility.updateWithTarget(rollData)
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
rollDialog.render(true)
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async rollArmeDegats(armeId, targetVigueur = undefined, rollDataInput = undefined) { async rollArmeDegats(armeId, targetVigueur = undefined, rollDataInput = undefined) {
@@ -597,25 +735,48 @@ export class HawkmoonActor extends Actor {
if (arme.type == "arme") { if (arme.type == "arme") {
arme = this.prepareArme(arme) arme = this.prepareArme(arme)
} }
console.log("DEGATS", arme) console.log("DEGATS", arme, targetVigueur, rollDataInput)
let roll let roll
if (rollDataInput?.isHeroique) { let bonus = 0
roll = new Roll("2d10rr10+" + arme.system.totalDegats).roll({ async: false }) let bonus2 = 0
if (rollDataInput?.applyCoupDevastateur) {
bonus2 = Math.floor(this.system.attributs.pui.value / 2)
let talent = this.items.find(item => item.type == "talent" && item.name.toLowerCase() == "coup dévastateur")
this.updateEmbeddedDocuments('Item', [{ _id: talent.id, 'system.used': true }])
}
if (rollDataInput?.isHeroique) {
if (rollDataInput?.attaqueCharge) {
bonus = 5
}
if (rollDataInput?.chargeCavalerie) {
bonus = 6
}
roll = await new Roll("2d10rr10+" + arme.system.totalDegats + "+" + bonus + "+" + bonus2).roll()
} else { } else {
roll = new Roll("1d10+" + arme.system.totalDegats).roll({ async: false }) if (rollDataInput?.attaqueCharge) {
bonus = 3
}
if (rollDataInput?.chargeCavalerie) {
bonus = 4
}
roll = await new Roll("1d10+" + arme.system.totalDegats + "+" + bonus + "+" + bonus2).roll()
} }
await HawkmoonUtility.showDiceSoNice(roll, game.settings.get("core", "rollMode")); await HawkmoonUtility.showDiceSoNice(roll, game.settings.get("core", "rollMode"));
let nbEtatPerdus = 0 let nbEtatPerdus = 0
if (targetVigueur) { if (targetVigueur) {
nbEtatPerdus = Math.floor(roll.total / targetVigueur) nbEtatPerdus = Math.floor(roll.total / targetVigueur)
} }
//console.log(roll)
let rollData = { let rollData = {
arme: arme, arme: arme,
finalResult: roll.total, finalResult: roll.total,
formula: roll.formula,
alias: this.name, alias: this.name,
actorImg: this.img, actorImg: this.img,
actorId: this.id, actorId: this.id,
defenderTokenId: rollDataInput?.defenderTokenId,
actionImg: arme.img, actionImg: arme.img,
targetVigueur: targetVigueur, targetVigueur: targetVigueur,
nbEtatPerdus: nbEtatPerdus nbEtatPerdus: nbEtatPerdus
@@ -624,5 +785,9 @@ export class HawkmoonActor extends Actor {
content: await renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-degats-result.html`, rollData) content: await renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-degats-result.html`, rollData)
}) })
if (rollDataInput?.defenderTokenId && nbEtatPerdus) {
HawkmoonUtility.applyCombativite(rollDataInput, nbEtatPerdus)
}
} }
} }

View File

@@ -14,10 +14,10 @@ export class HawkmoonAutomation {
this.__objectTypes = { } this.__objectTypes = { }
Object.entries(game.data.model.Actor).forEach(kv => { Object.entries(game.data.model.Actor).forEach(kv => {
this.__objectTypes[kv[0]] = duplicate(kv[1]) this.__objectTypes[kv[0]] = foundry.utils.duplicate(kv[1])
}) })
Object.entries(game.data.model.Item).forEach(kv => { Object.entries(game.data.model.Item).forEach(kv => {
this.__objectTypes[kv[0]] = duplicate(kv[1]) this.__objectTypes[kv[0]] = foundry.utils.duplicate(kv[1])
}) })
} }

View File

@@ -7,15 +7,15 @@ import { HawkmoonUtility } from "./hawkmoon-utility.js";
import { HawkmoonAutomation } from "./hawkmoon-automation.js"; import { HawkmoonAutomation } from "./hawkmoon-automation.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
const __ALLOWED_ITEM_CELLULE = { "talent": 1, "ressource": 1, "contact": 1} const __ALLOWED_ITEM_CELLULE = { "talent": 1, "ressource": 1, "contact": 1, "equipement": 1, "protection": 1, "artefact": 1, "arme": 1, "monnaie": 1 }
/* -------------------------------------------- */ /* -------------------------------------------- */
export class HawkmoonCelluleSheet extends ActorSheet { export class HawkmoonCelluleSheet extends foundry.appv1.sheets.ActorSheet {
/** @override */ /** @override */
static get defaultOptions() { static get defaultOptions() {
return mergeObject(super.defaultOptions, { return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["fvtt-hawkmoon-cyd", "sheet", "actor"], classes: ["fvtt-hawkmoon-cyd", "sheet", "actor"],
template: "systems/fvtt-hawkmoon-cyd/templates/cellule-sheet.html", template: "systems/fvtt-hawkmoon-cyd/templates/cellule-sheet.html",
width: 640, width: 640,
@@ -28,7 +28,7 @@ export class HawkmoonCelluleSheet extends ActorSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async getData() { async getData() {
const objectData = duplicate(this.object) const objectData = foundry.utils.duplicate(this.object)
let formData = { let formData = {
title: this.title, title: this.title,
@@ -41,15 +41,23 @@ export class HawkmoonCelluleSheet extends ActorSheet {
system: objectData.system, system: objectData.system,
effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)), effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)),
limited: this.object.limited, limited: this.object.limited,
talents: duplicate(this.actor.getTalents() || {}), talents: foundry.utils.duplicate(this.actor.getTalents() || {}),
ressources: duplicate(this.actor.getRessources()), ressources: foundry.utils.duplicate(this.actor.getRessources()),
contacts: duplicate(this.actor.getContacts()), contacts: foundry.utils.duplicate(this.actor.getContacts()),
members: this.getMembers(), members: this.getMembers(),
equipements: foundry.utils.duplicate(this.actor.getEquipments()),
artefacts: foundry.utils.duplicate(this.actor.getArtefacts()),
armes: foundry.utils.duplicate(this.actor.getWeapons()),
monnaies: foundry.utils.duplicate(this.actor.getMonnaies()),
protections: foundry.utils.duplicate(this.actor.getArmors()),
richesse: this.actor.computeRichesse(),
valeurEquipement: this.actor.computeValeurEquipement(),
description: await TextEditor.enrichHTML(this.object.system.description, { async: true }), description: await TextEditor.enrichHTML(this.object.system.description, { async: true }),
options: this.options, options: this.options,
owner: this.document.isOwner, owner: this.document.isOwner,
editScore: this.options.editScore, editScore: this.options.editScore,
isGM: game.user.isGM isGM: game.user.isGM,
config: game.system.hawkmoon.config
} }
this.formData = formData; this.formData = formData;
@@ -87,7 +95,7 @@ export class HawkmoonCelluleSheet extends ActorSheet {
let actorId = li.data("actor-id") let actorId = li.data("actor-id")
this.actor.removeMember(actorId) this.actor.removeMember(actorId)
}) })
// Update Inventory Item // Update Inventory Item
html.find('.item-edit').click(ev => { html.find('.item-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item") const li = $(ev.currentTarget).parents(".item")
@@ -109,15 +117,15 @@ export class HawkmoonCelluleSheet extends ActorSheet {
let value = ev.currentTarget.value let value = ev.currentTarget.value
this.actor.editItemField(itemId, itemType, itemField, dataType, value) this.actor.editItemField(itemId, itemType, itemField, dataType, value)
}) })
html.find('.quantity-modify').click(event => {
html.find('.quantity-minus').click(event => { const li = $(event.currentTarget).parents(".item")
const li = $(event.currentTarget).parents(".item"); const value = Number($(event.currentTarget).data("quantite-value"))
this.actor.incDecQuantity(li.data("item-id"), -1); this.actor.incDecQuantity( li.data("item-id"), value );
}); })
html.find('.quantity-plus').click(event => { html.find('.item-add').click((event) => {
const li = $(event.currentTarget).parents(".item"); const itemType = $(event.currentTarget).data("type")
this.actor.incDecQuantity(li.data("item-id"), +1); this.actor.createEmbeddedDocuments('Item', [{ name: `Nouveau ${itemType}`, type: itemType }], { renderSheet: true })
}); })
html.find('.lock-unlock-sheet').click((event) => { html.find('.lock-unlock-sheet').click((event) => {
this.options.editScore = !this.options.editScore; this.options.editScore = !this.options.editScore;
@@ -128,7 +136,7 @@ export class HawkmoonCelluleSheet extends ActorSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async _onDropActor(event, dragData) { async _onDropActor(event, dragData) {
const actor = fromUuidSync(dragData.uuid) const actor = fromUuidSync(dragData.uuid)
if (actor) { if (actor) {
this.actor.addMember(actor.id) this.actor.addMember(actor.id)
} else { } else {
ui.notifications.warn("Cet acteur n'a pas été trouvé.") ui.notifications.warn("Cet acteur n'a pas été trouvé.")
@@ -148,7 +156,7 @@ export class HawkmoonCelluleSheet extends ActorSheet {
super._onDropItem(event, dragData) super._onDropItem(event, dragData)
return return
} }
ui.notifications("Ce type d'item n'est pas autorisé sur une Cellule.") ui.notification.info("Ce type d'item n'est pas autorisé sur une Cellule.")
} }

View File

@@ -6,9 +6,9 @@ export class HawkmoonCombat extends Combat {
/* -------------------------------------------- */ /* -------------------------------------------- */
async rollInitiative(ids, formula = undefined, messageOptions = {} ) { async rollInitiative(ids, formula = undefined, messageOptions = {} ) {
ids = typeof ids === "string" ? [ids] : ids; ids = typeof ids === "string" ? [ids] : ids;
for (let cId = 0; cId < ids.length; cId++) { for (let cId of ids) {
const c = this.combatants.get(ids[cId]); const c = this.combatants.get(cId);
//console.log("Init for combattant", c ) console.log("Init for combattant", c, ids)
let id = c._id || c.id let id = c._id || c.id
let initValue = c.actor ? c.actor.getInitiativeScore() : 0 let initValue = c.actor ? c.actor.getInitiativeScore() : 0
await this.updateEmbeddedDocuments("Combatant", [ { _id: id, initiative: initValue } ]); await this.updateEmbeddedDocuments("Combatant", [ { _id: id, initiative: initValue } ]);
@@ -21,5 +21,4 @@ export class HawkmoonCombat extends Combat {
_onUpdate(changed, options, userId) { _onUpdate(changed, options, userId) {
} }
} }

143
modules/hawkmoon-config.js Normal file
View File

@@ -0,0 +1,143 @@
export const HAWKMOON_CONFIG = {
optionsDifficulte: [
{ key: "0", label: "Aucune/Inconnue" },
{ key: "5", label: "Facile (5)" },
{ key: "6", label: "(6)" },
{ key: "7", label: "(7)" },
{ key: "8", label: "(8)" },
{ key: "9", label: "(9)" },
{ key: "10", label: "Moyenne (10)" },
{ key: "11", label: "(11)" },
{ key: "12", label: "(12)" },
{ key: "13", label: "(13)" },
{ key: "14", label: "(14)" },
{ key: "15", label: "Ardue (15)" },
{ key: "16", label: "(16)" },
{ key: "17", label: "(17)" },
{ key: "18", label: "(18)" },
{ key: "19", label: "(19)" },
{ key: "20", label: "Hasardeuse (20)" },
{ key: "21", label: "(21)" },
{ key: "22", label: "(22)" },
{ key: "23", label: "(23)" },
{ key: "24", label: "(24)" },
{ key: "25", label: "Insensée (25)" },
{ key: "26", label: "(26)" },
{ key: "27", label: "(27)" },
{ key: "28", label: "(28)" },
{ key: "29", label: "(29)" },
{ key: "30", label: "Pure Folie (30)" }
],
optionsDistanceTir: [
{ key: "porteecourte", label: "Courte ({protectionDefenseur}+5)" },
{ key: "porteemoyenne", label: "Moyenne ({protectionDefenseur}+9)" },
{ key: "porteelongue", label: "Longue ({protectionDefenseur}+14)" }
],
optionsBonusMalus: [
{ key: "-10", label: "-10" },
{ key: "-9", label: "-9" },
{ key: "-8", label: "-8" },
{ key: "-7", label: "-7" },
{ key: "-6", label: "-6" },
{ key: "-5", label: "-5" },
{ key: "-4", label: "-4" },
{ key: "-3", label: "-3" },
{ key: "-2", label: "-2" },
{ key: "-1", label: "-1" },
{ key: "0", label: "0" },
{ key: "1", label: "+1" },
{ key: "2", label: "+2" },
{ key: "3", label: "+3" },
{ key: "4", label: "+4" },
{ key: "5", label: "+5" },
{ key: "6", label: "+6" },
{ key: "7", label: "+7" },
{ key: "8", label: "+8" },
{ key: "9", label: "+9" },
{ key: "10", label: "+10" }
],
optionsTailleCible: [
{ key: "normal", label: "Normal (SD+0)" },
{ key: "main", label: "Main (SD+10)" },
{ key: "enfant", label: "Enfant (SD+3)" },
{ key: "maison", label: "Maison (SD-10)" }
],
optionsCouvert: [
{ key: "aucun", label: "Aucun" },
{ key: "leger", label: "Léger (SD+5)" },
{ key: "complet", label: "Quasi complet (SD+10)" }
],
optionsTireurDeplacement: [
{ key: "immobile", label: "Immobile (SD+0)" },
{ key: "lent", label: "Lent (SD+3)" },
{ key: "rapide", label: "Rapide (SD+5)" }
],
optionsSoutiens: [
{ key: "0", label: "Aucun" },
{ key: "1", label: "Un soutien (+3)" },
{ key: "2", label: "Deux soutiens (+4)" },
{ key: "3", label: "Trois soutiens (+5)" }
],
optionsStatutResistant: [
{ key: "commun", label: "Commun" },
{ key: "clandestin", label: "Clandestin" },
{ key: "insurge", label: "Insurgé" }
],
optionsTypeArme: [
{key: "contact", label: "Arme de contact"},
{key: "contactjet", label: "Arme de contact et de Jet"},
{key: "jet", label: "Arme de Jet"},
{key: "tir", label: "Arme de Tir"}
],
optionsArtefactBranche: [
{key: "alchimie", label: "Alchimie"},
{key: "biologie", label: "Biologie"},
{key: "electricite", label: "Electricité"},
{key: "mecanique", label: "Mécanique"},
{key: "scienceesprit", label: "Science de l'Esprit"}
],
optionsArtefactBranche2: [
{key: "none", label: "Aucune"},
{key: "alchimie", label: "Alchimie"},
{key: "biologie", label: "Biologie"},
{key: "electricite", label: "Electricité"},
{key: "mecanique", label: "Mécanique"},
{key: "scienceesprit", label: "Science de l'Esprit"}
],
optionsTypeContact: [
{key: "contact", label: "Contact"},
{key: "allie", label: "Allié"}
],
optionsTypeMutation: [
{key: "tares_communes", label: "Tares et Malformations communes"},
{key: "evolutions_communes", label: "Evolutions communes"},
{key: "tares_rares", label: "Tares et Malformations rares"},
{key: "evolutions_rares", label: "Evolutions rares"},
{key: "tares_majeures", label: "Tares et Maformations majeures"},
{key: "evolutions_majeures", label: "Evolutions majeures"},
{key: "tares_except", label: "Tares et Malformations exceptionnelles"},
{key: "evolutions_except", label: "Evolutions exceptionnelles"}
],
optionsTypeTalent: [
{key: "personnage", label: "Personnage"},
{key: "cellule", label: "Cellule"},
{key: "traitespece", label: "Trait d'espèce"}
],
optionsUseTalent: [
{key: "permanent", label: "Permanent"},
{key: "sceance", label: "Une fois par scéance"},
{key: "scenario", label: "Une fois par scénario"},
{key: "jour", label: "Une fois par jour"},
{key: "unique", label: "Unique"}
],
optionsAutomationEvent: [
{key: "on-drop", label: "Drop sur l'acteur"},
{key: "prepare-roll", label: "Préparation d'un jet"},
{key: "bonus-permanent", label: "Bonus permanent"}
],
optionsBonusPermanent: [
{key: "vigueur", label: "Vigueur"},
{key: "bonus-defensif", label: "Bonus au Seuil de Défense"}
]
}

View File

@@ -13,7 +13,7 @@ export class HawkmoonCreatureSheet extends HawkmoonActorSheet {
/** @override */ /** @override */
static get defaultOptions() { static get defaultOptions() {
return mergeObject(super.defaultOptions, { return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["fvtt-hawkmoon-cyd", "sheet", "actor"], classes: ["fvtt-hawkmoon-cyd", "sheet", "actor"],
template: "systems/fvtt-hawkmoon-cyd/templates/creature-sheet.html", template: "systems/fvtt-hawkmoon-cyd/templates/creature-sheet.html",
width: 640, width: 640,

View File

@@ -22,7 +22,7 @@ export class HawkmoonTokenHud {
const hudData = { actor: actor } const hudData = { actor: actor }
const controlIconActions = html.find('.control-icon[data-action=combat]'); const controlIconActions = $(html).find('.control-icon[data-action=combat]');
// initiative // initiative
await HawkmoonTokenHud._configureSubMenu(controlIconActions, 'systems/fvtt-hawkmoon-cyd/templates/hud-adversites.html', hudData, await HawkmoonTokenHud._configureSubMenu(controlIconActions, 'systems/fvtt-hawkmoon-cyd/templates/hud-adversites.html', hudData,
(event) => { (event) => {
@@ -34,7 +34,7 @@ export class HawkmoonTokenHud {
/* -------------------------------------------- */ /* -------------------------------------------- */
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 ) {
HawkmoonTokenHud.addExtensionHud(app, html, tokenId); HawkmoonTokenHud.addExtensionHud(app, html, tokenId);
} }
@@ -42,11 +42,11 @@ export class HawkmoonTokenHud {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async _configureSubMenu(insertionPoint, template, hudData, onMenuItem) { static async _configureSubMenu(insertionPoint, template, hudData, onMenuItem) {
const hud = $(await renderTemplate(template, hudData)) const hud = $(await foundry.applications.handlebars.renderTemplate(template, hudData))
const list = hud.find('div.hawkmoon-hud-list') const list = hud.find('div.hawkmoon-hud-list')
HawkmoonTokenHud._toggleHudListActive(hud, list); HawkmoonTokenHud._toggleHudListActive(hud, list);
hud.find('img.hawkmoon-hud-togglebutton').click(event => HawkmoonTokenHud._toggleHudListActive(hud, list)); hud.find('img.hawkmoon-hud-togglebutton').click(event => HawkmoonTokenHud._toggleHudListActive(hud, list));
list.find('.hawkmoon-hud-adversite').click(onMenuItem); list.find('.hawkmoon-hud-adversite').click(onMenuItem);

View File

@@ -4,12 +4,12 @@ import { HawkmoonUtility } from "./hawkmoon-utility.js";
* Extend the basic ItemSheet with some very simple modifications * Extend the basic ItemSheet with some very simple modifications
* @extends {ItemSheet} * @extends {ItemSheet}
*/ */
export class HawkmoonItemSheet extends ItemSheet { export class HawkmoonItemSheet extends foundry.appv1.sheets.ItemSheet {
/** @override */ /** @override */
static get defaultOptions() { static get defaultOptions() {
return mergeObject(super.defaultOptions, { return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["fvtt-hawkmoon-cyd", "sheet", "item"], classes: ["fvtt-hawkmoon-cyd", "sheet", "item"],
template: "systems/fvtt-hawkmoon-cyd/templates/item-sheet.html", template: "systems/fvtt-hawkmoon-cyd/templates/item-sheet.html",
dragDrop: [{ dragSelector: null, dropSelector: null }], dragDrop: [{ dragSelector: null, dropSelector: null }],
@@ -48,7 +48,7 @@ export class HawkmoonItemSheet extends ItemSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
async getData() { async getData() {
const objectData = duplicate(this.object) const objectData = foundry.utils.duplicate(this.object)
let formData = { let formData = {
title: this.title, title: this.title,
id: this.id, id: this.id,
@@ -64,7 +64,8 @@ export class HawkmoonItemSheet extends ItemSheet {
owner: this.document.isOwner, owner: this.document.isOwner,
description: await TextEditor.enrichHTML(this.object.system.description, {async: true}), description: await TextEditor.enrichHTML(this.object.system.description, {async: true}),
mr: (this.object.type == 'specialisation'), mr: (this.object.type == 'specialisation'),
isGM: game.user.isGM isGM: game.user.isGM,
config: game.system.hawkmoon.config
} }
if ( objectData.type == "don") { if ( objectData.type == "don") {
@@ -89,7 +90,7 @@ export class HawkmoonItemSheet extends ItemSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
postItem() { postItem() {
let chatData = duplicate(HawkmoonUtility.data(this.item)); let chatData = foundry.utils.duplicate(HawkmoonUtility.data(this.item));
if (this.actor) { if (this.actor) {
chatData.actor = { id: this.actor.id }; chatData.actor = { id: this.actor.id };
} }
@@ -132,7 +133,7 @@ export class HawkmoonItemSheet extends ItemSheet {
html.find('.edit-predilection').change(ev => { html.find('.edit-predilection').change(ev => {
const li = $(ev.currentTarget).parents(".prediction-item") const li = $(ev.currentTarget).parents(".prediction-item")
let index = li.data("prediction-index") let index = li.data("prediction-index")
let pred = duplicate(this.object.system.predilections) let pred = foundry.utils.duplicate(this.object.system.predilections)
pred[index].name = ev.currentTarget.value pred[index].name = ev.currentTarget.value
pred[index].id = pred[index].id || randomID(16) pred[index].id = pred[index].id || randomID(16)
this.object.update( { 'system.predilections': pred }) this.object.update( { 'system.predilections': pred })
@@ -140,70 +141,70 @@ export class HawkmoonItemSheet extends ItemSheet {
html.find('.edit-predilection-description').change(ev => { html.find('.edit-predilection-description').change(ev => {
const li = $(ev.currentTarget).parents(".prediction-item") const li = $(ev.currentTarget).parents(".prediction-item")
let index = li.data("prediction-index") let index = li.data("prediction-index")
let pred = duplicate(this.object.system.predilections) let pred = foundry.utils.duplicate(this.object.system.predilections)
pred[index].description = ev.currentTarget.value pred[index].description = ev.currentTarget.value
pred[index].id = pred[index].id || randomID(16) pred[index].id = pred[index].id || randomID(16)
this.object.update( { 'system.predilections': pred }) this.object.update( { 'system.predilections': pred })
}) })
html.find('.predilection-acquise').change(ev => { html.find('.predilection-acquise').change(ev => {
const li = $(ev.currentTarget).parents(".prediction-item") const li = $(ev.currentTarget).parents(".prediction-item")
let index = li.data("prediction-index") let index = li.data("prediction-index")
let pred = duplicate(this.object.system.predilections) let pred = foundry.utils.duplicate(this.object.system.predilections)
pred[index].acquise = ev.currentTarget.checked pred[index].acquise = ev.currentTarget.checked
pred[index].id = pred[index].id || randomID(16) pred[index].id = pred[index].id || randomID(16)
this.object.update( { 'system.predilections': pred }) this.object.update( { 'system.predilections': pred })
}) })
html.find('.predilection-maitrise').change(ev => { html.find('.predilection-maitrise').change(ev => {
const li = $(ev.currentTarget).parents(".prediction-item") const li = $(ev.currentTarget).parents(".prediction-item")
let index = li.data("prediction-index") let index = li.data("prediction-index")
let pred = duplicate(this.object.system.predilections) let pred = foundry.utils.duplicate(this.object.system.predilections)
pred[index].maitrise = ev.currentTarget.checked pred[index].maitrise = ev.currentTarget.checked
pred[index].id = pred[index].id || randomID(16) pred[index].id = pred[index].id || randomID(16)
this.object.update( { 'system.predilections': pred }) this.object.update( { 'system.predilections': pred })
}) })
html.find('.predilection-used').change(ev => { html.find('.predilection-used').change(ev => {
const li = $(ev.currentTarget).parents(".prediction-item") const li = $(ev.currentTarget).parents(".prediction-item")
let index = li.data("prediction-index") let index = li.data("prediction-index")
let pred = duplicate(this.object.system.predilections) let pred = foundry.utils.duplicate(this.object.system.predilections)
pred[index].used = ev.currentTarget.checked pred[index].used = ev.currentTarget.checked
pred[index].id = pred[index].id || randomID(16) pred[index].id = pred[index].id || randomID(16)
this.object.update( { 'system.predilections': pred }) this.object.update( { 'system.predilections': pred })
}) })
html.find('#add-predilection').click(ev => { html.find('#add-predilection').click(ev => {
let pred = duplicate(this.object.system.predilections) let pred = foundry.utils.duplicate(this.object.system.predilections)
pred.push( { name: "Nouvelle prédilection", id: randomID(16), used: false }) pred.push( { name: "Nouvelle prédilection", id: randomID(16), used: false })
this.object.update( { 'system.predilections': pred }) this.object.update( { 'system.predilections': pred })
}) })
html.find('.delete-prediction').click(ev => { html.find('.delete-prediction').click(ev => {
const li = $(ev.currentTarget).parents(".prediction-item") const li = $(ev.currentTarget).parents(".prediction-item")
let index = li.data("prediction-index") let index = li.data("prediction-index")
let pred = duplicate(this.object.system.predilections) let pred = foundry.utils.duplicate(this.object.system.predilections)
pred.splice(index,1) pred.splice(index,1)
this.object.update( { 'system.predilections': pred }) this.object.update( { 'system.predilections': pred })
}) })
html.find('#add-automation').click(ev => { html.find('#add-automation').click(ev => {
let autom = duplicate(this.object.system.automations) let autom = foundry.utils.duplicate(this.object.system.automations)
autom.push( { eventtype: "on-drop", name: "Automatisation 1", competence: "", minLevel: 0, id: randomID(16) }) autom.push( { eventtype: "on-drop", name: "Automatisation 1", bonusname: "vigueur", bonus: 0, competence: "", minLevel: 0, baCost: 0, id: randomID(16) })
this.object.update( { 'system.automations': autom }) this.object.update( { 'system.automations': autom })
}) })
html.find('.delete-automation').click(ev => { html.find('.delete-automation').click(ev => {
const li = $(ev.currentTarget).parents(".automation-item") const li = $(ev.currentTarget).parents(".automation-item")
let index = li.data("automation-index") let index = li.data("automation-index")
let autom = duplicate(this.object.system.automations) let autom = foundry.utils.duplicate(this.object.system.automations)
autom.splice(index,1) autom.splice(index,1)
this.object.update( { 'system.automations': autom }) this.object.update( { 'system.automations': autom })
}) })
html.find('.automation-edit-field').change(ev => { html.find('.automation-edit-field').change(ev => {
let index = $(ev.currentTarget).data("automation-index") let index = $(ev.currentTarget).data("automation-index")
let field = $(ev.currentTarget).data("automation-field") let field = $(ev.currentTarget).data("automation-field")
let auto = duplicate(this.object.system.automations) let auto = foundry.utils.duplicate(this.object.system.automations)
auto[index][field] = ev.currentTarget.value auto[index][field] = ev.currentTarget.value
auto[index].id = auto[index].id || randomID(16) auto[index].id = auto[index].id || randomID(16)
this.object.update( { 'system.automations': auto }) this.object.update( { 'system.automations': auto })
}) })
// Update Inventory Item // Update Inventory Item
html.find('.item-delete').click(ev => { html.find('.item-delete').click(ev => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item");

View File

@@ -13,6 +13,7 @@ export const defaultItemImg = {
artefact: "systems/fvtt-hawkmoon-cyd/assets/icons/artefact.webp", artefact: "systems/fvtt-hawkmoon-cyd/assets/icons/artefact.webp",
contact: "systems/fvtt-hawkmoon-cyd/assets/icons/contacts.webp", contact: "systems/fvtt-hawkmoon-cyd/assets/icons/contacts.webp",
ressource: "systems/fvtt-hawkmoon-cyd/assets/icons/ressources.webp", ressource: "systems/fvtt-hawkmoon-cyd/assets/icons/ressources.webp",
mutation: "systems/fvtt-hawkmoon-cyd/assets/icons/mutation.webp",
} }
/** /**

View File

@@ -18,6 +18,7 @@ import { HawkmoonCombat } from "./hawkmoon-combat.js";
import { HawkmoonItem } from "./hawkmoon-item.js"; import { HawkmoonItem } from "./hawkmoon-item.js";
import { HawkmoonAutomation } from "./hawkmoon-automation.js"; import { HawkmoonAutomation } from "./hawkmoon-automation.js";
import { HawkmoonTokenHud } from "./hawkmoon-hud.js"; import { HawkmoonTokenHud } from "./hawkmoon-hud.js";
import { HAWKMOON_CONFIG } from "./hawkmoon-config.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
/* Foundry VTT Initialization */ /* Foundry VTT Initialization */
@@ -32,7 +33,7 @@ Hooks.once("init", async function () {
HawkmoonUtility.preloadHandlebarsTemplates() HawkmoonUtility.preloadHandlebarsTemplates()
/* -------------------------------------------- */ /* -------------------------------------------- */
// Set an initiative formula for the system // Set an initiative formula for the system
CONFIG.Combat.initiative = { CONFIG.Combat.initiative = {
formula: "1d10", formula: "1d10",
decimals: 1 decimals: 1
@@ -50,18 +51,19 @@ Hooks.once("init", async function () {
CONFIG.Item.documentClass = HawkmoonItem CONFIG.Item.documentClass = HawkmoonItem
game.system.hawkmoon = { game.system.hawkmoon = {
HawkmoonUtility, HawkmoonUtility,
HawkmoonAutomation HawkmoonAutomation,
config : HAWKMOON_CONFIG
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
// Register sheet application classes // Regster sheet application classes
Actors.unregisterSheet("core", ActorSheet); foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet);
Actors.registerSheet("fvtt-hawkmoon-cyd", HawkmoonActorSheet, { types: ["personnage"], makeDefault: true }) foundry.documents.collections.Actors.registerSheet("fvtt-hawkmoon-cyd", HawkmoonActorSheet, { types: ["personnage"], makeDefault: true })
Actors.registerSheet("fvtt-hawkmoon-cyd", HawkmoonCreatureSheet, { types: ["creature"], makeDefault: true }) foundry.documents.collections.Actors.registerSheet("fvtt-hawkmoon-cyd", HawkmoonCreatureSheet, { types: ["creature"], makeDefault: true })
Actors.registerSheet("fvtt-hawkmoon-cyd", HawkmoonCelluleSheet, { types: ["cellule"], makeDefault: true }); foundry.documents.collections.Actors.registerSheet("fvtt-hawkmoon-cyd", HawkmoonCelluleSheet, { types: ["cellule"], makeDefault: true });
Items.unregisterSheet("core", ItemSheet); foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet);
Items.registerSheet("fvtt-hawkmoon-cyd", HawkmoonItemSheet, { makeDefault: true }) foundry.documents.collections.Items.registerSheet("fvtt-hawkmoon-cyd", HawkmoonItemSheet, { makeDefault: true })
HawkmoonUtility.init() HawkmoonUtility.init()
HawkmoonAutomation.init() HawkmoonAutomation.init()
@@ -83,28 +85,15 @@ function welcomeMessage() {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
// Register world usage statistics async function importDefaultScene() {
function registerUsageCount(registerKey) { let exists = game.scenes.find(j => j.name == "Accueil");
if (game.user.isGM) { if (!exists) {
game.settings.register(registerKey, "world-key", { const scenes = await HawkmoonUtility.loadCompendium("fvtt-hawkmoon-cyd.scenes")
name: "Unique world key", let newDocuments = scenes.filter(i => i.name == "Accueil");
scope: "world", if (newDocuments) {
config: false, await game.scenes.documentClass.create(newDocuments);
default: "", game.scenes.find(i => i.name == "Accueil").activate();
type: String
});
let worldKey = game.settings.get(registerKey, "world-key")
if (worldKey == undefined || worldKey == "") {
worldKey = randomID(32)
game.settings.set(registerKey, "world-key", worldKey)
} }
// Simple API counter
let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"`
//$.ajaxSetup({
//headers: { 'Access-Control-Allow-Origin': '*' }
//})
$.ajax(regURL)
} }
} }
@@ -124,14 +113,16 @@ Hooks.once("ready", function () {
}); });
} }
registerUsageCount('fvtt-hawkmoon-cyd') import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter=>{
console.log("ClassCounter loaded", moduleCounter)
moduleCounter.ClassCounter.registerUsageCount()
}).catch(err=>
console.log("No stats available, giving up.")
)
importDefaultScene()
welcomeMessage() welcomeMessage()
// CSS patch for v9
if (game.version) {
let sidebar = document.getElementById("sidebar");
sidebar.style.width = "min-content";
}
}); });
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -147,4 +138,3 @@ Hooks.on("chatMessage", (html, content, msg) => {
} }
return true; return true;
}); });

View File

@@ -3,12 +3,12 @@ import { HawkmoonUtility } from "./hawkmoon-utility.js";
export class HawkmoonRollDialog extends Dialog { export class HawkmoonRollDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async create(actor, rollData ) { static async create(actor, rollData) {
let options = { classes: ["HawkmoonDialog"], width: 320, height: 'fit-content', 'z-index': 99999 }; let options = { classes: ["HawkmoonDialog"], width: 420, height: 'fit-content', 'z-index': 99999 };
let html = await renderTemplate('systems/fvtt-hawkmoon-cyd/templates/roll-dialog-generic.html', rollData); let html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-hawkmoon-cyd/templates/roll-dialog-generic.html', rollData);
return new HawkmoonRollDialog(actor, rollData, html, options ); return new HawkmoonRollDialog(actor, rollData, html, options);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -16,22 +16,23 @@ export class HawkmoonRollDialog extends Dialog {
let conf = { let conf = {
title: "Test de Capacité", title: "Test de Capacité",
content: html, content: html,
buttons: { buttons: {
rolld10: { rolld10: {
icon: '<i class="fas fa-check"></i>', icon: '<i class="fas fa-check"></i>',
label: "Lancer 1d10", label: "Lancer 1d10",
callback: () => { this.roll("d10") } callback: () => { this.roll("d10") }
}, },
rolld20: { rolld20: {
icon: '<i class="fas fa-check"></i>', icon: '<i class="fas fa-check"></i>',
label: "Lancer 1d20", label: "Lancer 1d20",
callback: () => { this.roll("d20") } callback: () => { this.roll("d20") }
}, },
cancel: { cancel: {
icon: '<i class="fas fa-times"></i>', icon: '<i class="fas fa-times"></i>',
label: "Annuler", label: "Annuler",
callback: () => { this.close() } callback: () => { this.close() }
} }, }
},
close: close close: close
} }
@@ -42,9 +43,9 @@ export class HawkmoonRollDialog extends Dialog {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
roll ( dice) { roll(dice) {
this.rollData.mainDice = dice this.rollData.mainDice = dice
HawkmoonUtility.rollHawkmoon( this.rollData ) HawkmoonUtility.rollHawkmoon(this.rollData)
} }
@@ -56,55 +57,87 @@ export class HawkmoonRollDialog extends Dialog {
function onLoad() { function onLoad() {
} }
$(function () { onLoad(); }); $(function () { onLoad(); });
html.find('#modificateur').change(async (event) => { html.find('#modificateur').change(async (event) => {
this.rollData.modificateur = Number(event.currentTarget.value) this.rollData.modificateur = Number(event.currentTarget.value)
}) })
html.find('#difficulte').change(async (event) => { html.find('#difficulte').change((event) => {
console.log("Difficulte: " + event.currentTarget.value)
this.rollData.difficulte = Number(event.currentTarget.value) this.rollData.difficulte = Number(event.currentTarget.value)
}) })
html.find('#attrKey').change(async (event) => { html.find('#attrKey').change(async (event) => {
this.rollData.attrKey = String(event.currentTarget.value) this.rollData.attrKey = String(event.currentTarget.value)
}) })
html.find('#select-maitrise').change(async (event) => { html.find('#attrKey2').change(async (event) => {
this.rollData.attrKey2 = String(event.currentTarget.value)
})
html.find('#select-maitrise').change(async (event) => {
this.rollData.maitriseId = String(event.currentTarget.value) this.rollData.maitriseId = String(event.currentTarget.value)
}) })
html.find('#competence-talents').change((event) => { html.find('#competence-talents').change((event) => {
this.rollData.selectedTalents = $('#competence-talents').val() this.rollData.selectedTalents = $('#competence-talents').val()
}) })
html.find('#taille-cible').change((event) => { html.find('#taille-cible').change((event) => {
this.rollData.tailleCible = String(event.currentTarget.value) this.rollData.tailleCible = String(event.currentTarget.value)
}) })
html.find('#tireur-deplacement').change((event) => { html.find('#tireur-deplacement').change((event) => {
this.rollData.tireurDeplacement = String(event.currentTarget.value) this.rollData.tireurDeplacement = String(event.currentTarget.value)
}) })
html.find('#cible-couvert').change((event) => { html.find('#cible-couvert').change((event) => {
this.rollData.cibleCouvert = String(event.currentTarget.value) this.rollData.cibleCouvert = String(event.currentTarget.value)
}) })
html.find('#distance-tir').change((event) => { html.find('#distance-tir').change((event) => {
this.rollData.distanceTir = String(event.currentTarget.value) this.rollData.distanceTir = String(event.currentTarget.value)
}) })
html.find('#bonus-malus-context').change((event) => { html.find('#bonus-malus-context').change((event) => {
this.rollData.bonusMalusContext = Number(event.currentTarget.value) this.rollData.bonusMalusContext = Number(event.currentTarget.value)
}) })
html.find('#defenseur-au-sol').change((event) => { html.find('#defenseur-au-sol').change((event) => {
this.rollData.defenseurAuSol = event.currentTarget.checked this.rollData.defenseurAuSol = event.currentTarget.checked
})
html.find('#ambidextre-1').change((event) => {
this.rollData.ambidextre1 = event.currentTarget.checked
})
html.find('#ambidextre-2').change((event) => {
this.rollData.ambidextre2 = event.currentTarget.checked
})
html.find('#attaque-monte').change((event) => {
this.rollData.attqueMonte = event.currentTarget.checked
}) })
html.find('#defenseur-aveugle').change((event) => { html.find('#defenseur-aveugle').change((event) => {
this.rollData.defenseurAveugle = event.currentTarget.checked this.rollData.defenseurAveugle = event.currentTarget.checked
}) })
html.find('#defenseur-de-dos').change((event) => { html.find('#defenseur-de-dos').change((event) => {
this.rollData.defenseurDeDos = event.currentTarget.checked this.rollData.defenseurDeDos = event.currentTarget.checked
}) })
html.find('#defenseur-restreint').change((event) => { html.find('#defenseur-restreint').change((event) => {
this.rollData.defenseurRestreint = event.currentTarget.checked this.rollData.defenseurRestreint = event.currentTarget.checked
}) })
html.find('#defenseur-immobilise').change((event) => { html.find('#defenseur-immobilise').change((event) => {
this.rollData.defenseurImmobilise = event.currentTarget.checked this.rollData.defenseurImmobilise = event.currentTarget.checked
}) })
html.find('#attaque-charge').change((event) => {
this.rollData.attaqueCharge = event.currentTarget.checked
})
html.find('#charge-cavalerie').change((event) => {
this.rollData.chargeCavalerie = event.currentTarget.checked
})
html.find('#attaquants-multiple').change((event) => {
this.rollData.attaquantsMultiples = event.currentTarget.checked
})
html.find('#soutiens').change((event) => {
this.rollData.soutiens = Number(event.currentTarget.value)
})
html.find('#feinte').change((event) => {
this.rollData.feinte = event.currentTarget.checked
})
html.find('#contenir').change((event) => {
this.rollData.contenir = event.currentTarget.checked
})
html.find('#attaque-desarme').change((event) => {
this.rollData.attaqueDesarme = event.currentTarget.checked
})
} }
} }

View File

@@ -3,10 +3,10 @@ import { HawkmoonCombat } from "./hawkmoon-combat.js";
import { HawkmoonCommands } from "./hawkmoon-commands.js"; import { HawkmoonCommands } from "./hawkmoon-commands.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
const __distanceDifficulte = { "porteecourte": 5, "porteemoyenne": 9, "porteelongue": 14} const __distanceDifficulte = { "porteecourte": 5, "porteemoyenne": 9, "porteelongue": 14 }
const __tireurDeplacement = { immobile: 0, lent: 3, rapide: 5} const __tireurDeplacement = { immobile: 0, lent: 3, rapide: 5 }
const __cibleCouvert = { aucun: 0, leger: 5, complet: 10} const __cibleCouvert = { aucun: 0, leger: 5, complet: 10 }
const __tailleCible = { normal: 0, main: 10, enfant: 3, maison: -10} const __tailleCible = { normal: 0, main: 10, enfant: 3, maison: -10 }
/* -------------------------------------------- */ /* -------------------------------------------- */
export class HawkmoonUtility { export class HawkmoonUtility {
@@ -15,8 +15,7 @@ export class HawkmoonUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async init() { static async init() {
Hooks.on('renderChatLog', (log, html, data) => HawkmoonUtility.chatListeners(html)) Hooks.on('renderChatLog', (log, html, data) => HawkmoonUtility.chatListeners(html))
Hooks.on("getChatLogEntryContext", (html, options) => HawkmoonUtility.chatRollMenu(html, options)) Hooks.on("getChatMessageContextOptions", (html, options) => HawkmoonUtility.chatRollMenu(html, options))
Hooks.on("getCombatTrackerEntryContext", (html, options) => { Hooks.on("getCombatTrackerEntryContext", (html, options) => {
HawkmoonUtility.pushInitiativeOptions(html, options); HawkmoonUtility.pushInitiativeOptions(html, options);
}) })
@@ -114,6 +113,26 @@ export class HawkmoonUtility {
let logoPause = "systems/fvtt-hawkmoon-cyd/assets/logos/" + game.settings.get("fvtt-hawkmoon-cyd", "hawkmoon-pause-logo") + ".webp" let logoPause = "systems/fvtt-hawkmoon-cyd/assets/logos/" + game.settings.get("fvtt-hawkmoon-cyd", "hawkmoon-pause-logo") + ".webp"
let logoImg = document.querySelector('#pause').children[0] let logoImg = document.querySelector('#pause').children[0]
logoImg.setAttribute('style', `content: url(${logoPause})`) logoImg.setAttribute('style', `content: url(${logoPause})`)
game.system.hawkmoon.config.listeNiveauSkill = this.createDirectOptionList(0, 10)
game.system.hawkmoon.config.listeNiveauCreature = this.createDirectOptionList(0, 35)
game.system.hawkmoon.config.listeNiveauContact = this.createDirectOptionList(1, 3)
}
/* -------------------------------------------- */
static createDirectOptionList(min, max) {
let options = {};
for (let i = min; i <= max; i++) {
options[`${i}`] = `${i}`;
}
return options;
}
static createArrayOptionList(min, max) {
let options = [];
for (let i = min; i <= max; i++) {
options.push({ key: `${i}`, label: `${i}` });
}
return options;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -135,24 +154,33 @@ export class HawkmoonUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async chatListeners(html) { static async chatListeners(html) {
html.on("click", '.predilection-reroll', async event => { $(html).on("click", '.predilection-reroll', async event => {
let predIdx = $(event.currentTarget).data("predilection-index") let predIdx = $(event.currentTarget).data("predilection-index")
let messageId = HawkmoonUtility.findChatMessageId(event.currentTarget) let messageId = HawkmoonUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId) let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "hawkmoon-roll") let rollData = message.getFlag("world", "hawkmoon-roll")
let actor = this.getActorFromRollData(rollData) let actor = HawkmoonUtility.getActorFromRollData(rollData)
await actor.setPredilectionUsed(rollData.competence._id, predIdx) await actor.setPredilectionUsed(rollData.competence._id, predIdx)
rollData.competence = duplicate(actor.getCompetence(rollData.competence._id)) rollData.competence = foundry.utils.duplicate(actor.getCompetence(rollData.competence._id))
HawkmoonUtility.rollHawkmoon(rollData) HawkmoonUtility.rollHawkmoon(rollData)
}) })
html.on("click", '.roll-chat-degat', async event => { $(html).on("click", '.roll-chat-degat', async event => {
let messageId = HawkmoonUtility.findChatMessageId(event.currentTarget) let messageId = HawkmoonUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId) let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "hawkmoon-roll") let rollData = message.getFlag("world", "hawkmoon-roll")
let actor = this.getActorFromRollData(rollData) let actor = HawkmoonUtility.getActorFromRollData(rollData)
actor.rollArmeDegats(rollData.arme._id, rollData.targetVigueur, rollData) actor.rollArmeDegats(rollData.arme._id, rollData.targetVigueur, rollData)
}) })
$(html).on("click", '.roll-chat-degat-devastateur', async event => {
let messageId = HawkmoonUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "hawkmoon-roll")
let actor = HawkmoonUtility.getActorFromRollData(rollData)
rollData.applyCoupDevastateur = true
actor.rollArmeDegats(rollData.arme._id, rollData.targetVigueur, rollData)
})
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -163,14 +191,11 @@ export class HawkmoonUtility {
'systems/fvtt-hawkmoon-cyd/templates/partial-item-header.html', 'systems/fvtt-hawkmoon-cyd/templates/partial-item-header.html',
'systems/fvtt-hawkmoon-cyd/templates/partial-item-description.html', 'systems/fvtt-hawkmoon-cyd/templates/partial-item-description.html',
'systems/fvtt-hawkmoon-cyd/templates/partial-item-nav.html', 'systems/fvtt-hawkmoon-cyd/templates/partial-item-nav.html',
'systems/fvtt-hawkmoon-cyd/templates/partial-list-niveau.html',
'systems/fvtt-hawkmoon-cyd/templates/partial-list-niveau-creature.html',
'systems/fvtt-hawkmoon-cyd/templates/partial-item-prix.html', 'systems/fvtt-hawkmoon-cyd/templates/partial-item-prix.html',
'systems/fvtt-hawkmoon-cyd/templates/partial-sante-etat.html',
'systems/fvtt-hawkmoon-cyd/templates/partial-automation.html', 'systems/fvtt-hawkmoon-cyd/templates/partial-automation.html',
'systems/fvtt-hawkmoon-cyd/templates/hud-adversites.html', 'systems/fvtt-hawkmoon-cyd/templates/hud-adversites.html',
] ]
return loadTemplates(templatePaths); return foundry.applications.handlebars.loadTemplates(templatePaths);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -247,30 +272,19 @@ export class HawkmoonUtility {
let id = rollData.rollId; let id = rollData.rollId;
let oldRollData = this.rollDataStore[id] || {}; let oldRollData = this.rollDataStore[id] || {};
let newRollData = mergeObject(oldRollData, rollData); let newRollData = foundry.utils.mergeObject(oldRollData, rollData);
this.rollDataStore[id] = newRollData; this.rollDataStore[id] = newRollData;
} }
/* -------------------------------------------- */
static saveRollData(rollData) {
game.socket.emit("system.fvtt-hawkmoon-cyd", {
name: "msg_update_roll", data: rollData
}); // Notify all other clients of the roll
this.updateRollData(rollData);
}
/* -------------------------------------------- */
static getRollData(id) {
return this.rollDataStore[id];
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static onSocketMesssage(msg) { static onSocketMesssage(msg) {
//console.log("SOCKET MESSAGE", msg.name, game.user.character.id, msg.data.defenderId); if (msg.msg == "msg_apply_combativite") {
if (msg.name == "msg_update_defense_state") { let defender = game.canvas.tokens.get(msg.data.defenderTokenId)?.actor
this.updateDefenseState(msg.data.defenderId, msg.data.rollId); if (defender) {
} defender.changeEtatCombativite(msg.data.value)
if (msg.name == "msg_update_roll") { } else {
this.updateRollData(msg.data); console.warn("HawkmoonUtility.onSocketMesssage : Impossible de trouver le token pour appliquer la combativité", msg.defenderTokenId)
}
} }
} }
@@ -304,10 +318,10 @@ export class HawkmoonUtility {
switch (rollMode) { switch (rollMode) {
case "blindroll": //GM only case "blindroll": //GM only
blind = true; blind = true;
case "gmroll": //GM + rolling player case "gmroll": // GM + rolling player
whisper = this.getUsers(user => user.isGM); whisper = this.getUsers(user => user.isGM);
break; break;
case "roll": //everybody case "roll": // everybody
whisper = this.getUsers(user => user.active); whisper = this.getUsers(user => user.active);
break; break;
case "selfroll": case "selfroll":
@@ -325,7 +339,7 @@ export class HawkmoonUtility {
let pa = Math.floor((valueSC - (po * 400)) / 20) let pa = Math.floor((valueSC - (po * 400)) / 20)
let sc = valueSC - (po * 400) - (pa * 20) let sc = valueSC - (po * 400) - (pa * 20)
return { return {
po: po, pa: pa, sc: sc, valueSC: valueSC po, pa, sc, valueSC
} }
} }
@@ -344,15 +358,28 @@ export class HawkmoonUtility {
} }
} }
//console.log("Result : ", rollData) //console.log("Result : ", rollData
this.computeResultQuality(rollData)
}
/* -------------------------------------------- */
static computeResultQuality(rollData) {
if (rollData.difficulte > 0 && !rollData.isDramatique) { if (rollData.difficulte > 0 && !rollData.isDramatique) {
rollData.isSuccess = (rollData.finalResult >= rollData.difficulte) rollData.isSuccess = (rollData.finalResult >= rollData.difficulte)
rollData.isHeroique = ((rollData.finalResult - rollData.difficulte) >= 10) rollData.isHeroique = ((rollData.finalResult - rollData.difficulte) >= 10)
rollData.isDramatique = ((rollData.finalResult - rollData.difficulte) <= -10) rollData.isDramatique = ((rollData.finalResult - rollData.difficulte) <= -10)
} }
} }
/* -------------------------------------------- */
static applyCombativite(rollData, value) {
if (game.user.isGM) {
let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor
defender.changeEtatCombativite(value)
} else {
game.socket.emit("system.fvtt-hawkmoon-cyd", { msg: "msg_apply_combativite", data: { defenderTokenId: rollData.defenderTokenId, value } });
}
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static async rollHawkmoon(rollData) { static async rollHawkmoon(rollData) {
@@ -362,7 +389,10 @@ export class HawkmoonUtility {
} }
if (!rollData.attr) { if (!rollData.attr) {
rollData.actionImg = "systems/fvtt-hawkmoon-cyd/assets/icons/" + actor.system.attributs[rollData.attrKey].labelnorm + ".webp" rollData.actionImg = "systems/fvtt-hawkmoon-cyd/assets/icons/" + actor.system.attributs[rollData.attrKey].labelnorm + ".webp"
rollData.attr = duplicate(actor.system.attributs[rollData.attrKey]) rollData.attr = foundry.utils.duplicate(actor.system.attributs[rollData.attrKey])
}
if (rollData.attrKey2 != "none") {
rollData.attr2 = foundry.utils.duplicate(actor.system.attributs[rollData.attrKey2])
} }
if (rollData.maitriseId != "none") { if (rollData.maitriseId != "none") {
@@ -374,7 +404,7 @@ export class HawkmoonUtility {
//console.log("BEFORE COMP", rollData) //console.log("BEFORE COMP", rollData)
if (rollData.competence) { if (rollData.competence) {
rollData.predilections = duplicate(rollData.competence.system.predilections.filter(pred => pred.acquise && !pred.maitrise && !pred.used) || []) rollData.predilections = foundry.utils.duplicate(rollData.competence.system.predilections || [])
let compmod = (rollData.competence.system.niveau == 0) ? -3 : 0 let compmod = (rollData.competence.system.niveau == 0) ? -3 : 0
rollData.diceFormula += `+${rollData.attr.value}+${rollData.competence.system.niveau}+${rollData.modificateur}+${compmod}` rollData.diceFormula += `+${rollData.attr.value}+${rollData.competence.system.niveau}+${rollData.modificateur}+${compmod}`
@@ -396,13 +426,26 @@ export class HawkmoonUtility {
} }
} }
rollData.diceFormula += `+${rollData.bonusMalusContext}` rollData.diceFormula += `+${rollData.bonusMalusContext}`
} else if (rollData.attr2) {
rollData.diceFormula += `+${rollData.attr.value}+${rollData.attr2.value}+${rollData.modificateur}+${rollData.bonusMalusContext}`
} else { } else {
rollData.diceFormula += `+${rollData.attr.value}*${rollData.multiplier}+${rollData.modificateur}+${rollData.bonusMalusContext}` rollData.diceFormula += `+${rollData.attr.value}*${rollData.multiplier}+${rollData.modificateur}+${rollData.bonusMalusContext}`
} }
// Bonus arme naturelle en défense // Bonus arme naturelle en défense
if (rollData.bonusArmeNaturelle) { if (rollData.bonusArmeNaturelle) {
rollData.diceFormula += `+${rollData.bonusArmeNaturelle}` rollData.diceFormula += `+${rollData.bonusArmeNaturelle}`
} }
if (rollData.attaquantsMultiples) {
rollData.diceFormula += `+3`
}
if (rollData.hasAmbidextre) {
if (rollData.ambidextre1) {
rollData.diceFormula += `-3`
} else if (rollData.ambidextre2) {
rollData.diceFormula += `-6`
}
}
if (rollData.defenseurAuSol) { if (rollData.defenseurAuSol) {
rollData.diceFormula += `+3` rollData.diceFormula += `+3`
} }
@@ -418,15 +461,23 @@ export class HawkmoonUtility {
if (rollData.defenseurImmobilise) { if (rollData.defenseurImmobilise) {
rollData.diceFormula += `+5` rollData.diceFormula += `+5`
} }
if (rollData.soutiens > 0) { // 1 soutien = +3, 2 soutiens = +4, 3 soutiens = +5
if (rollData.arme && rollData.arme.system.isDistance) { rollData.diceFormula += `+${rollData.soutiens + 2}`
}
if (rollData.arme?.system.isDistance) {
rollData.difficulte = __distanceDifficulte[rollData.distanceTir] rollData.difficulte = __distanceDifficulte[rollData.distanceTir]
rollData.difficulte += __tireurDeplacement[rollData.tireurDeplacement] rollData.difficulte += __tireurDeplacement[rollData.tireurDeplacement]
rollData.difficulte += __cibleCouvert[rollData.cibleCouvert] rollData.difficulte += __cibleCouvert[rollData.cibleCouvert]
rollData.difficulte += __tailleCible[rollData.tailleCible] rollData.difficulte += __tailleCible[rollData.tailleCible]
rollData.difficulte += rollData.cibleDeplace ? 3 : 0 rollData.difficulte += rollData.cibleDeplace ? 3 : 0
rollData.difficulte += rollData.cibleCaC ? 3 : 0 rollData.difficulte += rollData.cibleCaC ? 3 : 0
rollData.difficulte += rollData.protectionDefenseur
} }
if (rollData.attaqueDesarme) {
rollData.difficulte += 10
}
// Ajout adversités // Ajout adversités
rollData.diceFormula += `-${rollData.nbAdversites}` rollData.diceFormula += `-${rollData.nbAdversites}`
@@ -434,9 +485,12 @@ export class HawkmoonUtility {
rollData.diceFormula += `+${rollData.arme.system.bonusmaniementoff}` rollData.diceFormula += `+${rollData.arme.system.bonusmaniementoff}`
} }
let myRoll = new Roll(rollData.diceFormula).roll({ async: false }) // Gestion de la feinte éventuelle
rollData.nbCombativitePerdu = 1
let myRoll = await new Roll(rollData.diceFormula).roll()
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode")) await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
rollData.roll = myRoll rollData.roll = foundry.utils.duplicate(myRoll)
console.log(">>>> ", myRoll) console.log(">>>> ", myRoll)
rollData.finalResult = myRoll.total rollData.finalResult = myRoll.total
@@ -444,27 +498,59 @@ export class HawkmoonUtility {
if (rollData.isInit) { if (rollData.isInit) {
actor.setFlag("world", "last-initiative", rollData.finalResult) actor.setFlag("world", "last-initiative", rollData.finalResult)
} }
if (rollData.feinte) {
actor.changeBonneAventure(-1)
if (rollData.isHeroique) {
rollData.nbCombativitePerdu = "vaincu"
} else if (rollData.isSuccess) {
rollData.nbCombativitePerdu = 2
}
}
this.createChatWithRollMode(rollData.alias, { this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-generic-result.html`, rollData) content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-generic-result.html`, rollData)
}, rollData) }, rollData)
if ((rollData.coupBas || rollData.arme) && rollData.isSuccess && rollData.defenderTokenId) {
this.applyCombativite(rollData, rollData.nbCombativitePerdu)
}
if (rollData.coupBas && rollData.isSuccess && rollData.defenderTokenId) {
let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor
defender.incDecAdversite("bleue", -2)
}
}
/* -------------------------------------------- */
static getCombativiteList(nbActivite) {
let list = [{ value: String(0), label: "Combatif" }]
for (let i = 1; i < nbActivite - 2; i++) {
list.push({ value: String(i), label: "Eprouvé " + i })
}
list[nbActivite - 2] = { value: String(nbActivite - 2), label: "Affaibli" }
list[nbActivite - 1] = { value: String(nbActivite - 1), label: "Très Affaibli" }
list[nbActivite] = { value: String(nbActivite), label: "Vaincu" }
return list
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static async bonusRollHawkmoon(rollData) { static async bonusRollHawkmoon(rollData) {
rollData.bonusFormula = rollData.addedBonus rollData.bonusFormula = rollData.addedBonus
console.log("Bonus Roll Hawkmoon", rollData.bonusFormula)
let bonusRoll = new Roll(rollData.bonusFormula).roll({ async: false }) if (!Number(rollData.bonusFormula)) {
await this.showDiceSoNice(bonusRoll, game.settings.get("core", "rollMode")); let bonusRoll = await new Roll(rollData.bonusFormula).roll()
rollData.bonusRoll = bonusRoll await this.showDiceSoNice(bonusRoll, game.settings.get("core", "rollMode"));
rollData.bonusRoll = foundry.utils.duplicate(bonusRoll)
rollData.finalResult += Number(rollData.bonusRoll.total)
} else {
rollData.finalResult += Number(rollData.bonusFormula)
console.log("Bonus Roll Hawkmoon 2", rollData.finalResult)
}
rollData.finalResult += rollData.bonusRoll.total this.computeResultQuality(rollData)
this.computeResult(rollData)
this.createChatWithRollMode(rollData.alias, { this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-generic-result.html`, rollData) content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-generic-result.html`, rollData)
}, rollData) }, rollData)
} }
@@ -491,7 +577,7 @@ export class HawkmoonUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static blindMessageToGM(chatOptions) { static blindMessageToGM(chatOptions) {
let chatGM = duplicate(chatOptions); let chatGM = foundry.utils.duplicate(chatOptions);
chatGM.whisper = this.getUsers(user => user.isGM); chatGM.whisper = this.getUsers(user => user.isGM);
chatGM.content = "Blinde message of " + game.user.name + "<br>" + chatOptions.content; chatGM.content = "Blinde message of " + game.user.name + "<br>" + chatOptions.content;
console.log("blindMessageToGM", chatGM); console.log("blindMessageToGM", chatGM);
@@ -555,7 +641,7 @@ export class HawkmoonUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static getBasicRollData() { static getBasicRollData() {
let rollData = { let rollData = {
rollId: randomID(16), rollId: foundry.utils.randomID(16),
rollMode: game.settings.get("core", "rollMode"), rollMode: game.settings.get("core", "rollMode"),
modificateursOptions: this.getModificateurOptions(), modificateursOptions: this.getModificateurOptions(),
pointAmeOptions: this.getPointAmeOptions(), pointAmeOptions: this.getPointAmeOptions(),
@@ -571,7 +657,14 @@ export class HawkmoonUtility {
tailleCible: "normal", tailleCible: "normal",
tireurDeplacement: "immobile", tireurDeplacement: "immobile",
cibleCouvert: "aucun", cibleCouvert: "aucun",
distanceTir: "porteemoyenne" distanceTir: "porteemoyenne",
attaqueCharge: false,
attaqueDesarme: false,
attaqueAmbidextre1: false,
attaqueAmbidextre2: false,
chargeCavalerie: false,
contenir: false,
soutiens: 0
} }
return rollData return rollData
} }
@@ -583,11 +676,22 @@ export class HawkmoonUtility {
rollData.defenderTokenId = target.id rollData.defenderTokenId = target.id
let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor
rollData.armeDefense = defender.getBestDefenseValue() rollData.armeDefense = defender.getBestDefenseValue()
rollData.armeAttaqueDefenseur = defender.getBestAttackValue()
rollData.targetVigueur = defender.getVigueur() rollData.targetVigueur = defender.getVigueur()
rollData.protectionDefenseur = defender.getProtection() rollData.protectionDefenseur = defender.getProtection()
if (rollData.armeDefense) { if (rollData.immobiliser || rollData.repousser) {
let combatValues = defender.getCombatValues()
rollData.difficulte = combatValues.defenseTotal + (rollData.armeDefense && rollData.cibleconsciente ? 5 : 0)
} else if (rollData.coupBas) {
let combatValues = defender.getCombatValues()
rollData.difficulte = combatValues.defenseTotal
} else if (rollData.assomer) {
rollData.difficulte = 3 + (defender.system.attributs.tre.value * 2)
} else if (rollData.desengager) {
rollData.difficulte = rollData.armeAttaqueDefenseur?.system?.totalOffensif || 0;
} else if (rollData.armeDefense) {
rollData.difficulte = rollData.armeDefense.system.totalDefensif rollData.difficulte = rollData.armeDefense.system.totalDefensif
if ( !rollData.arme.system.armenaturelle && !rollData.arme.system.armefortune ){ if (!rollData.desengager && !rollData.arme.system.armenaturelle && !rollData.arme.system.armefortune) {
if (rollData.armeDefense.system.armenaturelle || rollData.armeDefense.system.armefortune) { if (rollData.armeDefense.system.armenaturelle || rollData.armeDefense.system.armefortune) {
rollData.bonusArmeNaturelle = 3 rollData.bonusArmeNaturelle = 3
} }
@@ -605,11 +709,11 @@ export class HawkmoonUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static applyBonneAventureRoll(li, changed, addedBonus) { static applyBonneAventureRoll(li, changed, addedBonus) {
let msgId = li.data("message-id") let msgId = $(li).data("message-id")
let msg = game.messages.get(msgId) let msg = game.messages.get(msgId)
if (msg) { if (msg) {
let rollData = msg.getFlag("world", "hawkmoon-roll") let rollData = msg.getFlag("world", "hawkmoon-roll")
let actor = this.getActorFromRollData(rollData) let actor = HawkmoonUtility.getActorFromRollData(rollData)
actor.changeBonneAventure(changed) actor.changeBonneAventure(changed)
rollData.isReroll = true rollData.isReroll = true
rollData.textBonus = "Bonus de Points d'Aventure" rollData.textBonus = "Bonus de Points d'Aventure"
@@ -624,11 +728,11 @@ export class HawkmoonUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static applyEclatRoll(li, changed, addedBonus) { static applyEclatRoll(li, changed, addedBonus) {
let msgId = li.data("message-id") let msgId = $(li).data("message-id")
let msg = game.messages.get(msgId) let msg = game.messages.get(msgId)
if (msg) { if (msg) {
let rollData = msg.getFlag("world", "hawkmoon-roll") let rollData = msg.getFlag("world", "hawkmoon-roll")
let actor = this.getActorFromRollData(rollData) let actor = HawkmoonUtility.getActorFromRollData(rollData)
actor.changeEclat(changed) actor.changeEclat(changed)
rollData.isReroll = true rollData.isReroll = true
rollData.textBonus = "Bonus d'Eclat" rollData.textBonus = "Bonus d'Eclat"
@@ -645,15 +749,15 @@ export class HawkmoonUtility {
static chatRollMenu(html, options) { static chatRollMenu(html, options) {
let canApply = li => canvas.tokens.controlled.length && li.find(".hawkmoon-roll").length let canApply = li => canvas.tokens.controlled.length && li.find(".hawkmoon-roll").length
let canApplyBA = function (li) { let canApplyBA = function (li) {
let message = game.messages.get(li.attr("data-message-id")) let message = game.messages.get($(li).attr("data-message-id"))
let rollData = message.getFlag("world", "hawkmoon-roll") let rollData = message.getFlag("world", "hawkmoon-roll")
let actor = this.getActorFromRollData(rollData) let actor = HawkmoonUtility.getActorFromRollData(rollData)
return (!rollData.isReroll && actor.getBonneAventure() > 0) return (!rollData.isReroll && actor.getBonneAventure() > 0)
} }
let canApplyPE = function (li) { let canApplyPE = function (li) {
let message = game.messages.get(li.attr("data-message-id")) let message = game.messages.get($(li).attr("data-message-id"))
let rollData = message.getFlag("world", "hawkmoon-roll") let rollData = message.getFlag("world", "hawkmoon-roll")
let actor = this.getActorFromRollData(rollData) let actor = HawkmoonUtility.getActorFromRollData(rollData)
return (!rollData.isReroll && actor.getEclat() > 0) return (!rollData.isReroll && actor.getEclat() > 0)
} }
options.push( options.push(
@@ -677,7 +781,7 @@ export class HawkmoonUtility {
name: "Relancer le dé (1 point d'Eclat)", name: "Relancer le dé (1 point d'Eclat)",
icon: "<i class='fas fa-user-plus'></i>", icon: "<i class='fas fa-user-plus'></i>",
condition: canApply && canApplyPE, condition: canApply && canApplyPE,
callback: li => HawkmoonUtility.applyEclatRoll(li, -3, "reroll") callback: li => HawkmoonUtility.applyEclatRoll(li, -1, "reroll")
} }
) )
return options return options
@@ -686,11 +790,11 @@ export class HawkmoonUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async confirmDelete(actorSheet, li) { static async confirmDelete(actorSheet, li) {
let itemId = li.data("item-id"); let itemId = li.data("item-id");
let msgTxt = "<p>Are you sure to remove this Item ?"; let msgTxt = "<p>Etes vous certain de vouloir supprimer cet item ?";
let buttons = { let buttons = {
delete: { delete: {
icon: '<i class="fas fa-check"></i>', icon: '<i class="fas fa-check"></i>',
label: "Yes, remove it", label: "Oui !",
callback: () => { callback: () => {
actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]); actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
li.slideUp(200, () => actorSheet.render(false)); li.slideUp(200, () => actorSheet.render(false));
@@ -698,12 +802,12 @@ export class HawkmoonUtility {
}, },
cancel: { cancel: {
icon: '<i class="fas fa-times"></i>', icon: '<i class="fas fa-times"></i>',
label: "Cancel" label: "Non"
} }
} }
msgTxt += "</p>"; msgTxt += "</p>";
let d = new Dialog({ let d = new Dialog({
title: "Confirm removal", title: "Confirmer la suppression",
content: msgTxt, content: msgTxt,
buttons: buttons, buttons: buttons,
default: "cancel" default: "cancel"
@@ -722,7 +826,6 @@ export class HawkmoonUtility {
console.log(entryData) console.log(entryData)
htmlTab += `<tr><td>@UUID[Compendium.${compName}.${entryData._id}]{${entryData.name}}</td>` htmlTab += `<tr><td>@UUID[Compendium.${compName}.${entryData._id}]{${entryData.name}}</td>`
htmlTab += `<td>${entryData.system.description}</td>`; htmlTab += `<td>${entryData.system.description}</td>`;
//htmlTab += `<td>${entryData.system.resumebonus}</td>`;
htmlTab += "</tr>\n"; htmlTab += "</tr>\n";
} }
htmlTab += "</table>"; htmlTab += "</table>";

Binary file not shown.

View File

View File

@@ -0,0 +1 @@
MANIFEST-000329

0
packs/aides-de-jeu/LOCK Normal file
View File

8
packs/aides-de-jeu/LOG Normal file
View File

@@ -0,0 +1,8 @@
2025/11/21-21:17:11.288531 7f34ccff96c0 Recovering log #327
2025/11/21-21:17:11.303357 7f34ccff96c0 Delete type=3 #325
2025/11/21-21:17:11.303441 7f34ccff96c0 Delete type=0 #327
2025/11/21-21:20:34.182000 7f322ffff6c0 Level-0 table #332: started
2025/11/21-21:20:34.182040 7f322ffff6c0 Level-0 table #332: 0 bytes OK
2025/11/21-21:20:34.189103 7f322ffff6c0 Delete type=0 #330
2025/11/21-21:20:34.199156 7f322ffff6c0 Manual compaction at level-0 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
2025/11/21-21:20:34.220809 7f322ffff6c0 Manual compaction at level-1 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)

View File

@@ -0,0 +1,8 @@
2025/10/26-15:18:50.824844 7f058d1fa6c0 Recovering log #323
2025/10/26-15:18:50.834381 7f058d1fa6c0 Delete type=3 #321
2025/10/26-15:18:50.834446 7f058d1fa6c0 Delete type=0 #323
2025/10/26-15:36:37.999570 7f0586bff6c0 Level-0 table #328: started
2025/10/26-15:36:37.999597 7f0586bff6c0 Level-0 table #328: 0 bytes OK
2025/10/26-15:36:38.035738 7f0586bff6c0 Delete type=0 #326
2025/10/26-15:36:38.190124 7f0586bff6c0 Manual compaction at level-0 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
2025/10/26-15:36:38.190183 7f0586bff6c0 Manual compaction at level-1 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/armes/000275.ldb Normal file

Binary file not shown.

0
packs/armes/000330.log Normal file
View File

1
packs/armes/CURRENT Normal file
View File

@@ -0,0 +1 @@
MANIFEST-000328

0
packs/armes/LOCK Normal file
View File

8
packs/armes/LOG Normal file
View File

@@ -0,0 +1,8 @@
2025/11/21-21:17:11.119952 7f34cd7fa6c0 Recovering log #326
2025/11/21-21:17:11.135840 7f34cd7fa6c0 Delete type=3 #324
2025/11/21-21:17:11.135940 7f34cd7fa6c0 Delete type=0 #326
2025/11/21-21:20:34.115063 7f322ffff6c0 Level-0 table #331: started
2025/11/21-21:20:34.115090 7f322ffff6c0 Level-0 table #331: 0 bytes OK
2025/11/21-21:20:34.121038 7f322ffff6c0 Delete type=0 #329
2025/11/21-21:20:34.121241 7f322ffff6c0 Manual compaction at level-0 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
2025/11/21-21:20:34.121271 7f322ffff6c0 Manual compaction at level-1 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)

8
packs/armes/LOG.old Normal file
View File

@@ -0,0 +1,8 @@
2025/10/26-15:18:50.724903 7f05877fe6c0 Recovering log #322
2025/10/26-15:18:50.734667 7f05877fe6c0 Delete type=3 #320
2025/10/26-15:18:50.734726 7f05877fe6c0 Delete type=0 #322
2025/10/26-15:36:37.786399 7f0586bff6c0 Level-0 table #327: started
2025/10/26-15:36:37.786438 7f0586bff6c0 Level-0 table #327: 0 bytes OK
2025/10/26-15:36:37.828201 7f0586bff6c0 Delete type=0 #325
2025/10/26-15:36:37.860961 7f0586bff6c0 Manual compaction at level-0 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
2025/10/26-15:36:37.860990 7f0586bff6c0 Manual compaction at level-1 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)

BIN
packs/armes/MANIFEST-000328 Normal file

Binary file not shown.

Binary file not shown.

View File

View File

@@ -0,0 +1 @@
MANIFEST-000328

View File

View File

@@ -0,0 +1,8 @@
2025/11/21-21:17:11.082663 7f34ccff96c0 Recovering log #326
2025/11/21-21:17:11.097415 7f34ccff96c0 Delete type=3 #324
2025/11/21-21:17:11.097522 7f34ccff96c0 Delete type=0 #326
2025/11/21-21:20:34.082672 7f322ffff6c0 Level-0 table #331: started
2025/11/21-21:20:34.082698 7f322ffff6c0 Level-0 table #331: 0 bytes OK
2025/11/21-21:20:34.088631 7f322ffff6c0 Delete type=0 #329
2025/11/21-21:20:34.094927 7f322ffff6c0 Manual compaction at level-0 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
2025/11/21-21:20:34.094971 7f322ffff6c0 Manual compaction at level-1 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)

View File

@@ -0,0 +1,8 @@
2025/10/26-15:18:50.698736 7f058c9f96c0 Recovering log #322
2025/10/26-15:18:50.709788 7f058c9f96c0 Delete type=3 #320
2025/10/26-15:18:50.709858 7f058c9f96c0 Delete type=0 #322
2025/10/26-15:36:37.564245 7f0586bff6c0 Level-0 table #327: started
2025/10/26-15:36:37.564294 7f0586bff6c0 Level-0 table #327: 0 bytes OK
2025/10/26-15:36:37.604220 7f0586bff6c0 Delete type=0 #325
2025/10/26-15:36:37.709945 7f0586bff6c0 Manual compaction at level-0 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
2025/10/26-15:36:37.709995 7f0586bff6c0 Manual compaction at level-1 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

View File

@@ -0,0 +1 @@
MANIFEST-000328

0
packs/competences/LOCK Normal file
View File

8
packs/competences/LOG Normal file
View File

@@ -0,0 +1,8 @@
2025/11/21-21:17:11.044217 7f34ce7fc6c0 Recovering log #326
2025/11/21-21:17:11.059351 7f34ce7fc6c0 Delete type=3 #324
2025/11/21-21:17:11.059409 7f34ce7fc6c0 Delete type=0 #326
2025/11/21-21:20:34.076024 7f322ffff6c0 Level-0 table #331: started
2025/11/21-21:20:34.076057 7f322ffff6c0 Level-0 table #331: 0 bytes OK
2025/11/21-21:20:34.082546 7f322ffff6c0 Delete type=0 #329
2025/11/21-21:20:34.094915 7f322ffff6c0 Manual compaction at level-0 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
2025/11/21-21:20:34.094962 7f322ffff6c0 Manual compaction at level-1 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)

View File

@@ -0,0 +1,8 @@
2025/10/26-15:18:50.672996 7f058d1fa6c0 Recovering log #322
2025/10/26-15:18:50.683402 7f058d1fa6c0 Delete type=3 #320
2025/10/26-15:18:50.683496 7f058d1fa6c0 Delete type=0 #322
2025/10/26-15:36:37.604372 7f0586bff6c0 Level-0 table #327: started
2025/10/26-15:36:37.604409 7f0586bff6c0 Level-0 table #327: 0 bytes OK
2025/10/26-15:36:37.638938 7f0586bff6c0 Delete type=0 #325
2025/10/26-15:36:37.709963 7f0586bff6c0 Manual compaction at level-0 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
2025/10/26-15:36:37.710002 7f0586bff6c0 Manual compaction at level-1 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/equipement/000275.ldb Normal file

Binary file not shown.

View File

1
packs/equipement/CURRENT Normal file
View File

@@ -0,0 +1 @@
MANIFEST-000328

0
packs/equipement/LOCK Normal file
View File

8
packs/equipement/LOG Normal file
View File

@@ -0,0 +1,8 @@
2025/11/21-21:17:11.157103 7f34ce7fc6c0 Recovering log #326
2025/11/21-21:17:11.172875 7f34ce7fc6c0 Delete type=3 #324
2025/11/21-21:17:11.172939 7f34ce7fc6c0 Delete type=0 #326
2025/11/21-21:20:34.095092 7f322ffff6c0 Level-0 table #331: started
2025/11/21-21:20:34.095126 7f322ffff6c0 Level-0 table #331: 0 bytes OK
2025/11/21-21:20:34.102295 7f322ffff6c0 Delete type=0 #329
2025/11/21-21:20:34.121183 7f322ffff6c0 Manual compaction at level-0 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
2025/11/21-21:20:34.121249 7f322ffff6c0 Manual compaction at level-1 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)

8
packs/equipement/LOG.old Normal file
View File

@@ -0,0 +1,8 @@
2025/10/26-15:18:50.749067 7f058d1fa6c0 Recovering log #322
2025/10/26-15:18:50.759273 7f058d1fa6c0 Delete type=3 #320
2025/10/26-15:18:50.759337 7f058d1fa6c0 Delete type=0 #322
2025/10/26-15:36:37.743796 7f0586bff6c0 Level-0 table #327: started
2025/10/26-15:36:37.743858 7f0586bff6c0 Level-0 table #327: 0 bytes OK
2025/10/26-15:36:37.786277 7f0586bff6c0 Delete type=0 #325
2025/10/26-15:36:37.860948 7f0586bff6c0 Manual compaction at level-0 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
2025/10/26-15:36:37.860984 7f0586bff6c0 Manual compaction at level-1 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

View File

@@ -0,0 +1 @@
MANIFEST-000328

0
packs/historiques/LOCK Normal file
View File

8
packs/historiques/LOG Normal file
View File

@@ -0,0 +1,8 @@
2025/11/21-21:17:11.100312 7f34ce7fc6c0 Recovering log #326
2025/11/21-21:17:11.117500 7f34ce7fc6c0 Delete type=3 #324
2025/11/21-21:17:11.117567 7f34ce7fc6c0 Delete type=0 #326
2025/11/21-21:20:34.069446 7f322ffff6c0 Level-0 table #331: started
2025/11/21-21:20:34.069505 7f322ffff6c0 Level-0 table #331: 0 bytes OK
2025/11/21-21:20:34.075899 7f322ffff6c0 Delete type=0 #329
2025/11/21-21:20:34.094892 7f322ffff6c0 Manual compaction at level-0 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
2025/11/21-21:20:34.094951 7f322ffff6c0 Manual compaction at level-1 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)

View File

@@ -0,0 +1,8 @@
2025/10/26-15:18:50.712053 7f058d1fa6c0 Recovering log #322
2025/10/26-15:18:50.722592 7f058d1fa6c0 Delete type=3 #320
2025/10/26-15:18:50.722674 7f058d1fa6c0 Delete type=0 #322
2025/10/26-15:36:37.639047 7f0586bff6c0 Level-0 table #327: started
2025/10/26-15:36:37.639075 7f0586bff6c0 Level-0 table #327: 0 bytes OK
2025/10/26-15:36:37.675760 7f0586bff6c0 Delete type=0 #325
2025/10/26-15:36:37.709975 7f0586bff6c0 Manual compaction at level-0 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
2025/10/26-15:36:37.710009 7f0586bff6c0 Manual compaction at level-1 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/mutations/000185.ldb Normal file

Binary file not shown.

View File

1
packs/mutations/CURRENT Normal file
View File

@@ -0,0 +1 @@
MANIFEST-000238

0
packs/mutations/LOCK Normal file
View File

8
packs/mutations/LOG Normal file
View File

@@ -0,0 +1,8 @@
2025/11/21-21:17:11.062660 7f34cdffb6c0 Recovering log #236
2025/11/21-21:17:11.079663 7f34cdffb6c0 Delete type=3 #234
2025/11/21-21:17:11.079731 7f34cdffb6c0 Delete type=0 #236
2025/11/21-21:20:34.088817 7f322ffff6c0 Level-0 table #241: started
2025/11/21-21:20:34.088856 7f322ffff6c0 Level-0 table #241: 0 bytes OK
2025/11/21-21:20:34.094750 7f322ffff6c0 Delete type=0 #239
2025/11/21-21:20:34.094940 7f322ffff6c0 Manual compaction at level-0 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)
2025/11/21-21:20:34.094980 7f322ffff6c0 Manual compaction at level-1 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)

8
packs/mutations/LOG.old Normal file
View File

@@ -0,0 +1,8 @@
2025/10/26-15:18:50.686224 7f0587fff6c0 Recovering log #232
2025/10/26-15:18:50.696079 7f0587fff6c0 Delete type=3 #230
2025/10/26-15:18:50.696162 7f0587fff6c0 Delete type=0 #232
2025/10/26-15:36:37.675951 7f0586bff6c0 Level-0 table #237: started
2025/10/26-15:36:37.676003 7f0586bff6c0 Level-0 table #237: 0 bytes OK
2025/10/26-15:36:37.709795 7f0586bff6c0 Delete type=0 #235
2025/10/26-15:36:37.709986 7f0586bff6c0 Manual compaction at level-0 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)
2025/10/26-15:36:37.710016 7f0586bff6c0 Manual compaction at level-1 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/profils/000275.ldb Normal file

Binary file not shown.

0
packs/profils/000330.log Normal file
View File

1
packs/profils/CURRENT Normal file
View File

@@ -0,0 +1 @@
MANIFEST-000328

0
packs/profils/LOCK Normal file
View File

8
packs/profils/LOG Normal file
View File

@@ -0,0 +1,8 @@
2025/11/21-21:17:11.175622 7f34cd7fa6c0 Recovering log #326
2025/11/21-21:17:11.190667 7f34cd7fa6c0 Delete type=3 #324
2025/11/21-21:17:11.190757 7f34cd7fa6c0 Delete type=0 #326
2025/11/21-21:20:34.109081 7f322ffff6c0 Level-0 table #331: started
2025/11/21-21:20:34.109106 7f322ffff6c0 Level-0 table #331: 0 bytes OK
2025/11/21-21:20:34.114933 7f322ffff6c0 Delete type=0 #329
2025/11/21-21:20:34.121229 7f322ffff6c0 Manual compaction at level-0 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)
2025/11/21-21:20:34.121264 7f322ffff6c0 Manual compaction at level-1 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)

8
packs/profils/LOG.old Normal file
View File

@@ -0,0 +1,8 @@
2025/10/26-15:18:50.761639 7f05877fe6c0 Recovering log #322
2025/10/26-15:18:50.771506 7f05877fe6c0 Delete type=3 #320
2025/10/26-15:18:50.771562 7f05877fe6c0 Delete type=0 #322
2025/10/26-15:36:37.710125 7f0586bff6c0 Level-0 table #327: started
2025/10/26-15:36:37.710175 7f0586bff6c0 Level-0 table #327: 0 bytes OK
2025/10/26-15:36:37.743520 7f0586bff6c0 Delete type=0 #325
2025/10/26-15:36:37.860930 7f0586bff6c0 Manual compaction at level-0 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)
2025/10/26-15:36:37.860978 7f0586bff6c0 Manual compaction at level-1 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

View File

@@ -0,0 +1 @@
MANIFEST-000328

0
packs/protections/LOCK Normal file
View File

Some files were not shown because too many files have changed in this diff Show More