Compare commits

...

14 Commits

135 changed files with 2304 additions and 425 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

View File

@ -1,27 +1,28 @@
{
"ACTOR": {
"TypePersonnage": "Personnage",
"TypePNJ": "PNJ"
},
"ITEM": {
"TypeArme": "Arme",
"TypeCompetence": "Compétence",
"TypeProtection": "Protection",
"TypePacte": "Pacte",
"TypeTraitchaotique": "Trait Chaotique",
"TypeMonnaie": "Monnaie",
"TypeDon": "Don",
"TypeTendance": "Tendance",
"TypeRune": "Rune",
"TypeEquipement": "Equipement",
"TypeCapacite": "Capacité",
"TypeOrigine": "Origine",
"TypeHeritage": "Héritage",
"TypeMetier": "Métier",
"TypeRuneeffect": "Effet de Rune",
"TypeBouclier": "Bouclier"
"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

@ -12,7 +12,7 @@ export class MournbladeActorSheet extends ActorSheet {
/** @override */
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["fvtt-mournblade", "sheet", "actor"],
template: "systems/fvtt-mournblade/templates/actor-sheet.html",
width: 640,
@ -25,7 +25,7 @@ export class MournbladeActorSheet extends ActorSheet {
/* -------------------------------------------- */
async getData() {
const objectData = duplicate(this.object)
const objectData = foundry.utils.duplicate(this.object)
let actorData = objectData
let formData = {
@ -40,21 +40,29 @@ export class MournbladeActorSheet extends ActorSheet {
effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)),
limited: this.object.limited,
skills: this.actor.getSkills(),
armes: duplicate(this.actor.getWeapons()),
protections: duplicate(this.actor.getArmors()),
dons: duplicate(this.actor.getDons()),
armes: foundry.utils.duplicate(this.actor.getWeapons()),
protections: foundry.utils.duplicate(this.actor.getArmors()),
dons: foundry.utils.duplicate(this.actor.getDons()),
pactes: foundry.utils.duplicate(this.actor.getPactes()),
alignement: this.actor.getAlignement(),
aspect: this.actor.getAspect(),
marge: this.actor.getMarge(),
tendances:duplicate(this.actor.getTendances()),
runes:duplicate(this.actor.getRunes()),
traitsChaotiques:duplicate(this.actor.getTraitsChaotiques()),
origine: duplicate(this.actor.getOrigine() || {}),
heritage: duplicate(this.actor.getHeritage() || {}),
metier: duplicate(this.actor.getMetier() || {}),
tendances:foundry.utils.duplicate(this.actor.getTendances()),
runes:foundry.utils.duplicate(this.actor.getRunes()),
traitsChaotiques:foundry.utils.duplicate(this.actor.getTraitsChaotiques()),
traitsEspeces: foundry.utils.duplicate(this.actor.getTraitsEspeces()),
origine: foundry.utils.duplicate(this.actor.getOrigine() || {}),
heritage: foundry.utils.duplicate(this.actor.getHeritage() || {}),
metier: foundry.utils.duplicate(this.actor.getMetier() || {}),
combat: this.actor.getCombatValues(),
equipements: duplicate(this.actor.getEquipments()),
monnaies: duplicate(this.actor.getMonnaies()),
equipements: foundry.utils.duplicate(this.actor.getEquipments()),
modifiers: foundry.utils.duplicate(this.actor.getModifiers()),
monnaies: foundry.utils.duplicate(this.actor.getMonnaies()),
runeEffects: foundry.utils.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,
@ -128,6 +136,21 @@ 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")
@ -142,6 +165,15 @@ export class MournbladeActorSheet extends ActorSheet {
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) => {

View File

@ -31,7 +31,7 @@ export class MournbladeActor extends Actor {
if (data instanceof Array) {
return super.create(data, options);
}
// If the created actor has items (only applicable to duplicated actors) bypass the new actor creation logic
// If the created actor has items (only applicable to foundry.utils.duplicated actors) bypass the new actor creation logic
if (data.items) {
let actor = super.create(data, options);
return actor;
@ -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)
arme = foundry.utils.duplicate(arme)
let combat = this.getCombatValues()
if (arme.system.typearme == "contact" || arme.system.typearme == "contactjet") {
arme.system.competence = duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "mêlée"))
arme.system.isMelee = true
arme.system.competence = foundry.utils.duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "mêlée"))
arme.system.attrKey = "pui"
arme.system.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.competence = duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "armes à distance"))
arme.system.isDistance = true
arme.system.competence = foundry.utils.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
@ -73,9 +86,9 @@ export class MournbladeActor extends Actor {
}
/* -------------------------------------------- */
prepareBouclier(bouclier) {
bouclier = duplicate(bouclier)
bouclier = foundry.utils.duplicate(bouclier)
let combat = this.getCombatValues()
bouclier.system.competence = duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "mêlée"))
bouclier.system.competence = foundry.utils.duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "mêlée"))
bouclier.system.attrKey = "pui"
bouclier.system.totalDegats = bouclier.system.degats + "+" + combat.bonusDegatsTotal
bouclier.system.totalOffensif = this.system.attributs.pui.value + bouclier.system.competence.system.niveau
@ -101,14 +114,31 @@ export class MournbladeActor extends Actor {
}
/* -------------------------------------------- */
getItemSorted( types) {
let items = this.items.filter(item => types.includes(item.type )) || []
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"])
}
getPactes() {
return this.getItemSorted(["pacte"])
}
getTendances() {
return this.getItemSorted(["tendance"])
}
@ -118,15 +148,24 @@ export class MournbladeActor extends Actor {
getEquipments() {
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.getItemSorted(["protection"])
}
getRuneEffects() {
return this.getItemSorted(["runeeffect"])
}
getOrigine() {
return this.items.find(item => item.type == "origine")
}
@ -140,7 +179,7 @@ export class MournbladeActor extends Actor {
getSkills() {
let comp = []
for (let item of this.items) {
item = duplicate(item)
item = foundry.utils.duplicate(item)
if (item.type == "competence") {
item.system.attribut1total = item.system.niveau + (this.system.attributs[item.system.attribut1]?.value || 0)
item.system.attribut2total = item.system.niveau + (this.system.attributs[item.system.attribut2]?.value || 0)
@ -160,12 +199,23 @@ export class MournbladeActor extends Actor {
return comp
}
/* -------------------------------------------- */
getProtectionTotal() {
let protection = 0
for (let item of this.items) {
if (item.type == "protection" && item.system.equipped) {
protection += item.system.protection
}
}
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 +233,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 +248,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
}
@ -232,7 +289,7 @@ export class MournbladeActor extends Actor {
getItemById(id) {
let item = this.items.find(item => item.id == id);
if (item) {
item = duplicate(item)
item = foundry.utils.duplicate(item)
}
return item;
}
@ -240,12 +297,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 +355,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 = foundry.utils.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 = foundry.utils.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
@ -291,13 +423,13 @@ export class MournbladeActor extends Actor {
}
/* -------------------------------------------- */
subPointsAme(runeMode, value) {
let ame = duplicate(this.system.ame)
if(runeMode == "prononcer") {
ame.value -= value
let ame = foundry.utils.duplicate(this.system.ame)
if (runeMode == "prononcer") {
ame.value += value
} else {
ame.currentmax -= value
}
this.update( {'system.ame': ame})
this.update({ 'system.ame': ame })
}
/* -------------------------------------------- */
@ -318,6 +450,9 @@ export class MournbladeActor extends Actor {
/* -------------------------------------------- */
getBonusDegats() {
if (this.type == "creature") {
return 0
}
return __degatsBonus[this.system.attributs.pui.value]
}
@ -334,13 +469,13 @@ export class MournbladeActor extends Actor {
getSubActors() {
let subActors = [];
for (let id of this.system.subactors) {
subActors.push(duplicate(game.actors.get(id)));
subActors.push(foundry.utils.duplicate(game.actors.get(id)));
}
return subActors;
}
/* -------------------------------------------- */
async addSubActor(subActorId) {
let subActors = duplicate(this.system.subactors);
let subActors = foundry.utils.duplicate(this.system.subactors);
subActors.push(subActorId);
await this.update({ 'system.subactors': subActors });
}
@ -371,34 +506,55 @@ export class MournbladeActor extends Actor {
/* -------------------------------------------- */
async setPredilectionUsed(compId, predIdx) {
let comp = this.items.get(compId)
let pred = duplicate(comp.system.predilections)
let pred = foundry.utils.duplicate(comp.system.predilections)
pred[predIdx].used = true
await this.updateEmbeddedDocuments('Item', [{ _id: compId, 'system.predilections': pred }])
}
/* -------------------------------------------- */
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)
bestArme = foundry.utils.duplicate(arme)
}
}
return bestArme
}
/* -------------------------------------------- */
depenseRessources(arme) {
if (arme.system.nbressources && Number(arme.system.nbressources) > 0) {
if (this.type == "creature") {
let ressources = foundry.utils.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) {
@ -411,20 +567,29 @@ 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
if (attrKey != "tochoose") {
rollData.actionImg = "systems/fvtt-mournblade/assets/icons/" + this.system.attributs[attrKey].labelnorm + ".webp"
rollData.attr = duplicate(this.system.attributs[attrKey])
rollData.attr = foundry.utils.duplicate(this.system.attributs[attrKey])
}
}
if (compId) {
rollData.competence = duplicate(this.items.get(compId) || {})
rollData.competence = foundry.utils.duplicate(this.items.get(compId) || {})
rollData.actionImg = rollData.competence?.img
}
if (compName) {
rollData.competence = duplicate(this.items.find( item => item.name.toLowerCase() == compName.toLowerCase()) || {})
rollData.competence = foundry.utils.duplicate(this.items.find(item => item.name.toLowerCase() == compName.toLowerCase()) || {})
rollData.actionImg = rollData.competence?.img
}
return rollData
@ -446,22 +611,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 = foundry.utils.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)
@ -473,11 +638,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)
@ -487,6 +718,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,71 @@
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 },
},
listeNiveau: {
},
listeNiveauCreature: {
},
listePortees: {
"10": "Moins que courte (10)",
"15": "Courte et + (15)",
"20": "Moyenne et + (20)",
"25": "Longue et + (25)"
},
modificateurOptions: {},
pointsAmeOptions: {},
difficulteOptions: {
"0": "Aucune/Inconnue",
"5": "Facile (5)",
"10": "Moyenne (10)",
"15": "Ardue (15)",
"20": "Hasardeuse (20)",
"25": "Insensée (25)",
"30": "Pure Folie (30)"
},
attributs: {
adr: "Adresse", pui: "Puissance", cla: "Clairvoyance", pre: "Présence", tre: "Trempe"
},
lancementRuneOptions: {
prononcer: "Prononcer la rune",
inscrire: "Inscrire la rune"
},
effetRuneOptions: {
prononcee: "Prononcée",
inscrite: "Inscrite"
},
typeArmeOptions: {
contact: "Arme de contact",
contactjet: "Arme de contact et de Jet",
jet: "Arme de Jet",
tir: "Arme de Tir",
special: "Spécial (capacité/don)"
},
allegeanceOptions: {
tous: "Tous",
chaos: "Chaos",
loi: "Loi",
betes: "Seigneurs des Bêtes",
elementaires: "Seigneurs Elementaires"
},
};

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 foundry.utils.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

@ -9,7 +9,7 @@ export class MournbladeItemSheet extends ItemSheet {
/** @override */
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["fvtt-mournblade", "sheet", "item"],
template: "systems/fvtt-mournblade/templates/item-sheet.html",
dragDrop: [{ dragSelector: null, dropSelector: null }],
@ -48,7 +48,7 @@ export class MournbladeItemSheet extends ItemSheet {
/* -------------------------------------------- */
async getData() {
const objectData = duplicate(this.object)
const objectData = foundry.utils.duplicate(this.object)
let itemData = objectData
let formData = {
title: this.title,
@ -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
}
@ -90,7 +91,7 @@ export class MournbladeItemSheet extends ItemSheet {
/* -------------------------------------------- */
postItem() {
let chatData = duplicate(MournbladeUtility.data(this.item));
let chatData = foundry.utils.duplicate(MournbladeUtility.data(this.item));
if (this.actor) {
chatData.actor = { id: this.actor.id };
}
@ -133,28 +134,28 @@ export class MournbladeItemSheet extends ItemSheet {
html.find('.edit-prediction').change(ev => {
const li = $(ev.currentTarget).parents(".prediction-item")
let index = li.data("prediction-index")
let pred = duplicate(this.object.system.predilections)
let pred = foundry.utils.duplicate(this.object.system.predilections)
pred[index].name = ev.currentTarget.value
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)
let pred = foundry.utils.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)
let pred = foundry.utils.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 })
let pred = foundry.utils.duplicate(this.object.system.predilections)
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 })
@ -74,28 +77,13 @@ function welcomeMessage() {
}
/* -------------------------------------------- */
// 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();
}
}
@ -113,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);
@ -58,15 +59,6 @@ export class MournbladeUtility {
return actor
}
/* -------------------------------------------- */
static getModificateurOptions() {
let opt = []
for (let i = -15; i <= 15; i++) {
opt.push(`<option value="${i}">${i}</option>`)
}
return opt.concat("\n")
}
/* -------------------------------------------- */
static sortArrayObjectsByName(myArray) {
myArray.sort((a, b) => {
@ -74,18 +66,9 @@ export class MournbladeUtility {
})
}
/* -------------------------------------------- */
static getPointAmeOptions() {
let opt = []
for (let i = 1; i <= 20; i++) {
opt.push(`<option value="${i}">${i}</option>`)
}
return opt.concat("\n")
}
/* -------------------------------------------- */
static getAttributs() {
return { adr: "Adresse", pui: "Puissance", cla: "Clairvoyance", pre: "Présence", tre: "Trempe" }
return game.system.mournblade.config.attributs
}
/* -------------------------------------------- */
static pushInitiativeOptions(html, options) {
@ -100,6 +83,11 @@ export class MournbladeUtility {
static async ready() {
const skills = await MournbladeUtility.loadCompendium("fvtt-mournblade.skills")
this.skills = skills.map(i => i.toObject())
game.system.mournblade.config.listeNiveauSkill = MournbladeUtility.createDirectOptionList(0, 10)
game.system.mournblade.config.listeNiveauCreature = MournbladeUtility.createDirectOptionList(0, 35)
game.system.mournblade.config.modificateurOptions = MournbladeUtility.createArrayOptionList(-15, 15)
game.system.mournblade.config.pointsAmeOptions = MournbladeUtility.createDirectOptionList(0, 20)
}
/* -------------------------------------------- */
@ -118,6 +106,27 @@ export class MournbladeUtility {
static getOptionsStatusList() {
return this.optionsStatusList;
}
/* -------------------------------------------- */
static getPredilection(comp, predIdx) {
let pred = foundry.utils.duplicate(comp.system.predilections)
return foundry.utils.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) {
@ -128,8 +137,28 @@ export class MournbladeUtility {
let rollData = message.getFlag("world", "mournblade-roll")
let actor = MournbladeUtility.getActorFromRollData(rollData)
await actor.setPredilectionUsed(rollData.competence._id, predIdx)
rollData.competence = duplicate(actor.getCompetence(rollData.competence._id))
MournbladeUtility.rollMournblade(rollData)
rollData.competence = foundry.utils.duplicate(actor.getCompetence(rollData.competence._id))
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 } })
}
})
}
@ -138,8 +167,7 @@ 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-item-description.html'
]
return loadTemplates(templatePaths);
}
@ -181,12 +209,10 @@ export class MournbladeUtility {
}
return options;
}
/* -------------------------------------------- */
static buildListOptions(min, max) {
let options = ""
static createArrayOptionList(min, max) {
let options = [];
for (let i = min; i <= max; i++) {
options += `<option value="${i}">${i}</option>`
options.push({key:`${i}`, label:`${i}`});
}
return options;
}
@ -201,22 +227,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];
@ -224,12 +234,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);
}
}
}
@ -299,6 +307,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)
}
}
@ -311,7 +320,7 @@ export class MournbladeUtility {
}
if (!rollData.attr) {
rollData.actionImg = "systems/fvtt-mournblade/assets/icons/" + actor.system.attributs[rollData.attrKey].labelnorm + ".webp"
rollData.attr = duplicate(actor.system.attributs[rollData.attrKey])
rollData.attr = foundry.utils.duplicate(actor.system.attributs[rollData.attrKey])
}
rollData.diceFormula = rollData.mainDice
@ -323,17 +332,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 = foundry.utils.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") {
@ -343,16 +394,17 @@ export class MournbladeUtility {
rollData.runeduree = 1
}
}
let myRoll = new Roll(rollData.diceFormula).roll({ async: false })
let myRoll = await new Roll(rollData.diceFormula).evaluate();
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
rollData.roll = myRoll
rollData.roll = foundry.utils.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) {
@ -360,20 +412,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 = await new Roll(rollData.degatsFormula).evaluate({ maximize: maximize })
await this.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode"))
rollData.degatsRoll = foundry.utils.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 })
let bonusRoll = await new Roll(rollData.bonusFormula).evaluate()
await this.showDiceSoNice(bonusRoll, game.settings.get("core", "rollMode"));
rollData.bonusRoll = bonusRoll
rollData.bonusRoll = foundry.utils.duplicate(bonusRoll)
rollData.finalResult += rollData.bonusRoll.total
@ -407,7 +599,7 @@ export class MournbladeUtility {
/* -------------------------------------------- */
static blindMessageToGM(chatOptions) {
let chatGM = duplicate(chatOptions);
let chatGM = foundry.utils.duplicate(chatOptions);
chatGM.whisper = this.getUsers(user => user.isGM);
chatGM.content = "Blinde message of " + game.user.name + "<br>" + chatOptions.content;
console.log("blindMessageToGM", chatGM);
@ -460,7 +652,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)
@ -469,12 +662,11 @@ export class MournbladeUtility {
/* -------------------------------------------- */
static getBasicRollData() {
let rollData = {
rollId: randomID(16),
rollId: foundry.utils.randomID(16),
rollMode: game.settings.get("core", "rollMode"),
modificateursOptions: this.getModificateurOptions(),
pointAmeOptions: this.getPointAmeOptions(),
difficulte: 0,
modificateur: 0,
config: foundry.utils.duplicate(game.system.mournblade.config),
}
MournbladeUtility.updateWithTarget(rollData)
return rollData
@ -486,6 +678,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
@ -648,11 +843,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));
@ -660,12 +855,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/000195.ldb Normal file

Binary file not shown.

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

1
packs/armes/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000200

0
packs/armes/LOCK Normal file
View File

8
packs/armes/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/05/01-09:35:36.267528 7f830f4006c0 Recovering log #198
2024/05/01-09:35:36.318214 7f830f4006c0 Delete type=3 #196
2024/05/01-09:35:36.318310 7f830f4006c0 Delete type=0 #198
2024/05/01-09:42:43.133457 7f830e0006c0 Level-0 table #203: started
2024/05/01-09:42:43.133499 7f830e0006c0 Level-0 table #203: 0 bytes OK
2024/05/01-09:42:43.141393 7f830e0006c0 Delete type=0 #201
2024/05/01-09:42:43.156019 7f830e0006c0 Manual compaction at level-0 from '!items!0swiE8k5zfUIqmXu' @ 72057594037927935 : 1 .. '!items!wv5EiePmPTpqFutt' @ 0 : 0; will stop at (end)
2024/05/01-09:42:43.156088 7f830e0006c0 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/25-23:18:20.595518 7f0832a006c0 Recovering log #193
2024/04/25-23:18:20.606674 7f0832a006c0 Delete type=3 #191
2024/04/25-23:18:20.606816 7f0832a006c0 Delete type=0 #193
2024/04/25-23:31:59.770416 7f08310006c0 Level-0 table #199: started
2024/04/25-23:31:59.770479 7f08310006c0 Level-0 table #199: 0 bytes OK
2024/04/25-23:31:59.807298 7f08310006c0 Delete type=0 #197
2024/04/25-23:31:59.807694 7f08310006c0 Manual compaction at level-0 from '!items!0swiE8k5zfUIqmXu' @ 72057594037927935 : 1 .. '!items!wv5EiePmPTpqFutt' @ 0 : 0; will stop at (end)
2024/04/25-23:31:59.846668 7f08310006c0 Manual compaction at level-1 from '!items!0swiE8k5zfUIqmXu' @ 72057594037927935 : 1 .. '!items!wv5EiePmPTpqFutt' @ 0 : 0; will stop at (end)

BIN
packs/armes/MANIFEST-000200 Normal file

Binary file not shown.

BIN
packs/dons/000194.ldb Normal file

Binary file not shown.

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

1
packs/dons/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000199

0
packs/dons/LOCK Normal file
View File

8
packs/dons/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/05/01-09:35:36.447142 7f830ea006c0 Recovering log #197
2024/05/01-09:35:36.500900 7f830ea006c0 Delete type=3 #195
2024/05/01-09:35:36.501044 7f830ea006c0 Delete type=0 #197
2024/05/01-09:42:43.163729 7f830e0006c0 Level-0 table #202: started
2024/05/01-09:42:43.163769 7f830e0006c0 Level-0 table #202: 0 bytes OK
2024/05/01-09:42:43.170272 7f830e0006c0 Delete type=0 #200
2024/05/01-09:42:43.184812 7f830e0006c0 Manual compaction at level-0 from '!items!5dGXNiL3WN4cAk7X' @ 72057594037927935 : 1 .. '!items!zzz9JrtWjELdoAfK' @ 0 : 0; will stop at (end)
2024/05/01-09:42:43.184921 7f830e0006c0 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/25-23:18:20.639847 7f0833e006c0 Recovering log #192
2024/04/25-23:18:20.650619 7f0833e006c0 Delete type=3 #190
2024/04/25-23:18:20.650726 7f0833e006c0 Delete type=0 #192
2024/04/25-23:31:59.846695 7f08310006c0 Level-0 table #198: started
2024/04/25-23:31:59.846738 7f08310006c0 Level-0 table #198: 0 bytes OK
2024/04/25-23:31:59.878047 7f08310006c0 Delete type=0 #196
2024/04/25-23:31:59.950365 7f08310006c0 Manual compaction at level-0 from '!items!5dGXNiL3WN4cAk7X' @ 72057594037927935 : 1 .. '!items!zzz9JrtWjELdoAfK' @ 0 : 0; will stop at (end)
2024/04/25-23:31:59.950424 7f08310006c0 Manual compaction at level-1 from '!items!5dGXNiL3WN4cAk7X' @ 72057594037927935 : 1 .. '!items!zzz9JrtWjELdoAfK' @ 0 : 0; will stop at (end)

BIN
packs/dons/MANIFEST-000199 Normal file

Binary file not shown.

BIN
packs/equipement/000194.ldb Normal file

Binary file not shown.

View File

1
packs/equipement/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000199

0
packs/equipement/LOCK Normal file
View File

8
packs/equipement/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/05/01-09:35:36.386580 7f830f4006c0 Recovering log #197
2024/05/01-09:35:36.440932 7f830f4006c0 Delete type=3 #195
2024/05/01-09:35:36.441077 7f830f4006c0 Delete type=0 #197
2024/05/01-09:42:43.156323 7f830e0006c0 Level-0 table #202: started
2024/05/01-09:42:43.156397 7f830e0006c0 Level-0 table #202: 0 bytes OK
2024/05/01-09:42:43.163540 7f830e0006c0 Delete type=0 #200
2024/05/01-09:42:43.184777 7f830e0006c0 Manual compaction at level-0 from '!items!1cZd2hlTV9tykDED' @ 72057594037927935 : 1 .. '!items!y47dBO3Mf5Pn7tOd' @ 0 : 0; will stop at (end)
2024/05/01-09:42:43.184871 7f830e0006c0 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/25-23:18:20.625174 7f0832a006c0 Recovering log #192
2024/04/25-23:18:20.636417 7f0832a006c0 Delete type=3 #190
2024/04/25-23:18:20.636541 7f0832a006c0 Delete type=0 #192
2024/04/25-23:31:59.807936 7f08310006c0 Level-0 table #198: started
2024/04/25-23:31:59.807990 7f08310006c0 Level-0 table #198: 0 bytes OK
2024/04/25-23:31:59.846313 7f08310006c0 Delete type=0 #196
2024/04/25-23:31:59.913834 7f08310006c0 Manual compaction at level-0 from '!items!1cZd2hlTV9tykDED' @ 72057594037927935 : 1 .. '!items!y47dBO3Mf5Pn7tOd' @ 0 : 0; will stop at (end)
2024/04/25-23:31:59.950407 7f08310006c0 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/000194.ldb Normal file

Binary file not shown.

View File

1
packs/heritages/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000199

0
packs/heritages/LOCK Normal file
View File

8
packs/heritages/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/05/01-09:35:36.580416 7f830ea006c0 Recovering log #197
2024/05/01-09:35:36.650922 7f830ea006c0 Delete type=3 #195
2024/05/01-09:35:36.651073 7f830ea006c0 Delete type=0 #197
2024/05/01-09:42:43.178046 7f830e0006c0 Level-0 table #202: started
2024/05/01-09:42:43.178094 7f830e0006c0 Level-0 table #202: 0 bytes OK
2024/05/01-09:42:43.184514 7f830e0006c0 Delete type=0 #200
2024/05/01-09:42:43.184854 7f830e0006c0 Manual compaction at level-0 from '!items!2GaJZsqr2c2mcDRv' @ 72057594037927935 : 1 .. '!items!ui4JGsGwHNlSXVK3' @ 0 : 0; will stop at (end)
2024/05/01-09:42:43.184903 7f830e0006c0 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/25-23:18:20.668825 7f0833e006c0 Recovering log #192
2024/04/25-23:18:20.680265 7f0833e006c0 Delete type=3 #190
2024/04/25-23:18:20.680363 7f0833e006c0 Delete type=0 #192
2024/04/25-23:31:59.913864 7f08310006c0 Level-0 table #198: started
2024/04/25-23:31:59.913918 7f08310006c0 Level-0 table #198: 0 bytes OK
2024/04/25-23:31:59.950159 7f08310006c0 Delete type=0 #196
2024/04/25-23:31:59.950438 7f08310006c0 Manual compaction at level-0 from '!items!2GaJZsqr2c2mcDRv' @ 72057594037927935 : 1 .. '!items!ui4JGsGwHNlSXVK3' @ 0 : 0; will stop at (end)
2024/04/25-23:31:59.950490 7f08310006c0 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/000194.ldb Normal file

Binary file not shown.

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

1
packs/metiers/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000199

0
packs/metiers/LOCK Normal file
View File

8
packs/metiers/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/05/01-09:35:36.655366 7f830f4006c0 Recovering log #197
2024/05/01-09:35:36.709235 7f830f4006c0 Delete type=3 #195
2024/05/01-09:35:36.709381 7f830f4006c0 Delete type=0 #197
2024/05/01-09:42:43.185067 7f830e0006c0 Level-0 table #202: started
2024/05/01-09:42:43.185130 7f830e0006c0 Level-0 table #202: 0 bytes OK
2024/05/01-09:42:43.191994 7f830e0006c0 Delete type=0 #200
2024/05/01-09:42:43.216134 7f830e0006c0 Manual compaction at level-0 from '!items!09s33sFuju8zjPqI' @ 72057594037927935 : 1 .. '!items!xlyFCQClBZ1N3O1B' @ 0 : 0; will stop at (end)
2024/05/01-09:42:43.216237 7f830e0006c0 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/25-23:18:20.683579 7f0832a006c0 Recovering log #192
2024/04/25-23:18:20.739808 7f0832a006c0 Delete type=3 #190
2024/04/25-23:18:20.740012 7f0832a006c0 Delete type=0 #192
2024/04/25-23:31:59.987531 7f08310006c0 Level-0 table #198: started
2024/04/25-23:31:59.987597 7f08310006c0 Level-0 table #198: 0 bytes OK
2024/04/25-23:32:00.025092 7f08310006c0 Delete type=0 #196
2024/04/25-23:32:00.098181 7f08310006c0 Manual compaction at level-0 from '!items!09s33sFuju8zjPqI' @ 72057594037927935 : 1 .. '!items!xlyFCQClBZ1N3O1B' @ 0 : 0; will stop at (end)
2024/04/25-23:32:00.098246 7f08310006c0 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/000194.ldb Normal file

Binary file not shown.

View File

1
packs/origines/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000199

0
packs/origines/LOCK Normal file
View File

8
packs/origines/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/05/01-09:35:36.508432 7f830f4006c0 Recovering log #197
2024/05/01-09:35:36.561800 7f830f4006c0 Delete type=3 #195
2024/05/01-09:35:36.561939 7f830f4006c0 Delete type=0 #197
2024/05/01-09:42:43.170680 7f830e0006c0 Level-0 table #202: started
2024/05/01-09:42:43.170753 7f830e0006c0 Level-0 table #202: 0 bytes OK
2024/05/01-09:42:43.177825 7f830e0006c0 Delete type=0 #200
2024/05/01-09:42:43.184836 7f830e0006c0 Manual compaction at level-0 from '!items!2t1KmBeQNuKK5qlN' @ 72057594037927935 : 1 .. '!items!yBvkQb9S64s908sR' @ 0 : 0; will stop at (end)
2024/05/01-09:42:43.184888 7f830e0006c0 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/25-23:18:20.653541 7f0832a006c0 Recovering log #192
2024/04/25-23:18:20.665587 7f0832a006c0 Delete type=3 #190
2024/04/25-23:18:20.665693 7f0832a006c0 Delete type=0 #192
2024/04/25-23:31:59.878272 7f08310006c0 Level-0 table #198: started
2024/04/25-23:31:59.878321 7f08310006c0 Level-0 table #198: 0 bytes OK
2024/04/25-23:31:59.913563 7f08310006c0 Delete type=0 #196
2024/04/25-23:31:59.950389 7f08310006c0 Manual compaction at level-0 from '!items!2t1KmBeQNuKK5qlN' @ 72057594037927935 : 1 .. '!items!yBvkQb9S64s908sR' @ 0 : 0; will stop at (end)
2024/04/25-23:31:59.950473 7f08310006c0 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-000095

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

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

@ -0,0 +1,8 @@
2024/05/01-09:35:36.082984 7f830f4006c0 Recovering log #93
2024/05/01-09:35:36.138765 7f830f4006c0 Delete type=3 #91
2024/05/01-09:35:36.138887 7f830f4006c0 Delete type=0 #93
2024/05/01-09:42:43.096611 7f830e0006c0 Level-0 table #98: started
2024/05/01-09:42:43.096659 7f830e0006c0 Level-0 table #98: 0 bytes OK
2024/05/01-09:42:43.103787 7f830e0006c0 Delete type=0 #96
2024/05/01-09:42:43.126495 7f830e0006c0 Manual compaction at level-0 from '!actors!00CKDCqVh5fLZbYo' @ 72057594037927935 : 1 .. '!folders!dwT9WnH0ZnpuZh92' @ 0 : 0; will stop at (end)
2024/05/01-09:42:43.126585 7f830e0006c0 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/25-23:18:20.542505 7f0832a006c0 Recovering log #88
2024/04/25-23:18:20.553330 7f0832a006c0 Delete type=3 #86
2024/04/25-23:18:20.553446 7f0832a006c0 Delete type=0 #88
2024/04/25-23:31:59.654488 7f08310006c0 Level-0 table #94: started
2024/04/25-23:31:59.654563 7f08310006c0 Level-0 table #94: 0 bytes OK
2024/04/25-23:31:59.691350 7f08310006c0 Delete type=0 #92
2024/04/25-23:31:59.691614 7f08310006c0 Manual compaction at level-0 from '!actors!00CKDCqVh5fLZbYo' @ 72057594037927935 : 1 .. '!folders!dwT9WnH0ZnpuZh92' @ 0 : 0; will stop at (end)
2024/04/25-23:31:59.807584 7f08310006c0 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/000194.ldb Normal file

Binary file not shown.

View File

1
packs/protection/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000199

0
packs/protection/LOCK Normal file
View File

8
packs/protection/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/05/01-09:35:36.326101 7f830ea006c0 Recovering log #197
2024/05/01-09:35:36.382463 7f830ea006c0 Delete type=3 #195
2024/05/01-09:35:36.382677 7f830ea006c0 Delete type=0 #197
2024/05/01-09:42:43.148903 7f830e0006c0 Level-0 table #202: started
2024/05/01-09:42:43.148967 7f830e0006c0 Level-0 table #202: 0 bytes OK
2024/05/01-09:42:43.155801 7f830e0006c0 Delete type=0 #200
2024/05/01-09:42:43.156059 7f830e0006c0 Manual compaction at level-0 from '!items!2hD1DQVeCIQIXFU7' @ 72057594037927935 : 1 .. '!items!veoS6Gtzj6Dq087V' @ 0 : 0; will stop at (end)
2024/05/01-09:42:43.156117 7f830e0006c0 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/25-23:18:20.610323 7f0833e006c0 Recovering log #192
2024/04/25-23:18:20.622545 7f0833e006c0 Delete type=3 #190
2024/04/25-23:18:20.622654 7f0833e006c0 Delete type=0 #192
2024/04/25-23:31:59.733906 7f08310006c0 Level-0 table #198: started
2024/04/25-23:31:59.734001 7f08310006c0 Level-0 table #198: 0 bytes OK
2024/04/25-23:31:59.770187 7f08310006c0 Delete type=0 #196
2024/04/25-23:31:59.807670 7f08310006c0 Manual compaction at level-0 from '!items!2hD1DQVeCIQIXFU7' @ 72057594037927935 : 1 .. '!items!veoS6Gtzj6Dq087V' @ 0 : 0; will stop at (end)
2024/04/25-23:31:59.807915 7f08310006c0 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/000194.ldb Normal file

Binary file not shown.

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

1
packs/runes/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000199

0
packs/runes/LOCK Normal file
View File

8
packs/runes/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/05/01-09:35:36.849912 7f830ea006c0 Recovering log #197
2024/05/01-09:35:36.895690 7f830ea006c0 Delete type=3 #195
2024/05/01-09:35:36.895779 7f830ea006c0 Delete type=0 #197
2024/05/01-09:42:43.207927 7f830e0006c0 Level-0 table #202: started
2024/05/01-09:42:43.207966 7f830e0006c0 Level-0 table #202: 0 bytes OK
2024/05/01-09:42:43.215840 7f830e0006c0 Delete type=0 #200
2024/05/01-09:42:43.216214 7f830e0006c0 Manual compaction at level-0 from '!items!1JqWbEkHUoKXbsgn' @ 72057594037927935 : 1 .. '!items!xnCf2xIPzdsUoBTy' @ 0 : 0; will stop at (end)
2024/05/01-09:42:43.216305 7f830e0006c0 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/25-23:18:20.771521 7f0833e006c0 Recovering log #192
2024/04/25-23:18:20.782849 7f0833e006c0 Delete type=3 #190
2024/04/25-23:18:20.782970 7f0833e006c0 Delete type=0 #192
2024/04/25-23:32:00.061611 7f08310006c0 Level-0 table #198: started
2024/04/25-23:32:00.061677 7f08310006c0 Level-0 table #198: 0 bytes OK
2024/04/25-23:32:00.097976 7f08310006c0 Delete type=0 #196
2024/04/25-23:32:00.098231 7f08310006c0 Manual compaction at level-0 from '!items!1JqWbEkHUoKXbsgn' @ 72057594037927935 : 1 .. '!items!xnCf2xIPzdsUoBTy' @ 0 : 0; will stop at (end)
2024/04/25-23:32:00.098275 7f08310006c0 Manual compaction at level-1 from '!items!1JqWbEkHUoKXbsgn' @ 72057594037927935 : 1 .. '!items!xnCf2xIPzdsUoBTy' @ 0 : 0; will stop at (end)

BIN
packs/runes/MANIFEST-000199 Normal file

Binary file not shown.

BIN
packs/scenes/000110.ldb Normal file

Binary file not shown.

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

1
packs/scenes/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000115

0
packs/scenes/LOCK Normal file
View File

8
packs/scenes/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/05/01-09:35:36.976720 7f830ea006c0 Recovering log #113
2024/05/01-09:35:37.030673 7f830ea006c0 Delete type=3 #111
2024/05/01-09:35:37.030805 7f830ea006c0 Delete type=0 #113
2024/05/01-09:42:43.223193 7f830e0006c0 Level-0 table #118: started
2024/05/01-09:42:43.223235 7f830e0006c0 Level-0 table #118: 0 bytes OK
2024/05/01-09:42:43.229929 7f830e0006c0 Delete type=0 #116
2024/05/01-09:42:43.230159 7f830e0006c0 Manual compaction at level-0 from '!scenes!ZDV2IwduhOXTxy72' @ 72057594037927935 : 1 .. '!scenes!ZDV2IwduhOXTxy72' @ 0 : 0; will stop at (end)
2024/05/01-09:42:43.230186 7f830e0006c0 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/25-23:18:20.802683 7f0833e006c0 Recovering log #108
2024/04/25-23:18:20.813089 7f0833e006c0 Delete type=3 #106
2024/04/25-23:18:20.813231 7f0833e006c0 Delete type=0 #108
2024/04/25-23:32:00.135709 7f08310006c0 Level-0 table #114: started
2024/04/25-23:32:00.135776 7f08310006c0 Level-0 table #114: 0 bytes OK
2024/04/25-23:32:00.192118 7f08310006c0 Delete type=0 #112
2024/04/25-23:32:00.192474 7f08310006c0 Manual compaction at level-0 from '!scenes!ZDV2IwduhOXTxy72' @ 72057594037927935 : 1 .. '!scenes!ZDV2IwduhOXTxy72' @ 0 : 0; will stop at (end)
2024/04/25-23:32:00.192524 7f08310006c0 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-000107

View File

View File

@ -0,0 +1,8 @@
2024/05/01-09:35:36.208918 7f830ea006c0 Recovering log #105
2024/05/01-09:35:36.259681 7f830ea006c0 Delete type=3 #103
2024/05/01-09:35:36.259786 7f830ea006c0 Delete type=0 #105
2024/05/01-09:42:43.141574 7f830e0006c0 Level-0 table #110: started
2024/05/01-09:42:43.141614 7f830e0006c0 Level-0 table #110: 0 bytes OK
2024/05/01-09:42:43.148597 7f830e0006c0 Delete type=0 #108
2024/05/01-09:42:43.156038 7f830e0006c0 Manual compaction at level-0 from '!items!6bmjc4MUduGs9s6n' @ 72057594037927935 : 1 .. '!items!t692JcsGHG4YJIlM' @ 0 : 0; will stop at (end)
2024/05/01-09:42:43.156102 7f830e0006c0 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/25-23:18:20.580223 7f0833e006c0 Recovering log #100
2024/04/25-23:18:20.591502 7f0833e006c0 Delete type=3 #98
2024/04/25-23:18:20.591624 7f0833e006c0 Delete type=0 #100
2024/04/25-23:31:59.691806 7f08310006c0 Level-0 table #106: started
2024/04/25-23:31:59.691866 7f08310006c0 Level-0 table #106: 0 bytes OK
2024/04/25-23:31:59.733591 7f08310006c0 Delete type=0 #104
2024/04/25-23:31:59.807634 7f08310006c0 Manual compaction at level-0 from '!items!6bmjc4MUduGs9s6n' @ 72057594037927935 : 1 .. '!items!t692JcsGHG4YJIlM' @ 0 : 0; will stop at (end)
2024/04/25-23:31:59.807869 7f08310006c0 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/000194.ldb Normal file

Binary file not shown.

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

1
packs/skills/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000199

0
packs/skills/LOCK Normal file
View File

8
packs/skills/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/05/01-09:35:36.157653 7f830f4006c0 Recovering log #197
2024/05/01-09:35:36.201543 7f830f4006c0 Delete type=3 #195
2024/05/01-09:35:36.201652 7f830f4006c0 Delete type=0 #197
2024/05/01-09:42:43.126781 7f830e0006c0 Level-0 table #202: started
2024/05/01-09:42:43.126821 7f830e0006c0 Level-0 table #202: 0 bytes OK
2024/05/01-09:42:43.133212 7f830e0006c0 Delete type=0 #200
2024/05/01-09:42:43.156000 7f830e0006c0 Manual compaction at level-0 from '!items!0LlzDyCurJedqeyG' @ 72057594037927935 : 1 .. '!items!tq6mEgXog7h4VyWk' @ 0 : 0; will stop at (end)
2024/05/01-09:42:43.156076 7f830e0006c0 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/25-23:18:20.564492 7f0832a006c0 Recovering log #192
2024/04/25-23:18:20.576603 7f0832a006c0 Delete type=3 #190
2024/04/25-23:18:20.576708 7f0832a006c0 Delete type=0 #192
2024/04/25-23:31:59.612869 7f08310006c0 Level-0 table #198: started
2024/04/25-23:31:59.612922 7f08310006c0 Level-0 table #198: 0 bytes OK
2024/04/25-23:31:59.654250 7f08310006c0 Delete type=0 #196
2024/04/25-23:31:59.691593 7f08310006c0 Manual compaction at level-0 from '!items!0LlzDyCurJedqeyG' @ 72057594037927935 : 1 .. '!items!tq6mEgXog7h4VyWk' @ 0 : 0; will stop at (end)
2024/04/25-23:31:59.691665 7f08310006c0 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/000194.ldb Normal file

Binary file not shown.

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

1
packs/tables/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000199

0
packs/tables/LOCK Normal file
View File

8
packs/tables/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/05/01-09:35:36.910265 7f830f4006c0 Recovering log #197
2024/05/01-09:35:36.971498 7f830f4006c0 Delete type=3 #195
2024/05/01-09:35:36.971624 7f830f4006c0 Delete type=0 #197
2024/05/01-09:42:43.216406 7f830e0006c0 Level-0 table #202: started
2024/05/01-09:42:43.216462 7f830e0006c0 Level-0 table #202: 0 bytes OK
2024/05/01-09:42:43.223010 7f830e0006c0 Delete type=0 #200
2024/05/01-09:42:43.230120 7f830e0006c0 Manual compaction at level-0 from '!tables!zV2oJy8JZE0nngRY' @ 72057594037927935 : 1 .. '!tables.results!zV2oJy8JZE0nngRY.wTMX1TbxljHmHImp' @ 0 : 0; will stop at (end)
2024/05/01-09:42:43.230173 7f830e0006c0 Manual compaction at level-1 from '!tables!zV2oJy8JZE0nngRY' @ 72057594037927935 : 1 .. '!tables.results!zV2oJy8JZE0nngRY.wTMX1TbxljHmHImp' @ 0 : 0; will stop at (end)

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