Compare commits

..

1 Commits

Author SHA1 Message Date
b58995014c Update README.md 2022-01-09 08:48:38 +00:00
196 changed files with 1086 additions and 1812 deletions

View File

@ -17,7 +17,7 @@ test:
build:
stage: build
script:
- zip fvtt-yggdrasill.zip -r *.js *.json *.md fonts images packs module styles templates -x ".*"
- zip fvtt-yggdrasill.zip -r *.js *.json *.md module styles templates -x ".*"
artifacts:
name: fvtt-yggdrasill
when: on_success

View File

@ -1,11 +1,8 @@
# Yggdrasill (7ième Cercle) pour FoundryVTT
# Système Yggdrasill pour FoundryVTT
Ce système non-officiel est le portage du JdR Yggdrasill (7ième Cercle) pour le système FoundryVTT.
https://www.7emecercle.com/7C_site/jeux-de-roles/yggdrasill/
Ce système est l'implémentation du jeu de rôle Yggdrasill (7ième Cercle) pour FoundryVTT.
Le livre de base d'Yggdrasill, disponible sur le site de 7ième cercle est nécessaire pour jouer.
Yggdrasill le jeu de rôle est la propriété de 7ième Cercle.
The Vinque font used in this system is properly licensed for Web usage. The proof of the license agreement can be provided thru mail from here or on the French Discord (user @Thelvyn).
Ce système n'est pas officiel, et nécessite le livre de base pour jouer.
Yggdrasill le JDR est la propriété de 7ième Cercle.

View File

@ -6,16 +6,16 @@
import { YggdrasillUtility } from "./yggdrasill-utility.js";
/* -------------------------------------------- */
export class YggdrasillActorSheet extends foundry.appv1.sheets.ActorSheet {
export class YggdrasillActorSheet extends ActorSheet {
/** @override */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
return mergeObject(super.defaultOptions, {
classes: ["yggdrasill", "sheet", "actor"],
template: "systems/fvtt-yggdrasill/templates/actor-sheet.html",
width: 680,
height: 740,
width: 640,
height: 720,
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "stats" }],
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }],
editScore: false
@ -23,9 +23,9 @@ export class YggdrasillActorSheet extends foundry.appv1.sheets.ActorSheet {
}
/* -------------------------------------------- */
async getData() {
const objectData = foundry.utils.duplicate(this.object)
getData() {
const objectData = YggdrasillUtility.data(this.object);
let formData = {
title: this.title,
id: objectData.id,
@ -34,7 +34,7 @@ export class YggdrasillActorSheet extends foundry.appv1.sheets.ActorSheet {
name: objectData.name,
editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked",
data: foundry.utils.deepClone(objectData.system),
data: foundry.utils.deepClone(YggdrasillUtility.templateData(this.object)),
effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)),
limited: this.object.limited,
isEpuise: this.actor.isEpuise(),
@ -48,31 +48,23 @@ export class YggdrasillActorSheet extends foundry.appv1.sheets.ActorSheet {
blessures: this.actor.getBlessures(),
armes: this.actor.getArmes(),
armures: this.actor.getArmures(),
boucliers: this.actor.getBoucliers(),
prouessesMartiales: this.actor.getProuessesMartiales(),
equipements: this.actor.getToutEquipements(),
effetsmagiques: this.actor.getEffetsMagiques(),
effetsRunes: this.actor.getEffetsDeRunes(),
encTotal: this.actor.getEncTotal(),
protectionTotal: this.actor.getProtectionTotal(),
dpBouclier: this.actor.getDpBouclier(),
monnaies: this.actor.getMonnaies(),
sortsSejdr:this.actor.getSortsSejdr(),
sortsGaldr:this.actor.getSortsGaldr(),
runes: this.actor.getRunes(),
optionsCarac: YggdrasillUtility.createDirectOptionList(0, 20),
optionsDMDP: YggdrasillUtility.createDirectSortedOptionList(-10, +10),
optionsBase: YggdrasillUtility.createDirectOptionList(0, 20),
optionsFuror: YggdrasillUtility.createDirectOptionList(0, 15),
tiragerunes: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.tiragesrunes, {async: true}),
description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.description, {async: true}),
notes: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.notes, {async: true}),
gmnotes: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.gmnotes, {async: true}),
optionsDMDP: YggdrasillUtility.createDirectSortedOptionList(-10, +10),
optionsBase: YggdrasillUtility.createDirectOptionList(0, 20),
optionsFuror: YggdrasillUtility.createDirectOptionList(0, 15),
options: this.options,
owner: this.document.isOwner,
editScore: this.options.editScore,
isGM: game.user.isGM,
config: game.system.config
isGM: game.user.isGM
}
// Dynamic update some fields
this.updateDM(formData.data);
@ -88,10 +80,10 @@ export class YggdrasillActorSheet extends foundry.appv1.sheets.ActorSheet {
dm.total = dm.max + Number(dm.bonusmalus);
}
/* -------------------------------------------- */
updateDP( data ) {
updateDP( data ) {
let dp = data.caracsecondaire.defensephy;
dp.total = dp.max + Number(dp.bonusmalus);
dp.total += this.actor.getDpBouclier();
dp.total += (dp.bouclierequipe) ? 3 : 0;
}
/* -------------------------------------------- */
@ -105,7 +97,7 @@ updateDP( data ) {
// Update Inventory Item
html.find('.item-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item");
const item = this.actor.items.get(li.data("item-id"));
const item = this.actor.getOwnedItem(li.data("item-id"));
item.sheet.render(true);
});
// Delete Inventory Item
@ -113,19 +105,19 @@ updateDP( data ) {
const li = $(ev.currentTarget).parents(".item");
YggdrasillUtility.confirmDelete(this, li);
});
html.find('#isEpuise').click(event => {
this.actor.toggleEpuise( );
} );
html.find('.munition-moins').click(event => {
const li = $(event.currentTarget).parents(".item");
const item = this.actor.items.get(li.data("item-id"));
const item = this.actor.getOwnedItem(li.data("item-id"));
this.actor.decrementeMunition( item );
} );
html.find('.munition-plus').click(event => {
const li = $(event.currentTarget).parents(".item");
const item = this.actor.items.get(li.data("item-id"));
const item = this.actor.getOwnedItem(li.data("item-id"));
this.actor.incrementeMunition( item );
} );
html.find('.equipement-moins').click(event => {
@ -159,32 +151,32 @@ updateDP( data ) {
const li = $(event.currentTarget).parents(".item");
const sortId = li.data("item-id");
this.actor.rollSort(sortId, "sejdr");
});
});
html.find('.sort-galdr').click((event) => {
const li = $(event.currentTarget).parents(".item");
const sortId = li.data("item-id");
this.actor.rollSort(sortId, "galdr");
});
});
html.find('.sort-rune').click((event) => {
const li = $(event.currentTarget).parents(".item");
const sortId = li.data("item-id");
this.actor.rollSort(sortId, "rune");
});
});
html.find('.arme-label a').click((event) => {
const li = $(event.currentTarget).parents(".item");
const armeId = li.data("arme-id");
this.actor.rollArme(armeId);
});
});
html.find('.carac-roll').click((event) => {
const li = $(event.currentTarget).parents(".item");
let categ = li.data("carac-categ");
let carac = li.data("carac-key");
this.actor.rollCarac(categ, carac);
});
});
html.find('.weapon-damage').click((event) => {
const li = $(event.currentTarget).parents(".item");
const weapon = this.actor.items.get(li.data("item-id"));
const weapon = this.actor.getOwnedItem(li.data("item-id"));
this.actor.rollDamage(weapon, 'damage');
});
html.find('.competence-base').change((event) => {
@ -195,12 +187,12 @@ updateDP( data ) {
html.find('.lock-unlock-sheet').click((event) => {
this.options.editScore = !this.options.editScore;
this.render(true);
});
});
html.find('.item-link a').click((event) => {
const itemId = $(event.currentTarget).data("item-id");
const item = this.actor.items.get(itemId);
const item = this.actor.getOwnedItem(itemId);
item.sheet.render(true);
});
});
html.find('.item-equip').click(ev => {
const li = $(ev.currentTarget).parents(".item");
this.actor.equiperObject( li.data("item-id") );

View File

@ -175,15 +175,15 @@ export class YggdrasillActor extends Actor {
async prepareData() {
if ( this.type == "personnage") {
this.computeCaracSecondaire();
if (this.system.furor.value == 0)
if (this.data.data.furor.value == 0)
await this.setEpuise();
else
await this.cleanEpuise();
if ( this.system.caracsecondaire.pv.value < (this.system.caracsecondaire.pv.max/4) )
if ( this.data.data.caracsecondaire.pv.value < (this.data.data.caracsecondaire.pv.max/4) )
await this.setMeurtri();
else
await this.cleanMeurtri();
if ( this.system.caracsecondaire.pv.value < (this.system.caracsecondaire.pv.max/2) )
if ( this.data.data.caracsecondaire.pv.value < (this.data.data.caracsecondaire.pv.max/2) )
await this.setBlesse();
else
await this.cleanBlesse();
@ -193,24 +193,23 @@ export class YggdrasillActor extends Actor {
/* -------------------------------------------- */
_preUpdate(changed, options, user) {
if ( changed.system?.caracsecondaire?.pv?.value ) {
if ( changed.system.caracsecondaire.pv.value < 0 )
changed.system.caracsecondaire.pv.value = 0;
if ( changed.system.caracsecondaire.pv.value > this.system.caracsecondaire.pv.max )
changed.system.caracsecondaire.pv.value = this.system.caracsecondaire.pv.max;
if ( changed.data?.caracsecondaire?.pv?.value ) {
if ( changed.data.caracsecondaire.pv.value < 0 )
changed.data.caracsecondaire.pv.value = 0;
if ( changed.data.caracsecondaire.pv.value > this.data.data.caracsecondaire.pv.max )
changed.data.caracsecondaire.pv.value = this.data.data.caracsecondaire.pv.max;
}
if ( changed.system?.furor?.value ) {
if ( changed.system.furor.value < 0 )
changed.system.furor.value = 0;
if ( changed.system.furor.value > this.system.furor.max )
changed.system.furor.value = this.system.furor.max;
if ( changed.data?.furor?.value ) {
if ( changed.data.furor.value < 0 )
changed.data.furor.value = 0;
if ( changed.data.furor.value > this.data.data.furor.max )
changed.data.furor.value = this.data.data.furor.max;
}
super._preUpdate(changed, options, user);
}
/* -------------------------------------------- */
getCompetences() {
let comp = this.items.filter( item => item.type == 'competence');
let comp = this.data.items.filter( item => item.type == 'competence');
return comp;
}
/* -------------------------------------------- */
@ -225,97 +224,87 @@ export class YggdrasillActor extends Actor {
}
/* -------------------------------------------- */
getInitiativeScore() {
if ( this.type == 'personnage') {
return this.system.caracsecondaire.reaction.max;
} else {
return this.system.attributs.physique.values.defaut.value;
}
return this.data.data.caracsecondaire.reaction.max;
}
/* -------------------------------------------- */
getCompetencesGenerales() {
let comp = this.items.filter( item => item.type == 'competence' && item.system.categorie == 'generale');
let comp = this.data.items.filter( item => item.type == 'competence' && item.data.data.categorie == 'generale');
return comp.sort( this.compareName );
}
/* -------------------------------------------- */
getCompetencesMartiales() {
let comp = this.items.filter( item => item.type == 'competence' && item.system.categorie == 'martiale');
let comp = this.data.items.filter( item => item.type == 'competence' && item.data.data.categorie == 'martiale');
return comp.sort( this.compareName );
}
/* -------------------------------------------- */
getCompetencesMagiques() {
let comp = this.items.filter( item => item.type == 'competence' && item.system.categorie == 'magique');
let comp = this.data.items.filter( item => item.type == 'competence' && item.data.data.categorie == 'magique');
return comp.sort( this.compareName );
}
/* -------------------------------------------- */
getDons( ) {
let dons = this.items.filter( item => item.type == 'don');
let dons = this.data.items.filter( item => item.type == 'don');
return dons.sort( this.compareName );
}
/* -------------------------------------------- */
getEffetsMagiques( ) {
let effets = this.items.filter( item => item.type == 'effetmagique');
let effets = this.data.items.filter( item => item.type == 'effetmagique');
return effets.sort( this.compareName );
}
/* -------------------------------------------- */
getEffetsDeRunes( ) {
let effets = this.items.filter( item => item.type == 'effetderune');
let effets = this.data.items.filter( item => item.type == 'effetderune');
return effets.sort( this.compareName );
}
/* -------------------------------------------- */
getMonnaies( ) {
let monnaies = this.items.filter( item => item.type == 'monnaie');
let monnaies = this.data.items.filter( item => item.type == 'monnaie');
return monnaies.sort( this.compareName );
}
/* -------------------------------------------- */
getFaiblesses( ) {
let faib = this.items.filter( item => item.type == 'faiblesse');
let faib = this.data.items.filter( item => item.type == 'faiblesse');
return faib.sort( this.compareName );
}
/* -------------------------------------------- */
getBlessures( ) {
return this.items.filter( item => item.type == 'blessure');
return this.data.items.filter( item => item.type == 'blessure');
}
/* -------------------------------------------- */
getToutEquipements() {
return this.items.filter( item => item.type == 'equipement' || item.type == 'armure' || item.type == 'armecc' || item.type == 'armedist' || item.type == 'bouclier');
return this.data.items.filter( item => item.type == 'equipement' || item.type == 'armure' || item.type == 'armecc' || item.type == 'armedist');
}
/* -------------------------------------------- */
getArmes() {
return this.items.filter( item => (item.type == 'armecc' || item.type == 'armedist') && item.system.equipe );
return this.data.items.filter( item => (item.type == 'armecc' || item.type == 'armedist') && item.data.data.equipe );
}
/* -------------------------------------------- */
getArmures() {
return this.items.filter( item => item.type == 'armure' && item.system.equipe );
}
getBoucliers() {
return this.items.filter( item => item.type == 'bouclier' && item.system.equipe );
return this.data.items.filter( item => item.type == 'armure' && item.data.data.equipe );
}
getProuessesMartiales() {
let prouesse = this.items.filter( item => item.type == 'prouesse' );
let prouesse = this.data.items.filter( item => item.type == 'prouesse' );
return prouesse.sort( this.compareName );
}
getSortsSejdr() {
let sort = this.items.filter( item => item.type == 'sortsejdr' );
let sort = this.data.items.filter( item => item.type == 'sortsejdr' );
return sort.sort( this.compareName );
}
getSortsGaldr() {
let sort = this.items.filter( item => item.type == 'sortgaldr' );
let sort = this.data.items.filter( item => item.type == 'sortgaldr' );
return sort.sort( this.compareName );
}
getRunes() {
let sort = this.items.filter( item => item.type == 'rune' );
let sort = this.data.items.filter( item => item.type == 'rune' );
return sort.sort( this.compareName );
}
/* -------------------------------------------- */
async setEpuise( ) {
if (!this.system.status.epuise) {
await this.update({ 'system.status.epuise': true});
this.system.status.epuise = true;
}
await this.update({ 'data.status.epuise': true});
this.data.data.status.epuise = true;
/*let effect = this.getEffectByLabel('Epuisé');
if ( !effect ) {
let effect = statusEffects.find( ef => ef.id == 'epuise');
@ -324,10 +313,8 @@ export class YggdrasillActor extends Actor {
}
/* -------------------------------------------- */
async cleanEpuise() {
if (this.system.status.epuise) {
await this.update({ 'system.status.epuise': false});
this.system.status.epuise = false;
}
await this.update({ 'data.status.epuise': false});
this.data.data.status.epuise = false;
/*let effect = this.getEffectByLabel('Epuisé');
if ( effect ) {
await this.deleteEmbeddedDocuments("ActiveEffect", [ effect.id ]);
@ -335,7 +322,7 @@ export class YggdrasillActor extends Actor {
}
/* -------------------------------------------- */
async toggleEpuise( ) {
if ( this.system.status.epuise ) {
if ( this.data.data.status.epuise ) {
await this.cleanEpuise();
} else {
await this.setEpuise();
@ -343,15 +330,14 @@ export class YggdrasillActor extends Actor {
}
/* -------------------------------------------- */
isEpuise() {
return this.system.status.epuise;
return this.data.data.status.epuise;
}
/* -------------------------------------------- */
async setBlesse( ) {
if (!this.system.status.blesse) {
await this.update({ 'system.status.blesse': true} );
this.system.status.blesse = true;
}
await this.update({ 'data.status.blesse': true} );
this.data.data.status.blesse = true;
console.log("BLESSSE !!!!");
/*let effect = this.getEffectByLabel('Blessé');
if ( !effect ) {
let effect = statusEffects.find( ef => ef.id == 'blesse');
@ -360,10 +346,8 @@ export class YggdrasillActor extends Actor {
}
/* -------------------------------------------- */
async cleanBlesse() {
if (this.system.status.blesse) {
await this.update({ 'system.status.blesse': false} );
this.system.status.blesse = false;
}
await this.update({ 'data.status.blesse': false} );
this.data.data.status.blesse = false;
/*let effect = this.getEffectByLabel('Blessé');
if ( effect ) {
await this.deleteEmbeddedDocuments("ActiveEffect", [ effect.id ]);
@ -372,46 +356,43 @@ export class YggdrasillActor extends Actor {
/* -------------------------------------------- */
isBlesse() {
return this.system.status.blesse;
return this.data.data.status.blesse;
//return this.getEffectByLabel('Blessé');
}
/* -------------------------------------------- */
async setMeurtri( ) {
await this.setBlesse();
if (!this.system.status.meurtri) {
await this.update({ 'system.status.meurtri': true});
this.system.status.meurtri = true;
}
await this.update({ 'data.status.meurtri': true});
this.data.data.status.meurtri = true;
}
/* -------------------------------------------- */
async cleanMeurtri() {
if (this.system.status.meurtri) {
await this.update({ 'system.status.meurtri': false});
this.system.status.meurtri = false;
}
await this.update({ 'data.status.meurtri': false});
this.data.data.status.meurtri = false;
}
/* -------------------------------------------- */
isMeurtri() {
return this.system.status.meurtri;
return this.data.data.status.meurtri;
}
/* -------------------------------------------- */
async decrementFuror( nbFuror) {
await this.update( { 'system.furor.value': this.system.furor.value - nbFuror } );
await this.update( { 'data.furor.value': this.data.data.furor.value - nbFuror } );
}
/* -------------------------------------------- */
getCurrentFuror() {
return this.system.furor.value;
return this.data.data.furor.value;
}
/* -------------------------------------------- */
getActiveEffects(matching = it => true) {
let array = Array.from(this.getEmbeddedCollection("ActiveEffect").values());
return Array.from(this.getEmbeddedCollection("ActiveEffect").values()).filter(it => matching(it));
}
/* -------------------------------------------- */
getEffectByLabel(label) {
return this.getActiveEffects().find(it => it.label == label);
return this.getActiveEffects().find(it => it.data.label == label);
}
/* -------------------------------------------- */
getEffectById(id) {
@ -420,11 +401,11 @@ export class YggdrasillActor extends Actor {
/* -------------------------------------------- */
getCarac( caracName ) {
for( let key in this.system.carac) {
let categ = this.system.carac[key];
for( let key in this.data.data.carac) {
let categ = this.data.data.carac[key];
for( let carac in categ.carac) {
if (carac.toLowerCase() == caracName.toLowerCase() ) {
return foundry.utils.deepClone(categ.carac[carac]);
return deepClone(categ.carac[carac]);
}
}
}
@ -433,72 +414,50 @@ export class YggdrasillActor extends Actor {
/* -------------------------------------------- */
computeCaracSecondaire( ) {
if ( this.type == "personnage") {
let basecorps = this.system.carac.corps.carac;
let basecorps = this.data.data.carac.corps.carac;
let sumcorps = basecorps.puissance.value + basecorps.agilite.value + basecorps.vigueur.value
let baseesprit = this.system.carac.esprit.carac;
let baseesprit = this.data.data.carac.esprit.carac;
let sumesprit = baseesprit.intellect.value + baseesprit.perception.value + baseesprit.tenacite.value
let baseame = this.system.carac.ame.carac;
let baseame = this.data.data.carac.ame.carac;
let sumame = baseame.charisme.value + baseame.communication.value + baseame.instinct.value
let newPV = (sumcorps*3) + (sumesprit *2) + sumame;
if ( newPV != this.system.caracsecondaire.pv.max) {
this.system.caracsecondaire.pv.max = newPV;
this.update( { 'system.caracsecondaire.pv.max': newPV });
if ( newPV != this.data.data.caracsecondaire.pv.max) {
this.data.data.caracsecondaire.pv.max = newPV;
this.update( { 'data.caracsecondaire.pv.max': newPV });
}
this.system.caracsecondaire.reaction.value = baseesprit.intellect.value + baseesprit.perception.value + baseame.instinct.value;
let newReac = baseesprit.intellect.value + baseesprit.perception.value + baseame.instinct.value;
if ( newReac != this.system.caracsecondaire.reaction.max) {
this.system.caracsecondaire.reaction.max = newReac
this.update( { 'system.caracsecondaire.reaction.max': newReac });
}
this.data.data.caracsecondaire.reaction.value = baseesprit.intellect.value + baseesprit.perception.value + baseame.instinct.value;
this.data.data.caracsecondaire.reaction.max = baseesprit.intellect.value + baseesprit.perception.value + baseame.instinct.value;
this.system.caracsecondaire.defensephy.value = basecorps.agilite.value + basecorps.vigueur.value + baseame.instinct.value;
let newDef = basecorps.agilite.value + basecorps.vigueur.value + baseame.instinct.value;
if ( newDef != this.system.caracsecondaire.defensephy.max) {
this.system.caracsecondaire.defensephy.max = newDef
this.update( { 'system.caracsecondaire.defensephy.max': newDef });
}
this.data.data.caracsecondaire.defensephy.value = basecorps.agilite.value + basecorps.vigueur.value + baseame.instinct.value;
this.data.data.caracsecondaire.defensephy.max = basecorps.agilite.value + basecorps.vigueur.value + baseame.instinct.value;
this.system.caracsecondaire.defensemen.value = baseesprit.tenacite.value + baseame.instinct.value + baseesprit.intellect.value;
newDef = baseesprit.tenacite.value + baseame.instinct.value + baseesprit.intellect.value;
if ( newDef != this.system.caracsecondaire.defensemen.max) {
this.system.caracsecondaire.defensemen.max = newDef
this.update( { 'system.caracsecondaire.defensemen.max': newDef });
}
this.data.data.caracsecondaire.defensemen.value = baseesprit.tenacite.value + baseame.instinct.value + baseesprit.intellect.value;
this.data.data.caracsecondaire.defensemen.max = baseesprit.tenacite.value + baseame.instinct.value + baseesprit.intellect.value;
this.system.caracsecondaire.deplacement.value = basecorps.agilite.value + basecorps.vigueur.value;
let depl = basecorps.agilite.value + basecorps.vigueur.value;
if ( depl != this.system.caracsecondaire.deplacement.max) {
this.system.caracsecondaire.deplacement.max = depl
this.update( { 'system.caracsecondaire.deplacement.max': depl });
}
this.data.data.caracsecondaire.deplacement.value = basecorps.agilite.value + basecorps.vigueur.value;
this.data.data.caracsecondaire.deplacement.max = basecorps.agilite.value + basecorps.vigueur.value;
this.system.caracsecondaire.capaenc.value = (basecorps.puissance.value * 2) + basecorps.vigueur.value;
let enc = (basecorps.puissance.value * 2) + basecorps.vigueur.value;
if ( enc != this.system.caracsecondaire.capaenc.max ) {
this.system.caracsecondaire.capaenc.max = enc
this.update( { 'system.caracsecondaire.capaenc.max': enc });
}
//console.log("CARAC SEC", this.system.caracsecondaire)
this.data.data.caracsecondaire.capaenc.value = (basecorps.puissance.value * 2) + basecorps.vigueur.value;
this.data.data.caracsecondaire.capaenc.max = (basecorps.puissance.value * 2) + basecorps.vigueur.value;
}
}
/* -------------------------------------------- */
async equiperObject( equipementId ) {
let item = this.items.find( item => item.id == equipementId );
if (item && item.system) {
let update = { _id: item.id, "system.equipe": !item.system.equipe };
let item = this.data.items.find( item => item.id == equipementId );
if (item && item.data.data) {
let update = { _id: item.id, "data.equipe": !item.data.data.equipe };
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
}
}
/* -------------------------------------------- */
async updateCompetence( compId, niveau) {
let comp = this.items.find( item => item.type == 'competence' && item.id == compId);
let comp = this.data.items.find( item => item.type == 'competence' && item.id == compId);
console.log("Comp updated!!!!", compId, niveau);
if (comp) {
const update = { _id: comp.id, 'system.niveau': niveau };
const update = { _id: comp.id, 'data.niveau': niveau };
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
} else {
ui.notifications.warn("Compétence inconnue", compId)
@ -512,9 +471,9 @@ export class YggdrasillActor extends Actor {
/* -------------------------------------------- */
async rollAttribute( attrkey, subAttrKey = 'defaut') {
let attr = foundry.utils.duplicate(this.system.attributs[attrkey]);
console.log("ATTR : ", attr, attrkey, subAttrKey);
let subAttr = foundry.utils.duplicate(this.system.attributs[attrkey].values[subAttrKey] );
let attr = duplicate(this.data.data.attributs[attrkey]);
let subAttr = duplicate(this.data.data.attributs[attrkey].values[subAttrKey] );
console.log("ATTR : ", attr, subAttr);
if ( attr ) {
subAttr.label = subAttr.label || "";
let title = `Attribut : ${attr.label} ${subAttr.label} : ${subAttr.value}`;
@ -524,13 +483,16 @@ export class YggdrasillActor extends Actor {
actorImg: this.img,
actorId: this.id,
attr: attr,
valuePhysique: this.system.attributs["physique"].values["defaut"].value,
valuePhysique: this.data.data.attributs["physique"].values["defaut"].value,
subAttr: subAttr,
rollMode: game.settings.get("core", "rollMode"),
title: title,
isBlesse: this.system.etat.etat == "blesse",
isBlesse: this.data.data.etat.etat == "blesse",
optionsBonusMalus: YggdrasillUtility.buildListOptions(-6, +6),
bonusMalus: 0,
optionsSR: YggdrasillUtility.buildSROptions( ),
sr: 0
}
this.addDefaultRoll(rollData)
let rollDialog = await YggdrasillRoll.create( this, rollData);
console.log(rollDialog);
rollDialog.render( true );
@ -538,23 +500,11 @@ export class YggdrasillActor extends Actor {
ui.notifications.warn("Attribut non trouvée");
}
}
/* -------------------------------------------- */
addDefaultRoll(rollData) {
rollData.optionsBonusMalus= YggdrasillUtility.createOptions(-15, 15)
rollData.bonusMalus= "0"
rollData.optionsFuror= YggdrasillUtility.createOptions(0, this.getCurrentFuror())
rollData.furorUsage= "0"
rollData.optionsBD= YggdrasillUtility.createOptions(0, +15)
rollData.sr= "0"
rollData.puissanceRune = 1
rollData.optionsPuissanceRune= YggdrasillUtility.createOptions(1, +15)
rollData.supportRune= "peau"
rollData.config= game.system.config
}
/* -------------------------------------------- */
async rollCarac( categName, caracName) {
let carac = foundry.utils.duplicate(this.system.carac[categName].carac[caracName]);
let carac = duplicate(this.data.data.carac[categName].carac[caracName]);
console.log("CARAC : ", carac, this.data.data.carac);
if ( carac) {
let rollData = {
mode: "carac",
@ -568,9 +518,13 @@ export class YggdrasillActor extends Actor {
isEpuise: this.isEpuise(),
isBlesse: this.isBlesse(),
isMeurtri: this.isMeurtri(),
optionsBonusMalus: YggdrasillUtility.buildListOptions(-6, +6),
bonusMalus: 0,
optionsFuror: YggdrasillUtility.buildListOptions(0, this.getCurrentFuror() ),
furorUsage: 0,
optionsSR: YggdrasillUtility.buildSROptions( ),
sr: 0
}
this.addDefaultRoll(rollData)
console.log("CARAC : ", rollData, this.system.carac);
let rollDialog = await YggdrasillRoll.create( this, rollData);
console.log(rollDialog);
rollDialog.render( true );
@ -582,7 +536,7 @@ export class YggdrasillActor extends Actor {
/* -------------------------------------------- */
async rollCompetence( competenceId ) {
let competence = this.items.find( item => item.type == 'competence' && item.id == competenceId);
let competence = this.data.items.find( item => item.type == 'competence' && item.id == competenceId);
if ( competence) {
let rollData = {
mode: "competence",
@ -591,13 +545,18 @@ export class YggdrasillActor extends Actor {
actorId: this.id,
img: competence.img,
rollMode: game.settings.get("core", "rollMode"),
title: `Compétence ${competence.name} : ${competence.system.niveau}`,
competence: foundry.utils.duplicate(competence),
title: `Compétence ${competence.name} : ${competence.data.data.niveau}`,
competence: duplicate(competence),
isEpuise: this.isEpuise(),
isBlesse: this.isBlesse(),
isMeurtri: this.isMeurtri(),
optionsBonusMalus: YggdrasillUtility.buildListOptions(-6, +6),
bonusMalus: 0,
optionsFuror: YggdrasillUtility.buildListOptions(0, this.getCurrentFuror() ),
furorUsage: 0,
optionsSR: YggdrasillUtility.buildSROptions( ),
sr: 0
}
this.addDefaultRoll(rollData)
let rollDialog = await YggdrasillRoll.create( this, rollData);
console.log(rollDialog);
rollDialog.render( true );
@ -608,21 +567,21 @@ export class YggdrasillActor extends Actor {
/* -------------------------------------------- */
getAttaqueData( mode ) {
let attackData = foundry.utils.duplicate(attackMode[mode]);
let attackData = duplicate(attackMode[mode]);
if ( attackData){
attackData.mode = mode;
attackData.carac = foundry.utils.duplicate(this.system.carac[attackData.categName].carac[attackData.caracName]);
attackData.carac = duplicate(this.data.data.carac[attackData.categName].carac[attackData.caracName]);
if ( attackData.malus != 0) {
let malusTab = attackData.malus.split(';');
attackData.malus = this.system.carac[attackData.categName].carac[malusTab[0]].value * Number(malusTab[1])
attackData.malus = this.data.data.carac[attackData.categName].carac[malusTab[0]].value * Number(malusTab[1])
}
if ( attackData.protection != 0) {
let malusTab = attackData.protection.split(';');
attackData.protection = this.system.carac[attackData.categName].carac[malusTab[0]].value * Number(malusTab[1])
attackData.protection = this.data.data.carac[attackData.categName].carac[malusTab[0]].value * Number(malusTab[1])
}
if ( attackData.bonusdegats != 0) {
let malusTab = attackData.bonusdegats.split(';');
attackData.bonusdegats = this.system.carac[attackData.categName].carac[malusTab[0]].value * Number(malusTab[1])
attackData.bonusdegats = this.data.data.carac[attackData.categName].carac[malusTab[0]].value * Number(malusTab[1])
}
}
return attackData;
@ -630,21 +589,21 @@ export class YggdrasillActor extends Actor {
/* -------------------------------------------- */
getTirData( mode) {
let attackData = foundry.utils.duplicate( tirMode[mode] );
let attackData = duplicate( tirMode[mode] );
if ( attackData){
attackData.mode = mode;
attackData.carac = foundry.utils.duplicate(this.system.carac[attackData.categName].carac[attackData.caracName]);
attackData.carac = duplicate(this.data.data.carac[attackData.categName].carac[attackData.caracName]);
if ( attackData.malus != 0) {
let malusTab = attackData.malus.split(';');
attackData.malus = this.system.carac[attackData.categName].carac[malusTab[0]].value * Number(malusTab[1])
attackData.malus = this.data.data.carac[attackData.categName].carac[malusTab[0]].value * Number(malusTab[1])
}
if ( attackData.protection != 0) {
let malusTab = attackData.protection.split(';');
attackData.protection = this.system.carac[attackData.categName].carac[malusTab[0]].value * Number(malusTab[1])
attackData.protection = this.data.data.carac[attackData.categName].carac[malusTab[0]].value * Number(malusTab[1])
}
if ( attackData.bonusdegats != 0) {
let malusTab = attackData.bonusdegats.split(';');
attackData.bonusdegats = this.system.carac[attackData.categName].carac[malusTab[0]].value * Number(malusTab[1])
attackData.bonusdegats = this.data.data.carac[attackData.categName].carac[malusTab[0]].value * Number(malusTab[1])
}
}
return attackData;
@ -652,24 +611,23 @@ export class YggdrasillActor extends Actor {
/* -------------------------------------------- */
async rollSort( sortId, magie) {
let sort = this.items.find( item => item.id == sortId);
let competence = this.items.find( item => item.type == 'competence' && item.name.toLowerCase().includes(magie));
let sort = this.data.items.find( item => item.id == sortId);
let competence = this.data.items.find( item => item.type == 'competence' && item.name.toLowerCase().includes(magie));
console.log("SORT :", sortId, sort, competence );
let carac;
if ( magie == "sejdr") {
carac = foundry.utils.duplicate(this.system.carac.ame.carac.instinct);
carac = duplicate(this.data.data.carac.ame.carac.instinct);
} else if ( magie == "rune") {
carac = foundry.utils.duplicate(this.system.carac.ame.carac.communication);
carac = duplicate(this.data.data.carac.ame.carac.communication);
} else {
carac = foundry.utils.duplicate(this.system.carac.ame.carac.charisme);
carac = duplicate(this.data.data.carac.ame.carac.charisme);
}
if ( sort && competence) {
let rollData = {
mode: magie,
isMagie: true,
alias: this.name,
actorImg: this.img,
actorId: this.id,
@ -677,10 +635,10 @@ export class YggdrasillActor extends Actor {
rollMode: game.settings.get("core", "rollMode"),
title: magie + " - " + sort.name,
selectedCarac: carac,
agiliteCarac: foundry.utils.duplicate(this.system.carac.corps.carac.agilite),
instinctCarac: foundry.utils.duplicate(this.system.carac.ame.carac.instinct),
sort: foundry.utils.duplicate(sort),
competence: foundry.utils.duplicate(competence),
agiliteCarac: duplicate(this.data.data.carac.corps.carac.agilite),
instinctCarac: duplicate(this.data.data.carac.ame.carac.instinct),
sort: duplicate(sort),
competence: duplicate(competence),
dureeGaldr: "1d5a",
nbCibles: "1",
zoneGaldr: "INS10cm3",
@ -688,9 +646,17 @@ export class YggdrasillActor extends Actor {
isEpuise: this.isEpuise(),
isBlesse: this.isBlesse(),
isMeurtri: this.isMeurtri(),
optionsBonusMalus: YggdrasillUtility.buildListOptions(-6, +6),
optionsBD: YggdrasillUtility.buildListOptions(0, +6),
bonusMalus: 0,
optionsFuror: YggdrasillUtility.buildListOptions(0, this.getCurrentFuror() ),
furorUsage: 0,
optionsSR: YggdrasillUtility.buildSROptions( ),
sr: 14,
puissanceRune: 1,
optionsPuissanceRune: YggdrasillUtility.buildListOptions(1, 15),
supportRune: "peau",
}
this.addDefaultRoll(rollData)
rollData.sr = 14
let rollDialog = await YggdrasillRoll.create( this, rollData);
console.log(rollDialog);
rollDialog.render( true );
@ -701,9 +667,9 @@ export class YggdrasillActor extends Actor {
/* -------------------------------------------- */
async rollArme( armeId ) {
let arme = this.items.find( item => item.id == armeId);
let compName = armeCategorieToCompetence[arme.system.categorie];
let competence = this.items.find( item => item.type == 'competence' && item.name == compName);
let arme = this.data.items.find( item => item.id == armeId);
let compName = armeCategorieToCompetence[arme.data.data.categorie];
let competence = this.data.items.find( item => item.type == 'competence' && item.name == compName);
console.log("ARME :", armeId, arme, competence );
if ( arme && competence) {
@ -724,16 +690,21 @@ export class YggdrasillActor extends Actor {
img: competence.img,
rollMode: game.settings.get("core", "rollMode"),
title: "Attaque !",
selectedCarac: foundry.utils.duplicate(this.system.carac.corps.carac.agilite),
arme: foundry.utils.duplicate(arme),
competence: foundry.utils.duplicate(competence),
selectedCarac: duplicate(this.data.data.carac.corps.carac.agilite),
arme: duplicate(arme),
competence: duplicate(competence),
bonusdefense: 0,
isEpuise: this.isEpuise(),
isBlesse: this.isBlesse(),
isMeurtri: this.isMeurtri()
isMeurtri: this.isMeurtri(),
optionsBonusMalus: YggdrasillUtility.buildListOptions(-6, +6),
optionsBD: YggdrasillUtility.buildListOptions(0, +6),
bonusMalus: 0,
optionsFuror: YggdrasillUtility.buildListOptions(0, this.getCurrentFuror() ),
furorUsage: 0,
optionsSR: YggdrasillUtility.buildSROptions( ),
sr: 14
}
this.addDefaultRoll(rollData)
rollData.sr = 14
let rollDialog = await YggdrasillRoll.create( this, rollData);
console.log(rollDialog);
rollDialog.render( true );
@ -745,58 +716,42 @@ export class YggdrasillActor extends Actor {
/* -------------------------------------------- */
getEncTotal( ) {
let encTotal = 0;
for( let item of this.items) {
if (item.type == "equipement" || item.type == "armecc"
|| item.type == "armedist" || item.type == "armure" || item.type == "monnaie" || item.type == "bouclier") {
encTotal += (item.system.enc * item.system.quantite);
}
}
for( let item of this.items) {
if (item.type == "bouclier" && item.system.equipe) {
encTotal -= (item.system.enc * item.system.quantite);
encTotal += (item.system.enccomb * item.system.quantite);
for( let item of this.data.items) {
if (item.type == "equipement" || item.type == "armecc"
|| item.type == "armedist" || item.type == "armure" || item.type == "monnaie") {
encTotal += item.data.data.enc;
}
}
return encTotal;
}
}
/* -------------------------------------------- */
getProtectionTotal( ) {
let protectionTotal = 0;
for( let item of this.items) {
if (item.type == "armure" && item.system.equipe) {
protectionTotal += Number(item.system.protection);
for( let item of this.data.items) {
if (item.type == "armure" && item.data.data.equipe) {
protectionTotal += Number(item.data.data.protection);
}
}
return protectionTotal;
}
/* -------------------------------------------- */
getDpBouclier( ) {
let dpBouclier = 0;
for( let item of this.items) {
if (item.type == "bouclier" && item.system.equipe) {
dpBouclier += Number(item.system.defensebonus);
}
}
return dpBouclier;
}
/* -------------------------------------------- */
async incrementeQuantite( objetId ) {
let objetQ = this.items.find( item => item.id == objetId );
let objetQ = this.data.items.find( item => item.id == objetId );
if (objetQ) {
let newQ = objetQ.system.quantite + 1;
const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantite': newQ }]); // pdates one EmbeddedEntity
let newQ = objetQ.data.data.quantite + 1;
const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'data.quantite': newQ }]); // pdates one EmbeddedEntity
}
}
/* -------------------------------------------- */
async decrementeQuantite( objetId ) {
let objetQ = this.items.find( item => item.id == objetId );
let objetQ = this.data.items.find( item => item.id == objetId );
if (objetQ) {
let newQ = objetQ.system.quantite - 1;
let newQ = objetQ.data.data.quantite - 1;
newQ = (newQ <= 0) ? 0 : newQ;
const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantite': newQ }]); // pdates one EmbeddedEntity
const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'data.quantite': newQ }]); // pdates one EmbeddedEntity
}
}

View File

@ -22,7 +22,7 @@ export class YggdrasillCombat extends Combat {
// Send a chat message
let rollMode = messageOptions.rollMode || game.settings.get("core", "rollMode");
let messageData = foundry.utils.mergeObject(
let messageData = mergeObject(
{
speaker: {
scene: canvas.scene._id,

View File

@ -1,111 +0,0 @@
export const YGGDRASILL_CONFIG = {
optionsEtat: [
{ key: "fringant", label: "Fringant" },
{ key: "blesse", label: "Blessé" },
{ key: "mort", label: "Mort" }
],
optionsArme: [
{ key: "lutte", label: "Lutte" },
{ key: "improvisee", label: "Improvisée" },
{ key: "courte", label: "Courte" },
{ key: "longue", label: "Longue" },
{ key: "deuxmains", label: "A Deux Mains" },
{ key: "hast", label: "Hast" }
],
optionsArmeTir: [
{ key: "jet", label: "Jet" },
{ key: "tir", label: "Tir" }
],
optionsArmure: [
{ key: "armure", label: "Armure" },
{ key: "piecearmure", label: "Pièce d'Armure" }
],
optionsBouclier: [
{ key: "bouclier", label: "Bouclier" }
],
optionsCompetence: [
{ key: "generale", label: "Générale" },
{ key: "magique", label: "Magique" },
{ key: "martiale", label: "Martiale" }
],
optionsMaladie: [
{ key: "mineure", label: "Mineure" },
{ key: "moderee", label: "Modérée" },
{ key: "majeure", label: "Majeure" }
],
optionsProuesse: [
{ key: "attaque", label: "Attaque" },
{ key: "defensive", label: "Défensive" },
{ key: "utilitaire", label: "Utilitaire" }
]
,
optionsGaldr: [
{ key:"malediction", label:"Malédictions" },
{ key:"illusion", label:"Illusions" },
{ key:"charme", label:"Charme" }
],
optionsAttaque: [
{ key:"classique", label:"Attaque classique" },
{ key:"force", label:"Attaque en force" },
{ key:"devastatrice", label:"Attaque dévastatrice" },
{ key:"precise", label:"Attaque Précise" },
{ key:"visee", label:"Attaque Visée" }
],
optionsSR : [
{key: "0", label: "Aucun"},
{key: "5", label: "Très Simple (5)"},
{key: "7", label: "Simple (7)"},
{key: "10", label: "Aisé (10)"},
{key: "14", label: "Moyen (14)"},
{key: "19", label: "Difficile (19)"},
{key: "25", label: "Très Difficile (25)"},
{key: "32", label: "Exceptionnel (32)"},
{key: "40", label: "Légendaire (40)"},
{key: "49", label: "Divin (49)"}
],
optionsCarac: [
{ key: "puissance", label: "Puissance" },
{ key: "vigueur", label: "Vigueur" },
{ key: "agilite", label: "Agilité" },
{ key: "intellect", label: "Intellect" },
{ key: "perception", label: "Perception" },
{ key: "tenacite", label: "Tenacité" },
{ key: "charisme", label: "Charisme" },
{ key: "communication", label: "Communication" },
{ key: "instinct", label: "Instinct" }
],
optionsDureeGaldr: [
{ key:"1d5a", label:"1d5 Actions" },
{ key:"1d10t", label:"1d10 Tours" },
{ key:"1d10m", label:"1d10 Minutes" },
{ key:"1d10h", label:"1d10 Heures" },
{ key:"1d5j", label:"1d5 journées" }
],
optionsZoneGaldr: [
{ key:"INS10cm3", label:"INS x 10 cm3 (chat, balle, épée, ...)" },
{ key:"INS50cm3", label:"INS x 50 cm3 (tabouret, enfant, ...)" },
{ key:"INS1m3", label:"INS x 1 m3 (homme, 2 enfants, ...)" },
{ key:"INS5m3", label:"INS x 5 m3 (charrette, 2 cavaliers, ...)" },
{ key:"INS10m3", label:"INS x 10 m3 (maison, kraken, bateau, ...)" }
],
optionsNbCibles: [
{ key: "1", label: "1" },
{ key: "2_4", label: "2 à 4" },
{ key: "5_9", label: "5 à 9" },
{ key: "10_49", label: "10 à 49" },
{ key: "50plus", label: "50 et +" }
],
optionsSupportRunes: [
{ key: "peau", label: "Peau" },
{ key: "tissu", label: "Tissu" },
{ key: "cuir", label: "Cuir" },
{ key: "bois", label: "Bois" },
{ key: "pierremetal", label: "Pierre, Métal" }
]
}

View File

@ -6,12 +6,12 @@
import { YggdrasillUtility } from "./yggdrasill-utility.js";
/* -------------------------------------------- */
export class YggdrasillFigurantSheet extends foundry.appv1.sheets.ActorSheet {
export class YggdrasillFigurantSheet extends ActorSheet {
/** @override */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
return mergeObject(super.defaultOptions, {
classes: ["yggdrasill", "sheet", "actor"],
template: "systems/fvtt-yggdrasill/templates/figurant-sheet.html",
width: 640,
@ -23,9 +23,9 @@ export class YggdrasillFigurantSheet extends foundry.appv1.sheets.ActorSheet {
}
/* -------------------------------------------- */
async getData() {
const objectData = foundry.utils.duplicate(this.object)
getData() {
const objectData = YggdrasillUtility.data(this.object);
let formData = {
title: this.title,
id: objectData.id,
@ -34,21 +34,18 @@ export class YggdrasillFigurantSheet extends foundry.appv1.sheets.ActorSheet {
name: objectData.name,
editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked",
data: foundry.utils.deepClone(this.object.system),
data: foundry.utils.deepClone(YggdrasillUtility.templateData(this.object)),
limited: this.object.limited,
equipements: this.actor.getToutEquipements(),
effetsmagiques: this.actor.getEffetsMagiques(),
encTotal: this.actor.getEncTotal(),
monnaies: this.actor.getMonnaies(),
optionsAttr: Array.fromRange(41, 1),
optionsBase: YggdrasillUtility.createDirectOptionList(0, 20),
description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.description, {async: true}),
notes: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.notes, {async: true}),
optionsAttr: new Array(21).fill('option'),
optionsBase: YggdrasillUtility.createDirectOptionList(0, 20),
options: this.options,
owner: this.document.isOwner,
editScore: this.options.editScore,
isGM: game.user.isGM,
config: game.system.config
isGM: game.user.isGM
}
console.log("FIGURANT : ", formData);
@ -66,7 +63,7 @@ export class YggdrasillFigurantSheet extends foundry.appv1.sheets.ActorSheet {
// Update Inventory Item
html.find('.item-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item");
const item = this.actor.items.get(li.data("item-id"));
const item = this.actor.getOwnedItem(li.data("item-id"));
item.sheet.render(true);
});
// Delete Inventory Item
@ -74,7 +71,7 @@ export class YggdrasillFigurantSheet extends foundry.appv1.sheets.ActorSheet {
const li = $(ev.currentTarget).parents(".item");
YggdrasillUtility.confirmDelete(this, li);
});
html.find('.equipement-moins').click(event => {
const li = $(event.currentTarget).parents(".item");
this.actor.decrementeQuantite( li.data("item-id") );
@ -89,16 +86,16 @@ export class YggdrasillFigurantSheet extends foundry.appv1.sheets.ActorSheet {
let attrKey = li.data("attr-key");
let attrSubKey = $(event.currentTarget).data("attr-sub-key");
this.actor.rollAttribute(attrKey, attrSubKey);
});
});
html.find('.lock-unlock-sheet').click((event) => {
this.options.editScore = !this.options.editScore;
this.render(true);
});
});
html.find('.item-link a').click((event) => {
const itemId = $(event.currentTarget).data("item-id");
const item = this.actor.items.get(itemId);
const item = this.actor.getOwnedItem(itemId);
item.sheet.render(true);
});
});
html.find('.item-equip').click(ev => {
const li = $(ev.currentTarget).parents(".item");
this.actor.equiperObject( li.data("item-id") );

View File

@ -4,11 +4,11 @@ import { YggdrasillUtility } from "./yggdrasill-utility.js";
* Extend the basic ItemSheet with some very simple modifications
* @extends {ItemSheet}
*/
export class YggdrasillItemSheet extends foundry.appv1.sheets.ItemSheet {
export class YggdrasillItemSheet extends ItemSheet {
/** @override */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
return mergeObject(super.defaultOptions, {
classes: ["fvtt-yggdrasill", "sheet", "item"],
template: "systems/fvtt-yggdrasill/templates/item-sheet.html",
width: 550,
@ -26,7 +26,7 @@ export class YggdrasillItemSheet extends foundry.appv1.sheets.ItemSheet {
{
class: "post",
icon: "fas fa-comment",
onclick: ev => {}
onclick: ev => {}
})
return buttons
}
@ -40,11 +40,11 @@ export class YggdrasillItemSheet extends foundry.appv1.sheets.ItemSheet {
sheetBody.css("height", bodyHeight);
return position;
}
/* -------------------------------------------- */
async getData() {
const objectData = foundry.utils.duplicate(this.object);
const objectData = YggdrasillUtility.data(this.object);
let formData = {
title: this.title,
id: objectData.id,
@ -53,19 +53,17 @@ export class YggdrasillItemSheet extends foundry.appv1.sheets.ItemSheet {
name: objectData.name,
editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked",
data: foundry.utils.deepClone(this.object.system),
data: foundry.utils.deepClone(YggdrasillUtility.templateData(this.object)),
optionsBase: YggdrasillUtility.createDirectOptionList(0, 20),
optionsNiveaux4: Array.fromRange(5, 1),
description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.description, {async: true}),
optionsNiveaux4: YggdrasillUtility.buildListOptions(1, 5),
limited: this.object.limited,
options: this.options,
owner: this.document.isOwner,
isGM: game.user.isGM,
config: game.system.config
isGM: game.user.isGM
}
return formData;
}
/* -------------------------------------------- */
/** @override */
activateListeners(html) {
@ -73,21 +71,21 @@ export class YggdrasillItemSheet extends foundry.appv1.sheets.ItemSheet {
// Everything below here is only needed if the sheet is editable
if (!this.options.editable) return;
// Update Inventory Item
html.find('.item-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item");
const item = this.object.options.actor.items.get(li.data("item-id"));
const item = this.object.options.actor.getOwnedItem(li.data("item-id"));
item.sheet.render(true);
});
// Update Inventory Item
html.find('.item-delete').click(ev => {
const li = $(ev.currentTarget).parents(".item");
this.object.options.actor.deleteEmbeddedDocuments( "Item", [li.data("item-id") ] ).then( this.render(true));
this.object.options.actor.deleteOwnedItem( li.data("item-id") ).then( this.render(true));
});
}
/* -------------------------------------------- */
get template()
{

View File

@ -14,8 +14,6 @@ import { YggdrasillActorSheet } from "./yggdrasill-actor-sheet.js";
import { YggdrasillFigurantSheet } from "./yggdrasill-figurant-sheet.js";
import { YggdrasillUtility } from "./yggdrasill-utility.js";
import { YggdrasillCombat } from "./yggdrasill-combat.js";
import { YGGDRASILL_CONFIG } from "./yggdrasill-config.js";
import { ClassCounter} from "https://www.uberwald.me/fvtt_appcount/count-class-ready.js"
/* -------------------------------------------- */
/* Foundry VTT Initialization */
@ -30,14 +28,12 @@ Hooks.once("init", async function () {
YggdrasillUtility.preloadHandlebarsTemplates();
/* -------------------------------------------- */
// Set an initiative formula for the system
// Set an initiative formula for the system
CONFIG.Combat.initiative = {
formula: "1d20",
decimals: 0
};
game.system.config = YGGDRASILL_CONFIG
/* -------------------------------------------- */
game.socket.on("system.fvtt-yggdrasill", data => {
YggdrasillUtility.onSocketMesssage(data);
@ -52,23 +48,26 @@ Hooks.once("init", async function () {
/* -------------------------------------------- */
// Register sheet application classes
foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet);
foundry.documents.collections.Actors.registerSheet("fvtt-yggdrasill", YggdrasillActorSheet, { types: ["personnage"], makeDefault: true });
foundry.documents.collections.Actors.registerSheet("fvtt-yggdrasill", YggdrasillFigurantSheet, { types: ["figurant"], makeDefault: false });
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet);
foundry.documents.collections.Items.registerSheet("fvtt-yggdrasill", YggdrasillItemSheet, { makeDefault: true });
Actors.unregisterSheet("core", ActorSheet);
Actors.registerSheet("fvtt-yggdrasill", YggdrasillActorSheet, { types: ["personnage"], makeDefault: true });
Actors.registerSheet("fvtt-yggdrasill", YggdrasillFigurantSheet, { types: ["figurant"], makeDefault: false });
Items.unregisterSheet("core", ItemSheet);
Items.registerSheet("fvtt-yggdrasill", YggdrasillItemSheet, { makeDefault: true });
// Init/registers
Hooks.on('renderChatLog', (log, html, data) => {
//YggdrasillUtility.registerChatCallbacks(html);
});
});
/* -------------------------------------------- */
function welcomeMessage() {
//ChatUtility.removeMyChatMessageContaining('<div id="welcome-message-sos">');
ChatMessage.create({
user: game.user.id,
whisper: [game.user.id],
content: `<div id="welcome-message-yggdrasill"><span class="rdd-roll-part"><strong>Bienvenue à Yggdrasill !</strong>
<p>Yggdrasill est un Jeu de Rôle publié par 7ième Cercle : https://www.7emecercle.com/7C_site/jeux-de-roles/yggdrasill/</p>
<br>Yggdrasill est une propriété de 7ième Cercle.
</div>
content: `<div id="welcome-message-yggdrasill"><span class="rdd-roll-part">Bienvenue !</div>
` });
}
@ -85,9 +84,7 @@ Hooks.once("ready", function () {
user: game.user._id
});
}
ClassCounter.registerUsageCount()
welcomeMessage()
welcomeMessage();
});
/* -------------------------------------------- */

View File

@ -11,24 +11,24 @@ export class YggdrasillRoll extends Dialog {
let html
let h = 440;
if ( rollData.mode == "competence") {
html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-competence.html', rollData);
html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-competence.html', rollData);
h = 340;
} else if (rollData.mode == "carac") {
html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-carac.html', rollData);
html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-carac.html', rollData);
h = 320;
} else if (rollData.mode == "attribut") {
html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-attribut.html', rollData);
html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-attribut.html', rollData);
h = 320;
} else if (rollData.mode == "armecc") {
html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-armecc.html', rollData);
html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-armecc.html', rollData);
} else if (rollData.mode == "sejdr") {
html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-sejdr.html', rollData);
html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-sejdr.html', rollData);
} else if (rollData.mode == "rune") {
html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-rune.html', rollData);
html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-rune.html', rollData);
} else if (rollData.mode == "galdr") {
html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-galdr.html', rollData);
html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-galdr.html', rollData);
} else {
html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-armetir.html', rollData);
html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-armetir.html', rollData);
}
let options = { classes: ["yggdrasilldialog"], width: 600, height: h, 'z-index': 99999 };
return new YggdrasillRoll(actor, rollData, html, options );
@ -39,11 +39,11 @@ export class YggdrasillRoll extends Dialog {
let conf = {
title: (rollData.mode == "competence") ? "Compétence" : "Caractéristique",
content: html,
buttons: {
buttons: {
roll: {
icon: '<i class="fas fa-check"></i>',
label: "Lancer le Test",
callback: () => { this.roll() }
callback: () => { this.roll() }
},
cancel: {
icon: '<i class="fas fa-times"></i>',
@ -68,17 +68,17 @@ export class YggdrasillRoll extends Dialog {
YggdrasillUtility.rollYggdrasill( this.rollData )
}
}
/* -------------------------------------------- */
updateGaldrSR( ) {
let sdDuree = Number(dureeGaldrSD[this.rollData.dureeGaldr]);
let sdVar = 0;
if ( this.rollData.sort.system.voie == "illusion") {
if ( this.rollData.sort.data.voie == "illusion") {
sdVar = Number(zonesciblesGaldrSD[this.rollData.zoneGaldr]);
} else {
sdVar = Number(ciblesGaldrSD[this.rollData.nbCibles]);
}
let SR = Number(this.rollData.sort.system.sd) + sdDuree + sdVar;
let SR = Number(this.rollData.sort.data.sd) + sdDuree + sdVar;
$("#srTotal").text(SR);
this.rollData.sr = SR;
}
@ -88,35 +88,30 @@ export class YggdrasillRoll extends Dialog {
let support = 0;
this.rollData.dureeRune = 6 - this.rollData.agiliteCarac.value;
if ( this.rollData.supportRune == "peau") {
if ( this.rollData.supportRune == "peau") {
support = 3;
this.rollData.echelleDuree = "Actions";
this.rollData.echelleDureeVie = "Heures"
}
if ( this.rollData.supportRune == "tissu") {
if ( this.rollData.supportRune == "tissu") {
support = 6;
this.rollData.echelleDuree = "Tours";
this.rollData.echelleDureeVie = "Jours"
}
if ( this.rollData.supportRune == "cuir") {
support = 9;
this.rollData.echelleDuree = "Minutes";
this.rollData.echelleDureeVie = "Semaines"
}
if ( this.rollData.supportRune == "bois") {
support = 12;
this.rollData.echelleDuree = "Heures";
this.rollData.echelleDureeVie = "Mois"
}
if ( this.rollData.supportRune == "pierremetal") {
support = 15;
this.rollData.echelleDuree = "Jours";
this.rollData.echelleDureeVie = "Années"
}
let SR = this.rollData.puissanceRune + (Number(this.rollData.sort.system.niveau)*3) + support;
let SR = this.rollData.puissanceRune + (Number(this.rollData.sort.data.niveau)*3) + support;
$("#srTotal").text(SR);
$("#runeDuree").text( this.rollData.dureeRune + " " + this.rollData.echelleDuree);
$("#runeDureeVie").text( this.rollData.competence.system.niveau + " " + this.rollData.echelleDureeVie);
$("#runeDureeVie").text( this.rollData.puissanceRune + " " + this.rollData.echelleDuree);
this.rollData.sr = SR;
}
@ -124,7 +119,7 @@ export class YggdrasillRoll extends Dialog {
activateListeners(html) {
super.activateListeners(html);
let dialog = this;
var dialog = this;
function onLoad() {
if (dialog.rollData.mode == "competence") {
let carac = dialog.actor.getCarac( "Puissance" );
@ -156,12 +151,12 @@ export class YggdrasillRoll extends Dialog {
$("#caracValue").text(carac.value+"d10");
});
html.find('#typeAttack').change((event) => {
html.find('#typeAttack').change((event) => {
let attackType = event.currentTarget.value;
let attackDef
if ( this.rollData.mode == 'armecc')
if ( this.rollData.mode == 'armecc')
attackDef = this.actor.getAttaqueData( attackType);
else
else
attackDef = this.actor.getTirData( attackType);
this.rollData.attackDef = attackDef;
this.rollData.selectedCarac = attackDef.carac;
@ -192,8 +187,8 @@ export class YggdrasillRoll extends Dialog {
this.rollData.zoneGaldr = event.currentTarget.value;
this.updateGaldrSR();
});
html.find('#bonusMalus').change((event) => {
this.rollData.bonusMalus = Number(event.currentTarget.value);
});
@ -208,5 +203,5 @@ export class YggdrasillRoll extends Dialog {
});
}
}

View File

@ -1,38 +1,47 @@
/* -------------------------------------------- */
/* -------------------------------------------- */
//import { YggdrasillCombat } from "./yggdrasill-combat.js";
/* -------------------------------------------- */
/* -------------------------------------------- */
const dureeGaldrText = { "1d5a": "Actions", "1d10t": "Tours", "1d10m": "Minutes", "1d10h": "Heures", "1d5j": "Jours"};
const ciblesGaldrText = { "1": "1", "2_4": "2 à 4", "5_9": "5 à 9", "10_49": "10 à 49", "50plus": "50 et plus"};
/* -------------------------------------------- */
/* -------------------------------------------- */
export class YggdrasillUtility {
/* -------------------------------------------- */
/* -------------------------------------------- */
static async preloadHandlebarsTemplates() {
const templatePaths = [
'systems/fvtt-yggdrasill/templates/actor-sheet.html',
'systems/fvtt-yggdrasill/templates/editor-notes-gm.html'
'systems/fvtt-yggdrasill/templates/editor-notes-gm.html',
'systems/fvtt-yggdrasill/templates/hud-actor-attaque.html',
'systems/fvtt-yggdrasill/templates/hud-actor-sort.html'
]
return foundry.applications.handlebars.loadTemplates(templatePaths);
return loadTemplates(templatePaths);
}
/* -------------------------------------------- */
static templateData(it) {
return YggdrasillUtility.data(it)?.data ?? {}
}
/* -------------------------------------------- */
static data(it) {
if (it instanceof Actor || it instanceof Item || it instanceof Combatant) {
return it.data;
}
return it;
}
/* -------------------------------------------- */
static createDirectSortedOptionList( min, max) {
let options = [];
for(let i=min; i<=max; i++) {
for(let i=min; i<=max; i++) {
options.push( {value:i, text: `${i}` } );
}
return options;
}
/* -------------------------------------------- */
static createOptions( min, max) {
let options = [];
for(let i=min; i<=max; i++) {
options.push( {key:i, label: `${i}` } );
}
return options;
}
/* -------------------------------------------- */
static createDirectOptionList( min, max) {
let options = {};
@ -50,6 +59,23 @@ export class YggdrasillUtility {
}
return options;
}
/* -------------------------------------------- */
static buildSROptions( ) {
let options = ""
options += `<option value="0">Aucun</option>`
options += `<option value="5">Très Simple (5)</option>`
options += `<option value="7">Simple (7)</option>`
options += `<option value="10">Aisé (10)</option>`
options += `<option value="14">Moyen (14)</option>`
options += `<option value="19">Difficile (19)</option>`
options += `<option value="25">Trés Difficile (25)</option>`
options += `<option value="32">Exceptionnel (32)</option>`
options += `<option value="40">Légendaire (40)</option>`
options += `<option value="49">Divin (49)</option>`
return options;
}
/* -------------------------------------------- */
static onSocketMesssage( msg ) {
@ -72,78 +98,41 @@ export class YggdrasillUtility {
return compendiumData.filter(filter);
}
/* -------------------------------------------- */
static async specificYggRoll( nbDice, isFurorUsage = false) {
let rawDices = []
let rolls = []
let maxTab = []
let maxTabMaxIndex = isFurorUsage ? nbDice : 2;
for (let i=0; i<nbDice; i++) {
rolls[i] = await new Roll("1d10x10").roll( ) //+sumDice+"+"+rollData.furorUsage+"d10+"+niveauCompetence+"+"+rollData.finalBM).roll( { async: false} );
if ( i == nbDice-1 ) {
await this.showDiceSoNice(rolls[i], game.settings.get("core", "rollMode") );
} else {
this.showDiceSoNice(rolls[i], game.settings.get("core", "rollMode") );
}
rawDices.push({ 'result': rolls[i].total});
}
rolls.sort((a,b) => a.total-b.total);
rolls.reverse();
for (let i=0; i<maxTabMaxIndex; i++) {
maxTab[i] = {idx: 0, value: 0};
if (rolls[i]?.total != undefined) maxTab[i].value = rolls[i].total;
}
return { rawDices: rawDices, maxTab: maxTab, rolls: rolls }
}
/* -------------------------------------------- */
static async rollAttribute( rollData ) {
// Init stuff
let isCritical = false;
let isFailure = false;
let isSuccess = false;
let marge = 0;
let marge = 0;
let niveau = rollData.subAttr.value;
// Bonus/Malus total
rollData.finalBM = Number(rollData.bonusMalus);
rollData.finalBM = rollData.bonusMalus;
// Gestion cas blessé (malus de -3)
if ( rollData.isBlesse) { // Cas blesse : malus de -3
rollData.finalBM -= 3;
}
let results = await this.specificYggRoll( 2 )
rollData.rawDices = results.rawDices
rollData.maxTab = results.maxTab
rollData.rolls = results.rolls
rollData.bonus = niveau + Number(rollData.finalBM)
rollData.finalTotal = Number(rollData.maxTab[0].value) + Number(rollData.maxTab[1].value);
rollData.finalTotal += Number(rollData.bonus)
let myRoll = new Roll("2d10+"+niveau+"+"+rollData.finalBM).roll( { async: false} );
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode") );
// Compute total SR
rollData.srFinal = Number(rollData.sr);
if ( rollData.bonusdefense ) {
rollData.srFinal += Number(rollData.bonusdefense);
}
if ( rollData.srFinal > 0 ) {
isCritical = rollData.finalTotal >= rollData.srFinal*2;
isSuccess = rollData.finalTotal >= rollData.srFinal;
marge = rollData.finalTotal - rollData.srFinal;
rollData.srFinal = rollData.sr;
if ( rollData.srFinal > 0 ) {
isCritical = myRoll.total >= rollData.srFinal*2;
isSuccess = myRoll.total >= rollData.srFinal;
marge = myRoll.total - rollData.srFinal;
}
if (rollData.rolls[0].dice[0].results[0].result == 1 && rollData.rolls[1].dice[0].results[0].result == 1) {
if (myRoll.dice[0].results[0].result == 1 && myRoll.dice[0].results[1].result == 1) {
isFailure = true;
}
// Dégats
if ( isSuccess && rollData.subAttr.degats ) {
rollData.degatsExplain = `Marge(${marge}) + Physique(${rollData.valuePhysique}) + 1d10`;
rollData.rollDegats = await new Roll("1d10+"+marge+"+"+rollData.valuePhysique).roll( );
await this.showDiceSoNice(rollData.rollDegats, game.settings.get("core", "rollMode") );
rollData.rollDegats = new Roll("1d10+"+marge+"+"+rollData.valuePhysique).roll( { async: false} );
await this.showDiceSoNice(rollData.rollDegats, game.settings.get("core", "rollMode") );
rollData.degats = rollData.rollDegats.total;
}
@ -152,101 +141,83 @@ export class YggdrasillUtility {
rollData.isSuccess = isSuccess;
rollData.isCritical = isCritical;
rollData.marge = marge;
rollData.roll = myRoll
console.log("ROLLLL ATTR!!!!", rollData);
this.createChatWithRollMode( rollData.alias, {
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-yggdrasill/templates/chat-generic-result.html`, rollData)
content: await renderTemplate(`systems/fvtt-yggdrasill/templates/chat-generic-result.html`, rollData)
});
//myRoll.toMessage();
}
/* -------------------------------------------- */
static async rollYggdrasill( rollData ) {
let sumDice = ( rollData.isEpuise | rollData.isMeurtri) ? 1 : 2;
let sumDice = ( rollData.isEpuise | rollData.isMeurtri | rollData.isBlesse) ? 1 : 2;
// Init stuff
let isCritical = false;
let isFailure = false;
let isSuccess = false;
let marge = 0;
let marge = 0;
let nbDice = rollData.selectedCarac.value;
let niveauCompetence = 0;
// Select niveau de competence/arme/carac
if ( rollData.mode != "carac" ) {
niveauCompetence = rollData.competence.system.niveau;
niveauCompetence = rollData.competence.data.niveau;
} else {
niveauCompetence = rollData.selectedCarac.value;
}
// Bonus/Malus total
rollData.finalBM = Number(rollData.bonusMalus);
rollData.finalBM = rollData.bonusMalus;
if ( rollData.attackDef) {
rollData.finalBM -= rollData.attackDef.malus;
}
if ( rollData?.sort?.system?.malus ) {
rollData.finalBM += rollData.sort.system.malus;
if ( rollData.sort && rollData.sort.data.malus ) {
rollData.finalBM += rollData.sort.data.malus;
}
// Gestion cas blessé (malus de -3)
if ( rollData.isBlesse) { // Cas blesse : malus de -3
rollData.finalBM -= 3;
}
if (sumDice > nbDice) sumDice = nbDice;
let results = await this.specificYggRoll( nbDice )
rollData.rawDices = results.rawDices
rollData.maxTab = results.maxTab
rollData.rolls = results.rolls
console.log("RES", results, nbDice, sumDice)
if ( rollData.furorUsage > 0 ) {
results = await this.specificYggRoll( rollData.furorUsage, true )
rollData.furorRawDices = results.rawDices
rollData.furorMaxTab = results.maxTab
rollData.furorRolls = results.rolls
let actor = game.actors.get(rollData.actorId);
actor.decrementFuror( rollData.furorUsage);
}
rollData.bonusTotal = niveauCompetence + rollData.finalBM
rollData.finalTotal = (sumDice ==1) ? rollData.maxTab[0].value : rollData.maxTab[0].value + rollData.maxTab[1].value;
rollData.furorResult = 0
for (let i=0; i<rollData.furorUsage; i++) {
rollData.furorResult += rollData.furorMaxTab[i].value
}
rollData.finalTotal += Number(rollData.furorResult) + Number(rollData.bonusTotal);
rollData.niveauCompetence = niveauCompetence
let myRoll = new Roll(nbDice+"d10x10kh"+sumDice+"+"+rollData.furorUsage+"d10+"+niveauCompetence+"+"+rollData.finalBM).roll( { async: false} );
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode") );
// Compute total SR
rollData.srFinal = rollData.sr;
if ( rollData.bonusdefense ) {
rollData.srFinal += rollData.bonusdefense;
}
if ( rollData.srFinal > 0 ) {
isCritical = rollData.finalTotal >= rollData.srFinal*2;
isSuccess = rollData.finalTotal >= rollData.srFinal;
marge = rollData.finalTotal - rollData.srFinal;
if ( rollData.srFinal > 0 ) {
isCritical = myRoll.total >= rollData.srFinal*2;
isSuccess = myRoll.total >= rollData.srFinal;
marge = myRoll.total - rollData.srFinal;
}
if (nbDice == 1 && rollData.rolls[0].dice[0].results[0].result == 1) {
rollData.rawDices = duplicate(myRoll.dice[0].results);
if (nbDice == 1 && myRoll.dice[0].results[0].result == 1) {
isFailure = true;
}
if (nbDice == 2 && rollData.rolls[0].dice[0].results[0].result == 1 && rollData.rolls[1].dice[0].results[0].result == 1) {
if (nbDice == 2 && myRoll.dice[0].results[0].result == 1 && myRoll.dice[0].results[1].result == 1) {
isFailure = true;
}
if (nbDice >= 3 ) {
let nbOnes = 0
for (let roll of rollData.rolls) {
if (roll.dice[0].results[0].result == 1 ) nbOnes++;
}
isFailure = nbOnes >= 3;
let nbOnes = myRoll.dice[0].results.filter( dice => dice.result == 1);
isFailure = nbOnes.length >= 3;
}
if ( rollData.furorUsage > 0 ) {
let actor = game.actors.get(rollData.actorId);
actor.decrementFuror( rollData.furorUsage);
}
// Dégats
if ( isSuccess && (rollData.mode == "armecc" || rollData.mode == "armedist") ) {
rollData.degatsExplain = `Marge(${marge}) + Degats Arme(${rollData.arme.system.degat}) + Bonus Attaque(${rollData.attackDef.bonusdegats})`;
rollData.degats = marge + rollData.arme.system.degat + rollData.attackDef.bonusdegats;
rollData.degatsExplain = `Marge(${marge}) + Degats Arme(${rollData.arme.data.degat}) + Bonus Attaque(${rollData.attackDef.bonusdegats})`;
rollData.degats = marge + rollData.arme.data.degat + rollData.attackDef.bonusdegats;
}
// Stockage resultats
@ -255,13 +226,14 @@ export class YggdrasillUtility {
rollData.isSuccess = isSuccess;
rollData.isCritical = isCritical;
rollData.marge = marge;
rollData.roll = myRoll
// Specific GALDR
if ( rollData.sort?.type == "sortgaldr" && rollData.isSuccess) {
let galdrRoll = await new Roll( rollData.dureeGaldr.substring(0, rollData.dureeGaldr.length - 1) ).roll( );
let galdrRoll = new Roll( rollData.dureeGaldr.substring(0, rollData.dureeGaldr.length - 1) ).roll( { async: false} );
await this.showDiceSoNice(galdrRoll, game.settings.get("core", "rollMode") );
rollData.dureeGaldrText = galdrRoll.total + " " + dureeGaldrText[rollData.dureeGaldr];
if ( rollData.sort.system.voie == "illusion") {
if ( rollData.sort.data.voie == "illusion") {
let volume = rollData.zoneGaldr.substring(3, rollData.zoneGaldr.length);
rollData.zoneGaldrText = rollData.instinctCarac.value + " x " + volume;
} else {
@ -274,11 +246,12 @@ export class YggdrasillUtility {
this.createChatWithRollMode( rollData.alias, {
content: await renderTemplate(`systems/fvtt-yggdrasill/templates/chat-generic-result.html`, rollData)
});
//myRoll.toMessage();
}
/* -------------------------------------------- */
static getUsers(filter) {
return game.users.filter(filter).map(user => user.system._id);
return game.users.filter(filter).map(user => user.data._id);
}
/* -------------------------------------------- */
static getWhisperRecipients(rollMode, name) {
@ -298,7 +271,7 @@ export class YggdrasillUtility {
/* -------------------------------------------- */
static blindMessageToGM(chatOptions) {
let chatGM = foundry.utils.duplicate(chatOptions);
let chatGM = duplicate(chatOptions);
chatGM.whisper = this.getUsers(user => user.isGM);
chatGM.content = "Message aveugle de " + game.user.name + "<br>" + chatOptions.content;
console.log("blindMessageToGM", chatGM);
@ -331,7 +304,7 @@ export class YggdrasillUtility {
static createChatWithRollMode(name, chatOptions) {
this.createChatMessage(name, game.settings.get("core", "rollMode"), chatOptions);
}
/* -------------------------------------------- */
static async confirmDelete(actorSheet, li) {
let itemId = li.data("item-id");
@ -360,7 +333,7 @@ export class YggdrasillUtility {
d.render(true);
}
/* -------------------------------------------- */
static async showDiceSoNice(roll, rollMode) {
if (game.modules.get("dice-so-nice")?.active) {

View File

@ -1,7 +1,7 @@
[Dolphin]
HeaderColumnWidths=544,73,106,72
SortOrder=1
SortRole=modificationtime
Timestamp=2022,2,5,12,44,17.076
Timestamp=2021,9,21,17,43,45.19
Version=4
ViewMode=1
VisibleRoles=Details_text,Details_size,Details_modificationtime,Details_creationtime,CustomizedDetails

View File

@ -1,15 +1,21 @@
{"name":"Lance cc","type":"armecc","img":"icons/svg/item-bag.svg","data":{"categorie":"hast","equipe":false,"degat":10,"solidite":11,"enc":2,"valeur":4,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"xMRAVbweHG0aMBNR":3},"flags":{"core":{"sourceId":"Item.KPPt0lyDyEac7SPi"}},"_id":"3VBHojfjdD504ibv"}
{"name":"Casque","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":3,"enc":2,"valeur":2,"description":"<p>Le mod&egrave;le le plus fr&eacute;quent comporte un nasal et des &laquo; lunettes &raquo; qui prot&egrave;gent les yeux. Sur une base de bol en m&eacute;tal, des lamelles de renforts sont rivet&eacute;es afin d&rsquo;assurer la rigidit&eacute; de l&rsquo;ensemble. L&rsquo;int&eacute;rieur est doubl&eacute; de cuir et de tissu afin d&rsquo;amortir les chocs.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"8MoqC7EIc3SXtdsN"}
{"_id":"8aaaIqx6uT1sJ0RO","name":"Lance","type":"armedist","img":"icons/svg/item-bag.svg","data":{"categorie":"jet","equipe":false,"degat":8,"solidite":11,"enc":4,"portee":"5/10/15/30","valeur":4,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{}}
{"name":"Cuir lamellé","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":6,"enc":3,"valeur":2,"description":"<p>Des lamelles de cuir plus rigides sont coll&eacute;es et cousues sur la version pr&eacute;c&eacute;dente. La poitrine, le ventre, les omoplates et les coudes sont particuli&egrave;rement renforc&eacute;s. Des pi&egrave;ces semi-rigides, bomb&eacute;es, enserrent parfois les &eacute;paules.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"B2yc8LDKTRl0Hjxt"}
{"name":"Hache de guerre","type":"armecc","img":"icons/svg/item-bag.svg","data":{"categorie":"longue","equipe":false,"degat":9,"solidite":10,"enc":2,"valeur":1,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"BwmkCCiJWME4CpB0"}
{"name":"Poignard cc","type":"armecc","img":"icons/svg/item-bag.svg","data":{"categorie":"courte","equipe":false,"degat":3,"solidite":9,"enc":0,"valeur":0.5,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"xMRAVbweHG0aMBNR":3},"flags":{"core":{"sourceId":"Item.jLtQv1SAt8pkMGqa"}},"_id":"CwrTGdva6vQVz0aQ"}
{"name":"Epaullières de fourrure","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":2,"enc":1,"valeur":0.6,"description":"<p>Il s&rsquo;agit d&rsquo;un grand morceau de peau encerclant les &eacute;paules et le cou. En g&eacute;n&eacute;ral, cette fourrure est fix&eacute;e sur une cape. En plus de la protection qu&rsquo;elle apporte, sa nature (loup, ours, vison, etc.. ) donne une indication sur le statut du guerrier.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"C2mzwxiCPJWoY8kc"}
{"name":"Epée courte","type":"armecc","img":"icons/svg/item-bag.svg","data":{"categorie":"longue","equipe":false,"degat":5,"solidite":11,"enc":0,"valeur":2,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"FGIja8vhUOeGNC4x"}
{"name":"Longue hache","type":"armecc","img":"icons/svg/item-bag.svg","data":{"categorie":"deuxmains","equipe":false,"degat":14,"solidite":12,"enc":3,"valeur":3,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"GqAbMhROpATanmH3"}
{"name":"Hache de jet","type":"armedist","img":"icons/svg/item-bag.svg","data":{"categorie":"jet","equipe":false,"degat":4,"solidite":8,"enc":0,"portee":"3/6/9/15","valeur":0.3,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"IZRpi8jq9erpiyoy"}
{"_id":"MkEW9Ma5m9nlE0nr","name":"Poignard","type":"armedist","img":"icons/svg/item-bag.svg","data":{"categorie":"jet","equipe":false,"degat":3,"solidite":9,"enc":0,"portee":"3/6/9/12","valeur":0.5,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{}}
{"_id":"MkEW9Ma5m9nlE0nr","name":"Poignard","type":"armedist","img":"icons/svg/item-bag.svg","data":{"categorie":"jet","equipe":false,"degat":3,"solidite":9,"enc":2,"portee":"3/6/9/12","valeur":0.4,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{}}
{"name":"Cuir renforcé","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":4,"enc":1,"valeur":1,"description":"<p>La veste devient plus &eacute;paisse et doubl&eacute;e de tissu. Des pi&egrave;ces de m&eacute;tal, des rivets plats en cuivre, en bronze ou en fer apportent une protection suppl&eacute;mentaire aux zones les plus expos&eacute;es. Le col monte parfois jusque sous le menton.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"P6dSkefY97UqdDj9"}
{"name":"Arc de chasse","type":"armedist","img":"icons/svg/item-bag.svg","data":{"categorie":"tir","equipe":false,"degat":6,"solidite":8,"enc":2,"portee":"10/20/40/80","valeur":1,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"PsqO2GFVTFIeyCmQ"}
{"name":"Bracelets de cuir renforcé","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":1,"enc":0,"valeur":0.3,"description":"<p>Ils prot&egrave;gent l&rsquo;avant-bras, du dessus de la main jusqu&rsquo;au coude. Souvent grav&eacute;s de motifs d&eacute;coratifs, ils se composent de lamelles de cuir rigidifi&eacute;es et nou&eacute;es &agrave; l&rsquo;aide de gros lacets.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"RgYAFOOAh7GGzBaF"}
{"name":"Jambières de cuir renforcé","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":2,"enc":1,"valeur":0.4,"description":"<p>Nou&eacute;es autour des cuisses ou des mollets, elles prot&egrave;gent le combattant des coups visant ses jambes. Ici aussi, les artisans essaient souvent d&rsquo;orner ces pi&egrave;ces d&rsquo;armure de d&eacute;corations cisel&eacute;es dans la mati&egrave;re.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"SpTt7wfW9qBKJDxX"}
{"name":"Veste de cuir","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":2,"enc":0,"valeur":0.3,"description":"<p>Il s&rsquo;agit autant d&rsquo;un v&ecirc;tement courant que d&rsquo;une armure. La veste recouvre le torse, le ventre et les hanches. Certaines poss&egrave;dent des manches, courtes ou longues. Le cuir souple et fin ne restreint gu&egrave;re la libert&eacute; de mouvement.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"WrJ7Q4e556LDolbu"}
{"name":"Hachette","type":"armecc","img":"icons/svg/item-bag.svg","data":{"categorie":"courte","equipe":false,"degat":4,"solidite":8,"enc":0,"valeur":0.3,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"fjIHt6jNRAM25L9q"}
{"name":"Arc de guerre","type":"armedist","img":"icons/svg/item-bag.svg","data":{"categorie":"tir","equipe":false,"degat":7,"solidite":10,"enc":2,"portee":"10/30/50/100","valeur":2,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"jSrZnzjI0QVWuXw8"}
{"name":"Javeline","type":"armedist","img":"icons/svg/item-bag.svg","data":{"categorie":"jet","equipe":false,"degat":6,"solidite":7,"enc":2,"portee":"5/10/20/40","valeur":0.4,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"m6PjnSO3ACnzU0ie"}
{"name":"Cotte de mailles","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":9,"enc":5,"valeur":8,"description":"<p>Compos&eacute;e de centaines d&rsquo;anneaux de fer rivet&eacute;s, la cotte de mailles prot&egrave;ge les m&ecirc;mes parties du corps qu&rsquo;une veste. Elle ne descend jamais sur les jambes car cela restreint trop la mobilit&eacute; des combattants. Ceux-ci enfilent dessous une chemise molletonn&eacute;e ou une fine veste de cuir.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"n9eKutLHJZoBYFAD"}
{"name":"Epée à deux mains","type":"armecc","img":"icons/svg/item-bag.svg","data":{"categorie":"deuxmains","equipe":false,"degat":12,"solidite":14,"enc":3,"valeur":5,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"ptcBNQhYLwWkBkc0"}
{"name":"Epée longue","type":"armecc","img":"icons/svg/item-bag.svg","data":{"categorie":"longue","equipe":false,"degat":7,"solidite":11,"enc":1,"valeur":4,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"rpY7aUxJelvsozvh"}
{"name":"Fronde","type":"armedist","img":"icons/svg/item-bag.svg","data":{"categorie":"tir","equipe":false,"degat":4,"solidite":12,"enc":0,"portee":"10/20/30/40","valeur":0.1,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"x3aMYeKa73GxJ1Ge"}

View File

Binary file not shown.

View File

@ -1 +0,0 @@
MANIFEST-000036

View File

View File

@ -1,15 +0,0 @@
2025/05/01-23:39:32.648964 7fe00affd6c0 Recovering log #34
2025/05/01-23:39:32.659213 7fe00affd6c0 Delete type=0 #34
2025/05/01-23:39:32.659296 7fe00affd6c0 Delete type=3 #32
2025/05/02-00:00:01.649791 7fe0093ff6c0 Level-0 table #39: started
2025/05/02-00:00:01.653017 7fe0093ff6c0 Level-0 table #39: 2327 bytes OK
2025/05/02-00:00:01.659302 7fe0093ff6c0 Delete type=0 #37
2025/05/02-00:00:01.659500 7fe0093ff6c0 Manual compaction at level-0 from '!items!3VBHojfjdD504ibv' @ 72057594037927935 : 1 .. '!items!x3aMYeKa73GxJ1Ge' @ 0 : 0; will stop at (end)
2025/05/02-00:00:01.690344 7fe0093ff6c0 Manual compaction at level-1 from '!items!3VBHojfjdD504ibv' @ 72057594037927935 : 1 .. '!items!x3aMYeKa73GxJ1Ge' @ 0 : 0; will stop at '!items!x3aMYeKa73GxJ1Ge' @ 45 : 1
2025/05/02-00:00:01.690353 7fe0093ff6c0 Compacting 1@1 + 1@2 files
2025/05/02-00:00:01.693550 7fe0093ff6c0 Generated table #40@1: 15 keys, 2327 bytes
2025/05/02-00:00:01.693570 7fe0093ff6c0 Compacted 1@1 + 1@2 files => 2327 bytes
2025/05/02-00:00:01.700976 7fe0093ff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2025/05/02-00:00:01.701159 7fe0093ff6c0 Delete type=2 #5
2025/05/02-00:00:01.701309 7fe0093ff6c0 Delete type=2 #39
2025/05/02-00:00:01.701436 7fe0093ff6c0 Manual compaction at level-1 from '!items!x3aMYeKa73GxJ1Ge' @ 45 : 1 .. '!items!x3aMYeKa73GxJ1Ge' @ 0 : 0; will stop at (end)

View File

@ -1,8 +0,0 @@
2024/05/02-09:20:30.852464 7f844c2006c0 Recovering log #30
2024/05/02-09:20:30.862615 7f844c2006c0 Delete type=3 #28
2024/05/02-09:20:30.862709 7f844c2006c0 Delete type=0 #30
2024/05/02-09:24:00.910769 7f844ae006c0 Level-0 table #35: started
2024/05/02-09:24:00.910814 7f844ae006c0 Level-0 table #35: 0 bytes OK
2024/05/02-09:24:00.917379 7f844ae006c0 Delete type=0 #33
2024/05/02-09:24:00.931103 7f844ae006c0 Manual compaction at level-0 from '!items!3VBHojfjdD504ibv' @ 72057594037927935 : 1 .. '!items!x3aMYeKa73GxJ1Ge' @ 0 : 0; will stop at (end)
2024/05/02-09:24:00.931173 7f844ae006c0 Manual compaction at level-1 from '!items!3VBHojfjdD504ibv' @ 72057594037927935 : 1 .. '!items!x3aMYeKa73GxJ1Ge' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -1,8 +1,8 @@
{"_id":"4YGPuZ813BWQaNbq","name":"Bracelets de cuir renforcé","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"piecearmure","equipe":false,"protection":1,"enc":0,"valeur":0.3,"description":"<p>Ils prot&egrave;gent l&rsquo;avant-bras, du dessus de la main jusqu&rsquo;au coude. Souvent grav&eacute;s de motifs d&eacute;coratifs, ils se composent de lamelles de cuir rigidifi&eacute;es et nou&eacute;es &agrave; l&rsquo;aide de gros lacets.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{}}
{"name":"Bracelets de cuir renforcé","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":1,"enc":0,"valeur":0.3,"description":"<p>Ils prot&egrave;gent l&rsquo;avant-bras, du dessus de la main jusqu&rsquo;au coude. Souvent grav&eacute;s de motifs d&eacute;coratifs, ils se composent de lamelles de cuir rigidifi&eacute;es et nou&eacute;es &agrave; l&rsquo;aide de gros lacets.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"4YGPuZ813BWQaNbq"}
{"name":"Cuir lamellé","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":6,"enc":3,"valeur":2,"description":"<p>Des lamelles de cuir plus rigides sont coll&eacute;es et cousues sur la version pr&eacute;c&eacute;dente. La poitrine, le ventre, les omoplates et les coudes sont particuli&egrave;rement renforc&eacute;s. Des pi&egrave;ces semi-rigides, bomb&eacute;es, enserrent parfois les &eacute;paules.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"9WReqm0CdcCGnsNc"}
{"name":"Veste de cuir","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":2,"enc":0,"valeur":0.3,"description":"<p>Il s&rsquo;agit autant d&rsquo;un v&ecirc;tement courant que d&rsquo;une armure. La veste recouvre le torse, le ventre et les hanches. Certaines poss&egrave;dent des manches, courtes ou longues. Le cuir souple et fin ne restreint gu&egrave;re la libert&eacute; de mouvement.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"JP6OeUflKfg4WiyJ"}
{"name":"Cuir renforcé","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":4,"enc":1,"valeur":1,"description":"<p>La veste devient plus &eacute;paisse et doubl&eacute;e de tissu. Des pi&egrave;ces de m&eacute;tal, des rivets plats en cuivre, en bronze ou en fer apportent une protection suppl&eacute;mentaire aux zones les plus expos&eacute;es. Le col monte parfois jusque sous le menton.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"MFH09YNp4uGL8eCE"}
{"_id":"NK7IF0Cr4oOPCZVq","name":"Epaulières de fourrure","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"piecearmure","equipe":false,"protection":2,"enc":1,"valeur":0.6,"description":"<p>Il s&rsquo;agit d&rsquo;un grand morceau de peau encerclant les &eacute;paules et le cou. En g&eacute;n&eacute;ral, cette fourrure est fix&eacute;e sur une cape. En plus de la protection qu&rsquo;elle apporte, sa nature (loup, ours, vison, etc.. ) donne une indication sur le statut du guerrier.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{}}
{"_id":"WergjG9QE8SxlAGr","name":"Jambières de cuir renforcé","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"piecearmure","equipe":false,"protection":2,"enc":1,"valeur":0.4,"description":"<p>Nou&eacute;es autour des cuisses ou des mollets, elles prot&egrave;gent le combattant des coups visant ses jambes. Ici aussi, les artisans essaient souvent d&rsquo;orner ces pi&egrave;ces d&rsquo;armure de d&eacute;corations cisel&eacute;es dans la mati&egrave;re.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{}}
{"_id":"ozRBKdYJtbnk87gO","name":"Casque","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"piecearmure","equipe":false,"protection":3,"enc":2,"valeur":2,"description":"<p>Le mod&egrave;le le plus fr&eacute;quent comporte un nasal et des &laquo; lunettes &raquo; qui prot&egrave;gent les yeux. Sur une base de bol en m&eacute;tal, des lamelles de renforts sont rivet&eacute;es afin d&rsquo;assurer la rigidit&eacute; de l&rsquo;ensemble. L&rsquo;int&eacute;rieur est doubl&eacute; de cuir et de tissu afin d&rsquo;amortir les chocs.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{}}
{"name":"Epaullières de fourrure","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":2,"enc":1,"valeur":0.6,"description":"<p>Il s&rsquo;agit d&rsquo;un grand morceau de peau encerclant les &eacute;paules et le cou. En g&eacute;n&eacute;ral, cette fourrure est fix&eacute;e sur une cape. En plus de la protection qu&rsquo;elle apporte, sa nature (loup, ours, vison, etc.. ) donne une indication sur le statut du guerrier.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"NK7IF0Cr4oOPCZVq"}
{"name":"Jambières de cuir renforcé","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":2,"enc":1,"valeur":0.4,"description":"<p>Nou&eacute;es autour des cuisses ou des mollets, elles prot&egrave;gent le combattant des coups visant ses jambes. Ici aussi, les artisans essaient souvent d&rsquo;orner ces pi&egrave;ces d&rsquo;armure de d&eacute;corations cisel&eacute;es dans la mati&egrave;re.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"WergjG9QE8SxlAGr"}
{"name":"Casque","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":3,"enc":2,"valeur":2,"description":"<p>Le mod&egrave;le le plus fr&eacute;quent comporte un nasal et des &laquo; lunettes &raquo; qui prot&egrave;gent les yeux. Sur une base de bol en m&eacute;tal, des lamelles de renforts sont rivet&eacute;es afin d&rsquo;assurer la rigidit&eacute; de l&rsquo;ensemble. L&rsquo;int&eacute;rieur est doubl&eacute; de cuir et de tissu afin d&rsquo;amortir les chocs.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"ozRBKdYJtbnk87gO"}
{"name":"Cotte de mailles","type":"armure","img":"icons/svg/item-bag.svg","data":{"categorie":"armure","equipe":false,"protection":9,"enc":5,"valeur":8,"description":"<p>Compos&eacute;e de centaines d&rsquo;anneaux de fer rivet&eacute;s, la cotte de mailles prot&egrave;ge les m&ecirc;mes parties du corps qu&rsquo;une veste. Elle ne descend jamais sur les jambes car cela restreint trop la mobilit&eacute; des combattants. Ceux-ci enfilent dessous une chemise molletonn&eacute;e ou une fine veste de cuir.</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"qUXBrstsh5Oo8FEx"}

Binary file not shown.

View File

@ -1 +0,0 @@
MANIFEST-000036

View File

View File

@ -1,15 +0,0 @@
2025/05/01-23:39:32.662878 7fe00a7fc6c0 Recovering log #34
2025/05/01-23:39:32.674030 7fe00a7fc6c0 Delete type=0 #34
2025/05/01-23:39:32.674181 7fe00a7fc6c0 Delete type=3 #32
2025/05/02-00:00:01.701554 7fe0093ff6c0 Level-0 table #39: started
2025/05/02-00:00:01.704718 7fe0093ff6c0 Level-0 table #39: 3197 bytes OK
2025/05/02-00:00:01.710800 7fe0093ff6c0 Delete type=0 #37
2025/05/02-00:00:01.741412 7fe0093ff6c0 Manual compaction at level-0 from '!items!4YGPuZ813BWQaNbq' @ 72057594037927935 : 1 .. '!items!qUXBrstsh5Oo8FEx' @ 0 : 0; will stop at (end)
2025/05/02-00:00:01.741481 7fe0093ff6c0 Manual compaction at level-1 from '!items!4YGPuZ813BWQaNbq' @ 72057594037927935 : 1 .. '!items!qUXBrstsh5Oo8FEx' @ 0 : 0; will stop at '!items!qUXBrstsh5Oo8FEx' @ 24 : 1
2025/05/02-00:00:01.741491 7fe0093ff6c0 Compacting 1@1 + 1@2 files
2025/05/02-00:00:01.744814 7fe0093ff6c0 Generated table #40@1: 8 keys, 3197 bytes
2025/05/02-00:00:01.744839 7fe0093ff6c0 Compacted 1@1 + 1@2 files => 3197 bytes
2025/05/02-00:00:01.751538 7fe0093ff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2025/05/02-00:00:01.751680 7fe0093ff6c0 Delete type=2 #5
2025/05/02-00:00:01.751873 7fe0093ff6c0 Delete type=2 #39
2025/05/02-00:00:01.782461 7fe0093ff6c0 Manual compaction at level-1 from '!items!qUXBrstsh5Oo8FEx' @ 24 : 1 .. '!items!qUXBrstsh5Oo8FEx' @ 0 : 0; will stop at (end)

View File

@ -1,8 +0,0 @@
2024/05/02-09:20:30.867038 7f844cc006c0 Recovering log #30
2024/05/02-09:20:30.878552 7f844cc006c0 Delete type=3 #28
2024/05/02-09:20:30.878665 7f844cc006c0 Delete type=0 #30
2024/05/02-09:24:00.917585 7f844ae006c0 Level-0 table #35: started
2024/05/02-09:24:00.917644 7f844ae006c0 Level-0 table #35: 0 bytes OK
2024/05/02-09:24:00.924086 7f844ae006c0 Delete type=0 #33
2024/05/02-09:24:00.931117 7f844ae006c0 Manual compaction at level-0 from '!items!4YGPuZ813BWQaNbq' @ 72057594037927935 : 1 .. '!items!qUXBrstsh5Oo8FEx' @ 0 : 0; will stop at (end)
2024/05/02-09:24:00.931187 7f844ae006c0 Manual compaction at level-1 from '!items!4YGPuZ813BWQaNbq' @ 72057594037927935 : 1 .. '!items!qUXBrstsh5Oo8FEx' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
MANIFEST-000036

View File

View File

@ -1,15 +0,0 @@
2025/05/01-23:39:32.635609 7fe00b7fe6c0 Recovering log #34
2025/05/01-23:39:32.645474 7fe00b7fe6c0 Delete type=0 #34
2025/05/01-23:39:32.645571 7fe00b7fe6c0 Delete type=3 #32
2025/05/02-00:00:01.629647 7fe0093ff6c0 Level-0 table #39: started
2025/05/02-00:00:01.633062 7fe0093ff6c0 Level-0 table #39: 4373 bytes OK
2025/05/02-00:00:01.639223 7fe0093ff6c0 Delete type=0 #37
2025/05/02-00:00:01.659477 7fe0093ff6c0 Manual compaction at level-0 from '!items!4rM9IvDuijsjbAhI' @ 72057594037927935 : 1 .. '!items!swTZ43FJRWkqjR75' @ 0 : 0; will stop at (end)
2025/05/02-00:00:01.670214 7fe0093ff6c0 Manual compaction at level-1 from '!items!4rM9IvDuijsjbAhI' @ 72057594037927935 : 1 .. '!items!swTZ43FJRWkqjR75' @ 0 : 0; will stop at '!items!swTZ43FJRWkqjR75' @ 45 : 1
2025/05/02-00:00:01.670224 7fe0093ff6c0 Compacting 1@1 + 1@2 files
2025/05/02-00:00:01.673584 7fe0093ff6c0 Generated table #40@1: 15 keys, 4373 bytes
2025/05/02-00:00:01.673615 7fe0093ff6c0 Compacted 1@1 + 1@2 files => 4373 bytes
2025/05/02-00:00:01.679975 7fe0093ff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2025/05/02-00:00:01.680089 7fe0093ff6c0 Delete type=2 #5
2025/05/02-00:00:01.680247 7fe0093ff6c0 Delete type=2 #39
2025/05/02-00:00:01.701412 7fe0093ff6c0 Manual compaction at level-1 from '!items!swTZ43FJRWkqjR75' @ 45 : 1 .. '!items!swTZ43FJRWkqjR75' @ 0 : 0; will stop at (end)

View File

@ -1,8 +0,0 @@
2024/05/02-09:20:30.837163 7f844cc006c0 Recovering log #30
2024/05/02-09:20:30.848664 7f844cc006c0 Delete type=3 #28
2024/05/02-09:20:30.848767 7f844cc006c0 Delete type=0 #30
2024/05/02-09:24:00.903725 7f844ae006c0 Level-0 table #35: started
2024/05/02-09:24:00.903795 7f844ae006c0 Level-0 table #35: 0 bytes OK
2024/05/02-09:24:00.910581 7f844ae006c0 Delete type=0 #33
2024/05/02-09:24:00.931083 7f844ae006c0 Manual compaction at level-0 from '!items!4rM9IvDuijsjbAhI' @ 72057594037927935 : 1 .. '!items!swTZ43FJRWkqjR75' @ 0 : 0; will stop at (end)
2024/05/02-09:24:00.931143 7f844ae006c0 Manual compaction at level-1 from '!items!4rM9IvDuijsjbAhI' @ 72057594037927935 : 1 .. '!items!swTZ43FJRWkqjR75' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -1,7 +1,7 @@
{"name":"Superstition","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>Le monde regorge de signes divins, de d&eacute;tails naturels qui refl&egrave;tent le sens cach&eacute; des choses. Le personnage sait rep&eacute;rer et interpr&eacute;ter ces &eacute;l&eacute;ments. Il s&rsquo;agit en g&eacute;n&eacute;ral d&rsquo;y voir des conditions favorables ou d&eacute;favorables pour le moment pr&eacute;sent, mais aussi des messages d&rsquo;avertissement envoy&eacute;s par les dieux. Les habitants de la Scandia sont des gens tr&egrave;s superstitieux et ils tendent &agrave; voir partout des pr&eacute;sages significatifs. Le Meneur de Jeu pourra en profiter pour glisser quelques indices obscurs sur la situation actuelle des h&eacute;ros qui, dans l&rsquo;id&eacute;al, r&eacute;v&egrave;leront leur plein sens une fois qu&rsquo;il sera trop tard.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"26CQEICWZs8Gw4Xi"}
{"name":"Intimidation","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>Par l&rsquo;interm&eacute;diaire de la menace verbale ou physique, le personnage peut contraindre quelqu&rsquo;un &agrave; lui ob&eacute;ir. Une tentative d&rsquo;Intimidation n&eacute;cessite un test en opposition. La cible tente de r&eacute;sister gr&acirc;ce &agrave; sa T&eacute;nacit&eacute; et &agrave; sa D&eacute;fense mentale.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"3vspCnDuVMqQDuPe"}
{"name":"Négociation","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>Il s&rsquo;agit de la capacit&eacute; &agrave; mener une discussion vers un compromis acceptable par les deux parties. N&eacute;gociation est une comp&eacute;tence utile aux diplomates de la Scandia, mais aussi aux marchands qui peuvent mener &agrave; bien leur marchandage lors de l&rsquo;achat et de la vente de leurs produits.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"4k4NLNlEG7jZEPK6"}
{"_id":"6OMBvnSFqVHqd36u","name":"Jeux","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>le personnage conna&icirc;t les r&egrave;gles et sait pratiquer la plupart des jeux pris&eacute;s par les habitants de la Scandia, comme les jeux de d&eacute;s ou le <em>hnefatafl</em>. Cette comp&eacute;tence s&rsquo;utilise g&eacute;n&eacute;ralement avec des tests en opposition mettant en concurrence les niveaux de ma&icirc;trise respectifs des joueurs. Mais elle permet &eacute;galement de tricher. Dans ce cas, les autres participants peuvent tenter un test en opposition de Perception + Vigilance. Si le tricheur est d&eacute;masqu&eacute;, attendezvous &agrave; des cons&eacute;quences&hellip; muscl&eacute;es.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{}}
{"name":"Jeu","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>le personnage conna&icirc;t les r&egrave;gles et sait pratiquer la plupart des jeux pris&eacute;s par les habitants de la Scandia, comme les jeux de d&eacute;s ou le <em>hnefatafl</em>. Cette comp&eacute;tence s&rsquo;utilise g&eacute;n&eacute;ralement avec des tests en opposition mettant en concurrence les niveaux de ma&icirc;trise respectifs des joueurs. Mais elle permet &eacute;galement de tricher. Dans ce cas, les autres participants peuvent tenter un test en opposition de Perception + Vigilance. Si le tricheur est d&eacute;masqu&eacute;, attendezvous &agrave; des cons&eacute;quences&hellip; muscl&eacute;es.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"6OMBvnSFqVHqd36u"}
{"name":"Artisanat","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":true,"categorie":"generale","specialisation":"","description":"<p>Cette comp&eacute;tence regroupe l&rsquo;ensemble des activit&eacute;s manuelles permettant de confectionner les objets du quotidien. La plupart des habitants de la Scandia pratiquent plus ou moins ces techniques et se r&eacute;v&egrave;lent autonomes lorsqu&rsquo;il s&rsquo;agit de fabriquer ou de r&eacute;parer des ustensiles basiques. Un niveau Confirm&eacute; permet d&rsquo;exercer son artisanat en professionnel et de gagner sa vie avec cette activit&eacute;. Les meilleurs artisans b&eacute;n&eacute;ficient d&rsquo;une renomm&eacute;e et d&rsquo;une consid&eacute;ration importantes. L&rsquo;utilisation de cette comp&eacute;tence correspond en g&eacute;n&eacute;ral &agrave; un test &eacute;tendu. Sp&eacute;cialisations possibles : cordonnerie, ferronnerie, chaudronnerie, charpenterie, tissage, tannerie, corderie, taille de pierre, poterie, sellerie, etc&hellip;</p>\n<p>Il existe cependant deux sp&eacute;cialisations qui m&eacute;ritent que l&rsquo;on s&rsquo;y attarde, tant elles occupent une place importante dans la soci&eacute;t&eacute; des Terres du Nord.</p>\n<p><strong>Construction navale : </strong>cette sp&eacute;cialisation permet de mener &agrave; bien la construction des diff&eacute;rents types de navires sillonnant les flots de la Scandia. Le personnage ma&icirc;trise aussi bien les secrets de l&rsquo;architecture navale que les techniques de la charpenterie de marine, mais il sait tout autant diriger les artisans qui vont r&eacute;aliser le bateau selon ses instructions. Les meilleurs dans ce domaine sont tr&egrave;s recherch&eacute;s par tous les jarls et souverains des Royaumes Nordiques.</p>\n<p><strong>Forge : </strong>l&rsquo;art de la forge n&eacute;cessite des connaissances sp&eacute;cifiques dont certaines confinent au secret transmis uniquement d&rsquo;un ma&icirc;tre &agrave; son disciple. Un personnage Novice sait fabriquer des objets usuels, simples, utiles au quotidien (clous, t&ecirc;tes d&rsquo;outils, anneaux&hellip;) Une fois atteint le niveau Confirm&eacute;, il peut commencer &agrave; forger des pi&egrave;ces plus complexes (fer pour les chevaux, serrures, ferrures d&rsquo;ornements, etc&hellip;) ainsi que des armes et des armures. Si certains exercent leur profession de mani&egrave;re itin&eacute;rante, un forgeron doit tout de m&ecirc;me disposer d&rsquo;un atelier et d&rsquo;outils appropri&eacute;s afin de pouvoir mettre en oeuvre sa comp&eacute;tence. Un forgeron pratique l&rsquo;un des m&eacute;tiers les plus respect&eacute;s parmi les artisans.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"947IgofSqazA1CoD"}
{"name":"Survie","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>Le personnage se sent &agrave; l&rsquo;aise dans les milieux naturels et sait comment y vivre en harmonie avec la nature. Cette comp&eacute;tence permet de trouver de quoi se nourrir et s&rsquo;abreuver, un endroit pour s&rsquo;abriter, de faire du feu et de se prot&eacute;ger des conditions climatiques extr&ecirc;mes comme le froid d&rsquo;une nuit d&rsquo;hiver. La Survie recouvre &eacute;galement la chasse et le pistage, mais aussi le sens de l&rsquo;orientation et les premiers soins.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"9AHUm9FLajXTkEZJ"}
{"name":"Traditions","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>Gr&acirc;ce &agrave; cette comp&eacute;tence, le personnage se souvient des r&egrave;gles, des coutumes et des lois qui ont cours dans la r&eacute;gion, voire la cit&eacute;, o&ugrave; il se trouve. Si le syst&egrave;me juridique reste assez semblable dans toute la Scandia, il existe souvent quelques variations locales dans l&rsquo;application des peines encourues pour un m&ecirc;me crime. De m&ecirc;me, les us et coutumes de certains endroits changent subtilement par rapport aux habitudes des h&eacute;ros et peuvent provoquer des situations des plus embarrassantes. Un personnage Expert dans cette comp&eacute;tence peut endosser le r&ocirc;le de crieur des lois lors d&rsquo;un thing.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"CIfheBgF5plSgqYT"}
@ -9,10 +9,10 @@
{"name":"Esquive","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>Le personnage anticipe les attaques port&eacute;es contre lui et se met hors de port&eacute;e des coups ou des projectiles qui le visent. Bien qu&rsquo;elle s&rsquo;av&egrave;re surtout utile en combat, cette comp&eacute;tence sert &eacute;galement &agrave; &eacute;viter une collision qui menace le h&eacute;ros, comme un attelage lanc&eacute; au galop vers lui, ou un &eacute;boulement de gros rochers. Que l&rsquo;esquive soit r&eacute;ussie ou pas, le personnage se retrouve toujours &agrave; terre, &agrave; quelques pas de sa position initiale (le joueur choisit la direction).</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"MLCAKgi8wRLwlINc"}
{"name":"Commerce","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>Il s&rsquo;agit de la connaissance des lois de l&rsquo;offre et de la demande. Le n&eacute;gociant sait &eacute;valuer les choses lors d&rsquo;un troc, ou d&rsquo;une transaction s&rsquo;il utilise de la monnaie. Il conna&icirc;t &eacute;galement les points d&rsquo;approvisionnement pour les diff&eacute;rentes marchandises produites dans la Scandia, et les endroits o&ugrave; il a le plus de chance d&rsquo;en tirer le meilleur profit. Les dates et les lieux o&ugrave; se d&eacute;roulent les foires annuelles n&rsquo;ont pas de secret pour lui. Enfin, cette comp&eacute;tence g&egrave;re tout l&rsquo;aspect intendance de cette activit&eacute;.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"OlELPb9hGkbQNnff"}
{"name":"Chercher","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>Cette comp&eacute;tence entre en jeu lorsque le personnage fouille un endroit particulier. Elle permet de r&eacute;v&eacute;ler les &eacute;l&eacute;ments cach&eacute;s dans le d&eacute;cor ou les indices dissimul&eacute;s. Contrairement &agrave; la comp&eacute;tence Vigilance, Chercher n&eacute;cessite une d&eacute;marche active de la part du h&eacute;ros.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"QysZVyRFax7P0mko"}
{"_id":"SEeAKWRSKO0HWt6Q","name":"Médecine*","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>Cette comp&eacute;tence correspond &agrave; la connaissance de l&rsquo;ensemble des pratiques m&eacute;dicales de la Scandia. Elle permet d&rsquo;&eacute;tablir un diagnostic, de soigner les maladies les plus courantes, de traiter les blessures, de r&eacute;duire une fracture, d&rsquo;accompagner un accouchement, mais aussi de d&eacute;terminer les causes probables d&rsquo;une mort inexpliqu&eacute;e. Les premiers soins sont quant &agrave; eux couverts par la comp&eacute;tence Survie, mais un personnage plus comp&eacute;tent en M&eacute;decine peut dans ce cas substituer cette discipline &agrave; un test de Survie.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{}}
{"name":"Médecine","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>Cette comp&eacute;tence correspond &agrave; la connaissance de l&rsquo;ensemble des pratiques m&eacute;dicales de la Scandia. Elle permet d&rsquo;&eacute;tablir un diagnostic, de soigner les maladies les plus courantes, de traiter les blessures, de r&eacute;duire une fracture, d&rsquo;accompagner un accouchement, mais aussi de d&eacute;terminer les causes probables d&rsquo;une mort inexpliqu&eacute;e. Les premiers soins sont quant &agrave; eux couverts par la comp&eacute;tence Survie, mais un personnage plus comp&eacute;tent en M&eacute;decine peut dans ce cas substituer cette discipline &agrave; un test de Survie.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"SEeAKWRSKO0HWt6Q"}
{"name":"Herboristerie","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>Il s&rsquo;agit de la connaissance des plantes, des herbes et des produits naturels permettant de concocter des rem&egrave;des, mais aussi des teintures ou encore des poisons de toutes sortes. Un personnage vers&eacute; dans cette discipline sait &eacute;galement reconna&icirc;tre les plantes rencontr&eacute;es en pleine nature, ainsi que d&eacute;terminer l&rsquo;endroit o&ugrave; il a le plus de chance de trouver une esp&egrave;ce sp&eacute;cifique.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"SHnTbcIm0JZN7UqU"}
{"name":"Natation","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>Cette comp&eacute;tence repr&eacute;sente l&rsquo;aptitude &agrave; se mouvoir &agrave; la surface de l&rsquo;eau et &agrave; y demeurer en cas de chute depuis un navire. Le Meneur de Jeu peut appliquer un malus au test de Natation &eacute;gal &agrave; la valeur de protection de l&rsquo;armure port&eacute;e par l&rsquo;infortun&eacute;. Le nageur peut &eacute;galement se d&eacute;placer sous l&rsquo;eau ou plonger depuis les hauteurs vertigineuses des falaises avec de bonnes chances de r&eacute;ussite.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"VcfHyyT169aId8Td"}
{"_id":"ZhIYWUKuDV5hyuUA","name":"Langues*","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":true,"categorie":"generale","specialisation":"","description":"<p>Tous les personnages parlent couramment le norrois (<em>dansk tunga</em>), la langue commune aux diff&eacute;rents royaumes de la Scandia. Chaque sp&eacute;cialisation dans cette comp&eacute;tence correspond &agrave; une langue particuli&egrave;re et &eacute;trang&egrave;re, ou &agrave; un patois local issu d&rsquo;une autre racine linguistique comme le finnois parl&eacute; par les tribus sames. Il est toujours possible de comprendre un dialecte tir&eacute; du norrois en r&eacute;ussissant, g&eacute;n&eacute;ralement, un test d&rsquo;Intellect contre un Seuil de R&eacute;ussite Moyen (14). Exemples de sp&eacute;cialisation : saxon, finnois, balte, germain&hellip;</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{}}
{"name":"Langues","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":true,"categorie":"generale","specialisation":"","description":"<p>Tous les personnages parlent couramment le norrois (<em>dansk tunga</em>), la langue commune aux diff&eacute;rents royaumes de la Scandia. Chaque sp&eacute;cialisation dans cette comp&eacute;tence correspond &agrave; une langue particuli&egrave;re et &eacute;trang&egrave;re, ou &agrave; un patois local issu d&rsquo;une autre racine linguistique comme le finnois parl&eacute; par les tribus sames. Il est toujours possible de comprendre un dialecte tir&eacute; du norrois en r&eacute;ussissant, g&eacute;n&eacute;ralement, un test d&rsquo;Intellect contre un Seuil de R&eacute;ussite Moyen (14). Exemples de sp&eacute;cialisation : saxon, finnois, balte, germain&hellip;</p>","niveau":0,"niveauunrequis":true},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"ZhIYWUKuDV5hyuUA"}
{"name":"Discrétion","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>Le personnage sait se d&eacute;placer en silence, tout en profitant du moindre couvert afin de passer inaper&ccedil;u. Cette comp&eacute;tence permet &eacute;galement de se cacher efficacement ou de camoufler un objet sur soi ou dans le d&eacute;cor environnant.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"cKowAJGvHnY0GSOZ"}
{"name":"Art","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":true,"categorie":"generale","specialisation":"","description":"<p>Choisissez le domaine de pr&eacute;dilection du personnage. Il peut s&rsquo;agir d&rsquo;un simple don naturel, d&rsquo;une activit&eacute; professionnelle (pour un scalde), d&rsquo;un loisir&hellip; Cette comp&eacute;tence permet de cr&eacute;er une oeuvre d&rsquo;art originale ou d&rsquo;en reproduire une existante. Sp&eacute;cialisations possibles : orf&egrave;vrerie, chant, musique, danse, gravure, po&eacute;sie d&eacute;clam&eacute;e, flatterie, peinture, etc&hellip;</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"fcTMIpIMVc1cQASZ"}
{"name":"Larcins","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"generale","specialisation":"","description":"<p>Cette comp&eacute;tence recouvre les activit&eacute;s des filous des terres du Nord. Elle permet de crocheter une serrure, mais aussi de couper une bourse ou de subtiliser discr&egrave;tement des clefs. Dans ce deuxi&egrave;me cas, Larcins s&rsquo;emploie dans un test en opposition contre la Perception et la Vigilance de la cible.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"ggoWPfYoTx7QG5ae"}

View File

@ -1 +0,0 @@
MANIFEST-000036

View File

@ -1,15 +0,0 @@
2025/05/01-23:39:32.556908 7fe009ffb6c0 Recovering log #34
2025/05/01-23:39:32.567507 7fe009ffb6c0 Delete type=0 #34
2025/05/01-23:39:32.567628 7fe009ffb6c0 Delete type=3 #32
2025/05/02-00:00:01.567300 7fe0093ff6c0 Level-0 table #39: started
2025/05/02-00:00:01.570622 7fe0093ff6c0 Level-0 table #39: 18501 bytes OK
2025/05/02-00:00:01.576851 7fe0093ff6c0 Delete type=0 #37
2025/05/02-00:00:01.577006 7fe0093ff6c0 Manual compaction at level-0 from '!items!26CQEICWZs8Gw4Xi' @ 72057594037927935 : 1 .. '!items!ylqZMDyXujUlSorr' @ 0 : 0; will stop at (end)
2025/05/02-00:00:01.609221 7fe0093ff6c0 Manual compaction at level-1 from '!items!26CQEICWZs8Gw4Xi' @ 72057594037927935 : 1 .. '!items!ylqZMDyXujUlSorr' @ 0 : 0; will stop at '!items!ylqZMDyXujUlSorr' @ 90 : 1
2025/05/02-00:00:01.609228 7fe0093ff6c0 Compacting 1@1 + 1@2 files
2025/05/02-00:00:01.612484 7fe0093ff6c0 Generated table #40@1: 30 keys, 18501 bytes
2025/05/02-00:00:01.612511 7fe0093ff6c0 Compacted 1@1 + 1@2 files => 18501 bytes
2025/05/02-00:00:01.618471 7fe0093ff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2025/05/02-00:00:01.618573 7fe0093ff6c0 Delete type=2 #5
2025/05/02-00:00:01.618669 7fe0093ff6c0 Delete type=2 #39
2025/05/02-00:00:01.618752 7fe0093ff6c0 Manual compaction at level-1 from '!items!ylqZMDyXujUlSorr' @ 90 : 1 .. '!items!ylqZMDyXujUlSorr' @ 0 : 0; will stop at (end)

View File

@ -1,8 +0,0 @@
2024/05/02-09:20:30.743214 7f844cc006c0 Recovering log #30
2024/05/02-09:20:30.753988 7f844cc006c0 Delete type=3 #28
2024/05/02-09:20:30.754165 7f844cc006c0 Delete type=0 #30
2024/05/02-09:24:00.851545 7f844ae006c0 Level-0 table #35: started
2024/05/02-09:24:00.851582 7f844ae006c0 Level-0 table #35: 0 bytes OK
2024/05/02-09:24:00.858223 7f844ae006c0 Delete type=0 #33
2024/05/02-09:24:00.864778 7f844ae006c0 Manual compaction at level-0 from '!items!26CQEICWZs8Gw4Xi' @ 72057594037927935 : 1 .. '!items!ylqZMDyXujUlSorr' @ 0 : 0; will stop at (end)
2024/05/02-09:24:00.874940 7f844ae006c0 Manual compaction at level-1 from '!items!26CQEICWZs8Gw4Xi' @ 72057594037927935 : 1 .. '!items!ylqZMDyXujUlSorr' @ 0 : 0; will stop at (end)

View File

@ -1,3 +1,3 @@
{"_id":"RAhkadJOfEnVBLpy","name":"Galdr*","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"magique","specialisation":"","description":"<p>Le <em>galdr</em> utilise la puissance divine de la voix pour la magie. Tout pratiquant de la magie peut l&rsquo;utiliser. Il n&rsquo;est pas besoin d&rsquo;avoir une belle voix ou de chanter juste, mais de lancer des incantations.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{}}
{"_id":"UoWkSxLdXhZQinnc","name":"Runes*","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"magique","specialisation":"","description":"<p>Cette comp&eacute;tence permet de lire et de conna&icirc;tre le sens de chacune des vingt-quatre runes. Mais surtout elles donnent des indications occultes sur la r&eacute;alit&eacute; du monde et permettent de lancer des sorts de protection, mal&eacute;diction et gu&eacute;rison, &agrave; ceux qui savent s&rsquo;en servir.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{}}
{"_id":"mIBiTKqfqiiepeyz","name":"Sejdr*","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"magique","specialisation":"","description":"<p>Il s&rsquo;agit l&agrave; de l&rsquo;antique art magique enseign&eacute; &agrave; Odhinn m&ecirc;me, par Freyja, la sorcellerie. Les femmes sont plus nombreuses &agrave; en pratiquer certains sorts car ils sont li&eacute;s &agrave; des travaux consid&eacute;r&eacute;s comme purement f&eacute;minins (filer de la laine, mettre des v&ecirc;tements de c&eacute;r&eacute;monie pour les visions, chevaucher un autre personnage). Certains hommes pratiquent le Sejdr sans s&rsquo;en soucier, d&rsquo;autres s&eacute;lectionnent les sorts les moins compromettants et les compl&egrave;tent avec les Runes ou le Galdr.</p>","niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{}}
{"name":"Galdr","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"magique","specialisation":"","description":"<p>Le <em>galdr</em> utilise la puissance divine de la voix pour la magie. Tout pratiquant de la magie peut l&rsquo;utiliser. Il n&rsquo;est pas besoin d&rsquo;avoir une belle voix ou de chanter juste, mais de lancer des incantations.</p>","niveau":0,"niveauunrequis":true},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"RAhkadJOfEnVBLpy"}
{"name":"Runes","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"magique","specialisation":"","description":"<p>Cette comp&eacute;tence permet de lire et de conna&icirc;tre le sens de chacune des vingt-quatre runes. Mais surtout elles donnent des indications occultes sur la r&eacute;alit&eacute; du monde et permettent de lancer des sorts de protection, mal&eacute;diction et gu&eacute;rison, &agrave; ceux qui savent s&rsquo;en servir.</p>","niveau":0,"niveauunrequis":true},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"UoWkSxLdXhZQinnc"}
{"name":"Sejdr","type":"competence","img":"systems/fvtt-yggdrasill/images/icons/icon_skill.png","data":{"isspecialisation":false,"categorie":"magique","specialisation":"","description":"<p>Il s&rsquo;agit l&agrave; de l&rsquo;antique art magique enseign&eacute; &agrave; Odhinn m&ecirc;me, par Freyja, la sorcellerie. Les femmes sont plus nombreuses &agrave; en pratiquer certains sorts car ils sont li&eacute;s &agrave; des travaux consid&eacute;r&eacute;s comme purement f&eacute;minins (filer de la laine, mettre des v&ecirc;tements de c&eacute;r&eacute;monie pour les visions, chevaucher un autre personnage). Certains hommes pratiquent le Sejdr sans s&rsquo;en soucier, d&rsquo;autres s&eacute;lectionnent les sorts les moins compromettants et les compl&egrave;tent avec les Runes ou le Galdr.</p>","niveau":0,"niveauunrequis":true},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"feLeZcbqgHkVzfJP":3},"flags":{},"_id":"mIBiTKqfqiiepeyz"}

View File

@ -1 +0,0 @@
MANIFEST-000036

View File

@ -1,15 +0,0 @@
2025/05/01-23:39:32.583707 7fe00b7fe6c0 Recovering log #34
2025/05/01-23:39:32.593612 7fe00b7fe6c0 Delete type=0 #34
2025/05/01-23:39:32.593661 7fe00b7fe6c0 Delete type=3 #32
2025/05/02-00:00:01.557564 7fe0093ff6c0 Level-0 table #39: started
2025/05/02-00:00:01.560815 7fe0093ff6c0 Level-0 table #39: 1604 bytes OK
2025/05/02-00:00:01.567160 7fe0093ff6c0 Delete type=0 #37
2025/05/02-00:00:01.576997 7fe0093ff6c0 Manual compaction at level-0 from '!items!RAhkadJOfEnVBLpy' @ 72057594037927935 : 1 .. '!items!mIBiTKqfqiiepeyz' @ 0 : 0; will stop at (end)
2025/05/02-00:00:01.598577 7fe0093ff6c0 Manual compaction at level-1 from '!items!RAhkadJOfEnVBLpy' @ 72057594037927935 : 1 .. '!items!mIBiTKqfqiiepeyz' @ 0 : 0; will stop at '!items!mIBiTKqfqiiepeyz' @ 9 : 1
2025/05/02-00:00:01.598591 7fe0093ff6c0 Compacting 1@1 + 1@2 files
2025/05/02-00:00:01.601754 7fe0093ff6c0 Generated table #40@1: 3 keys, 1604 bytes
2025/05/02-00:00:01.601786 7fe0093ff6c0 Compacted 1@1 + 1@2 files => 1604 bytes
2025/05/02-00:00:01.608938 7fe0093ff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2025/05/02-00:00:01.609061 7fe0093ff6c0 Delete type=2 #5
2025/05/02-00:00:01.609167 7fe0093ff6c0 Delete type=2 #39
2025/05/02-00:00:01.618745 7fe0093ff6c0 Manual compaction at level-1 from '!items!mIBiTKqfqiiepeyz' @ 9 : 1 .. '!items!mIBiTKqfqiiepeyz' @ 0 : 0; will stop at (end)

View File

@ -1,8 +0,0 @@
2024/05/02-09:20:30.774893 7f844cc006c0 Recovering log #30
2024/05/02-09:20:30.785238 7f844cc006c0 Delete type=3 #28
2024/05/02-09:20:30.785346 7f844cc006c0 Delete type=0 #30
2024/05/02-09:24:00.874955 7f844ae006c0 Level-0 table #35: started
2024/05/02-09:24:00.875023 7f844ae006c0 Level-0 table #35: 0 bytes OK
2024/05/02-09:24:00.882281 7f844ae006c0 Delete type=0 #33
2024/05/02-09:24:00.896915 7f844ae006c0 Manual compaction at level-0 from '!items!RAhkadJOfEnVBLpy' @ 72057594037927935 : 1 .. '!items!mIBiTKqfqiiepeyz' @ 0 : 0; will stop at (end)
2024/05/02-09:24:00.903558 7f844ae006c0 Manual compaction at level-1 from '!items!RAhkadJOfEnVBLpy' @ 72057594037927935 : 1 .. '!items!mIBiTKqfqiiepeyz' @ 0 : 0; will stop at (end)

View File

@ -1 +0,0 @@
MANIFEST-000036

View File

@ -1,15 +0,0 @@
2025/05/01-23:39:32.570549 7fe00a7fc6c0 Recovering log #34
2025/05/01-23:39:32.580330 7fe00a7fc6c0 Delete type=0 #34
2025/05/01-23:39:32.580396 7fe00a7fc6c0 Delete type=3 #32
2025/05/02-00:00:01.547194 7fe0093ff6c0 Level-0 table #39: started
2025/05/02-00:00:01.550461 7fe0093ff6c0 Level-0 table #39: 3895 bytes OK
2025/05/02-00:00:01.557446 7fe0093ff6c0 Delete type=0 #37
2025/05/02-00:00:01.576988 7fe0093ff6c0 Manual compaction at level-0 from '!items!6IqVsJsYPrbxUJZX' @ 72057594037927935 : 1 .. '!items!mJSWXawEGARKlNja' @ 0 : 0; will stop at (end)
2025/05/02-00:00:01.577021 7fe0093ff6c0 Manual compaction at level-1 from '!items!6IqVsJsYPrbxUJZX' @ 72057594037927935 : 1 .. '!items!mJSWXawEGARKlNja' @ 0 : 0; will stop at '!items!mJSWXawEGARKlNja' @ 24 : 1
2025/05/02-00:00:01.577027 7fe0093ff6c0 Compacting 1@1 + 1@2 files
2025/05/02-00:00:01.580395 7fe0093ff6c0 Generated table #40@1: 8 keys, 3895 bytes
2025/05/02-00:00:01.580431 7fe0093ff6c0 Compacted 1@1 + 1@2 files => 3895 bytes
2025/05/02-00:00:01.586914 7fe0093ff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2025/05/02-00:00:01.587137 7fe0093ff6c0 Delete type=2 #5
2025/05/02-00:00:01.587348 7fe0093ff6c0 Delete type=2 #39
2025/05/02-00:00:01.618727 7fe0093ff6c0 Manual compaction at level-1 from '!items!mJSWXawEGARKlNja' @ 24 : 1 .. '!items!mJSWXawEGARKlNja' @ 0 : 0; will stop at (end)

View File

@ -1,8 +0,0 @@
2024/05/02-09:20:30.758816 7f844c2006c0 Recovering log #30
2024/05/02-09:20:30.770889 7f844c2006c0 Delete type=3 #28
2024/05/02-09:20:30.770994 7f844c2006c0 Delete type=0 #30
2024/05/02-09:24:00.858366 7f844ae006c0 Level-0 table #35: started
2024/05/02-09:24:00.858395 7f844ae006c0 Level-0 table #35: 0 bytes OK
2024/05/02-09:24:00.864599 7f844ae006c0 Delete type=0 #33
2024/05/02-09:24:00.864804 7f844ae006c0 Manual compaction at level-0 from '!items!6IqVsJsYPrbxUJZX' @ 72057594037927935 : 1 .. '!items!mJSWXawEGARKlNja' @ 0 : 0; will stop at (end)
2024/05/02-09:24:00.874924 7f844ae006c0 Manual compaction at level-1 from '!items!6IqVsJsYPrbxUJZX' @ 72057594037927935 : 1 .. '!items!mJSWXawEGARKlNja' @ 0 : 0; will stop at (end)

View File

Binary file not shown.

View File

@ -1 +0,0 @@
MANIFEST-000036

View File

View File

@ -1,15 +0,0 @@
2025/05/01-23:39:32.608867 7fe009ffb6c0 Recovering log #34
2025/05/01-23:39:32.619070 7fe009ffb6c0 Delete type=0 #34
2025/05/01-23:39:32.619205 7fe009ffb6c0 Delete type=3 #32
2025/05/02-00:00:01.618869 7fe0093ff6c0 Level-0 table #39: started
2025/05/02-00:00:01.622268 7fe0093ff6c0 Level-0 table #39: 8204 bytes OK
2025/05/02-00:00:01.629416 7fe0093ff6c0 Delete type=0 #37
2025/05/02-00:00:01.659464 7fe0093ff6c0 Manual compaction at level-0 from '!items!1EVz9C1fDUBafPHj' @ 72057594037927935 : 1 .. '!items!wnIXKyfqCWT0r4iT' @ 0 : 0; will stop at (end)
2025/05/02-00:00:01.659511 7fe0093ff6c0 Manual compaction at level-1 from '!items!1EVz9C1fDUBafPHj' @ 72057594037927935 : 1 .. '!items!wnIXKyfqCWT0r4iT' @ 0 : 0; will stop at '!items!wnIXKyfqCWT0r4iT' @ 90 : 1
2025/05/02-00:00:01.659517 7fe0093ff6c0 Compacting 1@1 + 1@2 files
2025/05/02-00:00:01.663128 7fe0093ff6c0 Generated table #40@1: 30 keys, 8204 bytes
2025/05/02-00:00:01.663159 7fe0093ff6c0 Compacted 1@1 + 1@2 files => 8204 bytes
2025/05/02-00:00:01.669772 7fe0093ff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2025/05/02-00:00:01.669933 7fe0093ff6c0 Delete type=2 #5
2025/05/02-00:00:01.670115 7fe0093ff6c0 Delete type=2 #39
2025/05/02-00:00:01.701398 7fe0093ff6c0 Manual compaction at level-1 from '!items!wnIXKyfqCWT0r4iT' @ 90 : 1 .. '!items!wnIXKyfqCWT0r4iT' @ 0 : 0; will stop at (end)

View File

@ -1,8 +0,0 @@
2024/05/02-09:20:30.806675 7f844cc006c0 Recovering log #30
2024/05/02-09:20:30.817229 7f844cc006c0 Delete type=3 #28
2024/05/02-09:20:30.817342 7f844cc006c0 Delete type=0 #30
2024/05/02-09:24:00.889174 7f844ae006c0 Level-0 table #35: started
2024/05/02-09:24:00.889211 7f844ae006c0 Level-0 table #35: 0 bytes OK
2024/05/02-09:24:00.896752 7f844ae006c0 Delete type=0 #33
2024/05/02-09:24:00.903544 7f844ae006c0 Manual compaction at level-0 from '!items!1EVz9C1fDUBafPHj' @ 72057594037927935 : 1 .. '!items!wnIXKyfqCWT0r4iT' @ 0 : 0; will stop at (end)
2024/05/02-09:24:00.903586 7f844ae006c0 Manual compaction at level-1 from '!items!1EVz9C1fDUBafPHj' @ 72057594037927935 : 1 .. '!items!wnIXKyfqCWT0r4iT' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -72,7 +72,7 @@
{"name":"#[CF_tempEntity]","type":"competence","img":"icons/svg/item-bag.svg","data":{"isspecialisation":false,"categorie":"","specialisation":"","description":0,"niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"cf":{"id":"temp_3mky1xz4s5a","folderPath":[],"color":"#000000","fontColor":"#FFFFFF","name":"Matériel de voyage","children":[],"icon":""}},"_id":"YkBXKz3eMPwnZzdy"}
{"_id":"Yzp6xG4TvdqekMbS","name":"Tabouret","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":1,"quantite":0,"description":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.BDhealihoWBT314b"},"cf":{"id":"temp_5sjuseujvx","color":"#000000"}}}
{"_id":"aTXpAI60TC9iPNW2","name":"Noix (x12)","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":1,"quantite":0,"description":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.BDhealihoWBT314b"},"cf":{"id":"temp_gnm0v0yf2u6","color":"#000000"}}}
{"_id":"b7KxnGQYSch0R3LR","name":"Oie, la pièce","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":1,"quantite":0,"description":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.BDhealihoWBT314b"},"cf":{"id":"temp_gnm0v0yf2u6","color":"#000000"}}}
{"_id":"b7KxnGQYSch0R3LR","name":"Oie, la pièce (Copy)","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":1,"quantite":0,"description":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.BDhealihoWBT314b"},"cf":{"id":"temp_gnm0v0yf2u6","color":"#000000"}}}
{"_id":"bBYQWKsP2obNVY3g","name":"Toque de luxe","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":30,"quantite":0,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"cf":{"id":"temp_adwio7cb4q5","color":"#000000"}}}
{"_id":"bVyPX9mly7ZKGmpi","name":"Lanterne","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":12,"quantite":0,"description":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.BDhealihoWBT314b"},"cf":{"id":"temp_3mky1xz4s5a","color":"#000000"}}}
{"name":"#[CF_tempEntity]","type":"competence","img":"icons/svg/item-bag.svg","data":{"isspecialisation":false,"categorie":"","specialisation":"","description":0,"niveau":0,"niveauunrequis":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"cf":{"id":"temp_xbkwrebbs7","folderPath":[],"color":"#000000","fontColor":"#FFFFFF","name":"Animaux","children":[],"icon":""}},"_id":"bc4G5zHvyo85bTY4"}
@ -122,7 +122,7 @@
{"_id":"tj5GitQXME3twMZA","name":"Ferme","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":100,"quantite":0,"description":"<p>Valeur: 100 &agrave; 500 onces d'argent</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.BDhealihoWBT314b"},"cf":{"id":"temp_4l2xub2vumf","color":"#000000"}}}
{"_id":"u6x3iKoK1dFVSkmR","name":"Assiettes en terre cuite (x6)","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":1,"quantite":0,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.kq81bAOPnRmqKfcz"},"cf":{"id":"temp_w8bf2nzl2s8","color":"#000000"}}}
{"_id":"uhn3xaweehPUZ50g","name":"Lait de vache, le litre","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":1,"quantite":0,"description":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.BDhealihoWBT314b"},"cf":{"id":"temp_oahtnyiva7l","color":"#000000"}}}
{"_id":"unHM416bSKzKQnEz","name":"Maison longue","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":500,"quantite":0,"description":"<p>Valeur: 500 &agrave; 10 000 onces d'argent</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.BDhealihoWBT314b"},"cf":{"id":"temp_4l2xub2vumf","color":"#000000"}}}
{"_id":"unHM416bSKzKQnEz","name":"Maison longue","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":50,"quantite":0,"description":"<p>Valeur: 50 &agrave; 10 000 onces d'argent</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.BDhealihoWBT314b"},"cf":{"id":"temp_4l2xub2vumf","color":"#000000"}}}
{"_id":"v2yQffSyG2Hv3PaX","name":"Poulet (x2)","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":1,"quantite":0,"description":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.BDhealihoWBT314b"},"cf":{"id":"temp_xbkwrebbs7","color":"#000000"}}}
{"_id":"vLedwJH0DQKCaXfx","name":"Pantalon de cuir de luxe","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":70,"quantite":0,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"cf":{"id":"temp_adwio7cb4q5","color":"#000000"}}}
{"_id":"vdDSkS9Y3VEkoMtd","name":"Grand sac","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":6,"quantite":0,"description":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.BDhealihoWBT314b"},"cf":{"id":"temp_3mky1xz4s5a","color":"#000000"}}}
@ -131,7 +131,7 @@
{"_id":"wGNKXkawnjjKSMhL","name":"Chemise ordinaire","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":8,"quantite":0,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"cf":{"id":"temp_adwio7cb4q5","color":"#000000"}}}
{"_id":"wIPiowsoKpN6O2i4","name":"Pièce de chanvre (5 mètres)","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":2,"quantite":0,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.K7VwQEbx4MfPwHnD"},"cf":{"id":"temp_t9iszt166h","color":"#000000"}}}
{"_id":"wWj2mtvC00EEqw0T","name":"Pièce de laine (5 mètres)","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":5,"quantite":0,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"cf":{"id":"temp_t9iszt166h","color":"#000000"}}}
{"_id":"xId7XdABXbPFlMZu","name":"Mouton, au kilo","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":1,"quantite":0,"description":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.BDhealihoWBT314b"},"cf":{"id":"temp_gnm0v0yf2u6","color":"#000000"}}}
{"_id":"xId7XdABXbPFlMZu","name":"Mouton, au kilo","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":3,"quantite":0,"description":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.BDhealihoWBT314b"},"cf":{"id":"temp_gnm0v0yf2u6","color":"#000000"}}}
{"_id":"xSuvtLVKnW7JX9pe","name":"Corde, 10m","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":1,"quantite":0,"description":null},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.BDhealihoWBT314b"},"cf":{"id":"temp_3mky1xz4s5a","color":"#000000"}}}
{"_id":"xqd7mgmosQP917Ie","name":"Ceinture de mauvaise qualité","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":5,"quantite":0,"description":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"cf":{"id":"temp_adwio7cb4q5","color":"#000000"}}}
{"_id":"xru0AoOx7lNrv85V","name":"Anneau","type":"equipement","img":"icons/svg/item-bag.svg","data":{"equipe":false,"enc":0,"valeur":5,"quantite":0,"description":"<p>Valeur 5 &agrave; 100</p>"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"rbua2TFRS5ZZzTJp":3},"flags":{"core":{"sourceId":"Item.BDhealihoWBT314b"},"cf":{"id":"temp_2dc832wxenw","color":"#000000"}}}

Binary file not shown.

View File

@ -1 +0,0 @@
MANIFEST-000036

View File

View File

@ -1,15 +0,0 @@
2025/05/01-23:39:32.814767 7fe00a7fc6c0 Recovering log #34
2025/05/01-23:39:32.824419 7fe00a7fc6c0 Delete type=0 #34
2025/05/01-23:39:32.824475 7fe00a7fc6c0 Delete type=3 #32
2025/05/02-00:00:01.899378 7fe0093ff6c0 Level-0 table #39: started
2025/05/02-00:00:01.903709 7fe0093ff6c0 Level-0 table #39: 22361 bytes OK
2025/05/02-00:00:01.910320 7fe0093ff6c0 Delete type=0 #37
2025/05/02-00:00:01.910744 7fe0093ff6c0 Manual compaction at level-0 from '!items!0tELaPFZgkeTUeVn' @ 72057594037927935 : 1 .. '!items!zC0kHoqZ9lkQFgI6' @ 0 : 0; will stop at (end)
2025/05/02-00:00:01.931428 7fe0093ff6c0 Manual compaction at level-1 from '!items!0tELaPFZgkeTUeVn' @ 72057594037927935 : 1 .. '!items!zC0kHoqZ9lkQFgI6' @ 0 : 0; will stop at '!items!zC0kHoqZ9lkQFgI6' @ 423 : 1
2025/05/02-00:00:01.931435 7fe0093ff6c0 Compacting 1@1 + 1@2 files
2025/05/02-00:00:01.934954 7fe0093ff6c0 Generated table #40@1: 141 keys, 22361 bytes
2025/05/02-00:00:01.934995 7fe0093ff6c0 Compacted 1@1 + 1@2 files => 22361 bytes
2025/05/02-00:00:01.942404 7fe0093ff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2025/05/02-00:00:01.942634 7fe0093ff6c0 Delete type=2 #5
2025/05/02-00:00:01.942749 7fe0093ff6c0 Delete type=2 #39
2025/05/02-00:00:01.952311 7fe0093ff6c0 Manual compaction at level-1 from '!items!zC0kHoqZ9lkQFgI6' @ 423 : 1 .. '!items!zC0kHoqZ9lkQFgI6' @ 0 : 0; will stop at (end)

View File

@ -1,8 +0,0 @@
2024/05/02-09:20:31.057575 7f844c2006c0 Recovering log #30
2024/05/02-09:20:31.068276 7f844c2006c0 Delete type=3 #28
2024/05/02-09:20:31.068367 7f844c2006c0 Delete type=0 #30
2024/05/02-09:24:00.993561 7f844ae006c0 Level-0 table #35: started
2024/05/02-09:24:00.993597 7f844ae006c0 Level-0 table #35: 0 bytes OK
2024/05/02-09:24:01.000558 7f844ae006c0 Delete type=0 #33
2024/05/02-09:24:01.000809 7f844ae006c0 Manual compaction at level-0 from '!items!0tELaPFZgkeTUeVn' @ 72057594037927935 : 1 .. '!items!zC0kHoqZ9lkQFgI6' @ 0 : 0; will stop at (end)
2024/05/02-09:24:01.000836 7f844ae006c0 Manual compaction at level-1 from '!items!0tELaPFZgkeTUeVn' @ 72057594037927935 : 1 .. '!items!zC0kHoqZ9lkQFgI6' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
MANIFEST-000036

View File

View File

@ -1,15 +0,0 @@
2025/05/01-23:39:32.621680 7fe00a7fc6c0 Recovering log #34
2025/05/01-23:39:32.632357 7fe00a7fc6c0 Delete type=0 #34
2025/05/01-23:39:32.632424 7fe00a7fc6c0 Delete type=3 #32
2025/05/02-00:00:01.639368 7fe0093ff6c0 Level-0 table #39: started
2025/05/02-00:00:01.642654 7fe0093ff6c0 Level-0 table #39: 7080 bytes OK
2025/05/02-00:00:01.649609 7fe0093ff6c0 Delete type=0 #37
2025/05/02-00:00:01.659488 7fe0093ff6c0 Manual compaction at level-0 from '!items!0EoL2kcGdYiYS8lY' @ 72057594037927935 : 1 .. '!items!xf1RAsIzBXQgbLq2' @ 0 : 0; will stop at (end)
2025/05/02-00:00:01.680340 7fe0093ff6c0 Manual compaction at level-1 from '!items!0EoL2kcGdYiYS8lY' @ 72057594037927935 : 1 .. '!items!xf1RAsIzBXQgbLq2' @ 0 : 0; will stop at '!items!xf1RAsIzBXQgbLq2' @ 78 : 1
2025/05/02-00:00:01.680352 7fe0093ff6c0 Compacting 1@1 + 1@2 files
2025/05/02-00:00:01.683895 7fe0093ff6c0 Generated table #40@1: 26 keys, 7080 bytes
2025/05/02-00:00:01.683925 7fe0093ff6c0 Compacted 1@1 + 1@2 files => 7080 bytes
2025/05/02-00:00:01.690005 7fe0093ff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2025/05/02-00:00:01.690119 7fe0093ff6c0 Delete type=2 #5
2025/05/02-00:00:01.690251 7fe0093ff6c0 Delete type=2 #39
2025/05/02-00:00:01.701424 7fe0093ff6c0 Manual compaction at level-1 from '!items!xf1RAsIzBXQgbLq2' @ 78 : 1 .. '!items!xf1RAsIzBXQgbLq2' @ 0 : 0; will stop at (end)

View File

@ -1,8 +0,0 @@
2024/05/02-09:20:30.821401 7f844c2006c0 Recovering log #30
2024/05/02-09:20:30.832886 7f844c2006c0 Delete type=3 #28
2024/05/02-09:20:30.832985 7f844c2006c0 Delete type=0 #30
2024/05/02-09:24:00.896933 7f844ae006c0 Level-0 table #35: started
2024/05/02-09:24:00.896967 7f844ae006c0 Level-0 table #35: 0 bytes OK
2024/05/02-09:24:00.903398 7f844ae006c0 Delete type=0 #33
2024/05/02-09:24:00.903573 7f844ae006c0 Manual compaction at level-0 from '!items!0EoL2kcGdYiYS8lY' @ 72057594037927935 : 1 .. '!items!xf1RAsIzBXQgbLq2' @ 0 : 0; will stop at (end)
2024/05/02-09:24:00.903612 7f844ae006c0 Manual compaction at level-1 from '!items!0EoL2kcGdYiYS8lY' @ 72057594037927935 : 1 .. '!items!xf1RAsIzBXQgbLq2' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
MANIFEST-000036

View File

@ -1,15 +0,0 @@
2025/05/01-23:39:32.801529 7fe009ffb6c0 Recovering log #34
2025/05/01-23:39:32.811167 7fe009ffb6c0 Delete type=0 #34
2025/05/01-23:39:32.811253 7fe009ffb6c0 Delete type=3 #32
2025/05/02-00:00:01.867646 7fe0093ff6c0 Level-0 table #39: started
2025/05/02-00:00:01.872073 7fe0093ff6c0 Level-0 table #39: 1937 bytes OK
2025/05/02-00:00:01.879149 7fe0093ff6c0 Delete type=0 #37
2025/05/02-00:00:01.910677 7fe0093ff6c0 Manual compaction at level-0 from '!items!7VeQIQHxvw233Jzt' @ 72057594037927935 : 1 .. '!items!xw2gPhCxDVpkJnxL' @ 0 : 0; will stop at (end)
2025/05/02-00:00:01.910767 7fe0093ff6c0 Manual compaction at level-1 from '!items!7VeQIQHxvw233Jzt' @ 72057594037927935 : 1 .. '!items!xw2gPhCxDVpkJnxL' @ 0 : 0; will stop at '!items!xw2gPhCxDVpkJnxL' @ 15 : 1
2025/05/02-00:00:01.910774 7fe0093ff6c0 Compacting 1@1 + 1@2 files
2025/05/02-00:00:01.914057 7fe0093ff6c0 Generated table #40@1: 5 keys, 1937 bytes
2025/05/02-00:00:01.914102 7fe0093ff6c0 Compacted 1@1 + 1@2 files => 1937 bytes
2025/05/02-00:00:01.920813 7fe0093ff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2025/05/02-00:00:01.920988 7fe0093ff6c0 Delete type=2 #5
2025/05/02-00:00:01.921112 7fe0093ff6c0 Delete type=2 #39
2025/05/02-00:00:01.952290 7fe0093ff6c0 Manual compaction at level-1 from '!items!xw2gPhCxDVpkJnxL' @ 15 : 1 .. '!items!xw2gPhCxDVpkJnxL' @ 0 : 0; will stop at (end)

View File

@ -1,8 +0,0 @@
2024/05/02-09:20:31.042811 7f844cc006c0 Recovering log #30
2024/05/02-09:20:31.054523 7f844cc006c0 Delete type=3 #28
2024/05/02-09:20:31.054615 7f844cc006c0 Delete type=0 #30
2024/05/02-09:24:00.986638 7f844ae006c0 Level-0 table #35: started
2024/05/02-09:24:00.986739 7f844ae006c0 Level-0 table #35: 0 bytes OK
2024/05/02-09:24:00.993409 7f844ae006c0 Delete type=0 #33
2024/05/02-09:24:01.000786 7f844ae006c0 Manual compaction at level-0 from '!items!7VeQIQHxvw233Jzt' @ 72057594037927935 : 1 .. '!items!xw2gPhCxDVpkJnxL' @ 0 : 0; will stop at (end)
2024/05/02-09:24:01.000868 7f844ae006c0 Manual compaction at level-1 from '!items!7VeQIQHxvw233Jzt' @ 72057594037927935 : 1 .. '!items!xw2gPhCxDVpkJnxL' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
MANIFEST-000036

View File

@ -1,15 +0,0 @@
2025/05/01-23:39:32.788688 7fe00b7fe6c0 Recovering log #34
2025/05/01-23:39:32.798630 7fe00b7fe6c0 Delete type=0 #34
2025/05/01-23:39:32.798720 7fe00b7fe6c0 Delete type=3 #32
2025/05/02-00:00:01.879296 7fe0093ff6c0 Level-0 table #39: started
2025/05/02-00:00:01.882491 7fe0093ff6c0 Level-0 table #39: 3029 bytes OK
2025/05/02-00:00:01.889505 7fe0093ff6c0 Delete type=0 #37
2025/05/02-00:00:01.910707 7fe0093ff6c0 Manual compaction at level-0 from '!items!89NwqZV3Qn9xWeO0' @ 72057594037927935 : 1 .. '!items!sH7HaKggOEaBVzn3' @ 0 : 0; will stop at (end)
2025/05/02-00:00:01.942824 7fe0093ff6c0 Manual compaction at level-1 from '!items!89NwqZV3Qn9xWeO0' @ 72057594037927935 : 1 .. '!items!sH7HaKggOEaBVzn3' @ 0 : 0; will stop at '!items!sH7HaKggOEaBVzn3' @ 15 : 1
2025/05/02-00:00:01.942831 7fe0093ff6c0 Compacting 1@1 + 1@2 files
2025/05/02-00:00:01.945898 7fe0093ff6c0 Generated table #40@1: 5 keys, 3029 bytes
2025/05/02-00:00:01.945923 7fe0093ff6c0 Compacted 1@1 + 1@2 files => 3029 bytes
2025/05/02-00:00:01.951946 7fe0093ff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2025/05/02-00:00:01.952072 7fe0093ff6c0 Delete type=2 #5
2025/05/02-00:00:01.952217 7fe0093ff6c0 Delete type=2 #39
2025/05/02-00:00:01.952318 7fe0093ff6c0 Manual compaction at level-1 from '!items!sH7HaKggOEaBVzn3' @ 15 : 1 .. '!items!sH7HaKggOEaBVzn3' @ 0 : 0; will stop at (end)

View File

@ -1,8 +0,0 @@
2024/05/02-09:20:31.028964 7f844c2006c0 Recovering log #30
2024/05/02-09:20:31.039429 7f844c2006c0 Delete type=3 #28
2024/05/02-09:20:31.039533 7f844c2006c0 Delete type=0 #30
2024/05/02-09:24:00.979204 7f844ae006c0 Level-0 table #35: started
2024/05/02-09:24:00.979236 7f844ae006c0 Level-0 table #35: 0 bytes OK
2024/05/02-09:24:00.986242 7f844ae006c0 Delete type=0 #33
2024/05/02-09:24:00.986432 7f844ae006c0 Manual compaction at level-0 from '!items!89NwqZV3Qn9xWeO0' @ 72057594037927935 : 1 .. '!items!sH7HaKggOEaBVzn3' @ 0 : 0; will stop at (end)
2024/05/02-09:24:00.986497 7f844ae006c0 Manual compaction at level-1 from '!items!89NwqZV3Qn9xWeO0' @ 72057594037927935 : 1 .. '!items!sH7HaKggOEaBVzn3' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -1 +0,0 @@
MANIFEST-000036

View File

@ -1,15 +0,0 @@
2025/05/01-23:39:32.775407 7fe00affd6c0 Recovering log #34
2025/05/01-23:39:32.785711 7fe00affd6c0 Delete type=0 #34
2025/05/01-23:39:32.785835 7fe00affd6c0 Delete type=3 #32
2025/05/02-00:00:01.889636 7fe0093ff6c0 Level-0 table #39: started
2025/05/02-00:00:01.893029 7fe0093ff6c0 Level-0 table #39: 1953 bytes OK
2025/05/02-00:00:01.899195 7fe0093ff6c0 Delete type=0 #37
2025/05/02-00:00:01.910727 7fe0093ff6c0 Manual compaction at level-0 from '!items!1smXvw2EcuTkytDv' @ 72057594037927935 : 1 .. '!items!yKLS6KQafucspg3R' @ 0 : 0; will stop at (end)
2025/05/02-00:00:01.921184 7fe0093ff6c0 Manual compaction at level-1 from '!items!1smXvw2EcuTkytDv' @ 72057594037927935 : 1 .. '!items!yKLS6KQafucspg3R' @ 0 : 0; will stop at '!items!yKLS6KQafucspg3R' @ 15 : 1
2025/05/02-00:00:01.921192 7fe0093ff6c0 Compacting 1@1 + 1@2 files
2025/05/02-00:00:01.925008 7fe0093ff6c0 Generated table #40@1: 5 keys, 1953 bytes
2025/05/02-00:00:01.925036 7fe0093ff6c0 Compacted 1@1 + 1@2 files => 1953 bytes
2025/05/02-00:00:01.931142 7fe0093ff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2025/05/02-00:00:01.931249 7fe0093ff6c0 Delete type=2 #5
2025/05/02-00:00:01.931354 7fe0093ff6c0 Delete type=2 #39
2025/05/02-00:00:01.952302 7fe0093ff6c0 Manual compaction at level-1 from '!items!yKLS6KQafucspg3R' @ 15 : 1 .. '!items!yKLS6KQafucspg3R' @ 0 : 0; will stop at (end)

View File

@ -1,8 +0,0 @@
2024/05/02-09:20:31.014753 7f844cc006c0 Recovering log #30
2024/05/02-09:20:31.025539 7f844cc006c0 Delete type=3 #28
2024/05/02-09:20:31.025663 7f844cc006c0 Delete type=0 #30
2024/05/02-09:24:00.972587 7f844ae006c0 Level-0 table #35: started
2024/05/02-09:24:00.972622 7f844ae006c0 Level-0 table #35: 0 bytes OK
2024/05/02-09:24:00.979047 7f844ae006c0 Delete type=0 #33
2024/05/02-09:24:00.986419 7f844ae006c0 Manual compaction at level-0 from '!items!1smXvw2EcuTkytDv' @ 72057594037927935 : 1 .. '!items!yKLS6KQafucspg3R' @ 0 : 0; will stop at (end)
2024/05/02-09:24:00.986455 7f844ae006c0 Manual compaction at level-1 from '!items!1smXvw2EcuTkytDv' @ 72057594037927935 : 1 .. '!items!yKLS6KQafucspg3R' @ 0 : 0; will stop at (end)

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