Compare commits
1 Commits
v10
...
LeRatierBr
Author | SHA1 | Date | |
---|---|---|---|
b58995014c |
@ -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
|
||||
|
11
README.md
11
README.md
@ -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.
|
||||
|
@ -11,11 +11,11 @@ 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,8 +23,8 @@ export class YggdrasillActorSheet extends ActorSheet {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async getData() {
|
||||
const objectData = foundry.utils.duplicate(this.object)
|
||||
getData() {
|
||||
const objectData = YggdrasillUtility.data(this.object);
|
||||
|
||||
let formData = {
|
||||
title: this.title,
|
||||
@ -34,7 +34,7 @@ export class YggdrasillActorSheet extends 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 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 TextEditor.enrichHTML(this.object.system.tiragesrunes, {async: true}),
|
||||
description: await TextEditor.enrichHTML(this.object.system.description, {async: true}),
|
||||
notes: await TextEditor.enrichHTML(this.object.system.notes, {async: true}),
|
||||
gmnotes: await TextEditor.enrichHTML(this.object.system.biodata.gmnotes, {async: true}),
|
||||
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);
|
||||
@ -91,7 +83,7 @@ export class YggdrasillActorSheet extends ActorSheet {
|
||||
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
|
||||
@ -120,12 +112,12 @@ updateDP( data ) {
|
||||
|
||||
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 => {
|
||||
@ -184,7 +176,7 @@ updateDP( data ) {
|
||||
});
|
||||
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) => {
|
||||
@ -198,7 +190,7 @@ updateDP( data ) {
|
||||
});
|
||||
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 => {
|
||||
|
@ -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,16 +716,10 @@ export class YggdrasillActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
getEncTotal( ) {
|
||||
let encTotal = 0;
|
||||
for( let item of this.items) {
|
||||
for( let item of this.data.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);
|
||||
|| item.type == "armedist" || item.type == "armure" || item.type == "monnaie") {
|
||||
encTotal += item.data.data.enc;
|
||||
}
|
||||
}
|
||||
return encTotal;
|
||||
@ -763,40 +728,30 @@ export class YggdrasillActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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" }
|
||||
]
|
||||
|
||||
|
||||
}
|
@ -11,7 +11,7 @@ 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,8 +23,8 @@ export class YggdrasillFigurantSheet extends ActorSheet {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async getData() {
|
||||
const objectData = foundry.utils.duplicate(this.object)
|
||||
getData() {
|
||||
const objectData = YggdrasillUtility.data(this.object);
|
||||
|
||||
let formData = {
|
||||
title: this.title,
|
||||
@ -34,21 +34,18 @@ export class YggdrasillFigurantSheet extends 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),
|
||||
optionsAttr: new Array(21).fill('option'),
|
||||
optionsBase: YggdrasillUtility.createDirectOptionList(0, 20),
|
||||
description: await TextEditor.enrichHTML(this.object.system.description, {async: true}),
|
||||
notes: await TextEditor.enrichHTML(this.object.system.notes, {async: true}),
|
||||
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 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
|
||||
@ -96,7 +93,7 @@ export class YggdrasillFigurantSheet extends ActorSheet {
|
||||
});
|
||||
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 => {
|
||||
|
@ -8,7 +8,7 @@ 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,
|
||||
@ -43,7 +43,7 @@ export class YggdrasillItemSheet extends ItemSheet {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async getData() {
|
||||
const objectData = foundry.utils.duplicate(this.object);
|
||||
const objectData = YggdrasillUtility.data(this.object);
|
||||
|
||||
let formData = {
|
||||
title: this.title,
|
||||
@ -53,15 +53,13 @@ export class YggdrasillItemSheet extends 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 TextEditor.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;
|
||||
}
|
||||
@ -77,13 +75,13 @@ export class YggdrasillItemSheet extends ItemSheet {
|
||||
// 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));
|
||||
});
|
||||
|
||||
}
|
||||
|
@ -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 */
|
||||
@ -36,8 +34,6 @@ Hooks.once("init", async function () {
|
||||
decimals: 0
|
||||
};
|
||||
|
||||
game.system.config = YGGDRASILL_CONFIG
|
||||
|
||||
/* -------------------------------------------- */
|
||||
game.socket.on("system.fvtt-yggdrasill", data => {
|
||||
YggdrasillUtility.onSocketMesssage(data);
|
||||
@ -71,10 +67,7 @@ function welcomeMessage() {
|
||||
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>
|
||||
` });
|
||||
}
|
||||
|
||||
@ -91,9 +84,7 @@ Hooks.once("ready", function () {
|
||||
user: game.user._id
|
||||
});
|
||||
}
|
||||
|
||||
ClassCounter.registerUsageCount()
|
||||
welcomeMessage()
|
||||
welcomeMessage();
|
||||
});
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
@ -73,12 +73,12 @@ export class YggdrasillRoll extends Dialog {
|
||||
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;
|
||||
}
|
||||
@ -91,32 +91,27 @@ export class YggdrasillRoll extends Dialog {
|
||||
if ( this.rollData.supportRune == "peau") {
|
||||
support = 3;
|
||||
this.rollData.echelleDuree = "Actions";
|
||||
this.rollData.echelleDureeVie = "Heures"
|
||||
}
|
||||
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" );
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* -------------------------------------------- */
|
||||
//import { YggdrasillCombat } from "./yggdrasill-combat.js";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
const dureeGaldrText = { "1d5a": "Actions", "1d10t": "Tours", "1d10m": "Minutes", "1d10h": "Heures", "1d5j": "Jours"};
|
||||
@ -12,11 +13,26 @@ export class YggdrasillUtility {
|
||||
|
||||
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 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 = [];
|
||||
@ -25,14 +41,7 @@ export class YggdrasillUtility {
|
||||
}
|
||||
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,13 +59,22 @@ export class YggdrasillUtility {
|
||||
}
|
||||
return options;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static buildListOptions(min, max) {
|
||||
static buildSROptions( ) {
|
||||
let options = ""
|
||||
for (let i = min; i <= max; i++) {
|
||||
options += `<option value="${i}">${i}</option>`
|
||||
}
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -80,34 +98,6 @@ 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
|
||||
@ -118,39 +108,30 @@ export class YggdrasillUtility {
|
||||
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);
|
||||
}
|
||||
rollData.srFinal = rollData.sr;
|
||||
if ( rollData.srFinal > 0 ) {
|
||||
isCritical = rollData.finalTotal >= rollData.srFinal*2;
|
||||
isSuccess = rollData.finalTotal >= rollData.srFinal;
|
||||
marge = rollData.finalTotal - rollData.srFinal;
|
||||
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( );
|
||||
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;
|
||||
}
|
||||
@ -160,17 +141,19 @@ 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 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;
|
||||
@ -182,18 +165,18 @@ export class YggdrasillUtility {
|
||||
|
||||
// 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 && 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
|
||||
@ -201,60 +184,40 @@ export class YggdrasillUtility {
|
||||
}
|
||||
|
||||
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;
|
||||
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++;
|
||||
let nbOnes = myRoll.dice[0].results.filter( dice => dice.result == 1);
|
||||
isFailure = nbOnes.length >= 3;
|
||||
}
|
||||
isFailure = nbOnes >= 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
|
||||
@ -263,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 {
|
||||
@ -282,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) {
|
||||
@ -306,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);
|
||||
|
@ -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
|
||||
|
@ -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èle le plus fréquent comporte un nasal et des « lunettes » qui protègent les yeux. Sur une base de bol en métal, des lamelles de renforts sont rivetées afin d’assurer la rigidité de l’ensemble. L’intérieur est doublé de cuir et de tissu afin d’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ées et cousues sur la version précédente. La poitrine, le ventre, les omoplates et les coudes sont particulièrement renforcés. Des pièces semi-rigides, bombées, enserrent parfois les é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’agit d’un grand morceau de peau encerclant les épaules et le cou. En général, cette fourrure est fixée sur une cape. En plus de la protection qu’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 épaisse et doublée de tissu. Des pièces de métal, des rivets plats en cuivre, en bronze ou en fer apportent une protection supplémentaire aux zones les plus exposé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ègent l’avant-bras, du dessus de la main jusqu’au coude. Souvent gravés de motifs décoratifs, ils se composent de lamelles de cuir rigidifiées et nouées à l’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ées autour des cuisses ou des mollets, elles protègent le combattant des coups visant ses jambes. Ici aussi, les artisans essaient souvent d’orner ces pièces d’armure de décorations ciselées dans la matiè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’agit autant d’un vêtement courant que d’une armure. La veste recouvre le torse, le ventre et les hanches. Certaines possèdent des manches, courtes ou longues. Le cuir souple et fin ne restreint guère la liberté 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ée de centaines d’anneaux de fer rivetés, la cotte de mailles protège les mêmes parties du corps qu’une veste. Elle ne descend jamais sur les jambes car cela restreint trop la mobilité des combattants. Ceux-ci enfilent dessous une chemise molletonné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"}
|
||||
|
Binary file not shown.
@ -1 +0,0 @@
|
||||
MANIFEST-000032
|
@ -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)
|
@ -1,8 +0,0 @@
|
||||
2024/04/30-23:29:38.701535 7fdae60006c0 Recovering log #26
|
||||
2024/04/30-23:29:38.712717 7fdae60006c0 Delete type=3 #24
|
||||
2024/04/30-23:29:38.712835 7fdae60006c0 Delete type=0 #26
|
||||
2024/05/01-09:07:55.263638 7fdadfe006c0 Level-0 table #31: started
|
||||
2024/05/01-09:07:55.263695 7fdadfe006c0 Level-0 table #31: 0 bytes OK
|
||||
2024/05/01-09:07:55.270095 7fdadfe006c0 Delete type=0 #29
|
||||
2024/05/01-09:07:55.278160 7fdadfe006c0 Manual compaction at level-0 from '!items!3VBHojfjdD504ibv' @ 72057594037927935 : 1 .. '!items!x3aMYeKa73GxJ1Ge' @ 0 : 0; will stop at (end)
|
||||
2024/05/01-09:07:55.278217 7fdadfe006c0 Manual compaction at level-1 from '!items!3VBHojfjdD504ibv' @ 72057594037927935 : 1 .. '!items!x3aMYeKa73GxJ1Ge' @ 0 : 0; will stop at (end)
|
Binary file not shown.
@ -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ègent l’avant-bras, du dessus de la main jusqu’au coude. Souvent gravés de motifs décoratifs, ils se composent de lamelles de cuir rigidifiées et nouées à l’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ègent l’avant-bras, du dessus de la main jusqu’au coude. Souvent gravés de motifs décoratifs, ils se composent de lamelles de cuir rigidifiées et nouées à l’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ées et cousues sur la version précédente. La poitrine, le ventre, les omoplates et les coudes sont particulièrement renforcés. Des pièces semi-rigides, bombées, enserrent parfois les é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’agit autant d’un vêtement courant que d’une armure. La veste recouvre le torse, le ventre et les hanches. Certaines possèdent des manches, courtes ou longues. Le cuir souple et fin ne restreint guère la liberté 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 épaisse et doublée de tissu. Des pièces de métal, des rivets plats en cuivre, en bronze ou en fer apportent une protection supplémentaire aux zones les plus exposé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’agit d’un grand morceau de peau encerclant les épaules et le cou. En général, cette fourrure est fixée sur une cape. En plus de la protection qu’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ées autour des cuisses ou des mollets, elles protègent le combattant des coups visant ses jambes. Ici aussi, les artisans essaient souvent d’orner ces pièces d’armure de décorations ciselées dans la matiè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èle le plus fréquent comporte un nasal et des « lunettes » qui protègent les yeux. Sur une base de bol en métal, des lamelles de renforts sont rivetées afin d’assurer la rigidité de l’ensemble. L’intérieur est doublé de cuir et de tissu afin d’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’agit d’un grand morceau de peau encerclant les épaules et le cou. En général, cette fourrure est fixée sur une cape. En plus de la protection qu’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ées autour des cuisses ou des mollets, elles protègent le combattant des coups visant ses jambes. Ici aussi, les artisans essaient souvent d’orner ces pièces d’armure de décorations ciselées dans la matiè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èle le plus fréquent comporte un nasal et des « lunettes » qui protègent les yeux. Sur une base de bol en métal, des lamelles de renforts sont rivetées afin d’assurer la rigidité de l’ensemble. L’intérieur est doublé de cuir et de tissu afin d’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ée de centaines d’anneaux de fer rivetés, la cotte de mailles protège les mêmes parties du corps qu’une veste. Elle ne descend jamais sur les jambes car cela restreint trop la mobilité des combattants. Ceux-ci enfilent dessous une chemise molletonné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.
@ -1 +0,0 @@
|
||||
MANIFEST-000032
|
@ -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)
|
@ -1,8 +0,0 @@
|
||||
2024/04/30-23:29:38.716559 7fdae56006c0 Recovering log #26
|
||||
2024/04/30-23:29:38.727495 7fdae56006c0 Delete type=3 #24
|
||||
2024/04/30-23:29:38.727612 7fdae56006c0 Delete type=0 #26
|
||||
2024/05/01-09:07:55.278461 7fdadfe006c0 Level-0 table #31: started
|
||||
2024/05/01-09:07:55.278543 7fdadfe006c0 Level-0 table #31: 0 bytes OK
|
||||
2024/05/01-09:07:55.285552 7fdadfe006c0 Delete type=0 #29
|
||||
2024/05/01-09:07:55.307237 7fdadfe006c0 Manual compaction at level-0 from '!items!4YGPuZ813BWQaNbq' @ 72057594037927935 : 1 .. '!items!qUXBrstsh5Oo8FEx' @ 0 : 0; will stop at (end)
|
||||
2024/05/01-09:07:55.307315 7fdadfe006c0 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.
@ -1 +0,0 @@
|
||||
MANIFEST-000032
|
@ -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)
|
@ -1,8 +0,0 @@
|
||||
2024/04/30-23:29:38.686138 7fdae74006c0 Recovering log #26
|
||||
2024/04/30-23:29:38.697631 7fdae74006c0 Delete type=3 #24
|
||||
2024/04/30-23:29:38.697720 7fdae74006c0 Delete type=0 #26
|
||||
2024/05/01-09:07:55.248868 7fdadfe006c0 Level-0 table #31: started
|
||||
2024/05/01-09:07:55.248948 7fdadfe006c0 Level-0 table #31: 0 bytes OK
|
||||
2024/05/01-09:07:55.256720 7fdadfe006c0 Delete type=0 #29
|
||||
2024/05/01-09:07:55.278118 7fdadfe006c0 Manual compaction at level-0 from '!items!4rM9IvDuijsjbAhI' @ 72057594037927935 : 1 .. '!items!swTZ43FJRWkqjR75' @ 0 : 0; will stop at (end)
|
||||
2024/05/01-09:07:55.278189 7fdadfe006c0 Manual compaction at level-1 from '!items!4rM9IvDuijsjbAhI' @ 72057594037927935 : 1 .. '!items!swTZ43FJRWkqjR75' @ 0 : 0; will stop at (end)
|
Binary file not shown.
@ -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étails naturels qui reflètent le sens caché des choses. Le personnage sait repérer et interpréter ces éléments. Il s’agit en général d’y voir des conditions favorables ou défavorables pour le moment présent, mais aussi des messages d’avertissement envoyés par les dieux. Les habitants de la Scandia sont des gens très superstitieux et ils tendent à voir partout des présages significatifs. Le Meneur de Jeu pourra en profiter pour glisser quelques indices obscurs sur la situation actuelle des héros qui, dans l’idéal, révèleront leur plein sens une fois qu’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’intermédiaire de la menace verbale ou physique, le personnage peut contraindre quelqu’un à lui obéir. Une tentative d’Intimidation nécessite un test en opposition. La cible tente de résister grâce à sa Ténacité et à sa Dé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’agit de la capacité à mener une discussion vers un compromis acceptable par les deux parties. Négociation est une compétence utile aux diplomates de la Scandia, mais aussi aux marchands qui peuvent mener à bien leur marchandage lors de l’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ît les règles et sait pratiquer la plupart des jeux prisés par les habitants de la Scandia, comme les jeux de dés ou le <em>hnefatafl</em>. Cette compétence s’utilise généralement avec des tests en opposition mettant en concurrence les niveaux de maîtrise respectifs des joueurs. Mais elle permet également de tricher. Dans ce cas, les autres participants peuvent tenter un test en opposition de Perception + Vigilance. Si le tricheur est démasqué, attendezvous à des conséquences… musclé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ît les règles et sait pratiquer la plupart des jeux prisés par les habitants de la Scandia, comme les jeux de dés ou le <em>hnefatafl</em>. Cette compétence s’utilise généralement avec des tests en opposition mettant en concurrence les niveaux de maîtrise respectifs des joueurs. Mais elle permet également de tricher. Dans ce cas, les autres participants peuvent tenter un test en opposition de Perception + Vigilance. Si le tricheur est démasqué, attendezvous à des conséquences… musclé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étence regroupe l’ensemble des activité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évèlent autonomes lorsqu’il s’agit de fabriquer ou de réparer des ustensiles basiques. Un niveau Confirmé permet d’exercer son artisanat en professionnel et de gagner sa vie avec cette activité. Les meilleurs artisans bénéficient d’une renommée et d’une considération importantes. L’utilisation de cette compétence correspond en général à un test étendu. Spécialisations possibles : cordonnerie, ferronnerie, chaudronnerie, charpenterie, tissage, tannerie, corderie, taille de pierre, poterie, sellerie, etc…</p>\n<p>Il existe cependant deux spécialisations qui méritent que l’on s’y attarde, tant elles occupent une place importante dans la société des Terres du Nord.</p>\n<p><strong>Construction navale : </strong>cette spécialisation permet de mener à bien la construction des différents types de navires sillonnant les flots de la Scandia. Le personnage maîtrise aussi bien les secrets de l’architecture navale que les techniques de la charpenterie de marine, mais il sait tout autant diriger les artisans qui vont réaliser le bateau selon ses instructions. Les meilleurs dans ce domaine sont très recherchés par tous les jarls et souverains des Royaumes Nordiques.</p>\n<p><strong>Forge : </strong>l’art de la forge nécessite des connaissances spécifiques dont certaines confinent au secret transmis uniquement d’un maître à son disciple. Un personnage Novice sait fabriquer des objets usuels, simples, utiles au quotidien (clous, têtes d’outils, anneaux…) Une fois atteint le niveau Confirmé, il peut commencer à forger des pièces plus complexes (fer pour les chevaux, serrures, ferrures d’ornements, etc…) ainsi que des armes et des armures. Si certains exercent leur profession de manière itinérante, un forgeron doit tout de même disposer d’un atelier et d’outils appropriés afin de pouvoir mettre en oeuvre sa compétence. Un forgeron pratique l’un des métiers les plus respecté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 à l’aise dans les milieux naturels et sait comment y vivre en harmonie avec la nature. Cette compétence permet de trouver de quoi se nourrir et s’abreuver, un endroit pour s’abriter, de faire du feu et de se protéger des conditions climatiques extrêmes comme le froid d’une nuit d’hiver. La Survie recouvre également la chasse et le pistage, mais aussi le sens de l’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âce à cette compétence, le personnage se souvient des règles, des coutumes et des lois qui ont cours dans la région, voire la cité, où il se trouve. Si le système juridique reste assez semblable dans toute la Scandia, il existe souvent quelques variations locales dans l’application des peines encourues pour un même crime. De même, les us et coutumes de certains endroits changent subtilement par rapport aux habitudes des héros et peuvent provoquer des situations des plus embarrassantes. Un personnage Expert dans cette compétence peut endosser le rôle de crieur des lois lors d’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ées contre lui et se met hors de portée des coups ou des projectiles qui le visent. Bien qu’elle s’avère surtout utile en combat, cette compétence sert également à éviter une collision qui menace le héros, comme un attelage lancé au galop vers lui, ou un éboulement de gros rochers. Que l’esquive soit réussie ou pas, le personnage se retrouve toujours à terre, à 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’agit de la connaissance des lois de l’offre et de la demande. Le négociant sait évaluer les choses lors d’un troc, ou d’une transaction s’il utilise de la monnaie. Il connaît également les points d’approvisionnement pour les différentes marchandises produites dans la Scandia, et les endroits où il a le plus de chance d’en tirer le meilleur profit. Les dates et les lieux où se déroulent les foires annuelles n’ont pas de secret pour lui. Enfin, cette compétence gère tout l’aspect intendance de cette activité.</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étence entre en jeu lorsque le personnage fouille un endroit particulier. Elle permet de révéler les éléments cachés dans le décor ou les indices dissimulés. Contrairement à la compétence Vigilance, Chercher nécessite une démarche active de la part du hé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étence correspond à la connaissance de l’ensemble des pratiques médicales de la Scandia. Elle permet d’établir un diagnostic, de soigner les maladies les plus courantes, de traiter les blessures, de réduire une fracture, d’accompagner un accouchement, mais aussi de déterminer les causes probables d’une mort inexpliquée. Les premiers soins sont quant à eux couverts par la compétence Survie, mais un personnage plus compétent en Médecine peut dans ce cas substituer cette discipline à 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étence correspond à la connaissance de l’ensemble des pratiques médicales de la Scandia. Elle permet d’établir un diagnostic, de soigner les maladies les plus courantes, de traiter les blessures, de réduire une fracture, d’accompagner un accouchement, mais aussi de déterminer les causes probables d’une mort inexpliquée. Les premiers soins sont quant à eux couverts par la compétence Survie, mais un personnage plus compétent en Médecine peut dans ce cas substituer cette discipline à 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’agit de la connaissance des plantes, des herbes et des produits naturels permettant de concocter des remèdes, mais aussi des teintures ou encore des poisons de toutes sortes. Un personnage versé dans cette discipline sait également reconnaître les plantes rencontrées en pleine nature, ainsi que déterminer l’endroit où il a le plus de chance de trouver une espèce spé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étence représente l’aptitude à se mouvoir à la surface de l’eau et à y demeurer en cas de chute depuis un navire. Le Meneur de Jeu peut appliquer un malus au test de Natation égal à la valeur de protection de l’armure portée par l’infortuné. Le nageur peut également se déplacer sous l’eau ou plonger depuis les hauteurs vertigineuses des falaises avec de bonnes chances de ré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érents royaumes de la Scandia. Chaque spécialisation dans cette compétence correspond à une langue particulière et étrangère, ou à un patois local issu d’une autre racine linguistique comme le finnois parlé par les tribus sames. Il est toujours possible de comprendre un dialecte tiré du norrois en réussissant, généralement, un test d’Intellect contre un Seuil de Réussite Moyen (14). Exemples de spécialisation : saxon, finnois, balte, germain…</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érents royaumes de la Scandia. Chaque spécialisation dans cette compétence correspond à une langue particulière et étrangère, ou à un patois local issu d’une autre racine linguistique comme le finnois parlé par les tribus sames. Il est toujours possible de comprendre un dialecte tiré du norrois en réussissant, généralement, un test d’Intellect contre un Seuil de Réussite Moyen (14). Exemples de spécialisation : saxon, finnois, balte, germain…</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éplacer en silence, tout en profitant du moindre couvert afin de passer inaperçu. Cette compétence permet également de se cacher efficacement ou de camoufler un objet sur soi ou dans le dé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édilection du personnage. Il peut s’agir d’un simple don naturel, d’une activité professionnelle (pour un scalde), d’un loisir… Cette compétence permet de créer une oeuvre d’art originale ou d’en reproduire une existante. Spécialisations possibles : orfèvrerie, chant, musique, danse, gravure, poésie déclamée, flatterie, peinture, etc…</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étence recouvre les activités des filous des terres du Nord. Elle permet de crocheter une serrure, mais aussi de couper une bourse ou de subtiliser discrètement des clefs. Dans ce deuxième cas, Larcins s’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"}
|
||||
|
Binary file not shown.
@ -1 +0,0 @@
|
||||
MANIFEST-000032
|
@ -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)
|
@ -1,8 +0,0 @@
|
||||
2024/04/30-23:29:38.598445 7fdae56006c0 Recovering log #26
|
||||
2024/04/30-23:29:38.609001 7fdae56006c0 Delete type=3 #24
|
||||
2024/04/30-23:29:38.609105 7fdae56006c0 Delete type=0 #26
|
||||
2024/05/01-09:07:55.221157 7fdadfe006c0 Level-0 table #31: started
|
||||
2024/05/01-09:07:55.221263 7fdadfe006c0 Level-0 table #31: 0 bytes OK
|
||||
2024/05/01-09:07:55.228186 7fdadfe006c0 Delete type=0 #29
|
||||
2024/05/01-09:07:55.248533 7fdadfe006c0 Manual compaction at level-0 from '!items!26CQEICWZs8Gw4Xi' @ 72057594037927935 : 1 .. '!items!ylqZMDyXujUlSorr' @ 0 : 0; will stop at (end)
|
||||
2024/05/01-09:07:55.248650 7fdadfe006c0 Manual compaction at level-1 from '!items!26CQEICWZs8Gw4Xi' @ 72057594037927935 : 1 .. '!items!ylqZMDyXujUlSorr' @ 0 : 0; will stop at (end)
|
Binary file not shown.
@ -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’utiliser. Il n’est pas besoin d’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étence permet de lire et de connaître le sens de chacune des vingt-quatre runes. Mais surtout elles donnent des indications occultes sur la réalité du monde et permettent de lancer des sorts de protection, malédiction et guérison, à ceux qui savent s’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’agit là de l’antique art magique enseigné à Odhinn même, par Freyja, la sorcellerie. Les femmes sont plus nombreuses à en pratiquer certains sorts car ils sont liés à des travaux considérés comme purement féminins (filer de la laine, mettre des vêtements de cérémonie pour les visions, chevaucher un autre personnage). Certains hommes pratiquent le Sejdr sans s’en soucier, d’autres sélectionnent les sorts les moins compromettants et les complè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’utiliser. Il n’est pas besoin d’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étence permet de lire et de connaître le sens de chacune des vingt-quatre runes. Mais surtout elles donnent des indications occultes sur la réalité du monde et permettent de lancer des sorts de protection, malédiction et guérison, à ceux qui savent s’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’agit là de l’antique art magique enseigné à Odhinn même, par Freyja, la sorcellerie. Les femmes sont plus nombreuses à en pratiquer certains sorts car ils sont liés à des travaux considérés comme purement féminins (filer de la laine, mettre des vêtements de cérémonie pour les visions, chevaucher un autre personnage). Certains hommes pratiquent le Sejdr sans s’en soucier, d’autres sélectionnent les sorts les moins compromettants et les complè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"}
|
||||
|
Binary file not shown.
@ -1 +0,0 @@
|
||||
MANIFEST-000032
|
@ -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)
|
@ -1,8 +0,0 @@
|
||||
2024/04/30-23:29:38.628864 7fdae74006c0 Recovering log #26
|
||||
2024/04/30-23:29:38.639377 7fdae74006c0 Delete type=3 #24
|
||||
2024/04/30-23:29:38.639485 7fdae74006c0 Delete type=0 #26
|
||||
2024/05/01-09:07:55.235111 7fdadfe006c0 Level-0 table #31: started
|
||||
2024/05/01-09:07:55.235152 7fdadfe006c0 Level-0 table #31: 0 bytes OK
|
||||
2024/05/01-09:07:55.241587 7fdadfe006c0 Delete type=0 #29
|
||||
2024/05/01-09:07:55.248582 7fdadfe006c0 Manual compaction at level-0 from '!items!RAhkadJOfEnVBLpy' @ 72057594037927935 : 1 .. '!items!mIBiTKqfqiiepeyz' @ 0 : 0; will stop at (end)
|
||||
2024/05/01-09:07:55.248633 7fdadfe006c0 Manual compaction at level-1 from '!items!RAhkadJOfEnVBLpy' @ 72057594037927935 : 1 .. '!items!mIBiTKqfqiiepeyz' @ 0 : 0; will stop at (end)
|
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
||||
MANIFEST-000032
|
@ -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)
|
@ -1,8 +0,0 @@
|
||||
2024/04/30-23:29:38.613651 7fdae6a006c0 Recovering log #26
|
||||
2024/04/30-23:29:38.625184 7fdae6a006c0 Delete type=3 #24
|
||||
2024/04/30-23:29:38.625373 7fdae6a006c0 Delete type=0 #26
|
||||
2024/05/01-09:07:55.228367 7fdadfe006c0 Level-0 table #31: started
|
||||
2024/05/01-09:07:55.228409 7fdadfe006c0 Level-0 table #31: 0 bytes OK
|
||||
2024/05/01-09:07:55.234932 7fdadfe006c0 Delete type=0 #29
|
||||
2024/05/01-09:07:55.248560 7fdadfe006c0 Manual compaction at level-0 from '!items!6IqVsJsYPrbxUJZX' @ 72057594037927935 : 1 .. '!items!mJSWXawEGARKlNja' @ 0 : 0; will stop at (end)
|
||||
2024/05/01-09:07:55.248618 7fdadfe006c0 Manual compaction at level-1 from '!items!6IqVsJsYPrbxUJZX' @ 72057594037927935 : 1 .. '!items!mJSWXawEGARKlNja' @ 0 : 0; will stop at (end)
|
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
||||
MANIFEST-000032
|
@ -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)
|
@ -1,8 +0,0 @@
|
||||
2024/04/30-23:29:38.658423 7fdae56006c0 Recovering log #26
|
||||
2024/04/30-23:29:38.669272 7fdae56006c0 Delete type=3 #24
|
||||
2024/04/30-23:29:38.669388 7fdae56006c0 Delete type=0 #26
|
||||
2024/05/01-09:07:55.270287 7fdadfe006c0 Level-0 table #31: started
|
||||
2024/05/01-09:07:55.270340 7fdadfe006c0 Level-0 table #31: 0 bytes OK
|
||||
2024/05/01-09:07:55.277858 7fdadfe006c0 Delete type=0 #29
|
||||
2024/05/01-09:07:55.278175 7fdadfe006c0 Manual compaction at level-0 from '!items!1EVz9C1fDUBafPHj' @ 72057594037927935 : 1 .. '!items!wnIXKyfqCWT0r4iT' @ 0 : 0; will stop at (end)
|
||||
2024/05/01-09:07:55.278230 7fdadfe006c0 Manual compaction at level-1 from '!items!1EVz9C1fDUBafPHj' @ 72057594037927935 : 1 .. '!items!wnIXKyfqCWT0r4iT' @ 0 : 0; will stop at (end)
|
Binary file not shown.
@ -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 à 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 à 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 à 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 à 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.
@ -1 +0,0 @@
|
||||
MANIFEST-000032
|
@ -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)
|
@ -1,8 +0,0 @@
|
||||
2024/04/30-23:29:38.878752 7fdae60006c0 Recovering log #26
|
||||
2024/04/30-23:29:38.890171 7fdae60006c0 Delete type=3 #24
|
||||
2024/04/30-23:29:38.890274 7fdae60006c0 Delete type=0 #26
|
||||
2024/05/01-09:07:55.343882 7fdadfe006c0 Level-0 table #31: started
|
||||
2024/05/01-09:07:55.343919 7fdadfe006c0 Level-0 table #31: 0 bytes OK
|
||||
2024/05/01-09:07:55.350824 7fdadfe006c0 Delete type=0 #29
|
||||
2024/05/01-09:07:55.365593 7fdadfe006c0 Manual compaction at level-0 from '!items!0tELaPFZgkeTUeVn' @ 72057594037927935 : 1 .. '!items!zC0kHoqZ9lkQFgI6' @ 0 : 0; will stop at (end)
|
||||
2024/05/01-09:07:55.365651 7fdadfe006c0 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.
@ -1 +0,0 @@
|
||||
MANIFEST-000032
|
@ -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)
|
@ -1,8 +0,0 @@
|
||||
2024/04/30-23:29:38.672610 7fdae6a006c0 Recovering log #26
|
||||
2024/04/30-23:29:38.683005 7fdae6a006c0 Delete type=3 #24
|
||||
2024/04/30-23:29:38.683098 7fdae6a006c0 Delete type=0 #26
|
||||
2024/05/01-09:07:55.256906 7fdadfe006c0 Level-0 table #31: started
|
||||
2024/05/01-09:07:55.256961 7fdadfe006c0 Level-0 table #31: 0 bytes OK
|
||||
2024/05/01-09:07:55.263446 7fdadfe006c0 Delete type=0 #29
|
||||
2024/05/01-09:07:55.278143 7fdadfe006c0 Manual compaction at level-0 from '!items!0EoL2kcGdYiYS8lY' @ 72057594037927935 : 1 .. '!items!xf1RAsIzBXQgbLq2' @ 0 : 0; will stop at (end)
|
||||
2024/05/01-09:07:55.278203 7fdadfe006c0 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.
@ -1 +0,0 @@
|
||||
MANIFEST-000032
|
@ -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)
|
@ -1,8 +0,0 @@
|
||||
2024/04/30-23:29:38.864329 7fdae74006c0 Recovering log #26
|
||||
2024/04/30-23:29:38.875039 7fdae74006c0 Delete type=3 #24
|
||||
2024/04/30-23:29:38.875162 7fdae74006c0 Delete type=0 #26
|
||||
2024/05/01-09:07:55.358841 7fdadfe006c0 Level-0 table #31: started
|
||||
2024/05/01-09:07:55.358889 7fdadfe006c0 Level-0 table #31: 0 bytes OK
|
||||
2024/05/01-09:07:55.365401 7fdadfe006c0 Delete type=0 #29
|
||||
2024/05/01-09:07:55.365623 7fdadfe006c0 Manual compaction at level-0 from '!items!7VeQIQHxvw233Jzt' @ 72057594037927935 : 1 .. '!items!xw2gPhCxDVpkJnxL' @ 0 : 0; will stop at (end)
|
||||
2024/05/01-09:07:55.365664 7fdadfe006c0 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.
@ -1 +0,0 @@
|
||||
MANIFEST-000032
|
@ -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)
|
@ -1,8 +0,0 @@
|
||||
2024/04/30-23:29:38.848909 7fdae6a006c0 Recovering log #26
|
||||
2024/04/30-23:29:38.860284 7fdae6a006c0 Delete type=3 #24
|
||||
2024/04/30-23:29:38.860378 7fdae6a006c0 Delete type=0 #26
|
||||
2024/05/01-09:07:55.337174 7fdadfe006c0 Level-0 table #31: started
|
||||
2024/05/01-09:07:55.337262 7fdadfe006c0 Level-0 table #31: 0 bytes OK
|
||||
2024/05/01-09:07:55.343707 7fdadfe006c0 Delete type=0 #29
|
||||
2024/05/01-09:07:55.365572 7fdadfe006c0 Manual compaction at level-0 from '!items!89NwqZV3Qn9xWeO0' @ 72057594037927935 : 1 .. '!items!sH7HaKggOEaBVzn3' @ 0 : 0; will stop at (end)
|
||||
2024/05/01-09:07:55.365637 7fdadfe006c0 Manual compaction at level-1 from '!items!89NwqZV3Qn9xWeO0' @ 72057594037927935 : 1 .. '!items!sH7HaKggOEaBVzn3' @ 0 : 0; will stop at (end)
|
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
||||
MANIFEST-000032
|
@ -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)
|
@ -1,8 +0,0 @@
|
||||
2024/04/30-23:29:38.834359 7fdae56006c0 Recovering log #26
|
||||
2024/04/30-23:29:38.845525 7fdae56006c0 Delete type=3 #24
|
||||
2024/04/30-23:29:38.845680 7fdae56006c0 Delete type=0 #26
|
||||
2024/05/01-09:07:55.351078 7fdadfe006c0 Level-0 table #31: started
|
||||
2024/05/01-09:07:55.351137 7fdadfe006c0 Level-0 table #31: 0 bytes OK
|
||||
2024/05/01-09:07:55.358613 7fdadfe006c0 Delete type=0 #29
|
||||
2024/05/01-09:07:55.365609 7fdadfe006c0 Manual compaction at level-0 from '!items!1smXvw2EcuTkytDv' @ 72057594037927935 : 1 .. '!items!yKLS6KQafucspg3R' @ 0 : 0; will stop at (end)
|
||||
2024/05/01-09:07:55.365681 7fdadfe006c0 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
Loading…
Reference in New Issue
Block a user