Compare commits

..

5 Commits

Author SHA1 Message Date
adc912e6cd Ajout/upgrade des arts obscurs 2025-08-11 22:53:23 +02:00
51a457ebf6 Foundry v13 migration 2025-05-02 08:34:22 +02:00
2e9c558027 Ajout arts obscurs 2024-11-17 22:46:52 +01:00
bcd0758328 Ajout arts obscurs 2024-11-17 22:45:48 +01:00
2b680a203f Fix jet avec prestance 2024-08-11 14:40:41 +02:00
114 changed files with 3724 additions and 1759 deletions

BIN
assets/icons/sort.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -17,7 +17,8 @@
"fee": "Fée", "fee": "Fée",
"pouvoir": "Pouvoir", "pouvoir": "Pouvoir",
"profil": "Profil", "profil": "Profil",
"protection": "Protection" "protection": "Protection",
"sort": "Sort"
} }
} }
} }

View File

@@ -6,7 +6,7 @@
import { HeritiersUtility } from "./heritiers-utility.js"; import { HeritiersUtility } from "./heritiers-utility.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
export class HeritiersActorSheet extends ActorSheet { export class HeritiersActorSheet extends foundry.appv1.sheets.ActorSheet {
/** @override */ /** @override */
static get defaultOptions() { static get defaultOptions() {
@@ -40,6 +40,7 @@ export class HeritiersActorSheet extends ActorSheet {
skills: this.actor.getSkills(), skills: this.actor.getSkills(),
utileSkillsMental: this.actor.organizeUtileSkills("mental"), utileSkillsMental: this.actor.organizeUtileSkills("mental"),
utileSkillsPhysical: this.actor.organizeUtileSkills("physical"), utileSkillsPhysical: this.actor.organizeUtileSkills("physical"),
competencesMagie: HeritiersUtility.getCompetencesMagie(),
futileSkills: this.actor.organizeFutileSkills(), futileSkills: this.actor.organizeFutileSkills(),
contacts: this.actor.organizeContacts(), contacts: this.actor.organizeContacts(),
armes: foundry.utils.duplicate(this.actor.getWeapons()), armes: foundry.utils.duplicate(this.actor.getWeapons()),
@@ -57,12 +58,13 @@ export class HeritiersActorSheet extends ActorSheet {
pvMalus: this.actor.getPvMalus(), pvMalus: this.actor.getPvMalus(),
heritage: game.settings.get("fvtt-les-heritiers", "heritiers-heritage"), heritage: game.settings.get("fvtt-les-heritiers", "heritiers-heritage"),
initiative: this.actor.getFlag("world", "last-initiative") || -1, initiative: this.actor.getFlag("world", "last-initiative") || -1,
description: await TextEditor.enrichHTML(this.object.system.biodata.description, {async: true}), description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.description, { async: true }),
revesetranges: await TextEditor.enrichHTML(this.object.system.biodata.revesetranges, {async: true}), revesetranges: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.revesetranges, { async: true }),
secretsdecouverts: await TextEditor.enrichHTML(this.object.system.biodata.secretsdecouverts, {async: true}), secretsdecouverts: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.secretsdecouverts, { async: true }),
questions: await TextEditor.enrichHTML(this.object.system.biodata.questions, {async: true}), questions: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.questions, { async: true }),
habitat: await TextEditor.enrichHTML(this.object.system.biodata.habitat, {async: true}), habitat: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.habitat, { async: true }),
playernotes: await TextEditor.enrichHTML(this.object.system.biodata.playernotes, {async: true}), playernotes: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.playernotes, { async: true }),
magieList: this.actor.prepareMagie(),
options: this.options, options: this.options,
owner: this.document.isOwner, owner: this.document.isOwner,
editScore: this.options.editScore, editScore: this.options.editScore,
@@ -177,6 +179,11 @@ export class HeritiersActorSheet extends ActorSheet {
let compId = li.data("item-id") let compId = li.data("item-id")
this.actor.rollCompetence(compId) this.actor.rollCompetence(compId)
}) })
html.find('.roll-sort').click((event) => {
const li = $(event.currentTarget).parents(".item")
let sortId = li.data("item-id")
this.actor.rollSort(sortId)
})
html.find('.roll-attaque-arme').click((event) => { html.find('.roll-attaque-arme').click((event) => {
const li = $(event.currentTarget).parents(".item") const li = $(event.currentTarget).parents(".item")
let armeId = li.data("item-id") let armeId = li.data("item-id")
@@ -209,6 +216,14 @@ export class HeritiersActorSheet extends ActorSheet {
html.find('.item-add').click((event) => { html.find('.item-add').click((event) => {
const itemType = $(event.currentTarget).data("type") const itemType = $(event.currentTarget).data("type")
if (itemType == "sort") {
// Get data-sort-competence
let sortCompetence = $(event.currentTarget).data("sort-competence");
if (sortCompetence) {
this.actor.createEmbeddedDocuments('Item', [{ name: `Nouveau ${itemType} de ${sortCompetence}`, type: itemType, system: { competence: sortCompetence } }], { renderSheet: true })
return
}
}
this.actor.createEmbeddedDocuments('Item', [{ name: `Nouveau ${itemType}`, type: itemType }], { renderSheet: true }) this.actor.createEmbeddedDocuments('Item', [{ name: `Nouveau ${itemType}`, type: itemType }], { renderSheet: true })
}) })

View File

@@ -41,7 +41,7 @@ export class HeritiersActor extends Actor {
const skills = await HeritiersUtility.loadCompendium("fvtt-les-heritiers.competences") const skills = await HeritiersUtility.loadCompendium("fvtt-les-heritiers.competences")
data.items = [] data.items = []
for (let skill of skills) { for (let skill of skills) {
if (skill.system.categorie == "utile") { if (skill.system.categorie == "utile" && skill.system.profil != "magie") {
data.items.push(skill.toObject()) data.items.push(skill.toObject())
} }
} }
@@ -146,6 +146,38 @@ export class HeritiersActor extends Actor {
HeritiersUtility.sortArrayObjectsByName(pouvoirs) HeritiersUtility.sortArrayObjectsByName(pouvoirs)
return pouvoirs return pouvoirs
} }
getSorts() {
return this.getItemSorted(["sort"])
}
getCompetencesMagie() {
let comp = []
for (let item of this.items) {
if (item.type == "competence" && item.system.profil == "magie") {
let itemObj = foundry.utils.duplicate(item)
comp.push(itemObj)
}
}
HeritiersUtility.sortArrayObjectsByName(comp)
return comp
}
prepareMagie() {
let magieList = []
for (let item of this.items) {
if (item.type == "competence" && item.system.profil == "magie") {
let magie = {}
magie.name = item.name
magie.competence = foundry.utils.duplicate(item)
magie.sorts = []
for (let sort of this.items) {
if (sort.type == "sort" && sort.system.competence == item.name) {
magie.sorts.push(sort)
}
}
magieList.push(magie)
}
}
return magieList
}
/* -------------------------------------------- */ /* -------------------------------------------- */
getSkills() { getSkills() {
@@ -171,6 +203,28 @@ export class HeritiersActor extends Actor {
item.specList = specList.toString() item.specList = specList.toString()
} }
/* -------------------------------------------- */
organizeMagicSkills() {
let comp = {}
for (let key in game.system.lesheritiers.config.competenceProfil) {
if (game.system.lesheritiers.config.competenceProfil[key].kind == "magical")
comp[key] = { skills: [], niveau: 0 }
}
for (let item of this.items) {
if (item.type == "competence") {
if (item.system.categorie == "utile" && comp[item.system.profil]) {
this.prepareUtileSkill(item)
comp[item.system.profil].skills.push(item)
}
}
}
for (let key in comp) {
HeritiersUtility.sortArrayObjectsByName(comp[key].skills)
}
return Object.fromEntries(Object.entries(comp).sort())
}
/* -------------------------------------------- */ /* -------------------------------------------- */
organizeUtileSkills(kind = "mental") { organizeUtileSkills(kind = "mental") {
let comp = {} let comp = {}
@@ -192,6 +246,7 @@ export class HeritiersActor extends Actor {
} }
return Object.fromEntries(Object.entries(comp).sort()) return Object.fromEntries(Object.entries(comp).sort())
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
organizeContacts() { organizeContacts() {
let contactList = {} let contactList = {}
@@ -258,12 +313,37 @@ export class HeritiersActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async prepareData() { async prepareData() {
super.prepareData();
let pvMax = (this.system.caracteristiques.con.rang * 3) + 9 + this.system.pv.mod let pvMax = (this.system.caracteristiques.con.rang * 3) + 9 + this.system.pv.mod
if (this.system.pv.max != pvMax) { if (this.system.pv.max != pvMax) {
this.update({ 'system.pv.max': pvMax }) this.update({ 'system.pv.max': pvMax })
} }
if (this.system.biodata.magie || this.type == "pnj") {
let pointsAmes = this.system.caracteristiques.esp.rang + this.system.caracteristiques.san.rang + this.getMaxRangMagie()
if (this.system.magie.pointsame.max != pointsAmes) {
this.update({ 'system.magie.pointsame.max': pointsAmes })
}
}
super.prepareData();
}
/* -------------------------------------------- */
getMaxRangMagie() {
let niv = 0
let bestMagie
for (let comp of this.items) {
if (comp.type == "competence" && comp.system.profil == "magie") {
if (comp.system.niveau > niv) {
bestMagie = comp
niv = comp.system.niveau
}
}
}
if (bestMagie) {
return Math.round(bestMagie.system.niveau / 2)
}
return 0
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -627,6 +707,35 @@ export class HeritiersActor extends Actor {
rollDialog.render(true) rollDialog.render(true)
} }
/* -------------------------------------------- */
async rollSort(sortId) {
let sort = this.items.get(sortId)
let comp = this.items.find(it => it.type == "competence" && it.name.toLowerCase() == sort.system.competence.toLowerCase())
if (!comp) {
ui.notifications.warn("Compétence de magie associée non trouvée !")
return
}
let rollData = this.getCommonRollData(comp.id)
rollData.mode = "sort"
rollData.sort = foundry.utils.duplicate(sort)
rollData.sdValue = HeritiersUtility.getSDSortValue(sort.system.niveau)
rollData.sortPointsAme = sort.system.niveau
if (sort.system.carac2 != "none") {
// get the best carac between carac1 and carac2
if (this.system.caracteristiques[sort.system.carac1].value > this.system.caracteristiques[sort.system.carac2].value) {
rollData.caracKey = sort.system.carac1
} else {
rollData.caracKey = sort.system.carac2
}
rollData.caracMessage = "Ce sort peut être lancé avec " + game.system.lesheritiers.config.caracList[sort.system.carac1] + " ou " + game.system.lesheritiers.config.caracList[sort.system.carac2] + ". La meilleure caractéristique a été selectionnée."
}
console.log("RollData", rollData)
let rollDialog = await HeritiersRollDialog.create(this, rollData)
rollDialog.render(true)
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async rollAttaqueArme(armeId) { async rollAttaqueArme(armeId) {
let arme = this.items.get(armeId) let arme = this.items.get(armeId)

View File

@@ -30,7 +30,8 @@ export const HERITIERS_CONFIG = {
"combattant": {kind: "physical",name:"Combattant"}, "combattant": {kind: "physical",name:"Combattant"},
"erudit": {kind: "mental",name:"Erudit"}, "erudit": {kind: "mental",name:"Erudit"},
"savant": {kind: "mental",name:"Savant"}, "savant": {kind: "mental",name:"Savant"},
"gentleman": {kind: "mental",name:"Gentleman"} "gentleman": {kind: "mental",name:"Gentleman"},
"magie": {kind: "magical", name: "Magie"},
}, },
baseTestPouvoir: { baseTestPouvoir: {
"feerie": "Féerie", "feerie": "Féerie",
@@ -193,6 +194,12 @@ export const HERITIERS_CONFIG = {
{value: "5", label: "+5"}, {value: "5", label: "+5"},
{value: "6", label: "+6"} {value: "6", label: "+6"}
], ],
listNiveauSort: {
"1" : "1",
"2" : "2",
"3" : "3",
"4" : "4"
},
listNiveau: { listNiveau: {
"0": "0", "0": "0",
"1": "1", "1": "1",

View File

@@ -4,7 +4,7 @@ import { HeritiersUtility } from "./heritiers-utility.js";
* Extend the basic ItemSheet with some very simple modifications * Extend the basic ItemSheet with some very simple modifications
* @extends {ItemSheet} * @extends {ItemSheet}
*/ */
export class HeritiersItemSheet extends ItemSheet { export class HeritiersItemSheet extends foundry.appv1.sheets.ItemSheet {
/** @override */ /** @override */
static get defaultOptions() { static get defaultOptions() {
@@ -63,7 +63,7 @@ export class HeritiersItemSheet extends ItemSheet {
owner: this.document.isOwner, owner: this.document.isOwner,
config: game.system.lesheritiers.config, config: game.system.lesheritiers.config,
isArmeMelee: HeritiersUtility.isArmeMelee(this.object), isArmeMelee: HeritiersUtility.isArmeMelee(this.object),
description: await TextEditor.enrichHTML(this.object.system.description, {async: true}), description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.description, {async: true}),
mr: (this.object.type == 'specialisation'), mr: (this.object.type == 'specialisation'),
isGM: game.user.isGM, isGM: game.user.isGM,
usageMax: -1 usageMax: -1
@@ -76,6 +76,10 @@ export class HeritiersItemSheet extends ItemSheet {
this.object.system.pointsusagecourant = formData.usageMax this.object.system.pointsusagecourant = formData.usageMax
} }
} }
if (this.object.type == 'sort' ) {
formData.competencesMagie = HeritiersUtility.getCompetencesMagie()
}
//this.options.editable = !(this.object.origin == "embeddedItem"); //this.options.editable = !(this.object.origin == "embeddedItem");
console.log("ITEM DATA", formData, this); console.log("ITEM DATA", formData, this);

View File

@@ -18,6 +18,7 @@ export const defaultItemImg = {
fee: "systems/fvtt-les-heritiers/assets/icons/faery_type.webp", fee: "systems/fvtt-les-heritiers/assets/icons/faery_type.webp",
profil: "systems/fvtt-les-heritiers/assets/icons/profil.webp", profil: "systems/fvtt-les-heritiers/assets/icons/profil.webp",
equipement: "systems/fvtt-les-heritiers/assets/icons/equipement.webp", equipement: "systems/fvtt-les-heritiers/assets/icons/equipement.webp",
sort: "systems/fvtt-les-heritiers/assets/icons/sort.webp",
} }
/** /**

View File

@@ -55,12 +55,12 @@ Hooks.once("init", async function () {
/* -------------------------------------------- */ /* -------------------------------------------- */
// Register sheet application classes // Register sheet application classes
Actors.unregisterSheet("core", ActorSheet); foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet);
Actors.registerSheet("fvtt-les-heritiers", HeritiersActorSheet, { types: ["personnage"], makeDefault: true }) foundry.documents.collections.Actors.registerSheet("fvtt-les-heritiers", HeritiersActorSheet, { types: ["personnage"], makeDefault: true })
Actors.registerSheet("fvtt-les-heritiers", HeritiersActorPNJSheet, { types: ["pnj"], makeDefault: true }) foundry.documents.collections.Actors.registerSheet("fvtt-les-heritiers", HeritiersActorPNJSheet, { types: ["pnj"], makeDefault: true })
Items.unregisterSheet("core", ItemSheet); foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet);
Items.registerSheet("fvtt-les-heritiers", HeritiersItemSheet, { makeDefault: true }) foundry.documents.collections.Items.registerSheet("fvtt-les-heritiers", HeritiersItemSheet, { makeDefault: true })
HeritiersUtility.init() HeritiersUtility.init()
@@ -131,4 +131,3 @@ Hooks.on("chatMessage", (html, content, msg) => {
} }
return true; return true;
}); });

View File

@@ -6,7 +6,7 @@ export class HeritiersRollDialog extends Dialog {
static async create(actor, rollData) { static async create(actor, rollData) {
let options = { classes: ["HeritiersDialog"], width: 420, height: 'fit-content', 'z-index': 99999 }; let options = { classes: ["HeritiersDialog"], width: 420, height: 'fit-content', 'z-index': 99999 };
let html = await renderTemplate('systems/fvtt-les-heritiers/templates/roll-dialog-generic.html', rollData); let html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-les-heritiers/templates/roll-dialog-generic.html', rollData);
return new HeritiersRollDialog(actor, rollData, html, options); return new HeritiersRollDialog(actor, rollData, html, options);
} }
@@ -109,7 +109,6 @@ export class HeritiersRollDialog extends Dialog {
activateListeners(html) { activateListeners(html) {
super.activateListeners(html); super.activateListeners(html);
var dialog = this;
function onLoad() { function onLoad() {
} }
$(function () { onLoad(); }); $(function () { onLoad(); });

View File

@@ -48,7 +48,7 @@ export class HeritiersUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async init() { static async init() {
Hooks.on('renderChatLog', (log, html, data) => HeritiersUtility.chatListeners(html)) Hooks.on('renderChatLog', (log, html, data) => HeritiersUtility.chatListeners(html))
Hooks.on("getChatLogEntryContext", (html, options) => HeritiersUtility.chatRollMenu(html, options)) /* Unused for Heitiers : Hooks.on("getChatMessageContextOptions", (html, options) => HeritiersUtility.chatRollMenu(html, options))*/
this.rollDataStore = {} this.rollDataStore = {}
this.defenderStore = {} this.defenderStore = {}
@@ -104,6 +104,8 @@ export class HeritiersUtility {
const skills = await HeritiersUtility.loadCompendium("fvtt-les-heritiers.competences") const skills = await HeritiersUtility.loadCompendium("fvtt-les-heritiers.competences")
this.skills = skills.map(i => i.toObject()) this.skills = skills.map(i => i.toObject())
this.competencesMagie = this.skills.filter(s => s.system.profil == "magie")
game.settings.register("fvtt-les-heritiers", "heritiers-heritage", { game.settings.register("fvtt-les-heritiers", "heritiers-heritage", {
name: "Points d'héritage", name: "Points d'héritage",
hint: "Points d'héritage du groupe", hint: "Points d'héritage du groupe",
@@ -114,6 +116,19 @@ export class HeritiersUtility {
}) })
} }
/* -------------------------------------------- */
static getSDSortValue(niveau) {
if (niveau <= 2) return 12;
if (niveau <= 4) return 14;
if (niveau <= 6) return 16;
return 18;
}
/* -------------------------------------------- */
static getCompetencesMagie() {
return this.competencesMagie
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static async loadCompendiumData(compendium) { static async loadCompendiumData(compendium) {
const pack = game.packs.get(compendium); const pack = game.packs.get(compendium);
@@ -133,7 +148,7 @@ export class HeritiersUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async chatListeners(html) { static async chatListeners(html) {
html.on("click", '.predilection-reroll', async event => { $(html).on("click", '.predilection-reroll', async event => {
let predIdx = $(event.currentTarget).data("predilection-index") let predIdx = $(event.currentTarget).data("predilection-index")
let messageId = HeritiersUtility.findChatMessageId(event.currentTarget) let messageId = HeritiersUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId) let message = game.messages.get(messageId)
@@ -144,7 +159,7 @@ export class HeritiersUtility {
HeritiersUtility.rollHeritiers(rollData) HeritiersUtility.rollHeritiers(rollData)
}) })
html.on("click", '.roll-tricherie-2', async event => { $(html).on("click", '.roll-tricherie-2', async event => {
let messageId = HeritiersUtility.findChatMessageId(event.currentTarget) let messageId = HeritiersUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId) let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "heritiers-roll") let rollData = message.getFlag("world", "heritiers-roll")
@@ -155,7 +170,7 @@ export class HeritiersUtility {
} }
}) })
html.on("click", '.roll-chat-degat', async event => { $(html).on("click", '.roll-chat-degat', async event => {
let messageId = HeritiersUtility.findChatMessageId(event.currentTarget) let messageId = HeritiersUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId) let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "heritiers-roll") let rollData = message.getFlag("world", "heritiers-roll")
@@ -174,7 +189,7 @@ export class HeritiersUtility {
'systems/fvtt-les-heritiers/templates/partial-item-nav.html', 'systems/fvtt-les-heritiers/templates/partial-item-nav.html',
'systems/fvtt-les-heritiers/templates/partial-utile-skills.html' 'systems/fvtt-les-heritiers/templates/partial-utile-skills.html'
] ]
return loadTemplates(templatePaths); return foundry.applications.handlebars.loadTemplates(templatePaths);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -450,7 +465,7 @@ export class HeritiersUtility {
this.computeArmeDegats(rollData, actor) this.computeArmeDegats(rollData, actor)
} }
this.createChatWithRollMode(rollData.alias, { this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-les-heritiers/templates/chat-cc-result.html`, rollData) content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-les-heritiers/templates/chat-cc-result.html`, rollData)
}, rollData, "selfroll") }, rollData, "selfroll")
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -462,7 +477,7 @@ export class HeritiersUtility {
this.computeMarge(rollData, valeurDefense) this.computeMarge(rollData, valeurDefense)
rollData.dureeAssommer = (rollData.marge) ? rollData.marge * 2 : 1 rollData.dureeAssommer = (rollData.marge) ? rollData.marge * 2 : 1
this.createChatWithRollMode(rollData.alias, { this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-les-heritiers/templates/chat-assommer-result.html`, rollData) content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-les-heritiers/templates/chat-assommer-result.html`, rollData)
}, rollData, "selfroll") }, rollData, "selfroll")
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -476,6 +491,7 @@ export class HeritiersUtility {
} }
//rollData.actionImg = "systems/fvtt-les-heritiers/assets/icons/" + actor.system.attributs[rollData.attrKey].labelnorm + ".webp" //rollData.actionImg = "systems/fvtt-les-heritiers/assets/icons/" + actor.system.attributs[rollData.attrKey].labelnorm + ".webp"
if (rollData.caracKey == "pre") rollData.caracKey = "pres"; // Patch tomanage wrong carac key
rollData.carac = foundry.utils.duplicate(actor.system.caracteristiques[rollData.caracKey]) rollData.carac = foundry.utils.duplicate(actor.system.caracteristiques[rollData.caracKey])
if (rollData.forcedValue) { if (rollData.forcedValue) {
@@ -553,7 +569,7 @@ export class HeritiersUtility {
} }
this.createChatWithRollMode(rollData.alias, { this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-les-heritiers/templates/chat-generic-result.html`, rollData) content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-les-heritiers/templates/chat-generic-result.html`, rollData)
}, rollData) }, rollData)
// Gestion attaque standard // Gestion attaque standard
@@ -591,7 +607,7 @@ export class HeritiersUtility {
this.computeResult(rollData) this.computeResult(rollData)
this.createChatWithRollMode(rollData.alias, { this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-les-heritiers/templates/chat-generic-result.html`, rollData) content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-les-heritiers/templates/chat-generic-result.html`, rollData)
}, rollData) }, rollData)
} }
@@ -764,13 +780,13 @@ export class HeritiersUtility {
static chatRollMenu(html, options) { static chatRollMenu(html, options) {
let canApply = li => canvas.tokens.controlled.length && li.find(".heritiers-roll").length let canApply = li => canvas.tokens.controlled.length && li.find(".heritiers-roll").length
let canApplyBA = function (li) { let canApplyBA = function (li) {
let message = game.messages.get(li.attr("data-message-id")) let message = game.messages.get($(li).attr("data-message-id"))
let rollData = message.getFlag("world", "heritiers-roll") let rollData = message.getFlag("world", "heritiers-roll")
let actor = this.getActorFromRollData(rollData) let actor = this.getActorFromRollData(rollData)
return (!rollData.isReroll && actor.getBonneAventure() > 0) return (!rollData.isReroll && actor.getBonneAventure() > 0)
} }
let canApplyPE = function (li) { let canApplyPE = function (li) {
let message = game.messages.get(li.attr("data-message-id")) let message = game.messages.get($(li).attr("data-message-id"))
let rollData = message.getFlag("world", "heritiers-roll") let rollData = message.getFlag("world", "heritiers-roll")
let actor = this.getActorFromRollData(rollData) let actor = this.getActorFromRollData(rollData)
return (!rollData.isReroll && actor.getEclat() > 0) return (!rollData.isReroll && actor.getEclat() > 0)
@@ -805,11 +821,11 @@ export class HeritiersUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async confirmDelete(actorSheet, li) { static async confirmDelete(actorSheet, li) {
let itemId = li.data("item-id"); let itemId = li.data("item-id");
let msgTxt = "<p>Are you sure to remove this Item ?"; let msgTxt = "<p>Certain de supprimer cet item ?";
let buttons = { let buttons = {
delete: { delete: {
icon: '<i class="fas fa-check"></i>', icon: '<i class="fas fa-check"></i>',
label: "Yes, remove it", label: "Oui !",
callback: () => { callback: () => {
actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]); actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
li.slideUp(200, () => actorSheet.render(false)); li.slideUp(200, () => actorSheet.render(false));
@@ -817,12 +833,12 @@ export class HeritiersUtility {
}, },
cancel: { cancel: {
icon: '<i class="fas fa-times"></i>', icon: '<i class="fas fa-times"></i>',
label: "Cancel" label: "Non !"
} }
} }
msgTxt += "</p>"; msgTxt += "</p>";
let d = new Dialog({ let d = new Dialog({
title: "Confirm removal", title: "Confirmer la suppression",
content: msgTxt, content: msgTxt,
buttons: buttons, buttons: buttons,
default: "cancel" default: "cancel"
@@ -830,21 +846,56 @@ export class HeritiersUtility {
d.render(true); d.render(true);
} }
/************************************************************************************/ static loadSort() {
static async __create_talents_table() { // Create afolder in the item directory if it doesn't exist
let compName = "fvtt-les-heritiers.talents-cellule" if (!game.folders.getName("Magie du Clan")) {
const compData = await HeritiersUtility.loadCompendium(compName) Folder.create({
let talents = compData.map(i => i.toObject()) name: "Magie du Clan",
type: "Item",
color: "#3b1361"
});
}
let htmlTab = "<table border='1'><tbody>"; // Load the srcdata/sorts-druidisme.json file
for (let entryData of talents) { return fetch("systems/fvtt-les-heritiers/srcdata/sort_magieduclan.json")
console.log(entryData) .then(response => response.json())
htmlTab += `<tr><td>@UUID[Compendium.${compName}.${entryData._id}]{${entryData.name}}</td>` .then(data => {
htmlTab += `<td>${entryData.system.description}</td>`; console.log("Sorts Magie du Clan loaded:", data);
//htmlTab += `<td>${entryData.system.resumebonus}</td>`; this.sortDruidisme = data;
htmlTab += "</tr>\n"; // Loop through the spell and create the "sort "item based on the JSON content
} data.forEach(spell => {
htmlTab += "</table>"; spell.name = spell.name;
await JournalEntry.create({ name: 'Liste des Talents de Cellule', content: htmlTab }); spell.type = "sort";
spell.system = {
niveau: spell.niveau,
competence: spell.competence,
carac1: spell.carac1,
carac2: spell.carac2,
description: spell.description,
ingredients: spell.ingredients,
portee: spell.portee,
duree: spell.duree,
concentration: spell.concentration,
critique: spell.critique,
resistance: spell.resistance,
coutactivation: spell.coutactivation
};
spell.img = "systems/fvtt-les-heritiers/assets/icons/sort.webp";
spell.folder = game.folders.getName("Magie du Clan").id;
// Create the item in the world
Item.create(spell)
.then(item => {
console.log("Sort created:", item);
})
.catch(error => {
console.error("Error creating sort item:", error);
});
})
})
.catch(error => {
console.error("Error loading druidism spells:", error);
return [];
});
} }
} }

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000139 MANIFEST-000204

View File

@@ -1,8 +1,8 @@
2024/07/30-09:26:48.905986 7f61a0c006c0 Recovering log #137 2025/08/11-22:51:18.392137 7f12ef7fe6c0 Recovering log #202
2024/07/30-09:26:48.916644 7f61a0c006c0 Delete type=3 #135 2025/08/11-22:51:18.402831 7f12ef7fe6c0 Delete type=3 #200
2024/07/30-09:26:48.916787 7f61a0c006c0 Delete type=0 #137 2025/08/11-22:51:18.403033 7f12ef7fe6c0 Delete type=0 #202
2024/07/30-09:29:38.623829 7f619e8006c0 Level-0 table #142: started 2025/08/11-22:52:41.281449 7f12edffb6c0 Level-0 table #207: started
2024/07/30-09:29:38.623893 7f619e8006c0 Level-0 table #142: 0 bytes OK 2025/08/11-22:52:41.281484 7f12edffb6c0 Level-0 table #207: 0 bytes OK
2024/07/30-09:29:38.631639 7f619e8006c0 Delete type=0 #140 2025/08/11-22:52:41.288560 7f12edffb6c0 Delete type=0 #205
2024/07/30-09:29:38.640831 7f619e8006c0 Manual compaction at level-0 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.294969 7f12edffb6c0 Manual compaction at level-0 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end)
2024/07/30-09:29:38.640969 7f619e8006c0 Manual compaction at level-1 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.295038 7f12edffb6c0 Manual compaction at level-1 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2024/07/30-09:10:55.068008 7f61a0c006c0 Recovering log #133 2025/08/11-21:34:20.213810 7f12eeffd6c0 Recovering log #198
2024/07/30-09:10:55.078873 7f61a0c006c0 Delete type=3 #131 2025/08/11-21:34:20.256044 7f12eeffd6c0 Delete type=3 #196
2024/07/30-09:10:55.079032 7f61a0c006c0 Delete type=0 #133 2025/08/11-21:34:20.256149 7f12eeffd6c0 Delete type=0 #198
2024/07/30-09:23:03.189572 7f619e8006c0 Level-0 table #138: started 2025/08/11-22:51:08.095390 7f12edffb6c0 Level-0 table #203: started
2024/07/30-09:23:03.189616 7f619e8006c0 Level-0 table #138: 0 bytes OK 2025/08/11-22:51:08.095416 7f12edffb6c0 Level-0 table #203: 0 bytes OK
2024/07/30-09:23:03.237443 7f619e8006c0 Delete type=0 #136 2025/08/11-22:51:08.101419 7f12edffb6c0 Delete type=0 #201
2024/07/30-09:23:03.372498 7f619e8006c0 Manual compaction at level-0 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.115257 7f12edffb6c0 Manual compaction at level-0 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end)
2024/07/30-09:23:03.372559 7f619e8006c0 Manual compaction at level-1 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.115306 7f12edffb6c0 Manual compaction at level-1 from '!items!1NhJH4IJpxsGmLB8' @ 72057594037927935 : 1 .. '!items!y1yOenfAJTsb3r6e' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000139 MANIFEST-000204

View File

@@ -1,8 +1,8 @@
2024/07/30-09:26:48.936799 7f61a16006c0 Recovering log #137 2025/08/11-22:51:18.427459 7f12effff6c0 Recovering log #202
2024/07/30-09:26:48.947878 7f61a16006c0 Delete type=3 #135 2025/08/11-22:51:18.437741 7f12effff6c0 Delete type=3 #200
2024/07/30-09:26:48.947994 7f61a16006c0 Delete type=0 #137 2025/08/11-22:51:18.437824 7f12effff6c0 Delete type=0 #202
2024/07/30-09:29:38.641116 7f619e8006c0 Level-0 table #142: started 2025/08/11-22:52:41.295170 7f12edffb6c0 Level-0 table #207: started
2024/07/30-09:29:38.641202 7f619e8006c0 Level-0 table #142: 0 bytes OK 2025/08/11-22:52:41.295253 7f12edffb6c0 Level-0 table #207: 0 bytes OK
2024/07/30-09:29:38.648854 7f619e8006c0 Delete type=0 #140 2025/08/11-22:52:41.301406 7f12edffb6c0 Delete type=0 #205
2024/07/30-09:29:38.680189 7f619e8006c0 Manual compaction at level-0 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.321176 7f12edffb6c0 Manual compaction at level-0 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end)
2024/07/30-09:29:38.680301 7f619e8006c0 Manual compaction at level-1 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.321242 7f12edffb6c0 Manual compaction at level-1 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2024/07/30-09:10:55.099640 7f61a02006c0 Recovering log #133 2025/08/11-21:34:20.321725 7f12ee7fc6c0 Recovering log #198
2024/07/30-09:10:55.110842 7f61a02006c0 Delete type=3 #131 2025/08/11-21:34:20.374068 7f12ee7fc6c0 Delete type=3 #196
2024/07/30-09:10:55.110942 7f61a02006c0 Delete type=0 #133 2025/08/11-21:34:20.374213 7f12ee7fc6c0 Delete type=0 #198
2024/07/30-09:23:03.335864 7f619e8006c0 Level-0 table #138: started 2025/08/11-22:51:08.133789 7f12edffb6c0 Level-0 table #203: started
2024/07/30-09:23:03.335940 7f619e8006c0 Level-0 table #138: 0 bytes OK 2025/08/11-22:51:08.133823 7f12edffb6c0 Level-0 table #203: 0 bytes OK
2024/07/30-09:23:03.372305 7f619e8006c0 Delete type=0 #136 2025/08/11-22:51:08.139874 7f12edffb6c0 Delete type=0 #201
2024/07/30-09:23:03.372546 7f619e8006c0 Manual compaction at level-0 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.147851 7f12edffb6c0 Manual compaction at level-0 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end)
2024/07/30-09:23:03.446232 7f619e8006c0 Manual compaction at level-1 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.158002 7f12edffb6c0 Manual compaction at level-1 from '!items!1ETVaPBtjDtzelK1' @ 72057594037927935 : 1 .. '!items!zbsVCsWxRzkzzG1N' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000139 MANIFEST-000204

View File

@@ -1,8 +1,8 @@
2024/07/30-09:26:48.890651 7f619f8006c0 Recovering log #137 2025/08/11-22:51:18.358721 7f12eeffd6c0 Recovering log #202
2024/07/30-09:26:48.901439 7f619f8006c0 Delete type=3 #135 2025/08/11-22:51:18.370416 7f12eeffd6c0 Delete type=3 #200
2024/07/30-09:26:48.901535 7f619f8006c0 Delete type=0 #137 2025/08/11-22:51:18.370477 7f12eeffd6c0 Delete type=0 #202
2024/07/30-09:29:38.607037 7f619e8006c0 Level-0 table #142: started 2025/08/11-22:52:41.264660 7f12edffb6c0 Level-0 table #207: started
2024/07/30-09:29:38.607124 7f619e8006c0 Level-0 table #142: 0 bytes OK 2025/08/11-22:52:41.264688 7f12edffb6c0 Level-0 table #207: 0 bytes OK
2024/07/30-09:29:38.614640 7f619e8006c0 Delete type=0 #140 2025/08/11-22:52:41.270787 7f12edffb6c0 Delete type=0 #205
2024/07/30-09:29:38.640778 7f619e8006c0 Manual compaction at level-0 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.294911 7f12edffb6c0 Manual compaction at level-0 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end)
2024/07/30-09:29:38.640904 7f619e8006c0 Manual compaction at level-1 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.295015 7f12edffb6c0 Manual compaction at level-1 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2024/07/30-09:10:55.051639 7f61a16006c0 Recovering log #133 2025/08/11-21:34:20.151917 7f12ee7fc6c0 Recovering log #198
2024/07/30-09:10:55.062824 7f61a16006c0 Delete type=3 #131 2025/08/11-21:34:20.210898 7f12ee7fc6c0 Delete type=3 #196
2024/07/30-09:10:55.062987 7f61a16006c0 Delete type=0 #133 2025/08/11-21:34:20.211020 7f12ee7fc6c0 Delete type=0 #198
2024/07/30-09:23:03.237667 7f619e8006c0 Level-0 table #138: started 2025/08/11-22:51:08.101600 7f12edffb6c0 Level-0 table #203: started
2024/07/30-09:23:03.237719 7f619e8006c0 Level-0 table #138: 0 bytes OK 2025/08/11-22:51:08.101658 7f12edffb6c0 Level-0 table #203: 0 bytes OK
2024/07/30-09:23:03.272266 7f619e8006c0 Delete type=0 #136 2025/08/11-22:51:08.109108 7f12edffb6c0 Delete type=0 #201
2024/07/30-09:23:03.372517 7f619e8006c0 Manual compaction at level-0 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.115273 7f12edffb6c0 Manual compaction at level-0 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end)
2024/07/30-09:23:03.372572 7f619e8006c0 Manual compaction at level-1 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.115320 7f12edffb6c0 Manual compaction at level-1 from '!items!0fPXtA5LkLgG8uDj' @ 72057594037927935 : 1 .. '!items!zvtBlG6KCIn0oCVk' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

BIN
packs/avantages/000179.ldb Normal file

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000139 MANIFEST-000204

View File

@@ -1,8 +1,8 @@
2024/07/30-09:26:48.846369 7f61a0c006c0 Recovering log #137 2025/08/11-22:51:18.304943 7f12ef7fe6c0 Recovering log #202
2024/07/30-09:26:48.856642 7f61a0c006c0 Delete type=3 #135 2025/08/11-22:51:18.317352 7f12ef7fe6c0 Delete type=3 #200
2024/07/30-09:26:48.856767 7f61a0c006c0 Delete type=0 #137 2025/08/11-22:51:18.317883 7f12ef7fe6c0 Delete type=0 #202
2024/07/30-09:29:38.585757 7f619e8006c0 Level-0 table #142: started 2025/08/11-22:52:41.257402 7f12edffb6c0 Level-0 table #207: started
2024/07/30-09:29:38.585819 7f619e8006c0 Level-0 table #142: 0 bytes OK 2025/08/11-22:52:41.257472 7f12edffb6c0 Level-0 table #207: 0 bytes OK
2024/07/30-09:29:38.592691 7f619e8006c0 Delete type=0 #140 2025/08/11-22:52:41.264373 7f12edffb6c0 Delete type=0 #205
2024/07/30-09:29:38.606792 7f619e8006c0 Manual compaction at level-0 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.264537 7f12edffb6c0 Manual compaction at level-0 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end)
2024/07/30-09:29:38.606883 7f619e8006c0 Manual compaction at level-1 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.264567 7f12edffb6c0 Manual compaction at level-1 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2024/07/30-09:10:55.006701 7f61a0c006c0 Recovering log #133 2025/08/11-21:34:19.962488 7f12ee7fc6c0 Recovering log #198
2024/07/30-09:10:55.017640 7f61a0c006c0 Delete type=3 #131 2025/08/11-21:34:20.014408 7f12ee7fc6c0 Delete type=3 #196
2024/07/30-09:10:55.017731 7f61a0c006c0 Delete type=0 #133 2025/08/11-21:34:20.014461 7f12ee7fc6c0 Delete type=0 #198
2024/07/30-09:23:03.068943 7f619e8006c0 Level-0 table #138: started 2025/08/11-22:51:08.055412 7f12edffb6c0 Level-0 table #203: started
2024/07/30-09:23:03.068981 7f619e8006c0 Level-0 table #138: 0 bytes OK 2025/08/11-22:51:08.055458 7f12edffb6c0 Level-0 table #203: 0 bytes OK
2024/07/30-09:23:03.107862 7f619e8006c0 Delete type=0 #136 2025/08/11-22:51:08.062106 7f12edffb6c0 Delete type=0 #201
2024/07/30-09:23:03.189274 7f619e8006c0 Manual compaction at level-0 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.085428 7f12edffb6c0 Manual compaction at level-0 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end)
2024/07/30-09:23:03.189350 7f619e8006c0 Manual compaction at level-1 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.085469 7f12edffb6c0 Manual compaction at level-1 from '!items!0EAAt0qSzcD9VRBH' @ 72057594037927935 : 1 .. '!items!zfpjROW9LDAlXUkN' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
packs/capacites/000179.ldb Normal file

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000139 MANIFEST-000204

View File

@@ -1,8 +1,8 @@
2024/07/30-09:26:48.875799 7f61a16006c0 Recovering log #137 2025/08/11-22:51:18.341321 7f12ee7fc6c0 Recovering log #202
2024/07/30-09:26:48.886968 7f61a16006c0 Delete type=3 #135 2025/08/11-22:51:18.354195 7f12ee7fc6c0 Delete type=3 #200
2024/07/30-09:26:48.887068 7f61a16006c0 Delete type=0 #137 2025/08/11-22:51:18.354810 7f12ee7fc6c0 Delete type=0 #202
2024/07/30-09:29:38.599930 7f619e8006c0 Level-0 table #142: started 2025/08/11-22:52:41.237394 7f12edffb6c0 Level-0 table #207: started
2024/07/30-09:29:38.599993 7f619e8006c0 Level-0 table #142: 0 bytes OK 2025/08/11-22:52:41.237434 7f12edffb6c0 Level-0 table #207: 0 bytes OK
2024/07/30-09:29:38.606481 7f619e8006c0 Delete type=0 #140 2025/08/11-22:52:41.243722 7f12edffb6c0 Delete type=0 #205
2024/07/30-09:29:38.606839 7f619e8006c0 Manual compaction at level-0 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.264503 7f12edffb6c0 Manual compaction at level-0 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end)
2024/07/30-09:29:38.606928 7f619e8006c0 Manual compaction at level-1 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.264544 7f12edffb6c0 Manual compaction at level-1 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2024/07/30-09:10:55.037123 7f61a02006c0 Recovering log #133 2025/08/11-21:34:20.096085 7f12effff6c0 Recovering log #198
2024/07/30-09:10:55.047779 7f61a02006c0 Delete type=3 #131 2025/08/11-21:34:20.149715 7f12effff6c0 Delete type=3 #196
2024/07/30-09:10:55.047946 7f61a02006c0 Delete type=0 #133 2025/08/11-21:34:20.149828 7f12effff6c0 Delete type=0 #198
2024/07/30-09:23:03.151197 7f619e8006c0 Level-0 table #138: started 2025/08/11-22:51:08.062220 7f12edffb6c0 Level-0 table #203: started
2024/07/30-09:23:03.151237 7f619e8006c0 Level-0 table #138: 0 bytes OK 2025/08/11-22:51:08.062246 7f12edffb6c0 Level-0 table #203: 0 bytes OK
2024/07/30-09:23:03.188887 7f619e8006c0 Delete type=0 #136 2025/08/11-22:51:08.068241 7f12edffb6c0 Delete type=0 #201
2024/07/30-09:23:03.189323 7f619e8006c0 Manual compaction at level-0 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.085439 7f12edffb6c0 Manual compaction at level-0 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end)
2024/07/30-09:23:03.189365 7f619e8006c0 Manual compaction at level-1 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.085475 7f12edffb6c0 Manual compaction at level-1 from '!items!0cNSRJVPk3GbvxfD' @ 72057594037927935 : 1 .. '!items!yWDg2KlXEz33TSmZ' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000139 MANIFEST-000207

View File

@@ -1,8 +1,8 @@
2024/07/30-09:26:48.831897 7f619f8006c0 Recovering log #137 2025/08/11-22:51:18.291417 7f12ee7fc6c0 Recovering log #204
2024/07/30-09:26:48.842926 7f619f8006c0 Delete type=3 #135 2025/08/11-22:51:18.301512 7f12ee7fc6c0 Delete type=3 #202
2024/07/30-09:26:48.843016 7f619f8006c0 Delete type=0 #137 2025/08/11-22:51:18.301601 7f12ee7fc6c0 Delete type=0 #204
2024/07/30-09:29:38.578835 7f619e8006c0 Level-0 table #142: started 2025/08/11-22:52:41.243942 7f12edffb6c0 Level-0 table #210: started
2024/07/30-09:29:38.578921 7f619e8006c0 Level-0 table #142: 0 bytes OK 2025/08/11-22:52:41.244021 7f12edffb6c0 Level-0 table #210: 0 bytes OK
2024/07/30-09:29:38.585476 7f619e8006c0 Delete type=0 #140 2025/08/11-22:52:41.250458 7f12edffb6c0 Delete type=0 #208
2024/07/30-09:29:38.606759 7f619e8006c0 Manual compaction at level-0 from '!items!0V86n4TU8NegrR2B' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.264517 7f12edffb6c0 Manual compaction at level-0 from '!folders!FBCujRu055QLePB2' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end)
2024/07/30-09:29:38.606861 7f619e8006c0 Manual compaction at level-1 from '!items!0V86n4TU8NegrR2B' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.264551 7f12edffb6c0 Manual compaction at level-1 from '!folders!FBCujRu055QLePB2' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,15 @@
2024/07/30-09:10:54.992903 7f61a16006c0 Recovering log #133 2025/08/11-21:34:19.906242 7f12effff6c0 Recovering log #200
2024/07/30-09:10:55.003212 7f61a16006c0 Delete type=3 #131 2025/08/11-21:34:19.959359 7f12effff6c0 Delete type=3 #198
2024/07/30-09:10:55.003337 7f61a16006c0 Delete type=0 #133 2025/08/11-21:34:19.959494 7f12effff6c0 Delete type=0 #200
2024/07/30-09:23:03.108114 7f619e8006c0 Level-0 table #138: started 2025/08/11-22:51:08.074684 7f12edffb6c0 Level-0 table #205: started
2024/07/30-09:23:03.108172 7f619e8006c0 Level-0 table #138: 0 bytes OK 2025/08/11-22:51:08.078126 7f12edffb6c0 Level-0 table #205: 31504 bytes OK
2024/07/30-09:23:03.151019 7f619e8006c0 Delete type=0 #136 2025/08/11-22:51:08.085271 7f12edffb6c0 Delete type=0 #203
2024/07/30-09:23:03.189301 7f619e8006c0 Manual compaction at level-0 from '!items!0V86n4TU8NegrR2B' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.085480 7f12edffb6c0 Manual compaction at level-0 from '!folders!FBCujRu055QLePB2' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end)
2024/07/30-09:23:03.189378 7f619e8006c0 Manual compaction at level-1 from '!items!0V86n4TU8NegrR2B' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.085510 7f12edffb6c0 Manual compaction at level-1 from '!folders!FBCujRu055QLePB2' @ 72057594037927935 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at '!items!zEl2NQsnCpELVWzh' @ 338 : 1
2025/08/11-22:51:08.085516 7f12edffb6c0 Compacting 1@1 + 1@2 files
2025/08/11-22:51:08.088988 7f12edffb6c0 Generated table #206@1: 77 keys, 31504 bytes
2025/08/11-22:51:08.089022 7f12edffb6c0 Compacted 1@1 + 1@2 files => 31504 bytes
2025/08/11-22:51:08.095088 7f12edffb6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2025/08/11-22:51:08.095209 7f12edffb6c0 Delete type=2 #197
2025/08/11-22:51:08.095332 7f12edffb6c0 Delete type=2 #205
2025/08/11-22:51:08.115239 7f12edffb6c0 Manual compaction at level-1 from '!items!zEl2NQsnCpELVWzh' @ 338 : 1 .. '!items!zEl2NQsnCpELVWzh' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000139 MANIFEST-000204

View File

@@ -1,8 +1,8 @@
2024/07/30-09:26:48.860691 7f61a02006c0 Recovering log #137 2025/08/11-22:51:18.324133 7f12effff6c0 Recovering log #202
2024/07/30-09:26:48.871716 7f61a02006c0 Delete type=3 #135 2025/08/11-22:51:18.335594 7f12effff6c0 Delete type=3 #200
2024/07/30-09:26:48.871819 7f61a02006c0 Delete type=0 #137 2025/08/11-22:51:18.336174 7f12effff6c0 Delete type=0 #202
2024/07/30-09:29:38.592995 7f619e8006c0 Level-0 table #142: started 2025/08/11-22:52:41.250593 7f12edffb6c0 Level-0 table #207: started
2024/07/30-09:29:38.593062 7f619e8006c0 Level-0 table #142: 0 bytes OK 2025/08/11-22:52:41.250618 7f12edffb6c0 Level-0 table #207: 0 bytes OK
2024/07/30-09:29:38.599648 7f619e8006c0 Delete type=0 #140 2025/08/11-22:52:41.257077 7f12edffb6c0 Delete type=0 #205
2024/07/30-09:29:38.606816 7f619e8006c0 Manual compaction at level-0 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.264527 7f12edffb6c0 Manual compaction at level-0 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end)
2024/07/30-09:29:38.606905 7f619e8006c0 Manual compaction at level-1 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.264560 7f12edffb6c0 Manual compaction at level-1 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2024/07/30-09:10:55.021975 7f619f8006c0 Recovering log #133 2025/08/11-21:34:20.017484 7f12eeffd6c0 Recovering log #198
2024/07/30-09:10:55.033025 7f619f8006c0 Delete type=3 #131 2025/08/11-21:34:20.093316 7f12eeffd6c0 Delete type=3 #196
2024/07/30-09:10:55.033200 7f619f8006c0 Delete type=0 #133 2025/08/11-21:34:20.093428 7f12eeffd6c0 Delete type=0 #198
2024/07/30-09:23:03.033848 7f619e8006c0 Level-0 table #138: started 2025/08/11-22:51:08.068405 7f12edffb6c0 Level-0 table #203: started
2024/07/30-09:23:03.033938 7f619e8006c0 Level-0 table #138: 0 bytes OK 2025/08/11-22:51:08.068464 7f12edffb6c0 Level-0 table #203: 0 bytes OK
2024/07/30-09:23:03.068751 7f619e8006c0 Delete type=0 #136 2025/08/11-22:51:08.074542 7f12edffb6c0 Delete type=0 #201
2024/07/30-09:23:03.189232 7f619e8006c0 Manual compaction at level-0 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.085448 7f12edffb6c0 Manual compaction at level-0 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end)
2024/07/30-09:23:03.189337 7f619e8006c0 Manual compaction at level-1 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.085490 7f12edffb6c0 Manual compaction at level-1 from '!items!2QqvtClSVnh5ejXu' @ 72057594037927935 : 1 .. '!items!xzRJ6JP1HqoqxLdj' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1 @@
MANIFEST-000002

5
packs/magie-sorts/LOG Normal file
View File

@@ -0,0 +1,5 @@
2025/08/11-22:51:18.389099 7f12eeffd6c0 Delete type=3 #1
2025/08/11-22:52:41.270919 7f12edffb6c0 Level-0 table #5: started
2025/08/11-22:52:41.274955 7f12edffb6c0 Level-0 table #5: 72907 bytes OK
2025/08/11-22:52:41.281286 7f12edffb6c0 Delete type=0 #3
2025/08/11-22:52:41.294945 7f12edffb6c0 Manual compaction at level-0 from '!folders!NE8l8XLXdVUw0aZm' @ 72057594037927935 : 1 .. '!items!zjQQhJpujpdbG4zl' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

BIN
packs/pouvoirs/000180.ldb Normal file

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000140 MANIFEST-000205

View File

@@ -1,8 +1,8 @@
2024/07/30-09:26:48.920872 7f61a02006c0 Recovering log #137 2025/08/11-22:51:18.409703 7f12eeffd6c0 Recovering log #203
2024/07/30-09:26:48.931697 7f61a02006c0 Delete type=3 #135 2025/08/11-22:51:18.420789 7f12eeffd6c0 Delete type=3 #201
2024/07/30-09:26:48.931863 7f61a02006c0 Delete type=0 #137 2025/08/11-22:51:18.420873 7f12eeffd6c0 Delete type=0 #203
2024/07/30-09:29:38.614872 7f619e8006c0 Level-0 table #143: started 2025/08/11-22:52:41.288698 7f12edffb6c0 Level-0 table #208: started
2024/07/30-09:29:38.614928 7f619e8006c0 Level-0 table #143: 0 bytes OK 2025/08/11-22:52:41.288730 7f12edffb6c0 Level-0 table #208: 0 bytes OK
2024/07/30-09:29:38.623464 7f619e8006c0 Delete type=0 #141 2025/08/11-22:52:41.294715 7f12edffb6c0 Delete type=0 #206
2024/07/30-09:29:38.640807 7f619e8006c0 Manual compaction at level-0 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.294992 7f12edffb6c0 Manual compaction at level-0 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end)
2024/07/30-09:29:38.640941 7f619e8006c0 Manual compaction at level-1 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.295062 7f12edffb6c0 Manual compaction at level-1 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end)

View File

@@ -1,15 +1,8 @@
2024/07/30-09:10:55.082770 7f619f8006c0 Recovering log #133 2025/08/11-21:34:20.258603 7f12effff6c0 Recovering log #199
2024/07/30-09:10:55.094232 7f619f8006c0 Delete type=3 #131 2025/08/11-21:34:20.318194 7f12effff6c0 Delete type=3 #197
2024/07/30-09:10:55.094379 7f619f8006c0 Delete type=0 #133 2025/08/11-21:34:20.318250 7f12effff6c0 Delete type=0 #199
2024/07/30-09:23:03.272516 7f619e8006c0 Level-0 table #138: started 2025/08/11-22:51:08.109218 7f12edffb6c0 Level-0 table #204: started
2024/07/30-09:23:03.296681 7f619e8006c0 Level-0 table #138: 278828 bytes OK 2025/08/11-22:51:08.109241 7f12edffb6c0 Level-0 table #204: 0 bytes OK
2024/07/30-09:23:03.335294 7f619e8006c0 Delete type=0 #136 2025/08/11-22:51:08.115092 7f12edffb6c0 Delete type=0 #202
2024/07/30-09:23:03.372532 7f619e8006c0 Manual compaction at level-0 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.115290 7f12edffb6c0 Manual compaction at level-0 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end)
2024/07/30-09:23:03.372589 7f619e8006c0 Manual compaction at level-1 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at '!items!zON0h5SjFyANjPnA' @ 285 : 1 2025/08/11-22:51:08.115335 7f12edffb6c0 Manual compaction at level-1 from '!items!19r9ijZUyvnlIqgm' @ 72057594037927935 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end)
2024/07/30-09:23:03.372598 7f619e8006c0 Compacting 1@1 + 1@2 files
2024/07/30-09:23:03.396725 7f619e8006c0 Generated table #139@1: 135 keys, 278828 bytes
2024/07/30-09:23:03.396780 7f619e8006c0 Compacted 1@1 + 1@2 files => 278828 bytes
2024/07/30-09:23:03.445194 7f619e8006c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2024/07/30-09:23:03.445387 7f619e8006c0 Delete type=2 #106
2024/07/30-09:23:03.445870 7f619e8006c0 Delete type=2 #138
2024/07/30-09:23:03.521388 7f619e8006c0 Manual compaction at level-1 from '!items!zON0h5SjFyANjPnA' @ 285 : 1 .. '!items!zON0h5SjFyANjPnA' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

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

View File

@@ -1 +1 @@
MANIFEST-000138 MANIFEST-000202

View File

@@ -1,7 +1,7 @@
2024/07/30-09:26:48.951614 7f619f8006c0 Recovering log #136 2025/08/11-22:51:18.440585 7f12ef7fe6c0 Recovering log #200
2024/07/30-09:26:48.962377 7f619f8006c0 Delete type=3 #134 2025/08/11-22:51:18.452074 7f12ef7fe6c0 Delete type=3 #198
2024/07/30-09:26:48.962496 7f619f8006c0 Delete type=0 #136 2025/08/11-22:51:18.452406 7f12ef7fe6c0 Delete type=0 #200
2024/07/30-09:29:38.631861 7f619e8006c0 Level-0 table #141: started 2025/08/11-22:52:41.301484 7f12edffb6c0 Level-0 table #205: started
2024/07/30-09:29:38.631900 7f619e8006c0 Level-0 table #141: 0 bytes OK 2025/08/11-22:52:41.301507 7f12edffb6c0 Level-0 table #205: 0 bytes OK
2024/07/30-09:29:38.640515 7f619e8006c0 Delete type=0 #139 2025/08/11-22:52:41.307731 7f12edffb6c0 Delete type=0 #203
2024/07/30-09:29:38.640860 7f619e8006c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.321197 7f12edffb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2024/07/30-09:10:55.114542 7f61a16006c0 Recovering log #132 2025/08/11-21:34:20.376707 7f12eeffd6c0 Recovering log #196
2024/07/30-09:10:55.125060 7f61a16006c0 Delete type=3 #130 2025/08/11-21:34:20.429317 7f12eeffd6c0 Delete type=3 #194
2024/07/30-09:10:55.125159 7f61a16006c0 Delete type=0 #132 2025/08/11-21:34:20.429419 7f12eeffd6c0 Delete type=0 #196
2024/07/30-09:23:03.446260 7f619e8006c0 Level-0 table #137: started 2025/08/11-22:51:08.115446 7f12edffb6c0 Level-0 table #201: started
2024/07/30-09:23:03.446314 7f619e8006c0 Level-0 table #137: 0 bytes OK 2025/08/11-22:51:08.115492 7f12edffb6c0 Level-0 table #201: 0 bytes OK
2024/07/30-09:23:03.482153 7f619e8006c0 Delete type=0 #135 2025/08/11-22:51:08.121470 7f12edffb6c0 Delete type=0 #199
2024/07/30-09:23:03.558536 7f619e8006c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.147831 7f12edffb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
packs/scenes/000148.ldb Normal file

Binary file not shown.

0
packs/scenes/000175.log Normal file
View File

View File

@@ -1 +1 @@
MANIFEST-000108 MANIFEST-000173

View File

@@ -1,8 +1,8 @@
2024/07/30-09:26:48.966405 7f61a0c006c0 Recovering log #106 2025/08/11-22:51:18.458421 7f12eeffd6c0 Recovering log #171
2024/07/30-09:26:48.976989 7f61a0c006c0 Delete type=3 #104 2025/08/11-22:51:18.469978 7f12eeffd6c0 Delete type=3 #169
2024/07/30-09:26:48.977132 7f61a0c006c0 Delete type=0 #106 2025/08/11-22:51:18.470069 7f12eeffd6c0 Delete type=0 #171
2024/07/30-09:29:38.667547 7f619e8006c0 Level-0 table #111: started 2025/08/11-22:52:41.314747 7f12edffb6c0 Level-0 table #176: started
2024/07/30-09:29:38.667608 7f619e8006c0 Level-0 table #111: 0 bytes OK 2025/08/11-22:52:41.314796 7f12edffb6c0 Level-0 table #176: 0 bytes OK
2024/07/30-09:29:38.679898 7f619e8006c0 Delete type=0 #109 2025/08/11-22:52:41.320976 7f12edffb6c0 Delete type=0 #174
2024/07/30-09:29:38.680276 7f619e8006c0 Manual compaction at level-0 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.321230 7f12edffb6c0 Manual compaction at level-0 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end)
2024/07/30-09:29:38.680339 7f619e8006c0 Manual compaction at level-1 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end) 2025/08/11-22:52:41.321269 7f12edffb6c0 Manual compaction at level-1 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2024/07/30-09:10:55.129106 7f61a0c006c0 Recovering log #102 2025/08/11-21:34:20.432403 7f12effff6c0 Recovering log #167
2024/07/30-09:10:55.140215 7f61a0c006c0 Delete type=3 #100 2025/08/11-21:34:20.484938 7f12effff6c0 Delete type=3 #165
2024/07/30-09:10:55.140318 7f61a0c006c0 Delete type=0 #102 2025/08/11-21:34:20.484995 7f12effff6c0 Delete type=0 #167
2024/07/30-09:23:03.482450 7f619e8006c0 Level-0 table #107: started 2025/08/11-22:51:08.140001 7f12edffb6c0 Level-0 table #172: started
2024/07/30-09:23:03.482514 7f619e8006c0 Level-0 table #107: 0 bytes OK 2025/08/11-22:51:08.140028 7f12edffb6c0 Level-0 table #172: 0 bytes OK
2024/07/30-09:23:03.521050 7f619e8006c0 Delete type=0 #105 2025/08/11-22:51:08.147678 7f12edffb6c0 Delete type=0 #170
2024/07/30-09:23:03.558562 7f619e8006c0 Manual compaction at level-0 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.147861 7f12edffb6c0 Manual compaction at level-0 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end)
2024/07/30-09:23:03.596053 7f619e8006c0 Manual compaction at level-1 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end) 2025/08/11-22:51:08.157987 7f12edffb6c0 Manual compaction at level-1 from '!scenes!8DjkNeeujp2qff1N' @ 72057594037927935 : 1 .. '!scenes!ypDutqjqZcr7lx6I' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

19
srcdata/normalize.py Normal file
View File

@@ -0,0 +1,19 @@
import json
FIELDS = ["name", "competence", "description", "duree", "portee", "concentration", "critique", "ingredients", "resistance"]
def capitalize_first_letter(s):
if isinstance(s, str) and s:
return s[0].upper() + s[1:]
return s
with open("../srcdata/sort_magieduclan.json", "r", encoding="utf-8") as f:
data = json.load(f)
for spell in data:
for field in FIELDS:
if field in spell:
spell[field] = capitalize_first_letter(spell[field])
with open("../srcdata/sort_magieduclan.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)

287
srcdata/sort_druidisme.json Normal file
View File

@@ -0,0 +1,287 @@
[
{
"name": "Rituels de purification",
"description": "Les rituels de purification consistent à laver une souillure le plus souvent physique et/ou spirituelle, quand le mauvais œil (ou une malédiction) a été placé sur un lieu ou un objet : sang et tripes de cochon versés dans un puits, chouette aux yeux crevés clouée à une porte, crucifix figé dans un chêne, poupée de paille percée daiguilles, etc. Outre le nettoyage des éléments physiques, le rituel consiste à recourir aux plantes purgatives et aux fumigations naturelles appropriées, associées à une récitation de formules consacrées à la Grande Mère. Note : un individu changé en animal contre son gré à laide dune amulette druidique ou dune potion de faëomancie est considéré comme « maudit » et peut être purifié à laide de ce rituel pour retrouver sa forme dorigine. Le SD du rituel sera égal au SD du niveau de maîtrise du sort qui a servi à la métamorphose, ou bien fixé par le Docte.",
"niveau": 1,
"competence": "Druidisme",
"carac1": "esp",
"carac2": "pres",
"duree": "",
"portee": "",
"concentration": "",
"critique": "",
"ingredients": "Plantes purgatives et aux fumigations naturelles appropriées",
"resistance": "",
"coutactivation": ""
},
{
"name": "Philtre de veille",
"description": "Faire macérer des poignées de ronces et dorties dans de leau salée du lever jusquau coucher de soleil. Pour chaque poignée macérée est produite une dose de philtre. Égoutter les ronces et les orties, les calciner et réduire le charbon ainsi obtenu en une fine poudre. Incorporer celle-ci au liquide issu de la macération ; faire chauffer jusquà ébullition. Réciter les paroles propitiatoires. Ce philtre doit être bu à la nuit tombée. Son utilisateur ne ressent pas les effets de la fatigue pendant la nuit et le jour qui suit, et il ne subit pas les désagréments du manque de sommeil (battements de cœur, troubles de la perception, somnolence…). En revanche, il seffondrera de sommeil au prochain coucher de soleil.",
"niveau": 1,
"competence": "Druidisme",
"carac1": "esp",
"carac2": "prec",
"duree": "Jusquau prochain coucher de soleil",
"portee": "",
"concentration": "Macération (du lever au coucher de soleil) + préparation",
"critique": "Le philtre dure une journée de plus",
"ingredients": "Ronces et orties",
"resistance": "",
"coutactivation": ""
},
{
"name": "Philtre de sommeil",
"description": "Faire bouillir les fleurs de belladone et de passiflore ensemble. Ajouter à la décoction une pointe de miel pour le goût. Renforce le pouvoir soporifique et apaisant des plantes par les paroles rituelles. Le goût sucré rend ce philtre facile à dissimuler dans une pâtisserie ou dans un fruit qui en serait imbibé pendant une nuit. Celui qui absorbe ce philtre commencera à sassoupir une minute après, et dormira sur ses deux oreilles dans les trois minutes qui suivent.",
"niveau": 1,
"competence": "Druidisme",
"carac1": "esp",
"carac2": "prec",
"duree": "6 heures, sauf si le dormeur est réveillé de manière active par autrui",
"portee": "",
"concentration": "Préparation",
"critique": "La durée est doublée",
"ingredients": "Belladone, passiflore et miel",
"resistance": "Physique contre le résultat du sort (ou SD 14) pour ne pas sassoupir",
"coutactivation": ""
},
{
"name": "Philtre damour",
"description": "Faire macérer les pétales dune rose dans de leau. Piler les racines dune mandragore et les incorporer à la macération. Intégrer au mélange trois larmes en prononçant le poème rituel, puis filtrer le tout. Boire ce philtre rend surnaturellement attirant : il fait bénéficier dun bonus de + 2 à toute tentative de séduction. Ce bonus est cumulable avec dautres de même nature (par exemple issus davantages ou datouts féériques).",
"niveau": 1,
"competence": "Druidisme",
"carac1": "esp",
"carac2": "prec",
"duree": "Jusquà ce que lutilisateur se lave",
"portee": "",
"concentration": "Préparation",
"critique": "Lutilisateur bénéficie non plus dun bonus de + 2, mais dun bonus de + 3 à toutes ses tentatives de séduction",
"ingredients": "Mandragore et rose",
"resistance": "",
"coutactivation": ""
},
{
"name": "Philtre de descendance féérique",
"description": "Réduire les fleurs dacacia et clous de girofle en poudre, mélanger aux larmes et réciter les paroles sacrées au moment dune pleine lune. Quelques gouttes de ce philtre bues par une femme ou une fée avant de faire lamour garantiront que, si elle conçoit un enfant avec un Faux-Semblant, celui-ci sera également un Faux-Semblant (de lespèce du père ou de la mère). Un philtre équivalent élaboré avec des larmes humaines garantit que lenfant éventuel sera humain.",
"niveau": 1,
"competence": "Druidisme",
"carac1": "esp",
"carac2": "prec",
"duree": "2 heures",
"portee": "",
"concentration": "Préparation",
"critique": "Le philtre accroît considérablement les chances de fécondation",
"ingredients": "Fleurs dacacia, clous de girofle, larmes de pixie ou dhumain",
"resistance": "",
"coutactivation": ""
},
{
"name": "Philtre de bienveillance végétale",
"description": "Écraser les feuilles de lierre et en retirer le jus. Mélanger celui-ci à du jus de sureau. Le mélange doit être exposé pendant une nuit à la lueur de la pleine lune, au cours de laquelle le druide répétera le poème consacré. La préparation ainsi obtenue rendra la présence de la personne qui la boit très agréable à la végétation environnante. Celle-ci sécartera sur son passage, même sil sagit de ronciers inextricables, et se refermera derrière elle comme si personne nétait passé, facilitant les trajets à travers les broussailles, sous-bois ou jungles comme si elle marchait sur un chemin pédestre. Si un test de Survie est requis, un bonus reflétant cette collaboration des plantes sera fixé par le Docte.",
"niveau": 1,
"competence": "Druidisme",
"carac1": "esp",
"carac2": "prec",
"duree": "6 heures",
"portee": "",
"concentration": "Exposition pendant une nuit + préparation",
"critique": "La durée est doublée",
"ingredients": "Feuilles de lierre, baies de sureau",
"resistance": "",
"coutactivation": ""
},
{
"name": "Philtre tord-boyaux",
"description": "Envelopper les baies de houx dans les feuilles dhortensia, écraser le tout et en extraire le jus. Diluer le liquide dans sept gouttes de rosée et réciter les paroles consacrées afin que le philtre soit presque indétectable et que son goût normalement très amer devienne douceâtre. Descriptif du poison : Voies dadministration : ingestion. Toxicité : 5 Virulence : 15 Signature : 15. Lavantage de ce philtre est quil passera beaucoup plus facilement pour une simple intoxication alimentaire quun empoisonnement à larsenic. Complexité : n. a. Temps de fabrication : une heure avant laube Effets : le philtre tord-boyaux est un liquide translucide au goût douceâtre. Ce goût subtil est aisément dissimulé dans un plat à la saveur prononcée. La substance a linsigne avantage de ne pas perdre ses effets lors dune éventuelle cuisson. Ingéré, le poison commence à faire effet au cours de la digestion (deux heures). Il cause des maux de ventre, des vomissements et des diarrhées si aigus que celui qui lingère se tordra de douleur pendant 4 heures. En cas déchec à un test de Ressort (Endurer) + CON SD 15 pour Résister à la Virulence du poison, la victime perdra Toxicité + ME points de vie en plus de subir un malus de - 5 à toutes ses actions. En cas de réussite, ce malus est réduit à - 2. Note : voir le supplément Drogues délicieuses et effroyables poisons pour plus de détails sur le fonctionnement des poisons, et sur la terminologie propre à ces derniers qui est employée ici pour ce philtre. Notez que deux des poisons qui sont décrits dans cet opuscule, « Humeur de basilic » et « Sang de manticore », sont aussi des poisons fabriqués par les druides la plupart du temps.",
"niveau": 1,
"competence": "Druidisme",
"carac1": "esp",
"carac2": "prec",
"duree": "4 heures (effets)",
"portee": "",
"concentration": "Une heure avant laube (fabrication)",
"critique": "La Signature est augmentée de 2",
"ingredients": "Baies de houx et feuilles dhortensia",
"resistance": "Physique (ressort + con)",
"coutactivation": ""
},
{
"name": "Le rituel des Portes dAvalon",
"description": "Voilà bien longtemps déjà que, pour les profanes, les chemins dAvalon se sont perdus dans les brumes de loubli. Désormais, seuls les druides sont en mesure de sy rendre grâce au rituel des portes dAvalon. Ce rituel est un secret bien gardé parmi les druides, car nombreux sont les ennemis de la Grande Mère et des fées qui aimeraient trouver le chemin de la contrée féérique pour en voler les ressources ou pire, la pervertir voire la détruire. Pour se rendre en Avalon, le druide doit trouver un portail, cest-à-dire deux chênes aux ramures inextricablement entrelacées. Il peut également, grâce à ses pouvoirs, le fabriquer. Puis il doit réciter le poème rituel tout en avalant un gland issu dun chêne avalonien. Lorsque sa litanie prend fin, le brouillard se lève et entoure les chênes dont on naperçoit plus que les troncs. En regardant attentivement, on peut discerner une fine pellicule deau ruisseler des ramures qui finissent par disparaître. Le passage est ouvert. Les invités du druide peuvent passer, mais attention ! Le passage se referme dès lors que le druide est passé, à moins que ce dernier ne le maintienne ouvert à dessein, ce qui est normalement interdit. Note : ce rituel est enseigné à tous les Saronides et ne requiert pas lhabituelle dépense de 5 points dXP accompagnant lapprentissage dun nouveau sort.",
"niveau": 2,
"competence": "Druidisme",
"carac1": "esp",
"carac2": "pres",
"duree": "",
"portee": "Au portail",
"concentration": "Réciter le poème rituel",
"critique": "",
"ingredients": "Gland issu dun chêne avalonien",
"resistance": "",
"coutactivation": ""
},
{
"name": "Rituel de malédiction",
"description": "Les druides sont censés déjouer les malédictions, purifier les lieux souillés ou les victimes du mauvais œil. Cependant, à partir du deuxième cercle, ils sont capables eux-mêmes de maudire un objet, une personne ou un lieu. Un rituel de malédiction fonctionne à rebours dun rituel de purification. Le druide trouve un objet ou une substance comme support de sa malédiction et récite des paroles rituelles désignant la cible, le plus souvent à minuit, à la faveur de la lune. Leffet de ce type de malédiction mineure est ouvert aux fantaisies du Docte (ou des joueurs) : pustules sur la langue, chute de cheveux (saccompagnant dun malus de -1 en Prestance), maladresse chronique (malus de -1 en Précision ou Agilité), etc. Si vous songez à une malédiction majeure aux effets bien plus redoutables, augmentez le SD et exigez un rituel collectif. Dans tous les cas, une malédiction majeure sera très mal vue au sein de la communauté druidique et le responsable risque lexclusion. Note : le fonctionnement de ce rituel est enseigné à tous les Saronides et ne requiert pas lhabituelle dépense de 5 points dXP accompagnant lapprentissage dun nouveau sort.",
"niveau": 2,
"competence": "Druidisme",
"carac1": "esp",
"carac2": "pres",
"duree": "",
"portee": "",
"concentration": "Récite des paroles rituelles",
"critique": "",
"ingredients": "Objet ou une substance comme support",
"resistance": "Psychique ou physique (la plus élevée de la cible)",
"coutactivation": ""
},
{
"name": "Semence de lierre rouge",
"description": "Enduire la graine de lierre avec du crottin dhippogriffe et attendre trois jours. Après cela, une pousse sortira de la graine et il faudra chanter une strophe dépopée en celte transformant la graine germée en arme. Lorsque celle-ci touchera le sol à proximité dun ennemi de celui qui la lancée, des lianes de lierre rouge enchevêtreront ses pieds jusquaux genoux et conféreront un malus de -1 aux actions de la cible impliquant un mouvement. Ensuite, à chaque tour, le lierre montera davantage et deviendra plus vigoureux et difficile à trancher. La victime pourra se battre, mais non bouger ses jambes et souffrira donc dun malus de -1 supplémentaire pour toute attaque de Mêlée, parade ou bien esquive. Le malus maximum est -5, quand la cible est presque immobilisée par un lierre rouge qui lui enserre tout le corps jusquà la tête. Il faudra trancher ou brûler le lierre en causant 10 points de dégâts grâce à une arme tranchante ou un jet de flamme avec un SD de 13 (un échec critique signifiera que le coup a touché la cible). Sans arme tranchante ou flamme, le lierre rouge continuera à pousser et se renforcer, mais finira par se flétrir au bout de 15 minutes.",
"niveau": 2,
"competence": "Druidisme",
"carac1": "esp",
"carac2": "",
"duree": "15 minutes (si non coupée/brûlée)",
"portee": "À proximité",
"concentration": "Préparation sur trois jours + chant",
"critique": "Les points de vie du lierre sont doublés pour déterminer combien de coups darmes tranchantes sont nécessaires afin de le couper",
"ingredients": "Une graine de lierre avalonien et du crottin dhippogriffe",
"resistance": "",
"coutactivation": ""
},
{
"name": "Semence de ronce curatrice",
"description": "Cracher sur la ronce et lenduire de pollen déglantine avalonien. Lenterrer en récitant le poème consacré et attendre trois jours. Le troisième jour, alors que laube étend son voile de rosée sur le monde, déterrer la ronce qui émet une très légère aura verte et pulsatile. Une fois que la ronce a été bénie, le druide doit lappliquer sur la blessure quil veut guérir. Ses épines senfoncent douloureusement dans la peau du blessé afin de la refermer, tels des points de suture. Le blessé regagne instantanément 1d8 points de vie car la ronce sert de cicatrisant. Lorsque la cicatrisation naturelle du blessé est terminée, la ronce sèche et tombe delle-même. Cette semence permet de cicatriser, mais aussi dôter les corps étrangers (comme les balles) : la ronce sintroduit jusquau matériau, lenserre et le repousse, non sans causer une douleur extrême si aucun anesthésiant nest utilisé (test de Ressort + CON SD 14 pour ne pas sévanouir pendant ME minutes).",
"niveau": 2,
"competence": "Druidisme",
"carac1": "esp",
"carac2": "",
"duree": "Jusquà cicatrisation naturelle",
"portee": "Contact",
"concentration": "Préparation sur trois jours + poème",
"critique": "La semence rend directement 8 points de vie au lieu d1d8",
"ingredients": "Ronce du pays dhiver et pollen déglantine avalonienne",
"resistance": "Ressort (con)",
"coutactivation": ""
},
{
"name": "Semence de force",
"description": "Faire bouillir une poignée de fleurs de trèfle rouge pendant une journée, puis faire macérer la feuille de chêne avalonien dans le liquide obtenu. Faire sécher la feuille de chêne avalonien au soleil jusquà ce que des petits piquants poussent sur cette dernière. Après bénédiction du druide, lutilisateur doit poser la feuille de chêne enchantée sur son plexus solaire et appuyer jusquà ce que les petits piquants lui rentrent dans la peau. La feuille sintègre alors temporairement au corps de lutilisateur. Elle lui confère un bonus temporaire de + 2 en Force. Ce bonus est cumulable avec celui de la Capacité naturelle Force accrue (mais aucune créature naturelle ne peut avoir plus de 10 en Force). Au prochain lever de soleil, la feuille de chêne tombe delle-même, jaunie et racornie.",
"niveau": 2,
"competence": "Druidisme",
"carac1": "esp",
"carac2": "",
"duree": "Jusquau prochain lever de soleil",
"portee": "Contact",
"concentration": "Préparation d'une journée + séchage + bénédiction",
"critique": "Bonus de + 3 au lieu de + 2",
"ingredients": "Feuille de chêne avalonien et fleurs de trèfle rouge",
"resistance": "",
"coutactivation": ""
},
{
"name": "Semence de chêne",
"description": "Écraser les baies du gui avalonien et recouvrir le gland de la substance obtenue. Exposer le gland sur un lit de gui avalonien au soleil pendant sept jours, puis réciter le poème consacré et cracher sur le gland. Après bénédiction, lorsque la semence de chêne touche la terre, cest-à-dire le berceau de la Grande Mère, elle se met à pousser à une vitesse fulgurante. En cinq tours, la plante a atteint sa pleine maturité. Elle suit, ensuite, son cycle naturel. Note : dans lintention dutiliser la semence de chêne pour le rituel des Portes dAvalon, il suffit den planter deux à trois mètres de distance lune de lautre et dattendre sept jours.",
"niveau": 2,
"competence": "Druidisme",
"carac1": "esp",
"carac2": "",
"duree": "Suit son cycle naturel après 5 tours de croissance",
"portee": "",
"concentration": "Préparation sur sept jours + poème",
"critique": "Le chêne généré grâce à cette semence est sage, et prodiguera des conseils avisés à ceux qui peuvent communiquer avec lui. Cest un miracle de la Grande Mère qui deviendra objet de soin des druides et des fées proches de la nature",
"ingredients": "Gland et gui avalonien",
"resistance": "",
"coutactivation": ""
},
{
"name": "Semence de haricot magique",
"description": "Le druide doit cueillir lui-même des haricots, les écosser et en faire sécher les semences pendant deux jours. Ensuite, il lui faut demander à une licorne quelle crache dessus, et réciter les paroles rituelles. Au contact de la terre, comme dans le conte, le haricot poussera à une vitesse prodigieuse et atteindra une hauteur de 12 mètres. Il est possible de grimper aux branches comme à une échelle ou bien de se placer au-dessus de la graine pour être hissé au moment de la croissance. Le haricot supporte un poids de 500 kg. Pour atteindre sa pleine hauteur, 3 minutes sont requises. Le Pouvoir Main verte du sylve sur un haricot magique divisera par 3 le temps de croissance, multipliera par 3 sa capacité de charge ainsi que la hauteur atteinte, jusquà 36 mètres (46 mètres avec une réussite critique). Note : la durée de vie de cette plante géante est limitée. Au bout de 6 heures, elle se flétrira puis pourrira.",
"niveau": 2,
"competence": "Druidisme",
"carac1": "esp",
"carac2": "",
"duree": "6 heures",
"portee": "",
"concentration": "Préparation sur deux jours + salive de licorne + poème",
"critique": "La hauteur du haricot est augmentée de 10 mètres",
"ingredients": "Haricot avalonien du pays dété et salive de licorne",
"resistance": "",
"coutactivation": ""
},
{
"name": "Amulette de métamorphose en aigle",
"description": "Le druide doit préparer une pâte en mélangeant largile et leau de rosée. Lorsque la pâte atteint la bonne consistance, il doit la modeler en forme daigle et y planter la plume daigle en prononçant les paroles rituelles. Pour utiliser son amulette, le druide doit la briser sur sa cible en récitant à nouveau les paroles rituelles. Il transforme alors sa cible en aigle. Il peut, bien entendu, être la cible de son propre sort. Certains druides punissent leurs ennemis en les transformant pour longtemps, ou à jamais, en animaux. Cette amulette est déclinable en toutes sortes danimaux et de plantes, et les druides les plus cruels nhésitent pas à transformer leur cible en crapaud… Cependant, notez que le druide doit apprendre un nouveau sort pour chaque animal en lequel il peut se changer ou transformer autrui. En effet, ces amulettes reposent sur la connaissance des noms secrets des choses et des êtres qui nécessitent un apprentissage complexe. Note : il existe des amulettes similaires permettant doctroyer temporairement le Pouvoir de Communication animale ou végétale à la cible pendant une semaine. Elles constituent un sort différent et requièrent un apprentissage dédié (et donc la dépense dXP afférente).",
"niveau": 3,
"competence": "Druidisme",
"carac1": "prec",
"carac2": "",
"duree": "Une semaine, ou jusquà ce que le druide désire faire cesser la métamorphose",
"portee": "Contact",
"concentration": "Préparation",
"critique": "Celui qui est métamorphosé en aigle peut parler aux animaux, quels quils soient",
"ingredients": "Plume daigle, eau de rosée avalonienne, argile avalonien",
"resistance": "Physique pour une cible récalcitrante au pouvoir de lamulette",
"coutactivation": ""
},
{
"name": "Amulette de cercle de protection",
"description": "LOvate doit baigner la large pierre dans de leau vive, la sécher et la faire chauffer pendant une journée. À ce moment, il doit appliquer la feuille de chêne sur la pierre de manière quelle sincruste dedans en récitant les paroles rituelles. Pour activer le cercle de protection, le druide doit délimiter de manière continue son aire daction (fil enterré, frise dans la pierre, canalisation deau…), qui a pour rayon maximal la valeur de Prestance du druide x 100 m. Puis il enterre son amulette au centre du cercle en répétant les paroles rituelles. Dès lors, le cercle de protection est actif, ce qui signifie que nul ne peut y entrer sans y avoir été invité à voix haute par le druide. Les contrevenants sont bloqués par une force invisible. Forcer le passage est possible en réussissant un test de Ressort + FOR ou Fortitude + ESP contre un SD égal au score du test du druide. En cas déchec, le contrevenant sévanouira si sa Résistance psychique est inférieure au SD du sort, sinon, il souffrira dune migraine causant un malus de - 2.",
"niveau": 3,
"competence": "Druidisme",
"carac1": "prec",
"carac2": "",
"duree": "Tant que le cercle est brisé ou que lamulette est déterrée",
"portee": "Valeur de Prestance du druide x 100 m (rayon)",
"concentration": "Préparation d'une journée + délimitation",
"critique": "Le cercle ne peut être brisé que si lamulette est déterrée",
"ingredients": "Large pierre, feuille de chêne avalonien",
"resistance": "Ressort (for / fort / esp)",
"coutactivation": ""
},
{
"name": "Amulette dorage",
"description": "Le druide doit tailler la branche de frêne avalonien en une baguette de la taille de son avant-bras, et limmerger pendant une semaine dans leau de pluie dAvalon. Lorsquil la sort de leau, il doit y graver une rune secrète et prononcer les paroles rituelles. Pour utiliser son amulette, le druide doit voir le ciel et psalmodier les paroles rituelles en le contemplant. Puis, sur la dernière syllabe, il brise la baguette. À partir de ce moment, les nuées commencent à converger et le ciel sobscurcit ; au bout de dix minutes, la pluie se met à tomber. Dix minutes plus tard, lorage est là. Le druide peut manipuler lorage, le déplacer, faire varier lintensité de ses pluies et, surtout, manier la foudre. Pour ce faire, il doit réussir un test de Druidisme + PER SD 15. En cas de réussite, il foudroie sa cible qui subit [MR + 6] points de dégâts. Il peut manier la foudre une fois par tour (une Action), mais cela lui coûte 3 points dÂme à chaque fois (et un point temporaire dEsprit quand sa réserve dÂme est épuisée). Note : il existe dautres amulettes pour contrôler le temps quil fait (invoquer le soleil ou la pluie, etc.). Ce sont des sorts différents, requérant un apprentissage à part entière, mais qui fonctionnent de manière équivalente. Par exemple, une amulette de blizzard fera venir une tempête de neige et le druide pourra diriger de violentes bourrasques à la place de la foudre, ne causant pas de dégâts mais faisant tomber les cibles. Cependant, la température extérieure ne doit pas excéder 10 degrés pour que cette amulette fonctionne.",
"niveau": 3,
"competence": "Druidisme",
"carac1": "prec",
"carac2": "",
"duree": "Jusquà ce que le druide sendorme ou perde conscience",
"portee": "",
"concentration": "Préparation d'une semaine + activation",
"critique": "Lorage se déclenche en une minute",
"ingredients": "Branche de frêne avalonien et eau de pluie avalonienne",
"resistance": "",
"coutactivation": "3 points dÂme (et 1 point temporaire dEsprit si jauge dÂme épuisée) par utilisation de la foudre"
},
{
"name": "Amulette de renaissance du Bras",
"description": "LOvate doit enrouler la patte dours dans les feuilles de marronnier avalonien en prononçant les paroles rituelles. Puis il fait sécher le tout au soleil (la patte ne pourrit pas car elle est déjà enchantée). Pour utiliser son amulette, le druide doit humecter la patte dours avec le sang du manchot. Puis il la jette dans un grand feu en répétant les paroles rituelles tout au long de la combustion. La cible sent alors son bras repousser au fur et à mesure que la patte dours se consume. Lorsquelle est complètement consumée, la cible a complètement récupéré son bras et lusage de celui-ci. Le druide peut être la cible de son propre sort.",
"niveau": 3,
"competence": "Druidisme",
"carac1": "prec",
"carac2": "",
"duree": "Définitive",
"portee": "Contact",
"concentration": "Préparation + séchage + combustion",
"critique": "Le bras nouvellement acquis est irrigué par les forces de la Grande Mère. Il bénéficie dun bonus perpétuel de + 1 en Force (dans la limite du rang 10). Ce bonus est invisible : la cible na pas un bras plus gros que lautre",
"ingredients": "Feuilles de marronnier avalonien et patte dours décédé de mort naturelle",
"resistance": "",
"coutactivation": ""
},
{
"name": "Rituel de réenchantement",
"description": "Un Ovate aidé dau moins trois confrères est capable de restaurer la Féérie dun Faux-Semblant qui aurait été victime du Grand Rituel dexorcisme (voir p. 67) (léquivalent dune malédiction majeure pour sa victime). Le druide peut, en récitant les paroles rituelles pendant trois heures et surtout, au moyen dune quantité invraisemblable de poudre daile de pixie, réenchanter la victime de lexorcisme et lui restituer un rang de Féérie. La victime devra ensuite séjourner un an en Avalon pour redévelopper sa Féérie et pouvoir à nouveau se démasquer. Elle sera de la même espèce et conservera la même apparence quavant, mais devra réapprendre progressivement à utiliser ses Pouvoirs. Note : ce sort difficile, et rarement pratiqué, est connu des Ovates sans quils aient besoin de dépenser dXP pour lapprendre. Il fait partie de leur initiation druidique.",
"niveau": 3,
"competence": "Druidisme",
"carac1": "esp",
"carac2": "",
"duree": "Permanente (restauration), un an (redéveloppement de Féérie)",
"portee": "",
"concentration": "Trois heures de récitation",
"critique": "",
"ingredients": "Poudre daile de pixie",
"resistance": "",
"coutactivation": ""
}
]

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