Compare commits

..

18 Commits

135 changed files with 2358 additions and 271 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.history/

View File

@ -10,7 +10,7 @@ Books are mandatory to play and are available at : http://www.titam-france.fr
Système non-officiel pour le JDR Mournblade (Titam France).
Ce système a été autorisé par Ludospherik ( http://www.ludospherik.fr/ ), merci à eux !
Ce système a été autorisé par Le Département des Sombres Projets, merci à eux !
Les livres du jeu sont nécessaires pour jouer, et sont disponibles ici : http://www.titam-france.fr

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

28
lang/fr.json Normal file
View File

@ -0,0 +1,28 @@
{
"TYPES": {
"Actor": {
"personnage": "Personnage",
"creature": "Créature"
},
"Item": {
"arme": "Arme",
"competence": "Compétence",
"protection": "Protection",
"pacte": "Pacte",
"traitchaotique": "Trait Chaotique",
"monnaie": "Monnaie",
"don": "Don",
"tendance": "Tendance",
"rune": "Rune",
"equipement": "Equipement",
"capacite": "Capacité",
"origine": "Origine",
"heritage": "Héritage",
"metier": "Métier",
"runeeffect": "Effet de Rune",
"bouclier": "Bouclier",
"modifier": "Modificateur",
"traitespece": "Trait d'Espèce"
}
}
}

View File

@ -48,11 +48,20 @@ export class MournbladeActorSheet extends ActorSheet {
marge: this.actor.getMarge(),
tendances:duplicate(this.actor.getTendances()),
runes:duplicate(this.actor.getRunes()),
traitsChaotiques:duplicate(this.actor.getTraitsChaotiques()),
traitsEspeces: duplicate(this.actor.getTraitsEspeces()),
origine: duplicate(this.actor.getOrigine() || {}),
heritage: duplicate(this.actor.getHeritage() || {}),
metier: duplicate(this.actor.getMetier() || {}),
combat: this.actor.getCombatValues(),
equipements: duplicate(this.actor.getEquipments()),
modifiers: duplicate(this.actor.getModifiers()),
monnaies: duplicate(this.actor.getMonnaies()),
runeEffects: duplicate(this.actor.getRuneEffects()),
config: game.system.mournblade.config,
protectionTotal: this.actor.getProtectionTotal(),
santeMalus: this.actor.getStatusMalus(),
ameMalus: this.actor.getAmeMalus(),
description: await TextEditor.enrichHTML(this.object.system.biodata.description, {async: true}),
options: this.options,
owner: this.document.isOwner,
@ -95,7 +104,7 @@ export class MournbladeActorSheet extends ActorSheet {
let value = ev.currentTarget.value
this.actor.editItemField(itemId, itemType, itemField, dataType, value)
})
html.find('.quantity-minus').click(event => {
const li = $(event.currentTarget).parents(".item");
this.actor.incDecQuantity( li.data("item-id"), -1 );
@ -126,12 +135,45 @@ export class MournbladeActorSheet extends ActorSheet {
let armeId = li.data("item-id")
this.actor.rollArmeOffensif(armeId)
})
html.find('.roll-assomer').click((event) => {
this.actor.rollAssomer()
})
html.find('.roll-fuir').click((event) => {
this.actor.rollFuir()
})
html.find('.roll-immobiliser').click((event) => {
this.actor.rollImmobiliser()
})
html.find('.roll-arme-special').click((event) => {
const li = $(event.currentTarget).parents(".item")
let armeId = li.data("item-id")
this.actor.rollArmeSpecial(armeId)
})
html.find('.roll-arme-degats').click((event) => {
const li = $(event.currentTarget).parents(".item")
let armeId = li.data("item-id")
this.actor.rollArmeDegats(armeId)
})
html.find('.quantity-modify').click(event => {
const li = $(event.currentTarget).parents(".item")
const value = Number($(event.currentTarget).data("quantite-value"))
this.actor.incDecQuantity( li.data("item-id"), value );
})
html.find('.item-add').click((event) => {
const itemType = $(event.currentTarget).data("type")
this.actor.createEmbeddedDocuments('Item', [{ name: `Nouveau ${itemType}`, type: itemType }], { renderSheet: true })
})
html.find('.sante-modify').click((event) => {
const santeType = $(event.currentTarget).data("type")
const value = $(event.currentTarget).data("value")
this.actor.incDecSante(santeType, value, false)
})
html.find('.ame-modify').click((event) => {
const value = $(event.currentTarget).data("value")
this.actor.incDecAme(value)
})
html.find('.lock-unlock-sheet').click((event) => {
this.options.editScore = !this.options.editScore;

View File

@ -41,29 +41,42 @@ export class MournbladeActor extends Actor {
const skills = await MournbladeUtility.loadCompendium("fvtt-mournblade.skills")
data.items = skills.map(i => i.toObject())
}
if (data.type == 'pnj') {
if (data.type == 'creature') {
const skills = await MournbladeUtility.loadCompendium("fvtt-mournblade.skills-creatures")
data.items = skills.map(i => i.toObject())
data.items.push({ name: "Arme naturelle 1", type: 'arme', img: "systems/fvtt-mournblade/assets/icons/arme.webp", system: { typearme: "contact", bonusmaniementoff: 0, seuildefense: 0, degats: "0" } })
data.items.push({ name: "Arme naturelle 2", type: 'arme', img: "systems/fvtt-mournblade/assets/icons/arme.webp", system: { typearme: "contact", bonusmaniementoff: 0, seuildefense: 0, degats: "0" } })
}
return super.create(data, options);
}
/* -------------------------------------------- */
setModifier(name, type, value) {
this.createEmbeddedDocuments("Item", [{ type: "modifier", name: name, system: { modifiertype: type, value: value } }])
ui.notifications.info("Le modificateur " + name + " a été ajouté à " + this.name + ".")
}
/* -------------------------------------------- */
prepareArme(arme) {
arme = duplicate(arme)
let combat = this.getCombatValues()
if (arme.system.typearme == "contact" || arme.system.typearme == "contactjet") {
arme.system.isMelee = true
arme.system.competence = duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "mêlée"))
arme.system.attrKey = "pui"
arme.system.totalDegats = arme.system.degats + "+" + combat.bonusDegatsTotal
arme.system.totalOffensif = this.system.attributs.pui.value + arme.system.competence.system.niveau + arme.system.bonusmaniementoff
arme.system.totalOffensif = this.system.attributs.pui.value + arme.system.competence.system.niveau + arme.system.bonusmaniementoff + combat.attaqueModifier
if (arme.system.isdefense) {
arme.system.totalDefensif = combat.defenseTotal + arme.system.competence.system.niveau + arme.system.bonusmaniementdef
}
}
if (arme.system.typearme == "jet" || arme.system.typearme == "tir") {
arme.system.isDistance = true
arme.system.competence = duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "armes à distance"))
arme.system.attrKey = "adr"
arme.system.totalOffensif = this.system.attributs.adr.value + arme.system.competence.system.niveau + arme.system.bonusmaniementoff
arme.system.totalOffensif = this.system.attributs.adr.value + arme.system.competence.system.niveau + arme.system.bonusmaniementoff + combat.attaqueModifier
arme.system.totalDegats = arme.system.degats
if (arme.system.isdefense) {
arme.system.totalDefensif = combat.defenseTotal + arme.system.competence.system.niveau + arme.system.bonusmaniementdef
@ -96,27 +109,59 @@ export class MournbladeActor extends Actor {
armes.push(this.prepareBouclier(arme))
}
}
MournbladeUtility.sortArrayObjectsByName(armes)
return armes
}
/* -------------------------------------------- */
getDons() {
return this.items.filter(item => item.type == "don")
getModifiersForRoll() {
let modifiers = []
for (let mod of this.items) {
if (mod.type == "modifier" && mod.system.modifiertype == "roll") {
let modObj = mod.toObject()
modObj.system.apply = true
modifiers.push(modObj)
}
}
MournbladeUtility.sortArrayObjectsByName(modifiers)
return modifiers
}
/* -------------------------------------------- */
getItemSorted(types) {
let items = this.items.filter(item => types.includes(item.type)) || []
MournbladeUtility.sortArrayObjectsByName(items)
return items
}
getDons() {
return this.getItemSorted(["don"])
}
getTendances() {
return this.items.filter(item => item.type == "tendance")
return this.getItemSorted(["tendance"])
}
getRunes() {
return this.items.filter(item => item.type == "rune")
return this.getItemSorted(["rune"])
}
/* -------------------------------------------- */
getEquipments() {
return this.items.filter(item => item.type == "equipement")
return this.getItemSorted(["equipement"])
}
getModifiers() {
return this.getItemSorted(["modifier"])
}
getTraitsChaotiques() {
return this.getItemSorted(["traitchaotique"])
}
getTraitsEspeces() {
return this.getItemSorted(["traitespece"])
}
getMonnaies() {
return this.getItemSorted(["monnaie"])
}
/* -------------------------------------------- */
getArmors() {
return this.items.filter(item => item.type == "protection")
return this.getItemSorted(["protection"])
}
getRuneEffects() {
return this.getItemSorted(["runeeffect"])
}
getOrigine() {
return this.items.find(item => item.type == "origine")
@ -147,25 +192,27 @@ export class MournbladeActor extends Actor {
comp.push(item)
}
}
return comp.sort(function (a, b) {
let fa = a.name.toLowerCase(),
fb = b.name.toLowerCase();
if (fa < fb) {
return -1;
MournbladeUtility.sortArrayObjectsByName(comp)
return comp
}
/* -------------------------------------------- */
getProtectionTotal() {
let protection = 0
for (let item of this.items) {
if (item.type == "protection" && item.system.equipped) {
protection += item.system.protection
}
if (fa > fb) {
return 1;
}
return 0;
})
}
return protection
}
/* -------------------------------------------- */
getAspect() {
return (this.system.balance.loi > this.system.balance.chaos) ? this.system.balance.loi : this.system.balance.chaos
return (this.system.balance.loi > this.system.balance.chaos) ? this.system.balance.loi : this.system.balance.chaos
}
getMarge() {
return Math.abs( this.system.balance.loi - this.system.balance.chaos)
return Math.abs(this.system.balance.loi - this.system.balance.chaos)
}
getAlignement() {
return (this.system.balance.loi > this.system.balance.chaos) ? "loyal" : "chaotique"
@ -183,7 +230,14 @@ export class MournbladeActor extends Actor {
/* -------------------------------------------- */
getCombatValues() {
let defenserModifier = 0
this.items.filter(item => item.type == "modifier" && item.system.modifiertype == "defense").map(e => defenserModifier += e.system.value)
let attaqueModifier = 0
this.items.filter(item => item.type == "modifier" && item.system.modifiertype == "attaque").map(e => attaqueModifier += e.system.value)
let combat = {
defenserModifier,
attaqueModifier,
initBase: this.system.attributs.adr.value,
initTotal: this.system.attributs.adr.value + this.system.combat.initbonus,
bonusDegats: this.getBonusDegats(),
@ -191,7 +245,7 @@ export class MournbladeActor extends Actor {
vitesseBase: this.getVitesseBase(),
vitesseTotal: this.getVitesseBase() + this.system.combat.vitessebonus,
defenseBase: this.getDefenseBase(),
defenseTotal: this.getDefenseBase() + this.system.combat.defensebonus
defenseTotal: this.getDefenseBase() + this.system.combat.defensebonus + defenserModifier
}
return combat
}
@ -240,12 +294,49 @@ export class MournbladeActor extends Actor {
/* -------------------------------------------- */
async equipItem(itemId) {
let item = this.items.find(item => item.id == itemId)
if (item && item.system) {
if (item?.system) {
let update = { _id: item.id, "system.equipped": !item.system.equipped }
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
}
}
/* -------------------------------------------- */
getStatusMalus() {
if (this.system.biodata.ignoresantemalus) {
return 0
}
let malusL = 0
let malusNL = 0
if (this.system.sante.base - this.system.sante.letaux < 10) {
malusL = -2
}
if (this.system.sante.base - this.system.sante.letaux < 5) {
malusL = -5
}
if (this.system.sante.base - this.system.sante.nonletaux < 10) {
malusNL = -2
}
if (this.system.sante.base - this.system.sante.nonletaux < 5) {
malusNL = -5
}
return Math.min(malusL, malusNL)
}
/* -------------------------------------------- */
getAmeMalus() {
if (this.system.biodata.ignoreamemalus) {
return 0
}
let malusA = 0
if (this.system.ame.currentmax - this.system.ame.value < 10) {
malusA = -2
}
if (this.system.ame.currentmax - this.system.ame.value < 5) {
malusA = -5
}
return malusA
}
/* -------------------------------------------- */
editItemField(itemId, itemType, itemField, dataType, value) {
let item = this.items.find(item => item.id == itemId)
@ -261,6 +352,44 @@ export class MournbladeActor extends Actor {
}
}
/* -------------------------------------------- */
incDecSante(type, value, applyArmure = true) {
value = Number(value)
if (value && applyArmure) {
let protection = this.getProtectionTotal()
value -= protection
value = Math.max(0, Number(value))
}
if (value) {
let newSante = duplicate(this.system.sante)
newSante[type] += Number(value)
newSante[type] = Math.max(0, newSante[type])
if (newSante[type] > this.system.sante.base) {
value -= this.system.sante.base - newSante[type]
newSante[type] = this.system.sante.base
} else {
value = 0
}
newSante[type] = Math.min(newSante[type], newSante.base)
if (value && type == "nonletaux") {
newSante["letaux"] += value
}
this.update({ 'system.sante': newSante })
}
}
/* -------------------------------------------- */
incDecAme(value) {
value = Number(value)
if (value) {
let newAme = duplicate(this.system.ame)
newAme.value += Number(value)
newAme.value = Math.max(0, newAme.value)
newAme.value = Math.min(newAme.value, newAme.currentmax)
this.update({ 'system.ame': newAme })
}
}
/* -------------------------------------------- */
getBonneAventure() {
return this.system.bonneaventure.actuelle
@ -292,12 +421,12 @@ export class MournbladeActor extends Actor {
/* -------------------------------------------- */
subPointsAme(runeMode, value) {
let ame = duplicate(this.system.ame)
if(runeMode == "prononcer") {
ame.value -= value
if (runeMode == "prononcer") {
ame.value += value
} else {
ame.currentmax -= value
}
this.update( {'system.ame': ame})
this.update({ 'system.ame': ame })
}
/* -------------------------------------------- */
@ -318,6 +447,9 @@ export class MournbladeActor extends Actor {
/* -------------------------------------------- */
getBonusDegats() {
if (this.type == "creature") {
return 0
}
return __degatsBonus[this.system.attributs.pui.value]
}
@ -359,11 +491,10 @@ export class MournbladeActor extends Actor {
async incDecQuantity(objetId, incDec = 0) {
let objetQ = this.items.get(objetId)
if (objetQ) {
let newQ = objetQ.system.quantity + incDec;
const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantity': newQ }]); // pdates one EmbeddedEntity
let newQ = objetQ.system.quantite + incDec;
const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantite': newQ }]); // pdates one EmbeddedEntity
}
}
/* -------------------------------------------- */
getCompetence(compId) {
return this.items.get(compId)
@ -378,28 +509,49 @@ export class MournbladeActor extends Actor {
}
/* -------------------------------------------- */
getInitiativeScore( ) {
getInitiativeScore() {
return Number(this.system.attributs.adr.value) + Number(this.system.combat.initbonus)
}
/* -------------------------------------------- */
getBestDefenseValue() {
let defenseList = this.items.filter(item => (item.type =="arme" || item.type == "bouclier") && item.system.equipped)
let defenseList = this.items.filter(item => (item.type == "arme" || item.type == "bouclier") && item.system.equipped)
let maxDef = 0
let bestArme
for(let arme of defenseList) {
for (let arme of defenseList) {
if (arme.type == "arme" && arme.system.isdefense) {
arme = this.prepareArme(arme)
}
if (arme.type == "bouclier" ) {
if (arme.type == "bouclier") {
arme = this.prepareBouclier(arme)
}
if ( arme.system.totalDefensif > maxDef) {
if (arme.system.totalDefensif > maxDef) {
maxDef = arme.system.totalDefensif
bestArme = duplicate(arme)
}
}
return bestArme
}
/* -------------------------------------------- */
depenseRessources(arme) {
if (arme.system.nbressources && Number(arme.system.nbressources) > 0) {
if (this.type == "creature") {
let ressources = duplicate(this.system.ressources)
if (Number(ressources.value) >= Number(arme.system.nbressources)) {
ressources.value -= arme.system.nbressources
this.update({ 'system.ressources': ressources })
ChatMessage.create({
content: "L'utilisation de la capacité/arme a dépensé " + arme.system.nbressources + " ressources.",
whisper: game.user._id,
user: game.user._id
});
} else {
ui.notifications.warn("Points de ressources insuffisants.")
}
} else {
ui.notifications.warn("Les ressources ne sont pas disponibles pour les personnages.")
}
}
}
/* -------------------------------------------- */
getCommonRollData(attrKey = undefined, compId = undefined, compName = undefined) {
@ -412,6 +564,15 @@ export class MournbladeActor extends Actor {
rollData.canEclatDoubleD20 = this.canEclatDoubleD20()
rollData.doubleD20 = false
rollData.attributs = MournbladeUtility.getAttributs()
rollData.selectDifficulte = true
rollData.malusSante = this.getStatusMalus() + this.system.sante.malusmanuel
rollData.malusAme = this.getAmeMalus()
rollData.modifiers = this.getModifiersForRoll()
rollData.desavantages = {}
rollData.isMonte = this.system.combat.monte
if (rollData.isMonte) {
rollData.config.attaques["chargecavalerie"] = "Charge de cavalerie"
}
if (attrKey) {
rollData.attrKey = attrKey
@ -425,7 +586,7 @@ export class MournbladeActor extends Actor {
rollData.actionImg = rollData.competence?.img
}
if (compName) {
rollData.competence = duplicate(this.items.find( item => item.name.toLowerCase() == compName.toLowerCase()) || {})
rollData.competence = duplicate(this.items.find(item => item.name.toLowerCase() == compName.toLowerCase()) || {})
rollData.actionImg = rollData.competence?.img
}
return rollData
@ -447,22 +608,22 @@ export class MournbladeActor extends Actor {
}
/* -------------------------------------------- */
async rollRune(runeId) {
async rollRune(runeId) {
let comp = this.items.find(comp => comp.type == "competence" && comp.name.toLowerCase() == "savoir : runes")
if ( !comp) {
if (!comp) {
ui.notifications.warn("La compétence Savoirs : Runes n'a pas été trouvée, abandon.")
return
}
let rollData = this.getCommonRollData("cla", undefined, "Savoir : Runes")
rollData.rune = duplicate(this.items.get(runeId) || {})
rollData.rune = duplicate(this.items.get(runeId) || {})
rollData.difficulte = rollData.rune?.system?.seuil || 0
rollData.runemode = "prononcer"
rollData.runeame = 1
rollData.runeame = 1
console.log("runeData", rollData)
let rollDialog = await MournbladeRollDialog.create(this, rollData)
rollDialog.render(true)
}
/* -------------------------------------------- */
async rollArmeOffensif(armeId) {
let arme = this.items.get(armeId)
@ -474,11 +635,77 @@ export class MournbladeActor extends Actor {
}
let rollData = this.getCommonRollData(arme.system.attrKey, arme.system.competence._id)
rollData.arme = arme
rollData.typeAttaque = "assaut"
rollData.typeCouvert = "aucun"
rollData.hasDesavantageBonus = true
rollData.visee = false
rollData.ciblecourt = false
rollData.cibleconsciente = false
// Do not display difficulte if defense weapon or distance
if (rollData.armeDefense || rollData.arme.system.isDistance) {
rollData.selectDifficulte = false
rollData.difficulte = (rollData.arme.system.isDistance) ? 0 : rollData.difficulte
}
console.log("ARME!", rollData)
this.depenseRessources(arme)
let rollDialog = await MournbladeRollDialog.create(this, rollData)
rollDialog.render(true)
}
/* -------------------------------------------- */
async rollAssomer() {
let rollData = this.getCommonRollData("adr", undefined, "Filouterie")
rollData.typeAttaque = "assomer"
rollData.typeCouvert = "aucun"
rollData.hasDesavantageBonus = true
if (rollData.defender) {
rollData.selectDifficulte = false
rollData.difficulte = rollData.defender.system.attributs.tre.value * 2
}
console.log("Assomer!", rollData)
let rollDialog = await MournbladeRollDialog.create(this, rollData)
rollDialog.render(true)
}
/* -------------------------------------------- */
async rollFuir() {
let rollData = this.getCommonRollData("adr", undefined, "Mouvements")
rollData.typeAttaque = "fuir"
rollData.typeCouvert = "aucun"
rollData.hasDesavantageBonus = true
if (rollData.defender) {
rollData.selectDifficulte = false
let comp = rollData.defender.items.find(it => it.type == "competence" && it.name.toLowerCase() == "mouvements")
rollData.difficulte = rollData.defender.system.attributs.adr.value + ((comp) ? comp.system.niveau : rollData.defender.system.attributs.adr.value)
}
console.log("Fuir!", rollData)
let rollDialog = await MournbladeRollDialog.create(this, rollData)
rollDialog.render(true)
}
/* -------------------------------------------- */
async rollImmobiliser() {
let rollData = this.getCommonRollData("pui", undefined, "Mêlée")
rollData.typeAttaque = "immobiliser"
rollData.typeCouvert = "aucun"
rollData.hasDesavantageBonus = true
if (rollData.defender) {
rollData.selectDifficulte = false
rollData.difficulte = rollData.defenderCombatValues.defenseTotal
}
console.log("Immobiliser!", rollData)
let rollDialog = await MournbladeRollDialog.create(this, rollData)
rollDialog.render(true)
}
/* -------------------------------------------- */
async rollArmeSpecial(armeId) {
let arme = this.items.get(armeId)
if (arme) {
MournbladeUtility.createChatWithRollMode("GM", {
content: await renderTemplate(`systems/fvtt-mournblade/templates/chat-display-description.html`, arme)
}, arme)
this.depenseRessources(arme)
}
}
/* -------------------------------------------- */
async rollArmeDegats(armeId) {
let arme = this.items.get(armeId)
@ -488,6 +715,7 @@ export class MournbladeActor extends Actor {
if (arme.type == "bouclier") {
arme = this.prepareBouclier(arme)
}
rollData.degatsFormula = arme.system.totalDegats
let roll = new Roll(arme.system.totalDegats).roll({ async: false })
await MournbladeUtility.showDiceSoNice(roll, game.settings.get("core", "rollMode"));
let rollData = {

View File

@ -0,0 +1,25 @@
export const MOURNBLADE_CONFIG = {
attaques:{
assaut: "Assaut",
precise: "Attaque Précise",
feinte: "Feinte",
coupbas: "Coup Bas",
charger: "Charger",
contenir: "Contenir l'adversaire",
desarmer: "Désarmer"
},
couverts:{
aucun: {name: "Aucun", value: 0},
rondache: {name: "Rondache ou léger (-2)", value: -2},
pavois: { name: "Pavois ou à moitié (-5)", value: -5},
complet: {name:"Quasi complet (-10)", value: -10},
},
modifierTypes: {
aucun: {name: "Aucun", value: 0},
roll: {name: "Jet", value: 0},
degats: {name: "Dégats", value: 0},
defense: {name: "Capacité défensive", value: 0},
attaque: {name: "Capacité offensive", value: 0},
}
};

View File

@ -0,0 +1,25 @@
/**
* Extend the basic ActorSheet with some very simple modifications
* @extends {ActorSheet}
*/
import { MournbladeActorSheet } from "./mournblade-actor-sheet.js";
import { MournbladeUtility } from "./mournblade-utility.js";
/* -------------------------------------------- */
export class MournbladeCreatureSheet extends MournbladeActorSheet {
/** @override */
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
classes: ["fvtt-mournblade", "sheet", "actor"],
template: "systems/fvtt-mournblade/templates/creature-sheet.html",
width: 640,
height: 720,
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "stats" }],
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }],
editScore: false
})
}
}

View File

@ -64,6 +64,7 @@ export class MournbladeItemSheet extends ItemSheet {
options: this.options,
owner: this.document.isOwner,
description: await TextEditor.enrichHTML(this.object.system.description, {async: true}),
config: game.system.mournblade.config,
mr: (this.object.type == 'specialisation'),
isGM: game.user.isGM
}
@ -135,26 +136,26 @@ export class MournbladeItemSheet extends ItemSheet {
let index = li.data("prediction-index")
let pred = duplicate(this.object.system.predilections)
pred[index].name = ev.currentTarget.value
this.object.update( { 'data.predilections': pred })
this.object.update( { 'system.predilections': pred })
})
html.find('.delete-prediction').click(ev => {
const li = $(ev.currentTarget).parents(".prediction-item")
let index = li.data("prediction-index")
let pred = duplicate(this.object.system.predilections)
pred.splice(index,1)
this.object.update( { 'data.predilections': pred })
this.object.update( { 'system.predilections': pred })
})
html.find('.use-prediction').change(ev => {
const li = $(ev.currentTarget).parents(".prediction-item")
let index = li.data("prediction-index")
let pred = duplicate(this.object.system.predilections)
pred[index].used = ev.currentTarget.checked
this.object.update( { 'data.predilections': pred })
this.object.update( { 'system.predilections': pred })
})
html.find('#add-predilection').click(ev => {
let pred = duplicate(this.object.system.predilections)
pred.push( { name: "Nouvelle prédilection", used: false })
this.object.update( { 'data.predilections': pred })
pred.push( { name: "Nouvelle prédilection", id: randomID(), used: false })
this.object.update( { 'system.predilections': pred })
})
// Update Inventory Item
html.find('.item-delete').click(ev => {

View File

@ -11,8 +11,10 @@ export const defaultItemImg = {
predilection: "systems/fvtt-mournblade/assets/icons/predilection.webp",
protection: "systems/fvtt-mournblade/assets/icons/protection.webp",
rune: "systems/fvtt-mournblade/assets/icons/rune.webp",
runeeffect: "systems/fvtt-mournblade/assets/icons/rune.webp",
tendance: "systems/fvtt-mournblade/assets/icons/tendance.webp",
traitchaotique: "systems/fvtt-mournblade/assets/icons/traitchaotique.webp",
traitespece: "systems/fvtt-mournblade/assets/icons/capacite.webp"
}
/**

View File

@ -11,10 +11,11 @@
import { MournbladeActor } from "./mournblade-actor.js";
import { MournbladeItemSheet } from "./mournblade-item-sheet.js";
import { MournbladeActorSheet } from "./mournblade-actor-sheet.js";
//import { MournbladeNPCSheet } from "./mournblade-npc-sheet.js";
import { MournbladeCreatureSheet } from "./mournblade-creature-sheet.js";
import { MournbladeUtility } from "./mournblade-utility.js";
import { MournbladeCombat } from "./mournblade-combat.js";
import { MournbladeItem } from "./mournblade-item.js";
import { MOURNBLADE_CONFIG } from "./mournblade-config.js";
/* -------------------------------------------- */
/* Foundry VTT Initialization */
@ -45,13 +46,15 @@ Hooks.once("init", async function () {
CONFIG.Combat.documentClass = MournbladeCombat
CONFIG.Actor.documentClass = MournbladeActor
CONFIG.Item.documentClass = MournbladeItem
game.system.mournblade = { }
game.system.mournblade = {
config : MOURNBLADE_CONFIG,
}
/* -------------------------------------------- */
// Register sheet application classes
Actors.unregisterSheet("core", ActorSheet);
Actors.registerSheet("fvtt-mournblade", MournbladeActorSheet, { types: ["personnage"], makeDefault: true })
//Actors.registerSheet("fvtt-mournblade", MournbladeNPCSheet, { types: ["npc"], makeDefault: false });
Actors.registerSheet("fvtt-mournblade", MournbladeCreatureSheet, { types: ["creature"], makeDefault: true })
Items.unregisterSheet("core", ItemSheet);
Items.registerSheet("fvtt-mournblade", MournbladeItemSheet, { makeDefault: true })
@ -68,33 +71,19 @@ function welcomeMessage() {
content: `<div id="welcome-message-Mournblade"><span class="rdd-roll-part">
<strong>Bienvenue dans les Jeunes Royaumes de Mournblade !</strong>
<p>Les livres de Mournblade sont nécessaires pour jouer : https://www.titam-france.fr</p>
<p>Mournblade est jeude rôle publié par Titam France/Sombres projets, tout les droits leur appartiennent.<p>
<p>Mournblade est jeu de rôle publié par Titam France/Sombres projets, tout les droits leur appartiennent.</p>
<p>Système développé par LeRatierBretonnien, support sur le <a href="https://discord.gg/pPSDNJk">Discord FR de Foundry</a>.</p>
` });
}
/* -------------------------------------------- */
// Register world usage statistics
function registerUsageCount( registerKey ) {
if ( game.user.isGM ) {
game.settings.register(registerKey, "world-key", {
name: "Unique world key",
scope: "world",
config: false,
default: "",
type: String
});
let worldKey = game.settings.get(registerKey, "world-key")
if ( worldKey == undefined || worldKey == "" ) {
worldKey = randomID(32)
game.settings.set(registerKey, "world-key", worldKey )
}
// Simple API counter
let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"`
//$.ajaxSetup({
//headers: { 'Access-Control-Allow-Origin': '*' }
//})
$.ajax(regURL)
async function importDefaultScene() {
let exists = game.scenes.find(j => j.name == "Accueil");
if (!exists) {
const scenes = await MournbladeUtility.loadCompendium("fvtt-mournblade.scenes")
let newDocuments = scenes.filter(i => i.name == "Accueil");
await game.scenes.documentClass.create(newDocuments);
game.scenes.find(i => i.name == "Accueil").activate();
}
}
@ -112,13 +101,22 @@ Hooks.once("ready", function () {
user: game.user._id
});
}
// CSS patch for v9
if (game.version) {
let sidebar = document.getElementById("sidebar");
sidebar.style.width = "min-content";
if (!game.user.isGM && game.user.character && !game.user.character.prototypeToken.actorLink) {
ui.notifications.info("Le token de du joueur n'est pas connecté à l'acteur !");
ChatMessage.create({
content: "<b>ATTENTION</b> Le token du joueur " + game.user.name + " n'est pas connecté à l'acteur !",
user: game.user._id
});
}
registerUsageCount('fvtt-mournblade')
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter=>{
console.log("ClassCounter loaded", moduleCounter)
moduleCounter.ClassCounter.registerUsageCount()
}).catch(err=>
console.log("No stats available, giving up.")
)
importDefaultScene();
welcomeMessage();
});

View File

@ -52,14 +52,22 @@ export class MournbladeRollDialog extends Dialog {
activateListeners(html) {
super.activateListeners(html);
var dialog = this;
function onLoad() {
}
$(function () { onLoad(); });
html.find('.apply-modifier').change(async (event) => {
let modifierIdx = $(event.currentTarget).data("modifier-idx")
let modifier = this.rollData.modifiers[modifierIdx]
modifier.system.apply = event.currentTarget.checked
})
html.find('#modificateur').change(async (event) => {
this.rollData.modificateur = Number(event.currentTarget.value)
})
html.find('#typeAttaque').change(async (event) => {
this.rollData.typeAttaque = String(event.currentTarget.value)
})
html.find('#difficulte').change(async (event) => {
this.rollData.difficulte = Number(event.currentTarget.value)
})
@ -72,8 +80,41 @@ export class MournbladeRollDialog extends Dialog {
html.find('#runeame').change(async (event) => {
this.rollData.runeame = Number(event.currentTarget.value)
})
html.find('#isMonte').change(async (event) => {
this.rollData.desavantages.isMonte = event.currentTarget.checked
})
html.find('#cibleausol').change(async (event) => {
this.rollData.desavantages.cibleausol = event.currentTarget.checked
})
html.find('#cibledesarmee').change(async (event) => {
this.rollData.desavantages.cibledesarmee = event.currentTarget.checked
})
html.find('#ciblerestreint').change(async (event) => {
this.rollData.desavantages.ciblerestreint = event.currentTarget.checked
})
html.find('#cibleimmobilisée').change(async (event) => {
this.rollData.desavantages.cibleimmobilisée = event.currentTarget.checked
})
html.find('#ciblesurplomb').change(async (event) => {
this.rollData.desavantages.ciblesurplomb = event.currentTarget.checked
})
html.find('#doubleD20').change(async (event) => {
this.rollData.doubleD20 = event.currentTarget.checked
})
html.find('#visee').change(async (event) => {
this.rollData.visee = event.currentTarget.checked
})
html.find('#cibleconsciente').change(async (event) => {
this.rollData.cibleconsciente = event.currentTarget.checked
})
html.find('#ciblecourt').change(async (event) => {
this.rollData.ciblecourt = event.currentTarget.checked
})
html.find('#typeCouvert').change(async (event) => {
this.rollData.typeCouvert = String(event.currentTarget.value)
})
}
}

View File

@ -10,6 +10,7 @@ export class MournbladeUtility {
static async init() {
Hooks.on('renderChatLog', (log, html, data) => MournbladeUtility.chatListeners(html))
Hooks.on("getChatLogEntryContext", (html, options) => MournbladeUtility.chatRollMenu(html, options))
Hooks.on('renderChatMessage', (message, html, data) => MournbladeUtility.chatMessageHandler(message, html, data))
Hooks.on("getCombatTrackerEntryContext", (html, options) => {
MournbladeUtility.pushInitiativeOptions(html, options);
@ -67,6 +68,13 @@ export class MournbladeUtility {
return opt.concat("\n")
}
/* -------------------------------------------- */
static sortArrayObjectsByName(myArray) {
myArray.sort((a, b) => {
return a.name.localeCompare(b.name);
})
}
/* -------------------------------------------- */
static getPointAmeOptions() {
let opt = []
@ -111,6 +119,27 @@ export class MournbladeUtility {
static getOptionsStatusList() {
return this.optionsStatusList;
}
/* -------------------------------------------- */
static getPredilection(comp, predIdx) {
let pred = duplicate(comp.system.predilections)
return duplicate(pred[predIdx] || { name: "Error!" })
}
/* -------------------------------------------- */
static async chatMessageHandler(message, html, data) {
const chatCard = html.find('.action-section')
if (chatCard.length > 0) {
// If the user is the message author or the actor owner, proceed
const actor = game.actors.get(data.message.speaker.actor)
// DEBUG : console.log("FOUND 1!!! ", actor, data.message)
if (actor?.isOwner || game.user.isGM) {
return
}
chatCard.hide()
}
}
/* -------------------------------------------- */
static async chatListeners(html) {
@ -122,7 +151,27 @@ export class MournbladeUtility {
let actor = MournbladeUtility.getActorFromRollData(rollData)
await actor.setPredilectionUsed(rollData.competence._id, predIdx)
rollData.competence = duplicate(actor.getCompetence(rollData.competence._id))
MournbladeUtility.rollMournblade(rollData)
rollData.predilectionUsed = MournbladeUtility.getPredilection(rollData.competence, predIdx)
await MournbladeUtility.rollMournblade(rollData)
})
html.on("click", '.arme-roll-degats', async event => {
let messageId = MournbladeUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "mournblade-roll")
MournbladeUtility.rollDegatsFromAttaque(rollData)
})
html.on("click", '.arme-apply-degats', async event => {
let messageId = MournbladeUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "mournblade-roll")
if (game.user.isGM) {
MournbladeUtility.applyDegatsFromAttaque(rollData)
} else {
game.socket.emit("system.fvtt-mournblade", { name: "msg_apply_damage", data: { rolLData: rollData } })
}
})
}
@ -132,7 +181,8 @@ export class MournbladeUtility {
const templatePaths = [
'systems/fvtt-mournblade/templates/editor-notes-gm.html',
'systems/fvtt-mournblade/templates/partial-item-description.html',
'systems/fvtt-mournblade/templates/partial-list-niveau.html'
'systems/fvtt-mournblade/templates/partial-list-niveau.html',
'systems/fvtt-mournblade/templates/partial-list-niveau-creature.html'
]
return loadTemplates(templatePaths);
}
@ -194,22 +244,6 @@ export class MournbladeUtility {
return undefined;
}
/* -------------------------------------------- */
static updateRollData(rollData) {
let id = rollData.rollId;
let oldRollData = this.rollDataStore[id] || {};
let newRollData = mergeObject(oldRollData, rollData);
this.rollDataStore[id] = newRollData;
}
/* -------------------------------------------- */
static saveRollData(rollData) {
game.socket.emit("system.fvtt-mournblade", {
name: "msg_update_roll", data: rollData
}); // Notify all other clients of the roll
this.updateRollData(rollData);
}
/* -------------------------------------------- */
static getRollData(id) {
return this.rollDataStore[id];
@ -217,12 +251,10 @@ export class MournbladeUtility {
/* -------------------------------------------- */
static onSocketMesssage(msg) {
//console.log("SOCKET MESSAGE", msg.name, game.user.character.id, msg.data.defenderId);
if (msg.name == "msg_update_defense_state") {
this.updateDefenseState(msg.data.defenderId, msg.data.rollId);
}
if (msg.name == "msg_update_roll") {
this.updateRollData(msg.data);
if (msg.name == "msg_apply_damage") {
if (game.user.isGM) {
this.applyDegatsFromAttaque(msg.data.rollData);
}
}
}
@ -292,6 +324,7 @@ export class MournbladeUtility {
rollData.isSuccess = (rollData.finalResult >= rollData.difficulte)
rollData.isHeroique = ((rollData.finalResult - rollData.difficulte) >= 10)
rollData.isDramatique = ((rollData.finalResult - rollData.difficulte) <= -10)
rollData.isPureSuccess = (rollData.isSuccess && !rollData.isHeroique)
}
}
@ -316,17 +349,59 @@ export class MournbladeUtility {
}
//console.log("BEFORE COMP", rollData)
if (rollData.competence) {
rollData.predilections = duplicate(rollData.competence.system.predilections.filter(pred => !pred.used) || [])
rollData.predilections = duplicate(rollData.competence.system.predilections)
let compmod = (rollData.competence.system.niveau == 0) ? -3 : 0
rollData.diceFormula += `+${rollData.attr.value}+${rollData.competence.system.niveau}+${rollData.modificateur}+${compmod}`
} else {
rollData.diceFormula += `+${rollData.attr.value}*2+${rollData.modificateur}`
}
rollData.diceFormula += `+${rollData.malusSante}+${rollData.malusAme}`
if (rollData.arme && rollData.arme.type == "arme") {
if (rollData.arme?.type == "arme") {
rollData.diceFormula += `+${rollData.arme.system.bonusmaniementoff}`
}
// Apply modifiers
for (let modifier of rollData.modifiers) {
if (modifier.system.modifiertype == "roll" && modifier.system.apply) {
rollData.diceFormula += `+${modifier.system.value}`
}
}
// Apply desavantages
let desavantagesBonus = 0
for (let desavantage in rollData.desavantages) {
if (rollData.desavantages[desavantage]) {
desavantagesBonus += 5
}
}
desavantagesBonus = Math.min(15, desavantagesBonus)
rollData.diceFormula += `+${desavantagesBonus}`
// Monté ?
if (rollData.isMonte) {
rollData.diceFormula += "+5"
}
// Specific modifier for distance
if (rollData.arme?.system?.isDistance) {
if (rollData.visee) {
rollData.diceFormula += "+5"
}
if (rollData.cibleconsciente) {
rollData.diceFormula += `-${rollData.defender.system.attributs.adr.value}`
}
if (rollData.ciblecourt) {
if (rollData.difficulte <= 15) { // Portée courte ou moins
rollData.diceFormula += `-5`
} else {
rollData.diceFormula += `-10`
}
}
if (rollData.typeCouvert != "aucun") {
rollData.diceFormula += `+${rollData.config.couverts[rollData.typeCouvert].value}`
}
}
if (rollData.rune) {
rollData.runeduree = Math.ceil((rollData.runeame + 3) / 3)
if (rollData.runemode == "inscrire") {
@ -339,12 +414,14 @@ export class MournbladeUtility {
let myRoll = new Roll(rollData.diceFormula).roll({ async: false })
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
rollData.roll = myRoll
rollData.roll = duplicate(myRoll)
rollData.diceResult = myRoll.terms[0].results[0].result
console.log(">>>> ", myRoll)
rollData.finalResult = myRoll.total
this.computeResult(rollData)
// Application immédiate selon type de jet
if (rollData.rune) {
let subAme = rollData.runeame
if (rollData.isEchec && !rollData.isDramatique) {
@ -352,20 +429,160 @@ export class MournbladeUtility {
}
actor.subPointsAme(rollData.runemode, subAme)
}
if (rollData.typeAttaque == "assomer" && rollData.defenderTokenId && rollData.isPureSuccess) {
let defender = game.canvas.tokens.get(rollData?.defenderTokenId)?.actor
defender.setModifier("Assomer : Prochaine action", "roll", -5)
}
if (rollData.typeAttaque == "fuir" && rollData.difficulte > 0 && !rollData.isSuccess) {
actor.setModifier("Fuite échouée : -5 en défense ce round et suivant", "defense", -5)
}
if (rollData.typeAttaque == "immobiliser" && rollData.difficulte > 0 && rollData.isPureSuccess) {
actor.setModifier("Immobilisation en cours : -5 pour prochaine action", "roll", -5)
}
if ( rollData.typeAttaque == "chargecavalerie" ) {
actor.setModifier("Charge de Cavalerie : -5 défense pour le tour", "defense", -5)
}
this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-mournblade/templates/chat-generic-result.html`, rollData)
}, rollData)
}
/* -------------------------------------------- */
static async rollDegatsFromAttaque(rollData) {
let maximize = false
let degatsMessage = "Degats normaux"
if (rollData.arme?.system?.isMelee) {
rollData.degatsFormula = rollData.arme.system.totalDegats
if (rollData.isHeroique) { // Deux fois les dés de dégats
degatsMessage = "Dégats doublés"
}
if (rollData.typeAttaque == "assomer") {
rollData.degatsFormula = false
}
if (rollData.typeAttaque == "charger") {
rollData.degatsFormula += "+2"
}
if ( rollData.typeAttaque == "chargecavalerie" ) {
rollData.degatsFormula += "+5"
}
if (rollData.typeAttaque == "precise") {
degatsMessage = "Degats normaux"
if (rollData.isHeroique) { // Degats max
maximize = true
degatsMessage = "Dégats maximaux, ignore l'armure du défenseur";
rollData.ignoreDefenseArmor = true
}
}
if (rollData.typeAttaque == "feinte") {
degatsMessage = "Pas de dégats, mais bonus pour prochaine attaque"
rollData.degatsFormula = false
rollData.nextBonus = 5
if (rollData.isHeroique) { // Bonus pour prochaine action
rollData.nextBonus = 10
rollData.nextBonusDegats = 10
}
}
if (rollData.typeAttaque == "coupbas") {
degatsMessage = "Pas de dégats, mais malus pour prochaine action complexe du défenseur"
rollData.degatsFormula = false
rollData.nextMalus = 5
if (rollData.isHeroique) { // Malus pour prochaine action
rollData.nextMalus = 15
}
}
if (rollData.typeAttaque == "contenir") {
degatsMessage = "Pas de dégats, mais l'adversaire ne peut pas vous attaquer pour le reste du tour"
rollData.degatsFormula = false
if (rollData.isHeroique) { // Malus pour prochaine action
degatsMessage = "Pas de dégats, mais tout les adversaires avec une défense inférieure ou égale à " + rollData.finalResult-10 +
" ne peuvent pas vous attaquer pour le reste du tour"
}
}
if (rollData.typeAttaque == "desarmer") {
degatsMessage = "Pas de dégats, mais l'adversaire reçoit un malus de -5 pour sa prochaine action"
rollData.degatsFormula = false
if (rollData.isHeroique) { // Malus pour prochaine action
rollData.defenderDesarme = true
degatsMessage = "Pas de dégats, mais l'arme de votre adversaire est arrachée de ses mains"
}
}
} else { // Armes à distance
rollData.degatsFormula = rollData.arme.system.totalDegats
}
// Perform the roll, show the dice
rollData.finalResult = 0
rollData.degatsMessage = degatsMessage
if (rollData.degatsFormula) {
console.log("Degats formula", rollData.degatsFormula)
// Twice!maximize
if (rollData.isHeroique && !maximize) {
rollData.degatsFormula += "+" + rollData.degatsFormula
}
// Latest modifiers
for(let mod of rollData.modifiers) {
if (mod.system.modifiertype == "degats") {
rollData.degatsFormula += `+${mod.system.value}`
}
}
let degatsRoll = new Roll(rollData.degatsFormula).roll({ async: false, maximize: maximize })
await this.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode"))
rollData.degatsRoll = duplicate(degatsRoll)
rollData.finalResult = degatsRoll.total
}
this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-mournblade/templates/chat-degats-result.html`, rollData)
}, rollData)
}
/* -------------------------------------------- */
static applyDegatsFromAttaque(rollData) {
let defender = game.canvas.tokens.get(rollData?.defenderTokenId)?.actor
if (defender && rollData.arme) {
let actor = MournbladeUtility.getActorFromRollData(rollData)
if (rollData.typeAttaque == "desarmer" && !rollData.isHeroique) {
defender.setModifier("Malus suite à désarmement", "roll", -5)
}
if (rollData.typeAttaque == "charger") {
actor.setModifier("Défense suite à charge", "roll", -5)
}
if (rollData.nextBonus) {
actor.setModifier("Prochaine attaque", "roll", rollData.nextBonus)
if (rollData.nextDegatsBonus) {
actor.setModifier("Prochaine attaque", "degats", rollData.nextDegatsBonus)
}
}
if (rollData.nextMalus) {
defender.setModifier("Prochaine action complexe", "roll", -rollData.nextMalus)
}
if (rollData.defenderDesarme) {
ui.notifications.info("L'arme de " + defender.name + " est arrachée de ses mains (à gérer manuellement)" )
}
let degats = rollData.finalResult
let type = (rollData.arme.system.nonletaux) ? "nonletaux" : "letaux"
if (rollData.arme.system.ignorearmure) {
rollData.ignoreDefenseArmor = true
}
defender.incDecSante(type, +degats, rollData.ignoreDefenseArmor)
ui.notifications.info(defender.name + "a subi " + degats + " points de santé " + type + ".")
}
}
/* -------------------------------------------- */
static async bonusRollMournblade(rollData) {
rollData.bonusFormula = rollData.addedBonus
let bonusRoll = new Roll(rollData.bonusFormula).roll({ async: false })
await this.showDiceSoNice(bonusRoll, game.settings.get("core", "rollMode"));
rollData.bonusRoll = bonusRoll
rollData.bonusRoll = duplicate(bonusRoll)
rollData.finalResult += rollData.bonusRoll.total
@ -452,7 +669,8 @@ export class MournbladeUtility {
chatOptions.whisper = this.getWhisperRecipients(rollMode, name);
break;
}
chatOptions.alias = chatOptions.alias || name
chatOptions.alias = chatOptions.alias || name;
chatOptions.speaker = ChatMessage.getSpeaker();
let msg = await ChatMessage.create(chatOptions)
console.log("=======>", rollData)
msg.setFlag("world", "mournblade-roll", rollData)
@ -467,6 +685,7 @@ export class MournbladeUtility {
pointAmeOptions: this.getPointAmeOptions(),
difficulte: 0,
modificateur: 0,
config: duplicate(game.system.mournblade.config),
}
MournbladeUtility.updateWithTarget(rollData)
return rollData
@ -478,6 +697,9 @@ export class MournbladeUtility {
if (target) {
rollData.defenderTokenId = target.id
let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor
rollData.defenderCombatValues = defender.getCombatValues()
rollData.defender = defender.toObject() // Simpler
rollData.defenderDefense = defender.getBestDefenseValue()
rollData.armeDefense = defender.getBestDefenseValue()
if (rollData.armeDefense) {
rollData.difficulte = rollData.armeDefense.system.totalDefensif
@ -640,11 +862,11 @@ export class MournbladeUtility {
/* -------------------------------------------- */
static async confirmDelete(actorSheet, li) {
let itemId = li.data("item-id");
let msgTxt = "<p>Are you sure to remove this Item ?";
let msgTxt = "<p>Voulez vous supprimer cet item ?";
let buttons = {
delete: {
icon: '<i class="fas fa-check"></i>',
label: "Yes, remove it",
label: "Oui !",
callback: () => {
actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
li.slideUp(200, () => actorSheet.render(false));
@ -652,12 +874,12 @@ export class MournbladeUtility {
},
cancel: {
icon: '<i class="fas fa-times"></i>',
label: "Cancel"
label: "Non !"
}
}
msgTxt += "</p>";
let d = new Dialog({
title: "Confirm removal",
title: "Confirmer la suppression",
content: msgTxt,
buttons: buttons,
default: "cancel"

BIN
packs/armes/000090.ldb Normal file

Binary file not shown.

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

1
packs/armes/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000167

0
packs/armes/LOCK Normal file
View File

8
packs/armes/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/04/05-22:32:00.262772 7f38a20006c0 Recovering log #165
2024/04/05-22:32:00.273368 7f38a20006c0 Delete type=3 #163
2024/04/05-22:32:00.273429 7f38a20006c0 Delete type=0 #165
2024/04/05-22:32:55.827607 7f38a10006c0 Level-0 table #170: started
2024/04/05-22:32:55.827633 7f38a10006c0 Level-0 table #170: 0 bytes OK
2024/04/05-22:32:55.833693 7f38a10006c0 Delete type=0 #168
2024/04/05-22:32:55.847425 7f38a10006c0 Manual compaction at level-0 from '!items!0swiE8k5zfUIqmXu' @ 72057594037927935 : 1 .. '!items!wv5EiePmPTpqFutt' @ 0 : 0; will stop at (end)
2024/04/05-22:32:55.847463 7f38a10006c0 Manual compaction at level-1 from '!items!0swiE8k5zfUIqmXu' @ 72057594037927935 : 1 .. '!items!wv5EiePmPTpqFutt' @ 0 : 0; will stop at (end)

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

@ -0,0 +1,8 @@
2024/04/05-10:33:10.838933 7fc398c006c0 Recovering log #161
2024/04/05-10:33:10.849164 7fc398c006c0 Delete type=3 #159
2024/04/05-10:33:10.849241 7fc398c006c0 Delete type=0 #161
2024/04/05-10:37:42.813439 7fc3938006c0 Level-0 table #166: started
2024/04/05-10:37:42.813463 7fc3938006c0 Level-0 table #166: 0 bytes OK
2024/04/05-10:37:42.820695 7fc3938006c0 Delete type=0 #164
2024/04/05-10:37:42.820863 7fc3938006c0 Manual compaction at level-0 from '!items!0swiE8k5zfUIqmXu' @ 72057594037927935 : 1 .. '!items!wv5EiePmPTpqFutt' @ 0 : 0; will stop at (end)
2024/04/05-10:37:42.820879 7fc3938006c0 Manual compaction at level-1 from '!items!0swiE8k5zfUIqmXu' @ 72057594037927935 : 1 .. '!items!wv5EiePmPTpqFutt' @ 0 : 0; will stop at (end)

BIN
packs/armes/MANIFEST-000167 Normal file

Binary file not shown.

BIN
packs/dons/000005.ldb Normal file

Binary file not shown.

0
packs/dons/000168.log Normal file
View File

1
packs/dons/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000166

0
packs/dons/LOCK Normal file
View File

8
packs/dons/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/04/05-22:32:00.303088 7f38a34006c0 Recovering log #164
2024/04/05-22:32:00.314418 7f38a34006c0 Delete type=3 #162
2024/04/05-22:32:00.314502 7f38a34006c0 Delete type=0 #164
2024/04/05-22:32:55.861596 7f38a10006c0 Level-0 table #169: started
2024/04/05-22:32:55.861637 7f38a10006c0 Level-0 table #169: 0 bytes OK
2024/04/05-22:32:55.867760 7f38a10006c0 Delete type=0 #167
2024/04/05-22:32:55.874811 7f38a10006c0 Manual compaction at level-0 from '!items!5dGXNiL3WN4cAk7X' @ 72057594037927935 : 1 .. '!items!zzz9JrtWjELdoAfK' @ 0 : 0; will stop at (end)
2024/04/05-22:32:55.874840 7f38a10006c0 Manual compaction at level-1 from '!items!5dGXNiL3WN4cAk7X' @ 72057594037927935 : 1 .. '!items!zzz9JrtWjELdoAfK' @ 0 : 0; will stop at (end)

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

@ -0,0 +1,8 @@
2024/04/05-10:33:10.874418 7fc3996006c0 Recovering log #160
2024/04/05-10:33:10.885145 7fc3996006c0 Delete type=3 #158
2024/04/05-10:33:10.885204 7fc3996006c0 Delete type=0 #160
2024/04/05-10:37:42.841468 7fc3938006c0 Level-0 table #165: started
2024/04/05-10:37:42.841499 7fc3938006c0 Level-0 table #165: 0 bytes OK
2024/04/05-10:37:42.847438 7fc3938006c0 Delete type=0 #163
2024/04/05-10:37:42.847611 7fc3938006c0 Manual compaction at level-0 from '!items!5dGXNiL3WN4cAk7X' @ 72057594037927935 : 1 .. '!items!zzz9JrtWjELdoAfK' @ 0 : 0; will stop at (end)
2024/04/05-10:37:42.847642 7fc3938006c0 Manual compaction at level-1 from '!items!5dGXNiL3WN4cAk7X' @ 72057594037927935 : 1 .. '!items!zzz9JrtWjELdoAfK' @ 0 : 0; will stop at (end)

BIN
packs/dons/MANIFEST-000166 Normal file

Binary file not shown.

BIN
packs/equipement/000005.ldb Normal file

Binary file not shown.

View File

1
packs/equipement/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000166

0
packs/equipement/LOCK Normal file
View File

8
packs/equipement/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/04/05-22:32:00.290095 7f38a20006c0 Recovering log #164
2024/04/05-22:32:00.300122 7f38a20006c0 Delete type=3 #162
2024/04/05-22:32:00.300224 7f38a20006c0 Delete type=0 #164
2024/04/05-22:32:55.847559 7f38a10006c0 Level-0 table #169: started
2024/04/05-22:32:55.847585 7f38a10006c0 Level-0 table #169: 0 bytes OK
2024/04/05-22:32:55.853735 7f38a10006c0 Delete type=0 #167
2024/04/05-22:32:55.874789 7f38a10006c0 Manual compaction at level-0 from '!items!1cZd2hlTV9tykDED' @ 72057594037927935 : 1 .. '!items!y47dBO3Mf5Pn7tOd' @ 0 : 0; will stop at (end)
2024/04/05-22:32:55.874828 7f38a10006c0 Manual compaction at level-1 from '!items!1cZd2hlTV9tykDED' @ 72057594037927935 : 1 .. '!items!y47dBO3Mf5Pn7tOd' @ 0 : 0; will stop at (end)

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

@ -0,0 +1,8 @@
2024/04/05-10:33:10.863002 7fc398c006c0 Recovering log #160
2024/04/05-10:33:10.872681 7fc398c006c0 Delete type=3 #158
2024/04/05-10:33:10.872738 7fc398c006c0 Delete type=0 #160
2024/04/05-10:37:42.820943 7fc3938006c0 Level-0 table #165: started
2024/04/05-10:37:42.820973 7fc3938006c0 Level-0 table #165: 0 bytes OK
2024/04/05-10:37:42.827269 7fc3938006c0 Delete type=0 #163
2024/04/05-10:37:42.847575 7fc3938006c0 Manual compaction at level-0 from '!items!1cZd2hlTV9tykDED' @ 72057594037927935 : 1 .. '!items!y47dBO3Mf5Pn7tOd' @ 0 : 0; will stop at (end)
2024/04/05-10:37:42.847619 7fc3938006c0 Manual compaction at level-1 from '!items!1cZd2hlTV9tykDED' @ 72057594037927935 : 1 .. '!items!y47dBO3Mf5Pn7tOd' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/heritages/000005.ldb Normal file

Binary file not shown.

View File

1
packs/heritages/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000166

0
packs/heritages/LOCK Normal file
View File

8
packs/heritages/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/04/05-22:32:00.334658 7f38a34006c0 Recovering log #164
2024/04/05-22:32:00.344895 7f38a34006c0 Delete type=3 #162
2024/04/05-22:32:00.344976 7f38a34006c0 Delete type=0 #164
2024/04/05-22:32:55.867890 7f38a10006c0 Level-0 table #169: started
2024/04/05-22:32:55.867913 7f38a10006c0 Level-0 table #169: 0 bytes OK
2024/04/05-22:32:55.874663 7f38a10006c0 Delete type=0 #167
2024/04/05-22:32:55.874821 7f38a10006c0 Manual compaction at level-0 from '!items!2GaJZsqr2c2mcDRv' @ 72057594037927935 : 1 .. '!items!ui4JGsGwHNlSXVK3' @ 0 : 0; will stop at (end)
2024/04/05-22:32:55.874847 7f38a10006c0 Manual compaction at level-1 from '!items!2GaJZsqr2c2mcDRv' @ 72057594037927935 : 1 .. '!items!ui4JGsGwHNlSXVK3' @ 0 : 0; will stop at (end)

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

@ -0,0 +1,8 @@
2024/04/05-10:33:10.899441 7fc3996006c0 Recovering log #160
2024/04/05-10:33:10.909599 7fc3996006c0 Delete type=3 #158
2024/04/05-10:33:10.909664 7fc3996006c0 Delete type=0 #160
2024/04/05-10:37:42.827388 7fc3938006c0 Level-0 table #165: started
2024/04/05-10:37:42.827415 7fc3938006c0 Level-0 table #165: 0 bytes OK
2024/04/05-10:37:42.833886 7fc3938006c0 Delete type=0 #163
2024/04/05-10:37:42.847590 7fc3938006c0 Manual compaction at level-0 from '!items!2GaJZsqr2c2mcDRv' @ 72057594037927935 : 1 .. '!items!ui4JGsGwHNlSXVK3' @ 0 : 0; will stop at (end)
2024/04/05-10:37:42.847627 7fc3938006c0 Manual compaction at level-1 from '!items!2GaJZsqr2c2mcDRv' @ 72057594037927935 : 1 .. '!items!ui4JGsGwHNlSXVK3' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/metiers/000005.ldb Normal file

Binary file not shown.

0
packs/metiers/000168.log Normal file
View File

1
packs/metiers/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000166

0
packs/metiers/LOCK Normal file
View File

8
packs/metiers/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/04/05-22:32:00.349335 7f38a20006c0 Recovering log #164
2024/04/05-22:32:00.359431 7f38a20006c0 Delete type=3 #162
2024/04/05-22:32:00.359512 7f38a20006c0 Delete type=0 #164
2024/04/05-22:32:55.881485 7f38a10006c0 Level-0 table #169: started
2024/04/05-22:32:55.881507 7f38a10006c0 Level-0 table #169: 0 bytes OK
2024/04/05-22:32:55.887726 7f38a10006c0 Delete type=0 #167
2024/04/05-22:32:55.902069 7f38a10006c0 Manual compaction at level-0 from '!items!09s33sFuju8zjPqI' @ 72057594037927935 : 1 .. '!items!xlyFCQClBZ1N3O1B' @ 0 : 0; will stop at (end)
2024/04/05-22:32:55.902110 7f38a10006c0 Manual compaction at level-1 from '!items!09s33sFuju8zjPqI' @ 72057594037927935 : 1 .. '!items!xlyFCQClBZ1N3O1B' @ 0 : 0; will stop at (end)

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

@ -0,0 +1,8 @@
2024/04/05-10:33:10.911832 7fc398c006c0 Recovering log #160
2024/04/05-10:33:10.922143 7fc398c006c0 Delete type=3 #158
2024/04/05-10:33:10.922205 7fc398c006c0 Delete type=0 #160
2024/04/05-10:37:42.855350 7fc3938006c0 Level-0 table #165: started
2024/04/05-10:37:42.855382 7fc3938006c0 Level-0 table #165: 0 bytes OK
2024/04/05-10:37:42.861347 7fc3938006c0 Delete type=0 #163
2024/04/05-10:37:42.875214 7fc3938006c0 Manual compaction at level-0 from '!items!09s33sFuju8zjPqI' @ 72057594037927935 : 1 .. '!items!xlyFCQClBZ1N3O1B' @ 0 : 0; will stop at (end)
2024/04/05-10:37:42.875295 7fc3938006c0 Manual compaction at level-1 from '!items!09s33sFuju8zjPqI' @ 72057594037927935 : 1 .. '!items!xlyFCQClBZ1N3O1B' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/origines/000005.ldb Normal file

Binary file not shown.

View File

1
packs/origines/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000166

0
packs/origines/LOCK Normal file
View File

8
packs/origines/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/04/05-22:32:00.317992 7f38a20006c0 Recovering log #164
2024/04/05-22:32:00.328712 7f38a20006c0 Delete type=3 #162
2024/04/05-22:32:00.328797 7f38a20006c0 Delete type=0 #164
2024/04/05-22:32:55.853852 7f38a10006c0 Level-0 table #169: started
2024/04/05-22:32:55.853876 7f38a10006c0 Level-0 table #169: 0 bytes OK
2024/04/05-22:32:55.861390 7f38a10006c0 Delete type=0 #167
2024/04/05-22:32:55.874801 7f38a10006c0 Manual compaction at level-0 from '!items!2t1KmBeQNuKK5qlN' @ 72057594037927935 : 1 .. '!items!yBvkQb9S64s908sR' @ 0 : 0; will stop at (end)
2024/04/05-22:32:55.874834 7f38a10006c0 Manual compaction at level-1 from '!items!2t1KmBeQNuKK5qlN' @ 72057594037927935 : 1 .. '!items!yBvkQb9S64s908sR' @ 0 : 0; will stop at (end)

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

@ -0,0 +1,8 @@
2024/04/05-10:33:10.887357 7fc398c006c0 Recovering log #160
2024/04/05-10:33:10.897273 7fc398c006c0 Delete type=3 #158
2024/04/05-10:33:10.897357 7fc398c006c0 Delete type=0 #160
2024/04/05-10:37:42.834020 7fc3938006c0 Level-0 table #165: started
2024/04/05-10:37:42.834050 7fc3938006c0 Level-0 table #165: 0 bytes OK
2024/04/05-10:37:42.841338 7fc3938006c0 Delete type=0 #163
2024/04/05-10:37:42.847601 7fc3938006c0 Manual compaction at level-0 from '!items!2t1KmBeQNuKK5qlN' @ 72057594037927935 : 1 .. '!items!yBvkQb9S64s908sR' @ 0 : 0; will stop at (end)
2024/04/05-10:37:42.847635 7fc3938006c0 Manual compaction at level-1 from '!items!2t1KmBeQNuKK5qlN' @ 72057594037927935 : 1 .. '!items!yBvkQb9S64s908sR' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

View File

@ -0,0 +1 @@
MANIFEST-000062

0
packs/pnj-creatures/LOCK Normal file
View File

8
packs/pnj-creatures/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/04/05-22:32:00.212633 7f38a20006c0 Recovering log #60
2024/04/05-22:32:00.222206 7f38a20006c0 Delete type=3 #58
2024/04/05-22:32:00.222297 7f38a20006c0 Delete type=0 #60
2024/04/05-22:32:55.801427 7f38a10006c0 Level-0 table #65: started
2024/04/05-22:32:55.801455 7f38a10006c0 Level-0 table #65: 0 bytes OK
2024/04/05-22:32:55.808908 7f38a10006c0 Delete type=0 #63
2024/04/05-22:32:55.819661 7f38a10006c0 Manual compaction at level-0 from '!actors!00CKDCqVh5fLZbYo' @ 72057594037927935 : 1 .. '!folders!dwT9WnH0ZnpuZh92' @ 0 : 0; will stop at (end)
2024/04/05-22:32:55.819687 7f38a10006c0 Manual compaction at level-1 from '!actors!00CKDCqVh5fLZbYo' @ 72057594037927935 : 1 .. '!folders!dwT9WnH0ZnpuZh92' @ 0 : 0; will stop at (end)

View File

@ -0,0 +1,8 @@
2024/04/05-10:33:10.799853 7fc398c006c0 Recovering log #56
2024/04/05-10:33:10.810380 7fc398c006c0 Delete type=3 #54
2024/04/05-10:33:10.810447 7fc398c006c0 Delete type=0 #56
2024/04/05-10:37:42.776069 7fc3938006c0 Level-0 table #61: started
2024/04/05-10:37:42.776136 7fc3938006c0 Level-0 table #61: 0 bytes OK
2024/04/05-10:37:42.782798 7fc3938006c0 Delete type=0 #59
2024/04/05-10:37:42.782925 7fc3938006c0 Manual compaction at level-0 from '!actors!00CKDCqVh5fLZbYo' @ 72057594037927935 : 1 .. '!folders!dwT9WnH0ZnpuZh92' @ 0 : 0; will stop at (end)
2024/04/05-10:37:42.793116 7fc3938006c0 Manual compaction at level-1 from '!actors!00CKDCqVh5fLZbYo' @ 72057594037927935 : 1 .. '!folders!dwT9WnH0ZnpuZh92' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/protection/000005.ldb Normal file

Binary file not shown.

View File

1
packs/protection/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000166

0
packs/protection/LOCK Normal file
View File

8
packs/protection/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/04/05-22:32:00.276534 7f38a34006c0 Recovering log #164
2024/04/05-22:32:00.287282 7f38a34006c0 Delete type=3 #162
2024/04/05-22:32:00.287341 7f38a34006c0 Delete type=0 #164
2024/04/05-22:32:55.840890 7f38a10006c0 Level-0 table #169: started
2024/04/05-22:32:55.840916 7f38a10006c0 Level-0 table #169: 0 bytes OK
2024/04/05-22:32:55.847282 7f38a10006c0 Delete type=0 #167
2024/04/05-22:32:55.847457 7f38a10006c0 Manual compaction at level-0 from '!items!2hD1DQVeCIQIXFU7' @ 72057594037927935 : 1 .. '!items!veoS6Gtzj6Dq087V' @ 0 : 0; will stop at (end)
2024/04/05-22:32:55.847477 7f38a10006c0 Manual compaction at level-1 from '!items!2hD1DQVeCIQIXFU7' @ 72057594037927935 : 1 .. '!items!veoS6Gtzj6Dq087V' @ 0 : 0; will stop at (end)

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

@ -0,0 +1,8 @@
2024/04/05-10:33:10.851390 7fc3996006c0 Recovering log #160
2024/04/05-10:33:10.861354 7fc3996006c0 Delete type=3 #158
2024/04/05-10:33:10.861468 7fc3996006c0 Delete type=0 #160
2024/04/05-10:37:42.807302 7fc3938006c0 Level-0 table #165: started
2024/04/05-10:37:42.807334 7fc3938006c0 Level-0 table #165: 0 bytes OK
2024/04/05-10:37:42.813306 7fc3938006c0 Delete type=0 #163
2024/04/05-10:37:42.820853 7fc3938006c0 Manual compaction at level-0 from '!items!2hD1DQVeCIQIXFU7' @ 72057594037927935 : 1 .. '!items!veoS6Gtzj6Dq087V' @ 0 : 0; will stop at (end)
2024/04/05-10:37:42.820887 7fc3938006c0 Manual compaction at level-1 from '!items!2hD1DQVeCIQIXFU7' @ 72057594037927935 : 1 .. '!items!veoS6Gtzj6Dq087V' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/runes/000005.ldb Normal file

Binary file not shown.

0
packs/runes/000168.log Normal file
View File

1
packs/runes/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000166

0
packs/runes/LOCK Normal file
View File

8
packs/runes/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/04/05-22:32:00.392182 7f38a34006c0 Recovering log #164
2024/04/05-22:32:00.401887 7f38a34006c0 Delete type=3 #162
2024/04/05-22:32:00.401955 7f38a34006c0 Delete type=0 #164
2024/04/05-22:32:55.895639 7f38a10006c0 Level-0 table #169: started
2024/04/05-22:32:55.895662 7f38a10006c0 Level-0 table #169: 0 bytes OK
2024/04/05-22:32:55.901785 7f38a10006c0 Delete type=0 #167
2024/04/05-22:32:55.902096 7f38a10006c0 Manual compaction at level-0 from '!items!1JqWbEkHUoKXbsgn' @ 72057594037927935 : 1 .. '!items!xnCf2xIPzdsUoBTy' @ 0 : 0; will stop at (end)
2024/04/05-22:32:55.902124 7f38a10006c0 Manual compaction at level-1 from '!items!1JqWbEkHUoKXbsgn' @ 72057594037927935 : 1 .. '!items!xnCf2xIPzdsUoBTy' @ 0 : 0; will stop at (end)

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

@ -0,0 +1,8 @@
2024/04/05-10:33:10.949868 7fc3996006c0 Recovering log #160
2024/04/05-10:33:10.960580 7fc3996006c0 Delete type=3 #158
2024/04/05-10:33:10.960639 7fc3996006c0 Delete type=0 #160
2024/04/05-10:37:42.868075 7fc3938006c0 Level-0 table #165: started
2024/04/05-10:37:42.868101 7fc3938006c0 Level-0 table #165: 0 bytes OK
2024/04/05-10:37:42.874969 7fc3938006c0 Delete type=0 #163
2024/04/05-10:37:42.875258 7fc3938006c0 Manual compaction at level-0 from '!items!1JqWbEkHUoKXbsgn' @ 72057594037927935 : 1 .. '!items!xnCf2xIPzdsUoBTy' @ 0 : 0; will stop at (end)
2024/04/05-10:37:42.875328 7fc3938006c0 Manual compaction at level-1 from '!items!1JqWbEkHUoKXbsgn' @ 72057594037927935 : 1 .. '!items!xnCf2xIPzdsUoBTy' @ 0 : 0; will stop at (end)

BIN
packs/runes/MANIFEST-000166 Normal file

Binary file not shown.

BIN
packs/scenes/000051.ldb Normal file

Binary file not shown.

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

1
packs/scenes/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000082

0
packs/scenes/LOCK Normal file
View File

8
packs/scenes/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/04/05-22:32:00.418976 7f38a34006c0 Recovering log #80
2024/04/05-22:32:00.429111 7f38a34006c0 Delete type=3 #78
2024/04/05-22:32:00.429196 7f38a34006c0 Delete type=0 #80
2024/04/05-22:32:55.908848 7f38a10006c0 Level-0 table #85: started
2024/04/05-22:32:55.908902 7f38a10006c0 Level-0 table #85: 0 bytes OK
2024/04/05-22:32:55.915681 7f38a10006c0 Delete type=0 #83
2024/04/05-22:32:55.915862 7f38a10006c0 Manual compaction at level-0 from '!scenes!ZDV2IwduhOXTxy72' @ 72057594037927935 : 1 .. '!scenes!ZDV2IwduhOXTxy72' @ 0 : 0; will stop at (end)
2024/04/05-22:32:55.915878 7f38a10006c0 Manual compaction at level-1 from '!scenes!ZDV2IwduhOXTxy72' @ 72057594037927935 : 1 .. '!scenes!ZDV2IwduhOXTxy72' @ 0 : 0; will stop at (end)

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

@ -0,0 +1,8 @@
2024/04/05-10:33:10.975053 7fc3996006c0 Recovering log #76
2024/04/05-10:33:10.985213 7fc3996006c0 Delete type=3 #74
2024/04/05-10:33:10.985285 7fc3996006c0 Delete type=0 #76
2024/04/05-10:37:42.881876 7fc3938006c0 Level-0 table #81: started
2024/04/05-10:37:42.881906 7fc3938006c0 Level-0 table #81: 0 bytes OK
2024/04/05-10:37:42.889098 7fc3938006c0 Delete type=0 #79
2024/04/05-10:37:42.889473 7fc3938006c0 Manual compaction at level-0 from '!scenes!ZDV2IwduhOXTxy72' @ 72057594037927935 : 1 .. '!scenes!ZDV2IwduhOXTxy72' @ 0 : 0; will stop at (end)
2024/04/05-10:37:42.889524 7fc3938006c0 Manual compaction at level-1 from '!scenes!ZDV2IwduhOXTxy72' @ 72057594037927935 : 1 .. '!scenes!ZDV2IwduhOXTxy72' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

View File

@ -0,0 +1 @@
MANIFEST-000074

View File

View File

@ -0,0 +1,8 @@
2024/04/05-22:32:00.250297 7f38a34006c0 Recovering log #72
2024/04/05-22:32:00.260214 7f38a34006c0 Delete type=3 #70
2024/04/05-22:32:00.260274 7f38a34006c0 Delete type=0 #72
2024/04/05-22:32:55.819818 7f38a10006c0 Level-0 table #77: started
2024/04/05-22:32:55.819849 7f38a10006c0 Level-0 table #77: 0 bytes OK
2024/04/05-22:32:55.827482 7f38a10006c0 Delete type=0 #75
2024/04/05-22:32:55.847412 7f38a10006c0 Manual compaction at level-0 from '!items!6bmjc4MUduGs9s6n' @ 72057594037927935 : 1 .. '!items!t692JcsGHG4YJIlM' @ 0 : 0; will stop at (end)
2024/04/05-22:32:55.847448 7f38a10006c0 Manual compaction at level-1 from '!items!6bmjc4MUduGs9s6n' @ 72057594037927935 : 1 .. '!items!t692JcsGHG4YJIlM' @ 0 : 0; will stop at (end)

View File

@ -0,0 +1,8 @@
2024/04/05-10:33:10.827250 7fc3996006c0 Recovering log #68
2024/04/05-10:33:10.836850 7fc3996006c0 Delete type=3 #66
2024/04/05-10:33:10.836938 7fc3996006c0 Delete type=0 #68
2024/04/05-10:37:42.800320 7fc3938006c0 Level-0 table #73: started
2024/04/05-10:37:42.800361 7fc3938006c0 Level-0 table #73: 0 bytes OK
2024/04/05-10:37:42.807171 7fc3938006c0 Delete type=0 #71
2024/04/05-10:37:42.820825 7fc3938006c0 Manual compaction at level-0 from '!items!6bmjc4MUduGs9s6n' @ 72057594037927935 : 1 .. '!items!t692JcsGHG4YJIlM' @ 0 : 0; will stop at (end)
2024/04/05-10:37:42.820871 7fc3938006c0 Manual compaction at level-1 from '!items!6bmjc4MUduGs9s6n' @ 72057594037927935 : 1 .. '!items!t692JcsGHG4YJIlM' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/skills/000005.ldb Normal file

Binary file not shown.

0
packs/skills/000168.log Normal file
View File

1
packs/skills/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000166

0
packs/skills/LOCK Normal file
View File

8
packs/skills/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/04/05-22:32:00.235905 7f38a20006c0 Recovering log #164
2024/04/05-22:32:00.247273 7f38a20006c0 Delete type=3 #162
2024/04/05-22:32:00.247388 7f38a20006c0 Delete type=0 #164
2024/04/05-22:32:55.833815 7f38a10006c0 Level-0 table #169: started
2024/04/05-22:32:55.833839 7f38a10006c0 Level-0 table #169: 0 bytes OK
2024/04/05-22:32:55.840764 7f38a10006c0 Delete type=0 #167
2024/04/05-22:32:55.847437 7f38a10006c0 Manual compaction at level-0 from '!items!0LlzDyCurJedqeyG' @ 72057594037927935 : 1 .. '!items!tq6mEgXog7h4VyWk' @ 0 : 0; will stop at (end)
2024/04/05-22:32:55.847470 7f38a10006c0 Manual compaction at level-1 from '!items!0LlzDyCurJedqeyG' @ 72057594037927935 : 1 .. '!items!tq6mEgXog7h4VyWk' @ 0 : 0; will stop at (end)

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

@ -0,0 +1,8 @@
2024/04/05-10:33:10.815378 7fc398c006c0 Recovering log #160
2024/04/05-10:33:10.825596 7fc398c006c0 Delete type=3 #158
2024/04/05-10:33:10.825674 7fc398c006c0 Delete type=0 #160
2024/04/05-10:37:42.793134 7fc3938006c0 Level-0 table #165: started
2024/04/05-10:37:42.793174 7fc3938006c0 Level-0 table #165: 0 bytes OK
2024/04/05-10:37:42.800105 7fc3938006c0 Delete type=0 #163
2024/04/05-10:37:42.813427 7fc3938006c0 Manual compaction at level-0 from '!items!0LlzDyCurJedqeyG' @ 72057594037927935 : 1 .. '!items!tq6mEgXog7h4VyWk' @ 0 : 0; will stop at (end)
2024/04/05-10:37:42.820841 7fc3938006c0 Manual compaction at level-1 from '!items!0LlzDyCurJedqeyG' @ 72057594037927935 : 1 .. '!items!tq6mEgXog7h4VyWk' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/tables/000005.ldb Normal file

Binary file not shown.

0
packs/tables/000168.log Normal file
View File

1
packs/tables/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000166

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