Potions et élémentaires
@@ -30,6 +30,30 @@ jobs:
|
|||||||
manifest: https://www.uberwald.me/gitea/public/fvtt-mournblade/releases/download/latest/system.json
|
manifest: https://www.uberwald.me/gitea/public/fvtt-mournblade/releases/download/latest/system.json
|
||||||
download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-mournblade.zip
|
download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-mournblade.zip
|
||||||
|
|
||||||
|
# Set up Node.js and build compendium packs from source
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: https://github.com/actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm install
|
||||||
|
|
||||||
|
- name: Build journal-aide compendium pack
|
||||||
|
run: |
|
||||||
|
rm -rf packs/journal-aide/journal-aide
|
||||||
|
./node_modules/.bin/fvtt package pack -n journal-aide --inputDirectory ./packs/src/journal-aide --outputDirectory ./packs/journal-aide
|
||||||
|
|
||||||
|
- name: Build pouvoirs-elementaires compendium pack
|
||||||
|
run: |
|
||||||
|
rm -rf packs/pouvoirs-elementaires/pouvoirs-elementaires
|
||||||
|
./node_modules/.bin/fvtt package pack -n pouvoirs-elementaires --inputDirectory ./packs/src/pouvoirs-elementaires --outputDirectory ./packs/pouvoirs-elementaires
|
||||||
|
|
||||||
|
- name: Build creatures-elementaires compendium pack
|
||||||
|
run: |
|
||||||
|
rm -rf packs/creatures-elementaires/creatures-elementaires
|
||||||
|
./node_modules/.bin/fvtt package pack -n creatures-elementaires --inputDirectory ./packs/src/creatures-elementaires --outputDirectory ./packs/creatures-elementaires
|
||||||
|
|
||||||
# Create a zip file with all files required by the module to add to the release
|
# Create a zip file with all files required by the module to add to the release
|
||||||
- run: |
|
- run: |
|
||||||
apt update -y
|
apt update -y
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#661f1f" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M94.055 21.9 18.998 96.96l42.727 23.6-26.98 26.952L142.35 212.39c-40.443 70.148-30.72 161.07 29.2 220.958 71.605 71.606 187.737 71.587 259.356 0 71.62-71.587 71.642-187.654.037-259.22-59.915-59.878-150.896-69.57-221.084-29.177L144.95 37.415l-8.44 8.432-18.588 18.57L94.055 21.9zm47.224 45.598 62.337 103.275 8.098-5.248c44.21-28.663 99.014-34.044 147.166-16.078-1.16-.026-2.328-.04-3.503-.04-38.988 0-70.594 14.807-70.594 33.073 0 18.27 31.606 33.075 70.594 33.075 31.53 0 58.225-9.684 67.287-23.05 15.942 17.34 27.492 37.224 34.65 58.253-7.76-3.387-18.28-6.706-30.902-9.563-31.383-7.1-75.547-11.615-124.305-11.615-48.757 0-92.92 4.514-124.304 11.615-13.71 3.102-24.997 6.75-32.893 10.438a163.85 163.85 0 0 1 18.018-37.383l5.263-8.104-103.33-62.3 13.894-13.88 46.937 25.923 27.914-27.915-26.18-46.635 13.855-13.842zm-1.087 201.287c.482.28.982.56 1.506.84 7.89 4.22 20.41 8.487 36.103 12.037 31.383 7.1 75.547 11.615 124.304 11.615 48.758 0 92.922-4.514 124.305-11.615 15.687-3.55 28.203-7.813 36.094-12.033a164.248 164.248 0 0 1 2.746 17.643c-9.432 4.277-21.204 7.893-35.074 11.032-33.205 7.513-78.27 12.037-128.07 12.037-49.802 0-94.866-4.524-128.07-12.037-14.67-3.32-27-7.17-36.69-11.776a164.503 164.503 0 0 1 2.845-17.745z" fill="#fff" fill-opacity="1"></path></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 2.1 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
@@ -171,7 +171,6 @@
|
|||||||
"MNBL.weapontype": "Weapon Type",
|
"MNBL.weapontype": "Weapon Type",
|
||||||
"MNBL.weight": "Weight",
|
"MNBL.weight": "Weight",
|
||||||
"MNBL.total": "Total",
|
"MNBL.total": "Total",
|
||||||
|
|
||||||
"Présence": "Presence",
|
"Présence": "Presence",
|
||||||
"Puissance": "Might",
|
"Puissance": "Might",
|
||||||
"Trempe": "Mettle",
|
"Trempe": "Mettle",
|
||||||
@@ -200,5 +199,68 @@
|
|||||||
"traitchaotique": "Background",
|
"traitchaotique": "Background",
|
||||||
"traitespece": "Species Trait"
|
"traitespece": "Species Trait"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"MNBL.potion": "Potion",
|
||||||
|
"MNBL.potionRune": "Rune",
|
||||||
|
"MNBL.potionSeuil": "Rune Threshold",
|
||||||
|
"MNBL.potionPointsAme": "Soul Points invested",
|
||||||
|
"MNBL.potionForme": "Form",
|
||||||
|
"MNBL.potionStatut": "Status",
|
||||||
|
"MNBL.potionVirulence": "Virulence",
|
||||||
|
"MNBL.potionDuree": "Duration",
|
||||||
|
"MNBL.potionConservation": "Conservation",
|
||||||
|
"MNBL.potionTemps": "Preparation Time",
|
||||||
|
"MNBL.potionEffetCuratif": "Curative Effect",
|
||||||
|
"MNBL.potionEffetLetal": "Lethal Effect",
|
||||||
|
"MNBL.potionEffetSecondaire": "Side Effects",
|
||||||
|
"MNBL.potionDescription": "Description",
|
||||||
|
"MNBL.potionLiquide": "Liquid",
|
||||||
|
"MNBL.potionOnguent": "Ointment",
|
||||||
|
"MNBL.potionCachets": "Tablets",
|
||||||
|
"MNBL.potionPilules": "Pills",
|
||||||
|
"MNBL.potionInconnue": "Unknown",
|
||||||
|
"MNBL.potionEfficace": "Effective",
|
||||||
|
"MNBL.potionHeroique": "Heroic",
|
||||||
|
"MNBL.potionInefficace": "Ineffective",
|
||||||
|
"MNBL.potionPoison": "Poison",
|
||||||
|
"MNBL.preparePotion": "Prepare a Potion",
|
||||||
|
"MNBL.capacites": "Capacities / Powers",
|
||||||
|
"MNBL.capacite": "Capacity",
|
||||||
|
"MNBL.typeCapacite": "Capacity Type",
|
||||||
|
"MNBL.typeCapaciteElue": "Chosen Power",
|
||||||
|
"MNBL.typeCapaciteElementaire": "Elemental Power",
|
||||||
|
"MNBL.typeCapaciteDemoniaque": "Demonic Power",
|
||||||
|
"MNBL.typeCapaciteCreature": "Creature Power",
|
||||||
|
"MNBL.creatureTypeCreature": "Creature",
|
||||||
|
"MNBL.creatureTypeDemon": "Demon",
|
||||||
|
"MNBL.creatureTypeElementaire": "Elemental",
|
||||||
|
"MNBL.elementTypeAir": "Air",
|
||||||
|
"MNBL.elementTypeTerre": "Earth",
|
||||||
|
"MNBL.elementTypeFeu": "Fire",
|
||||||
|
"MNBL.elementTypeEau": "Water",
|
||||||
|
"MNBL.creatureType": "Creature Type",
|
||||||
|
"MNBL.elementType": "Element",
|
||||||
|
"MNBL.invoquerElementaire": "Summon an Elemental",
|
||||||
|
"MNBL.bannirElementaire": "Banish",
|
||||||
|
"MNBL.invocationsActives": "Active Invocations",
|
||||||
|
"MNBL.invocationElement": "Element",
|
||||||
|
"MNBL.invocationTier": "Power",
|
||||||
|
"MNBL.invocationSeuil": "Threshold",
|
||||||
|
"MNBL.invocationAmeExtra": "Extra Soul Points",
|
||||||
|
"MNBL.invocationAmeTotal": "Total Soul Cost",
|
||||||
|
"MNBL.invocationTemps": "Concentration Time",
|
||||||
|
"MNBL.invocationBonusPacte": "Elemental Pact Bonus",
|
||||||
|
"MNBL.invocationHautParler": "Savoir : Haut-Parler",
|
||||||
|
"MNBL.invocationSeigneursElem": "Savoir : Seigneurs Élémentaires",
|
||||||
|
"MNBL.invocationResultSucces": "The Elemental is summoned!",
|
||||||
|
"MNBL.invocationResultHeroique": "Heroic success! You may freely increase one of the Elemental's attributes by +2.",
|
||||||
|
"MNBL.invocationResultEchec": "The invocation failed. You lose half the Soul Points spent.",
|
||||||
|
"MNBL.invocationResultDramatique": "Dramatic failure! The invocation failed and you lose all invested Soul Points. A natural catastrophe is unleashed!",
|
||||||
|
"MNBL.invocationTierMineur": "Minor (Threshold 15)",
|
||||||
|
"MNBL.invocationTierMedian": "Median (Threshold 20)",
|
||||||
|
"MNBL.invocationTierMajeur": "Major (Threshold 25)",
|
||||||
|
"MNBL.invocationConcentrationMineur": "1 round",
|
||||||
|
"MNBL.invocationConcentrationMedian": "1 minute",
|
||||||
|
"MNBL.invocationConcentrationMajeur": "1 hour",
|
||||||
|
"MNBL.invocationAmeBloque": "Blocked Soul"
|
||||||
}
|
}
|
||||||
@@ -30,7 +30,6 @@
|
|||||||
"Clairvoyance": "Clairvoyance",
|
"Clairvoyance": "Clairvoyance",
|
||||||
"Présence": "Présence",
|
"Présence": "Présence",
|
||||||
"Trempe": "Trempe",
|
"Trempe": "Trempe",
|
||||||
|
|
||||||
"MNBL.assaut": "Assaut",
|
"MNBL.assaut": "Assaut",
|
||||||
"MNBL.preciseattack": "Attaque Précise",
|
"MNBL.preciseattack": "Attaque Précise",
|
||||||
"MNBL.feint": "Feinte",
|
"MNBL.feint": "Feinte",
|
||||||
@@ -38,7 +37,6 @@
|
|||||||
"MNBL.charge": "Charger",
|
"MNBL.charge": "Charger",
|
||||||
"MNBL.contain": "Contenir l'adversaire",
|
"MNBL.contain": "Contenir l'adversaire",
|
||||||
"MNBL.disarm": "Désarmer",
|
"MNBL.disarm": "Désarmer",
|
||||||
|
|
||||||
"MNBL.none": "Aucun",
|
"MNBL.none": "Aucun",
|
||||||
"MNBL.lightcover": "Rondache ou léger (-2)",
|
"MNBL.lightcover": "Rondache ou léger (-2)",
|
||||||
"MNBL.mediumcover": "Pavois ou à moitié (-5)",
|
"MNBL.mediumcover": "Pavois ou à moitié (-5)",
|
||||||
@@ -46,12 +44,10 @@
|
|||||||
"MNBL.roll": "Jet",
|
"MNBL.roll": "Jet",
|
||||||
"MNBL.defensecapacity": "Capacité défensive",
|
"MNBL.defensecapacity": "Capacité défensive",
|
||||||
"MNBL.attackcapacity": "Capacité offensive",
|
"MNBL.attackcapacity": "Capacité offensive",
|
||||||
|
|
||||||
"MNBL.lessthanshort": "Moins que courte (10)",
|
"MNBL.lessthanshort": "Moins que courte (10)",
|
||||||
"MNBL.shortmore": "Courte et + (10)",
|
"MNBL.shortmore": "Courte et + (10)",
|
||||||
"MNBL.mediummore": "Moyenne et + (20)",
|
"MNBL.mediummore": "Moyenne et + (20)",
|
||||||
"MNBL.longmore": "Longue et + (25)",
|
"MNBL.longmore": "Longue et + (25)",
|
||||||
|
|
||||||
"MNBL.noneunknwon": "Aucune/Inconnue",
|
"MNBL.noneunknwon": "Aucune/Inconnue",
|
||||||
"MNBL.easy": "Facile (5)",
|
"MNBL.easy": "Facile (5)",
|
||||||
"MNBL.medium": "Moyenne (10)",
|
"MNBL.medium": "Moyenne (10)",
|
||||||
@@ -59,22 +55,18 @@
|
|||||||
"MNBL.hazardous": "Hasardeuse (20)",
|
"MNBL.hazardous": "Hasardeuse (20)",
|
||||||
"MNBL.insane": "Insensée (25)",
|
"MNBL.insane": "Insensée (25)",
|
||||||
"MNBL.puremadness": "Pure Folie (30)",
|
"MNBL.puremadness": "Pure Folie (30)",
|
||||||
|
|
||||||
"MNBL.pronouncerune": "Prononcer la rune",
|
"MNBL.pronouncerune": "Prononcer la rune",
|
||||||
"MNBL.tracerune": "Tracer la rune",
|
"MNBL.tracerune": "Tracer la rune",
|
||||||
"MNBL.pronounced": "Prononcée",
|
"MNBL.pronounced": "Prononcée",
|
||||||
"MNBL.traced": "Tracée",
|
"MNBL.traced": "Tracée",
|
||||||
|
|
||||||
"MNBL.meleeweapon": "Arme de contact",
|
"MNBL.meleeweapon": "Arme de contact",
|
||||||
"MNBL.meleethrowweapon": "Arme de contact et de Jet",
|
"MNBL.meleethrowweapon": "Arme de contact et de Jet",
|
||||||
"MNBL.throwweapon": "Arme de Lancer",
|
"MNBL.throwweapon": "Arme de Lancer",
|
||||||
"MNBL.shootweapon": "Arme de Tir",
|
"MNBL.shootweapon": "Arme de Tir",
|
||||||
"MNBL.specialweapon": "Spécial (capacité/don)",
|
"MNBL.specialweapon": "Spécial (capacité/don)",
|
||||||
|
|
||||||
"MNBL.all": "Tous",
|
"MNBL.all": "Tous",
|
||||||
"MNBL.beastslords": "Seigneurs des Bêtes",
|
"MNBL.beastslords": "Seigneurs des Bêtes",
|
||||||
"MNBL.elementslords": "Seigneurs Elementaires",
|
"MNBL.elementslords": "Seigneurs Elementaires",
|
||||||
|
|
||||||
"MNBL.law": "Loi",
|
"MNBL.law": "Loi",
|
||||||
"MNBL.chaos": "Chaos",
|
"MNBL.chaos": "Chaos",
|
||||||
"MNBL.level": "Niveau",
|
"MNBL.level": "Niveau",
|
||||||
@@ -145,7 +137,6 @@
|
|||||||
"MNBL.soulmultiplier": "Multiplicateur d'âme",
|
"MNBL.soulmultiplier": "Multiplicateur d'âme",
|
||||||
"MNBL.ignorehealthmalus": "Ignore le malus de santé",
|
"MNBL.ignorehealthmalus": "Ignore le malus de santé",
|
||||||
"MNBL.ignoresoulmalus": "Ignore le malus d'âme",
|
"MNBL.ignoresoulmalus": "Ignore le malus d'âme",
|
||||||
|
|
||||||
"MNBL.weapon": "Arme",
|
"MNBL.weapon": "Arme",
|
||||||
"MNBL.nextattackbonus": "Bonus pour prochaine attaque",
|
"MNBL.nextattackbonus": "Bonus pour prochaine attaque",
|
||||||
"MNBL.nextactionmalus": "Malus au défenseur pour prochaine action",
|
"MNBL.nextactionmalus": "Malus au défenseur pour prochaine action",
|
||||||
@@ -162,7 +153,6 @@
|
|||||||
"MNBL.heroicsuccess": "Succés Héroïque",
|
"MNBL.heroicsuccess": "Succés Héroïque",
|
||||||
"MNBL.dramaticfailure": "Echec Dramatique",
|
"MNBL.dramaticfailure": "Echec Dramatique",
|
||||||
"MNBL.oddresult": "Résultat impair — le dé compte pour 0",
|
"MNBL.oddresult": "Résultat impair — le dé compte pour 0",
|
||||||
|
|
||||||
"MNBL.attackmountbonus": "Attaquant monté vs def. au sol (+5)",
|
"MNBL.attackmountbonus": "Attaquant monté vs def. au sol (+5)",
|
||||||
"MNBL.targetdefense": "Défense adversaire",
|
"MNBL.targetdefense": "Défense adversaire",
|
||||||
"MNBL.shootmodifier": "Modificateurs de Tir",
|
"MNBL.shootmodifier": "Modificateurs de Tir",
|
||||||
@@ -182,7 +172,6 @@
|
|||||||
"MNBL.soulmalus": "Malus d'âme",
|
"MNBL.soulmalus": "Malus d'âme",
|
||||||
"MNBL.registeredmodifiers": "Modificateurs enregistrés",
|
"MNBL.registeredmodifiers": "Modificateurs enregistrés",
|
||||||
"MNBL.doubleD20": "Doubler le d20 (1 Point d'Eclat)",
|
"MNBL.doubleD20": "Doubler le d20 (1 Point d'Eclat)",
|
||||||
|
|
||||||
"MNBL.pronouncedrune": "Rune prononcée",
|
"MNBL.pronouncedrune": "Rune prononcée",
|
||||||
"MNBL.tracedrune": "Rune tracée",
|
"MNBL.tracedrune": "Rune tracée",
|
||||||
"MNBL.equipped": "Equipé",
|
"MNBL.equipped": "Equipé",
|
||||||
@@ -211,7 +200,6 @@
|
|||||||
"MNBL.weaponscapacities": "Armes/Capacités",
|
"MNBL.weaponscapacities": "Armes/Capacités",
|
||||||
"MNBL.use": "Utiliser",
|
"MNBL.use": "Utiliser",
|
||||||
"MNBL.speciestrait": "Trait d'espèce",
|
"MNBL.speciestrait": "Trait d'espèce",
|
||||||
|
|
||||||
"MNBL.attribute": "Attribut",
|
"MNBL.attribute": "Attribut",
|
||||||
"MNBL.Protections": "Protections",
|
"MNBL.Protections": "Protections",
|
||||||
"MNBL.rune": "Rune",
|
"MNBL.rune": "Rune",
|
||||||
@@ -220,6 +208,68 @@
|
|||||||
"MNBL.details": "Détails",
|
"MNBL.details": "Détails",
|
||||||
"MNBL.sacrifice": "Sacrifice",
|
"MNBL.sacrifice": "Sacrifice",
|
||||||
"MNBL.identity": "Identité",
|
"MNBL.identity": "Identité",
|
||||||
"MNBL.gmtools": "Outils MJ"
|
"MNBL.gmtools": "Outils MJ",
|
||||||
|
"MNBL.potion": "Potion",
|
||||||
|
"MNBL.potionRune": "Rune",
|
||||||
|
"MNBL.potionSeuil": "Seuil de la Rune",
|
||||||
|
"MNBL.potionPointsAme": "Points d'Âme investis",
|
||||||
|
"MNBL.potionForme": "Forme",
|
||||||
|
"MNBL.potionStatut": "Statut",
|
||||||
|
"MNBL.potionVirulence": "Virulence",
|
||||||
|
"MNBL.potionDuree": "Durée d'effet",
|
||||||
|
"MNBL.potionConservation": "Conservation",
|
||||||
|
"MNBL.potionTemps": "Temps de préparation",
|
||||||
|
"MNBL.potionEffetCuratif": "Effet curatif",
|
||||||
|
"MNBL.potionEffetLetal": "Effet létal",
|
||||||
|
"MNBL.potionEffetSecondaire": "Effets secondaires",
|
||||||
|
"MNBL.potionDescription": "Description",
|
||||||
|
"MNBL.potionLiquide": "Liquide",
|
||||||
|
"MNBL.potionOnguent": "Onguent",
|
||||||
|
"MNBL.potionCachets": "Cachets",
|
||||||
|
"MNBL.potionPilules": "Pilules",
|
||||||
|
"MNBL.potionInconnue": "Inconnue",
|
||||||
|
"MNBL.potionEfficace": "Efficace",
|
||||||
|
"MNBL.potionHeroique": "Héroïque",
|
||||||
|
"MNBL.potionInefficace": "Inefficace",
|
||||||
|
"MNBL.potionPoison": "Poison",
|
||||||
|
"MNBL.preparePotion": "Préparer une Potion",
|
||||||
|
"MNBL.capacites": "Capacités / Pouvoirs",
|
||||||
|
"MNBL.capacite": "Capacité",
|
||||||
|
"MNBL.typeCapacite": "Type de capacité",
|
||||||
|
"MNBL.typeCapaciteElue": "Pouvoir Élue",
|
||||||
|
"MNBL.typeCapaciteElementaire": "Pouvoir Élémentaire",
|
||||||
|
"MNBL.typeCapaciteDemoniaque": "Pouvoir Démoniaque",
|
||||||
|
"MNBL.typeCapaciteCreature": "Pouvoir Créature",
|
||||||
|
"MNBL.creatureTypeCreature": "Créature",
|
||||||
|
"MNBL.creatureTypeDemon": "Démon",
|
||||||
|
"MNBL.creatureTypeElementaire": "Élémentaire",
|
||||||
|
"MNBL.elementTypeAir": "Air",
|
||||||
|
"MNBL.elementTypeTerre": "Terre",
|
||||||
|
"MNBL.elementTypeFeu": "Feu",
|
||||||
|
"MNBL.elementTypeEau": "Eau",
|
||||||
|
"MNBL.creatureType": "Type de créature",
|
||||||
|
"MNBL.elementType": "Élément",
|
||||||
|
"MNBL.invoquerElementaire": "Invoquer un Élémentaire",
|
||||||
|
"MNBL.bannirElementaire": "Bannir",
|
||||||
|
"MNBL.invocationsActives": "Invocations actives",
|
||||||
|
"MNBL.invocationElement": "Élément",
|
||||||
|
"MNBL.invocationTier": "Puissance",
|
||||||
|
"MNBL.invocationSeuil": "Seuil",
|
||||||
|
"MNBL.invocationAmeExtra": "Points d'Âme supplémentaires",
|
||||||
|
"MNBL.invocationAmeTotal": "Coût total en Âme",
|
||||||
|
"MNBL.invocationTemps": "Temps de concentration",
|
||||||
|
"MNBL.invocationBonusPacte": "Bonus Pacte élémentaire",
|
||||||
|
"MNBL.invocationHautParler": "Savoir : Haut-Parler",
|
||||||
|
"MNBL.invocationSeigneursElem": "Savoir : Seigneurs Élémentaires",
|
||||||
|
"MNBL.invocationResultSucces": "L'Élémentaire est invoqué !",
|
||||||
|
"MNBL.invocationResultHeroique": "Réussite héroïque ! Vous pouvez majorer gratuitement de +2 un attribut de l'Élémentaire.",
|
||||||
|
"MNBL.invocationResultEchec": "L'invocation a échoué. Vous perdez la moitié des points d'Âme dépensés.",
|
||||||
|
"MNBL.invocationResultDramatique": "Échec dramatique ! L'invocation a échoué et vous perdez tous les points d'Âme investis. Une catastrophe naturelle se déclenche !",
|
||||||
|
"MNBL.invocationTierMineur": "Mineur (Seuil 15)",
|
||||||
|
"MNBL.invocationTierMedian": "Médian (Seuil 20)",
|
||||||
|
"MNBL.invocationTierMajeur": "Majeur (Seuil 25)",
|
||||||
|
"MNBL.invocationConcentrationMineur": "1 tour",
|
||||||
|
"MNBL.invocationConcentrationMedian": "1 minute",
|
||||||
|
"MNBL.invocationConcentrationMajeur": "1 heure",
|
||||||
|
"MNBL.invocationAmeBloque": "Âme bloquée"
|
||||||
}
|
}
|
||||||
@@ -872,3 +872,48 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ==================== Sortilège Launch Button ==================== */
|
||||||
|
.fvtt-mournblade.sheet {
|
||||||
|
.header-actions {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
padding: 4px 0;
|
||||||
|
|
||||||
|
.chat-card-button {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
padding: 5px 12px;
|
||||||
|
background: linear-gradient(135deg, #6b1a1a 0%, #8b2222 50%, #6b1a1a 100%);
|
||||||
|
border: 1px solid #c0392b;
|
||||||
|
border-radius: 4px;
|
||||||
|
color: #f5e6d3;
|
||||||
|
font-family: CentaurMT, serif;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
cursor: pointer;
|
||||||
|
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
|
||||||
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.1);
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
|
i { color: #d4af37; }
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: linear-gradient(135deg, #8b2222 0%, #a52a2a 50%, #8b2222 100%);
|
||||||
|
border-color: #d4af37;
|
||||||
|
color: #fff;
|
||||||
|
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.15);
|
||||||
|
i { color: #ffd700; }
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background: linear-gradient(135deg, #5a1010 0%, #6b1a1a 50%, #5a1010 100%);
|
||||||
|
transform: translateY(1px);
|
||||||
|
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -313,3 +313,130 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ============================================= */
|
||||||
|
/* Potion Item Sheet */
|
||||||
|
/* ============================================= */
|
||||||
|
.potion-content {
|
||||||
|
.potion-header-info {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.25rem;
|
||||||
|
padding: 0.5rem;
|
||||||
|
background: rgba(139, 0, 0, 0.08);
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid rgba(139, 0, 0, 0.2);
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.potion-statut-badge {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.35rem;
|
||||||
|
padding: 0.2rem 0.6rem;
|
||||||
|
border-radius: 12px;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
&.statut-efficace { background: rgba(0,128,0,0.15); color: #155215; border: 1px solid #4a904a; }
|
||||||
|
&.statut-heroique { background: rgba(180,120,0,0.15); color: #7a5000; border: 1px solid #c89000; }
|
||||||
|
&.statut-inefficace { background: rgba(100,100,100,0.15); color: #555; border: 1px solid #888; }
|
||||||
|
&.statut-poison { background: rgba(100,0,100,0.15); color: #4a004a; border: 1px solid #880088; }
|
||||||
|
&.statut-inconnue { background: rgba(50,50,50,0.1); color: #666; border: 1px solid #aaa; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Potion in chat */
|
||||||
|
.potion-rune-info {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
padding: 0.4rem;
|
||||||
|
background: rgba(0,0,0,0.04);
|
||||||
|
border-radius: 4px;
|
||||||
|
margin-bottom: 0.35rem;
|
||||||
|
|
||||||
|
.potion-rune-name { font-weight: bold; }
|
||||||
|
.potion-rune-seuil { font-size: 0.85rem; color: #666; }
|
||||||
|
.potion-haut-parler { font-size: 0.85rem; color: #555; font-style: italic; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.potion-result-gm {
|
||||||
|
border: 1px dashed rgba(139,0,0,0.4);
|
||||||
|
background: rgba(139,0,0,0.05);
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 0.4rem;
|
||||||
|
|
||||||
|
.potion-result-title {
|
||||||
|
font-size: 0.95rem;
|
||||||
|
margin: 0 0 0.3rem;
|
||||||
|
}
|
||||||
|
.potion-heroique { color: #8B6900; }
|
||||||
|
.potion-efficace { color: #155215; }
|
||||||
|
.potion-inefficace { color: #555; }
|
||||||
|
.potion-poison { color: #660066; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.potion-result-player {
|
||||||
|
font-style: italic;
|
||||||
|
color: #666;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Potion dialog */
|
||||||
|
.potion-dialog {
|
||||||
|
.potion-dialog-section {
|
||||||
|
margin-bottom: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.potion-dialog-title {
|
||||||
|
font-size: 0.9rem;
|
||||||
|
font-weight: bold;
|
||||||
|
border-bottom: 1px solid rgba(0,0,0,0.15);
|
||||||
|
padding-bottom: 0.2rem;
|
||||||
|
margin-bottom: 0.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.potion-runes-table {
|
||||||
|
width: 100%;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
padding: 0.2rem 0.4rem;
|
||||||
|
border-bottom: 1px solid rgba(0,0,0,0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.potion-rune-row:hover { background: rgba(0,0,0,0.04); }
|
||||||
|
.potion-rune-radio { cursor: pointer; }
|
||||||
|
|
||||||
|
.rune-mini-img {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-right: 4px;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 1px solid rgba(139, 69, 19, 0.5);
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.potion-summary {
|
||||||
|
background: rgba(0,0,0,0.05);
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 0.4rem 0.6rem;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
|
||||||
|
.summary-row { margin-bottom: 0.2rem; }
|
||||||
|
.summary-label { font-weight: bold; min-width: 150px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.potion-info-note {
|
||||||
|
color: #888;
|
||||||
|
font-style: italic;
|
||||||
|
gap: 0.4rem;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -968,6 +968,165 @@
|
|||||||
height: 64px;
|
height: 64px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// =====================================================
|
||||||
|
// Item Card (post-item, chat-display-description)
|
||||||
|
// =====================================================
|
||||||
|
.mournblade-item-card {
|
||||||
|
font-family: CentaurMT, serif;
|
||||||
|
color: #2a1a0a;
|
||||||
|
background: linear-gradient(180deg, #fdf6e3 0%, #f7ead0 100%);
|
||||||
|
border: 1px solid #8b4513;
|
||||||
|
border-radius: 4px;
|
||||||
|
overflow: hidden;
|
||||||
|
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.25);
|
||||||
|
|
||||||
|
.item-card-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
background: linear-gradient(135deg, #4a0404 0%, #8b0000 50%, #6b2020 100%);
|
||||||
|
padding: 10px 12px;
|
||||||
|
border-bottom: 2px solid #c8860a;
|
||||||
|
|
||||||
|
.item-card-img {
|
||||||
|
width: 56px;
|
||||||
|
height: 56px;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 2px solid #c8860a;
|
||||||
|
object-fit: cover;
|
||||||
|
flex-shrink: 0;
|
||||||
|
background: rgba(0,0,0,0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-card-title {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
|
||||||
|
.item-card-name {
|
||||||
|
margin: 0 0 4px 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: Charlemagne, CentaurMT, serif;
|
||||||
|
font-size: 1.05rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #f5deb3;
|
||||||
|
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.6);
|
||||||
|
white-space: normal;
|
||||||
|
line-height: 1.2;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-card-type-badge {
|
||||||
|
display: inline-block;
|
||||||
|
background: rgba(200, 134, 10, 0.3);
|
||||||
|
border: 1px solid #c8860a;
|
||||||
|
border-radius: 10px;
|
||||||
|
padding: 1px 8px;
|
||||||
|
font-size: 0.72rem;
|
||||||
|
color: #f5deb3;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
|
||||||
|
i { margin-right: 3px; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-card-stats {
|
||||||
|
padding: 8px 12px;
|
||||||
|
border-bottom: 1px solid rgba(139, 69, 19, 0.2);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 3px;
|
||||||
|
|
||||||
|
.stat-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: baseline;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 8px;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
padding: 2px 0;
|
||||||
|
border-bottom: 1px dotted rgba(139, 69, 19, 0.12);
|
||||||
|
|
||||||
|
&:last-child { border-bottom: none; }
|
||||||
|
|
||||||
|
.stat-label {
|
||||||
|
color: #6b3a1f;
|
||||||
|
font-weight: bold;
|
||||||
|
flex-shrink: 0;
|
||||||
|
i { margin-right: 4px; color: #8b4513; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-value {
|
||||||
|
color: #2a1a0a;
|
||||||
|
text-align: right;
|
||||||
|
font-weight: normal;
|
||||||
|
|
||||||
|
&.stat-highlight {
|
||||||
|
font-weight: bold;
|
||||||
|
color: #4a0404;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.stat-flag {
|
||||||
|
justify-content: flex-start;
|
||||||
|
color: #6b3a1f;
|
||||||
|
font-style: italic;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
border-bottom: none;
|
||||||
|
padding: 1px 0;
|
||||||
|
i { margin-right: 5px; color: #8b0000; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-card-divider {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 6px 12px 0;
|
||||||
|
gap: 8px;
|
||||||
|
font-size: 0.72rem;
|
||||||
|
letter-spacing: 0.08em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: #8b4513;
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
&::before, &::after {
|
||||||
|
content: '';
|
||||||
|
flex: 1;
|
||||||
|
height: 1px;
|
||||||
|
background: linear-gradient(90deg, transparent, #c8860a, transparent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-card-description {
|
||||||
|
padding: 8px 12px 10px;
|
||||||
|
font-size: 0.88rem;
|
||||||
|
line-height: 1.5;
|
||||||
|
color: #2a1a0a;
|
||||||
|
|
||||||
|
p { margin: 0 0 6px 0; &:last-child { margin-bottom: 0; } }
|
||||||
|
em, i { color: #5a2a0a; }
|
||||||
|
strong, b { color: #2a1a0a; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-card-sacrifice {
|
||||||
|
background: rgba(100, 0, 0, 0.05);
|
||||||
|
border-top: 1px solid rgba(139, 0, 0, 0.2);
|
||||||
|
font-style: italic;
|
||||||
|
color: #5a0000;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.mournblade-item-card--compact {
|
||||||
|
.item-card-header {
|
||||||
|
padding: 8px 10px;
|
||||||
|
.item-card-img { width: 44px; height: 44px; }
|
||||||
|
.item-card-name { font-size: 0.95rem; }
|
||||||
|
}
|
||||||
|
.item-card-description { padding: 6px 10px 8px; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.roll-dialog-header {
|
.roll-dialog-header {
|
||||||
height: 52px;
|
height: 52px;
|
||||||
}
|
}
|
||||||
@@ -2287,6 +2446,40 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.result-chaos {
|
||||||
|
padding: 8px;
|
||||||
|
background: rgba(40, 0, 60, 0.85);
|
||||||
|
border-top: 2px solid #9400d3;
|
||||||
|
border-left: 4px solid #ff00ff;
|
||||||
|
color: #f0d0ff;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
|
||||||
|
.chaos-header {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1rem;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
color: #ff88ff;
|
||||||
|
i { margin-right: 6px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.chaos-effect {
|
||||||
|
line-height: 1.4;
|
||||||
|
i { margin-right: 6px; }
|
||||||
|
|
||||||
|
&.desastre {
|
||||||
|
color: #ff4444;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
&.echec_absolu {
|
||||||
|
color: #ffaa44;
|
||||||
|
}
|
||||||
|
&.rien {
|
||||||
|
color: #aaaacc;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.predilection-section {
|
.predilection-section {
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
background: rgba(220, 200, 255, 0.4);
|
background: rgba(220, 200, 255, 0.4);
|
||||||
@@ -2428,6 +2621,11 @@
|
|||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
transition: all 0.2s;
|
transition: all 0.2s;
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
padding: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
font-family: inherit;
|
||||||
|
|
||||||
i {
|
i {
|
||||||
margin-right: 4px;
|
margin-right: 4px;
|
||||||
@@ -2473,4 +2671,303 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// =====================================================
|
||||||
|
// Sortilège dialog
|
||||||
|
// =====================================================
|
||||||
|
.sortilege-dialog,
|
||||||
|
.potion-dialog,
|
||||||
|
.invocation-dialog {
|
||||||
|
font-family: CentaurMT, serif;
|
||||||
|
color: #2a1a0a;
|
||||||
|
padding: 10px;
|
||||||
|
background: url("../assets/ui/pc_sheet_bg.webp") repeat left top;
|
||||||
|
|
||||||
|
// Texte de base sombre sur fond parchemin
|
||||||
|
label, input, span, p {
|
||||||
|
color: #2a1a0a;
|
||||||
|
}
|
||||||
|
th, td {
|
||||||
|
color: #2a1a0a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sortilege-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
padding: 6px 10px;
|
||||||
|
background: linear-gradient(135deg, #4a0404 0%, #6d0808 100%);
|
||||||
|
border: 1px solid #8b0000;
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
.sortilege-actor-info {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sortilege-actor-img {
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 2px solid #a05020;
|
||||||
|
object-fit: cover;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
.sortilege-actor-name {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1.05rem;
|
||||||
|
color: #ffffff;
|
||||||
|
text-shadow: 0 1px 3px rgba(0,0,0,0.9);
|
||||||
|
}
|
||||||
|
.sortilege-ame-info {
|
||||||
|
font-size: 0.88rem;
|
||||||
|
color: #fde0ff;
|
||||||
|
text-shadow: 0 1px 2px rgba(0,0,0,0.8);
|
||||||
|
strong { color: #ffffff; font-weight: bold; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sortilege-mode-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
padding: 5px 4px;
|
||||||
|
border-bottom: 1px solid rgba(139, 69, 19, 0.4);
|
||||||
|
|
||||||
|
label {
|
||||||
|
flex-shrink: 0;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #5a1a00;
|
||||||
|
}
|
||||||
|
select {
|
||||||
|
flex: 1;
|
||||||
|
background: #3a1a08 !important;
|
||||||
|
border: 1px solid #c06030 !important;
|
||||||
|
border-radius: 3px;
|
||||||
|
padding: 5px 8px;
|
||||||
|
color: #ffffff !important;
|
||||||
|
font-family: CentaurMT, serif;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
appearance: none;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%23ffd070' d='M6 8L0 0h12z'/%3E%3C/svg%3E") !important;
|
||||||
|
background-repeat: no-repeat !important;
|
||||||
|
background-position: right 8px center !important;
|
||||||
|
background-size: 10px 7px !important;
|
||||||
|
padding-right: 28px;
|
||||||
|
|
||||||
|
option {
|
||||||
|
background: #1a0e06;
|
||||||
|
color: #ffffff;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sortilege-runes-table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
font-size: 0.88rem;
|
||||||
|
border: 1px solid #6b3010;
|
||||||
|
border-radius: 4px;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
thead tr th {
|
||||||
|
background: #3a1808;
|
||||||
|
padding: 6px 8px;
|
||||||
|
text-align: center;
|
||||||
|
border-bottom: 2px solid #8b4513;
|
||||||
|
color: #ffd070;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 0.82rem;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody tr.sortilege-rune-row {
|
||||||
|
border-bottom: 1px solid rgba(139, 69, 19, 0.3);
|
||||||
|
transition: background 0.15s;
|
||||||
|
background: rgba(255, 240, 210, 0.3);
|
||||||
|
|
||||||
|
&:last-child { border-bottom: none; }
|
||||||
|
&:nth-child(even) { background: rgba(200, 160, 100, 0.15); }
|
||||||
|
&:hover { background: rgba(139, 69, 19, 0.15); }
|
||||||
|
|
||||||
|
&.rune-selected {
|
||||||
|
background: rgba(139, 69, 19, 0.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
padding: 5px 8px;
|
||||||
|
vertical-align: middle;
|
||||||
|
color: #2a1a0a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rune-mini-img {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-right: 4px;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 1px solid rgba(139, 69, 19, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.sortilege-rune-points {
|
||||||
|
width: 55px;
|
||||||
|
text-align: center;
|
||||||
|
background: #3a1a08;
|
||||||
|
border: 1px solid #8b4513;
|
||||||
|
border-radius: 3px;
|
||||||
|
color: #f0e8d8;
|
||||||
|
padding: 2px 4px;
|
||||||
|
font-family: CentaurMT, serif;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
option { background: #1a0e06; color: #f0e8d8; }
|
||||||
|
|
||||||
|
&:disabled {
|
||||||
|
opacity: 0.35;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sortilege-summary {
|
||||||
|
background: linear-gradient(135deg, #4a0404 0%, #3a1808 100%);
|
||||||
|
border: 1px solid #8b4513;
|
||||||
|
border-left: 4px solid #c0392b;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 10px 14px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
.summary-row {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
|
||||||
|
&:last-child { margin-bottom: 0; }
|
||||||
|
|
||||||
|
.summary-label {
|
||||||
|
font-weight: bold;
|
||||||
|
color: #f0d8b0;
|
||||||
|
text-shadow: 0 1px 2px rgba(0,0,0,0.8);
|
||||||
|
}
|
||||||
|
.summary-value {
|
||||||
|
color: #ffd700;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1.05rem;
|
||||||
|
text-shadow: 0 1px 3px rgba(0,0,0,0.9);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Auto-cible and Modificateur rows
|
||||||
|
.flexrow {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
padding: 3px 4px;
|
||||||
|
|
||||||
|
label {
|
||||||
|
flex: 1;
|
||||||
|
color: #5a1a00;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="number"] {
|
||||||
|
width: 70px;
|
||||||
|
background: #3a1a08;
|
||||||
|
border: 1px solid #8b4513;
|
||||||
|
border-radius: 3px;
|
||||||
|
padding: 3px 8px;
|
||||||
|
color: #f0e8d8;
|
||||||
|
text-align: center;
|
||||||
|
font-family: CentaurMT, serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sortilege-modificateur-select {
|
||||||
|
width: 90px;
|
||||||
|
background: #3a1a08;
|
||||||
|
border: 1px solid #8b4513;
|
||||||
|
border-radius: 3px;
|
||||||
|
padding: 4px 8px;
|
||||||
|
color: #f0e8d8;
|
||||||
|
font-family: CentaurMT, serif;
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
option { background: #1a0e06; color: #f0e8d8; }
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="checkbox"] {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
accent-color: #c0392b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// =====================================================
|
||||||
|
// Sortilège chat result
|
||||||
|
// =====================================================
|
||||||
|
.mournblade-chat-result {
|
||||||
|
.sortilege-runes-summary {
|
||||||
|
margin-top: 8px;
|
||||||
|
border-top: 1px solid rgba(139, 69, 19, 0.3);
|
||||||
|
padding-top: 6px;
|
||||||
|
|
||||||
|
.details-section-title {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
color: #4a0404;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
|
||||||
|
i { margin-right: 4px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.sortilege-rune-detail {
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 3px 0;
|
||||||
|
font-size: 0.82rem;
|
||||||
|
border-bottom: 1px solid rgba(0,0,0,0.06);
|
||||||
|
|
||||||
|
.rune-mini-img {
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
border-radius: 2px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
.rune-name {
|
||||||
|
flex: 1;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.rune-formule {
|
||||||
|
font-style: italic;
|
||||||
|
color: #5a3a8a;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.rune-pts, .rune-actions { color: #666; white-space: nowrap; }
|
||||||
|
.rune-duree { color: #4a2060; font-style: italic; white-space: nowrap; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Haut-Parler formule dans la rune (chat-generic-result)
|
||||||
|
.rune-formule {
|
||||||
|
font-style: italic;
|
||||||
|
color: #5a3a8a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,126 @@
|
|||||||
|
import { MournbladeUtility } from "../mournblade-utility.js"
|
||||||
|
|
||||||
|
export default class MournbladeInvocationDialog {
|
||||||
|
|
||||||
|
static async create(actor, rollData) {
|
||||||
|
const ameDisponible = Math.max(0, (actor.system.ame.currentmax - actor.system.ame.value))
|
||||||
|
const maxExtra = Math.max(0, ameDisponible - 15)
|
||||||
|
|
||||||
|
// Detect elemental pacte bonus — the bonus is always available,
|
||||||
|
// but we display it dynamically based on chosen element.
|
||||||
|
// We pass the pactes to let JS listeners detect the match.
|
||||||
|
const pactes = actor.getPactes().map(p => ({
|
||||||
|
name: p.name,
|
||||||
|
allegeance: (p.system.allegeance || "").toLowerCase()
|
||||||
|
}))
|
||||||
|
|
||||||
|
const hautParlerComp = actor.items.find(c => c.type == "competence" && c.name.toLowerCase() == "savoir : haut-parler")
|
||||||
|
const seigneursElemComp = actor.items.find(c => c.type == "competence" && c.name.toLowerCase() == "savoir : seigneurs élémentaires")
|
||||||
|
|
||||||
|
const context = {
|
||||||
|
...rollData,
|
||||||
|
img: actor.img,
|
||||||
|
name: actor.name,
|
||||||
|
ameDisponible,
|
||||||
|
ameExtraOptions: Array.from({ length: maxExtra + 1 }, (_, i) => i),
|
||||||
|
modOptions: Array.from({ length: 21 }, (_, i) => i - 10),
|
||||||
|
hautParlerNiveau: hautParlerComp ? hautParlerComp.system.niveau : null,
|
||||||
|
seigneursElemNiveau: seigneursElemComp ? seigneursElemComp.system.niveau : null,
|
||||||
|
bonusPacte: false,
|
||||||
|
pactes,
|
||||||
|
}
|
||||||
|
|
||||||
|
const content = await foundry.applications.handlebars.renderTemplate(
|
||||||
|
"systems/fvtt-mournblade/templates/dialog-invocation-elementaire.hbs",
|
||||||
|
context
|
||||||
|
)
|
||||||
|
|
||||||
|
Hooks.once("renderDialogV2", (_app, html) => {
|
||||||
|
const form = html.querySelector ? html : html[0]
|
||||||
|
MournbladeInvocationDialog._attachListeners(form, pactes)
|
||||||
|
})
|
||||||
|
|
||||||
|
return foundry.applications.api.DialogV2.wait({
|
||||||
|
window: { title: "Invoquer un Élémentaire", icon: "fa-solid fa-wind" },
|
||||||
|
classes: ["mournblade-roll-dialog"],
|
||||||
|
position: { width: 480 },
|
||||||
|
modal: false,
|
||||||
|
content,
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
action: "invoquer",
|
||||||
|
label: "Invoquer",
|
||||||
|
icon: "fa-solid fa-wind",
|
||||||
|
default: true,
|
||||||
|
callback: (event, button, dialog) => {
|
||||||
|
MournbladeInvocationDialog._updateRollData(rollData, button.form.elements, actor, pactes)
|
||||||
|
MournbladeUtility.rollInvocationElementaire(rollData)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
],
|
||||||
|
rejectClose: false,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
static _elementKeywords = {
|
||||||
|
air: ["air", "vent", "sylphe", "seigneur de l'air"],
|
||||||
|
terre: ["terre", "gnome", "seigneur de la terre"],
|
||||||
|
feu: ["feu", "flamme", "salamandre", "seigneur du feu"],
|
||||||
|
eau: ["eau", "ondine", "seigneur de l'eau"],
|
||||||
|
}
|
||||||
|
|
||||||
|
static _hasPacteBonus(element, pactes) {
|
||||||
|
const keywords = MournbladeInvocationDialog._elementKeywords[element] || []
|
||||||
|
return pactes.some(p => keywords.some(kw => p.allegeance.includes(kw)))
|
||||||
|
}
|
||||||
|
|
||||||
|
static _attachListeners(html, pactes) {
|
||||||
|
const tierSeuils = { mineur: 15, median: 20, majeur: 25 }
|
||||||
|
const tierTemps = { mineur: "1 tour", median: "1 minute", majeur: "1 heure" }
|
||||||
|
|
||||||
|
const recalculate = () => {
|
||||||
|
const element = html.querySelector('[name="element"]')?.value ?? "air"
|
||||||
|
const tier = html.querySelector('[name="tier"]')?.value ?? "mineur"
|
||||||
|
const ameExtra = parseInt(html.querySelector('[name="ameExtra"]')?.value ?? 0)
|
||||||
|
|
||||||
|
const seuilBase = tierSeuils[tier] ?? 15
|
||||||
|
const seuil = seuilBase + ameExtra
|
||||||
|
const hasPacte = MournbladeInvocationDialog._hasPacteBonus(element, pactes)
|
||||||
|
|
||||||
|
const seuilEl = html.querySelector('#invoc-seuil')
|
||||||
|
const coutEl = html.querySelector('#invoc-cout')
|
||||||
|
const tempsEl = html.querySelector('#invoc-temps')
|
||||||
|
const pacteBanner = html.querySelector('.invoc-bonus-pacte')
|
||||||
|
|
||||||
|
if (seuilEl) seuilEl.textContent = seuil + (hasPacte ? " (-5 avec bonus Pacte)" : "")
|
||||||
|
if (coutEl) coutEl.textContent = seuil
|
||||||
|
if (tempsEl) tempsEl.textContent = tierTemps[tier] ?? "1 tour"
|
||||||
|
if (pacteBanner) pacteBanner.style.display = hasPacte ? "" : "none"
|
||||||
|
}
|
||||||
|
|
||||||
|
html.querySelectorAll('[name="element"], [name="tier"], [name="ameExtra"]').forEach(el => {
|
||||||
|
el.addEventListener('change', recalculate)
|
||||||
|
})
|
||||||
|
recalculate()
|
||||||
|
}
|
||||||
|
|
||||||
|
static _updateRollData(rollData, formElements, actor, pactes) {
|
||||||
|
const element = formElements['element']?.value ?? "air"
|
||||||
|
const tier = formElements['tier']?.value ?? "mineur"
|
||||||
|
const ameExtra = parseInt(formElements['ameExtra']?.value ?? 0)
|
||||||
|
const modificateur = parseInt(formElements['modificateur']?.value ?? 0)
|
||||||
|
|
||||||
|
const tierSeuils = { mineur: 15, median: 20, majeur: 25 }
|
||||||
|
const seuilBase = tierSeuils[tier] ?? 15
|
||||||
|
const seuil = seuilBase + ameExtra
|
||||||
|
|
||||||
|
rollData.invocationElement = element
|
||||||
|
rollData.invocationTier = tier
|
||||||
|
rollData.invocationSeuil = seuil
|
||||||
|
rollData.invocationAmeExtra = ameExtra
|
||||||
|
rollData.invocationSoulCost = seuil
|
||||||
|
rollData.difficulte = seuil
|
||||||
|
rollData.modificateur = modificateur
|
||||||
|
rollData.bonusPacte = MournbladeInvocationDialog._hasPacteBonus(element, pactes) ? 5 : 0
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -67,7 +67,248 @@ export class MournbladeRollDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mettre à jour rollData avec les valeurs du formulaire
|
* Create and display the sortilège (multi-rune spell) roll dialog
|
||||||
|
* @param {MournbladeActor} actor
|
||||||
|
* @param {Object} rollData
|
||||||
|
*/
|
||||||
|
static async createSortilege(actor, rollData) {
|
||||||
|
const ameDisponible = Math.max(1, (actor.system.ame.currentmax - actor.system.ame.value))
|
||||||
|
const context = {
|
||||||
|
...rollData,
|
||||||
|
img: actor.img,
|
||||||
|
name: actor.name,
|
||||||
|
config: game.system.mournblade.config,
|
||||||
|
runes: actor.getRunes(),
|
||||||
|
runemode: "prononcer",
|
||||||
|
ameDisponible,
|
||||||
|
ameOptions: Array.from({ length: ameDisponible }, (_, i) => i + 1),
|
||||||
|
modOptions: Array.from({ length: 21 }, (_, i) => i - 10),
|
||||||
|
}
|
||||||
|
|
||||||
|
const content = await foundry.applications.handlebars.renderTemplate(
|
||||||
|
"systems/fvtt-mournblade/templates/dialog-sortilege.hbs",
|
||||||
|
context
|
||||||
|
)
|
||||||
|
|
||||||
|
// Attach dynamic recalculation after render
|
||||||
|
Hooks.once("renderDialogV2", (_app, html) => {
|
||||||
|
const form = html.querySelector ? html : html[0]
|
||||||
|
MournbladeRollDialog._attachSortilegeListeners(form)
|
||||||
|
})
|
||||||
|
|
||||||
|
return foundry.applications.api.DialogV2.wait({
|
||||||
|
window: { title: "Lancer un Sortilège", icon: "fa-solid fa-star-of-david" },
|
||||||
|
classes: ["mournblade-roll-dialog"],
|
||||||
|
position: { width: 520 },
|
||||||
|
modal: false,
|
||||||
|
content,
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
action: "rolld10",
|
||||||
|
label: "Lancer 1d10",
|
||||||
|
icon: "fa-solid fa-dice-d10",
|
||||||
|
default: true,
|
||||||
|
callback: (event, button, dialog) => {
|
||||||
|
this._updateSortilegeRollData(rollData, button.form.elements, actor)
|
||||||
|
rollData.mainDice = "1d10"
|
||||||
|
MournbladeUtility.rollSortilege(rollData)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
action: "rolld20",
|
||||||
|
label: "Lancer 1d20",
|
||||||
|
icon: "fa-solid fa-dice-d20",
|
||||||
|
callback: (event, button, dialog) => {
|
||||||
|
this._updateSortilegeRollData(rollData, button.form.elements, actor)
|
||||||
|
rollData.mainDice = "1d20"
|
||||||
|
MournbladeUtility.rollSortilege(rollData)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
],
|
||||||
|
rejectClose: false,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open the potion preparation dialog
|
||||||
|
* @param {MournbladeActor} actor
|
||||||
|
* @param {object} rollData
|
||||||
|
*/
|
||||||
|
static async createPotion(actor, rollData) {
|
||||||
|
const ameDisponible = Math.max(1, (actor.system.ame.currentmax - actor.system.ame.value))
|
||||||
|
const context = {
|
||||||
|
...rollData,
|
||||||
|
img: actor.img,
|
||||||
|
name: actor.name,
|
||||||
|
config: game.system.mournblade.config,
|
||||||
|
runes: actor.getRunes(),
|
||||||
|
ameDisponible,
|
||||||
|
ameOptions: Array.from({ length: ameDisponible }, (_, i) => i + 1),
|
||||||
|
modOptions: Array.from({ length: 21 }, (_, i) => i - 10),
|
||||||
|
}
|
||||||
|
|
||||||
|
const content = await foundry.applications.handlebars.renderTemplate(
|
||||||
|
"systems/fvtt-mournblade/templates/dialog-potion.hbs",
|
||||||
|
context
|
||||||
|
)
|
||||||
|
|
||||||
|
Hooks.once("renderDialogV2", (_app, html) => {
|
||||||
|
const form = html.querySelector ? html : html[0]
|
||||||
|
MournbladeRollDialog._attachPotionListeners(form)
|
||||||
|
})
|
||||||
|
|
||||||
|
return foundry.applications.api.DialogV2.wait({
|
||||||
|
window: { title: "Préparer une Potion", icon: "fa-solid fa-flask" },
|
||||||
|
classes: ["mournblade-roll-dialog"],
|
||||||
|
position: { width: 520 },
|
||||||
|
modal: false,
|
||||||
|
content,
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
action: "preparer",
|
||||||
|
label: "Préparer",
|
||||||
|
icon: "fa-solid fa-flask",
|
||||||
|
default: true,
|
||||||
|
callback: (event, button, dialog) => {
|
||||||
|
MournbladeRollDialog._updatePotionRollData(rollData, button.form.elements, actor)
|
||||||
|
MournbladeUtility.rollPotion(rollData)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
],
|
||||||
|
rejectClose: false,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attach dynamic recalculation listeners to the potion dialog
|
||||||
|
* @param {HTMLElement} html
|
||||||
|
*/
|
||||||
|
static _attachPotionListeners(html) {
|
||||||
|
const recalculate = () => {
|
||||||
|
const radioChecked = html.querySelector('.potion-rune-radio:checked')
|
||||||
|
const runeRow = radioChecked?.closest('[data-seuil]')
|
||||||
|
const seuil = parseInt(runeRow?.dataset.seuil ?? 0)
|
||||||
|
const pa = parseInt(html.querySelector('[name="pointsAme"]')?.value ?? 1)
|
||||||
|
const mod = parseInt(html.querySelector('[name="modificateur"]')?.value ?? 0)
|
||||||
|
|
||||||
|
const difficulteEl = html.querySelector('#potion-difficulte')
|
||||||
|
if (difficulteEl) difficulteEl.textContent = (seuil + pa) + (mod !== 0 ? ` (mod ${mod > 0 ? '+' : ''}${mod})` : '')
|
||||||
|
|
||||||
|
const tempsEl = html.querySelector('#potion-temps')
|
||||||
|
if (tempsEl) {
|
||||||
|
const heures = Math.max(1, Math.ceil(pa / 3))
|
||||||
|
tempsEl.textContent = heures === 1 ? '1 heure' : `${heures} heures`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
html.querySelectorAll('.potion-rune-radio, [name="pointsAme"]').forEach(el => {
|
||||||
|
el.addEventListener('change', recalculate)
|
||||||
|
})
|
||||||
|
recalculate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update rollData from the potion dialog form elements
|
||||||
|
* @param {object} rollData
|
||||||
|
* @param {HTMLFormControlsCollection} formElements
|
||||||
|
* @param {MournbladeActor} actor
|
||||||
|
*/
|
||||||
|
static _updatePotionRollData(rollData, formElements, actor) {
|
||||||
|
const runeId = formElements['rune-selected']?.value
|
||||||
|
if (runeId) {
|
||||||
|
const rune = actor.getRunes().find(r => r._id === runeId)
|
||||||
|
if (rune) {
|
||||||
|
rollData.runeId = runeId
|
||||||
|
rollData.runeName = rune.name
|
||||||
|
rollData.runeImg = rune.img
|
||||||
|
rollData.runeSeuil = rune.system.seuil ?? 0
|
||||||
|
rollData.runeHautParler = rune.system.hautParler ?? ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rollData.pointsAme = parseInt(formElements['pointsAme']?.value ?? 1)
|
||||||
|
rollData.forme = formElements['forme']?.value ?? "liquide"
|
||||||
|
rollData.modificateur = parseInt(formElements['modificateur']?.value ?? 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attach dynamic recalculation listeners to the sortilège dialog
|
||||||
|
* @param {HTMLElement} html
|
||||||
|
*/
|
||||||
|
static _attachSortilegeListeners(html) {
|
||||||
|
const recalculate = () => {
|
||||||
|
const checkboxes = html.querySelectorAll('.sortilege-rune-checkbox:checked')
|
||||||
|
const modeSelect = html.querySelector('[name="runemode"]')
|
||||||
|
const mode = modeSelect?.value ?? "prononcer"
|
||||||
|
|
||||||
|
let maxSeuil = 0
|
||||||
|
let totalAme = 0
|
||||||
|
let totalActions = 0
|
||||||
|
let count = 0
|
||||||
|
|
||||||
|
// Enable/disable points inputs based on checkbox state
|
||||||
|
html.querySelectorAll('.sortilege-rune-checkbox').forEach(cb => {
|
||||||
|
const row = cb.closest('.sortilege-rune-row')
|
||||||
|
const pointsInput = row?.querySelector('.sortilege-rune-points')
|
||||||
|
if (pointsInput) pointsInput.disabled = !cb.checked
|
||||||
|
})
|
||||||
|
|
||||||
|
checkboxes.forEach(cb => {
|
||||||
|
const row = cb.closest('.sortilege-rune-row')
|
||||||
|
const seuil = Number(row?.dataset.seuil ?? 0)
|
||||||
|
const pts = Number(row?.querySelector('.sortilege-rune-points')?.value ?? 1)
|
||||||
|
if (seuil > maxSeuil) maxSeuil = seuil
|
||||||
|
totalAme += pts
|
||||||
|
totalActions += Math.ceil(pts / 3) * (mode === "inscrire" ? 2 : 1)
|
||||||
|
count++
|
||||||
|
})
|
||||||
|
|
||||||
|
const difficulte = count > 0 ? maxSeuil + (count - 1) : 0
|
||||||
|
html.querySelector('#sortilege-difficulte').textContent = count > 0 ? difficulte : '—'
|
||||||
|
html.querySelector('#sortilege-total-ame').textContent = totalAme
|
||||||
|
html.querySelector('#sortilege-actions').textContent = totalActions
|
||||||
|
}
|
||||||
|
|
||||||
|
html.querySelectorAll('.sortilege-rune-checkbox, .sortilege-rune-points, [name="runemode"]')
|
||||||
|
.forEach(el => el.addEventListener('change', recalculate))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract sortilège data from the form
|
||||||
|
* @param {Object} rollData
|
||||||
|
* @param {HTMLFormControlsCollection} formElements
|
||||||
|
* @param {MournbladeActor} actor
|
||||||
|
*/
|
||||||
|
static _updateSortilegeRollData(rollData, formElements, actor) {
|
||||||
|
rollData.runemode = formElements.runemode?.value ?? "prononcer"
|
||||||
|
rollData.modificateur = Number(formElements.modificateur?.value ?? 0)
|
||||||
|
rollData.runeautocible = formElements.runeautocible?.checked ?? false
|
||||||
|
|
||||||
|
// Collect selected runes with their soul points
|
||||||
|
const runes = actor.getRunes()
|
||||||
|
rollData.sortilegeRunes = []
|
||||||
|
for (const rune of runes) {
|
||||||
|
const checkbox = formElements[`rune-selected-${rune._id}`]
|
||||||
|
if (checkbox?.checked) {
|
||||||
|
const pts = Math.max(1, Number(formElements[`rune-points-${rune._id}`]?.value ?? 1))
|
||||||
|
rollData.sortilegeRunes.push({
|
||||||
|
id: rune._id,
|
||||||
|
name: rune.name,
|
||||||
|
img: rune.img,
|
||||||
|
seuil: rune.system.seuil,
|
||||||
|
formule: rune.system.formule,
|
||||||
|
pts,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rollData.sortilegeRunes.length === 0) return
|
||||||
|
|
||||||
|
const maxSeuil = Math.max(...rollData.sortilegeRunes.map(r => r.seuil))
|
||||||
|
rollData.difficulte = maxSeuil + (rollData.sortilegeRunes.length - 1)
|
||||||
|
rollData.runeame = rollData.sortilegeRunes.reduce((s, r) => s + r.pts, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
* @param {Object} rollData - L'objet rollData à mettre à jour
|
* @param {Object} rollData - L'objet rollData à mettre à jour
|
||||||
* @param {HTMLFormControlsCollection} formElements - Les éléments du formulaire
|
* @param {HTMLFormControlsCollection} formElements - Les éléments du formulaire
|
||||||
* @param {MournbladeActor} actor - L'acteur pour récupérer les attributs
|
* @param {MournbladeActor} actor - L'acteur pour récupérer les attributs
|
||||||
@@ -98,6 +339,9 @@ export class MournbladeRollDialog {
|
|||||||
if (formElements.runeame) {
|
if (formElements.runeame) {
|
||||||
rollData.runeame = Number(formElements.runeame.value)
|
rollData.runeame = Number(formElements.runeame.value)
|
||||||
}
|
}
|
||||||
|
if (formElements.runeautocible !== undefined) {
|
||||||
|
rollData.runeautocible = formElements.runeautocible.checked
|
||||||
|
}
|
||||||
|
|
||||||
// Combat mêlée
|
// Combat mêlée
|
||||||
if (formElements.typeAttaque) {
|
if (formElements.typeAttaque) {
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ export { default as MournbladePacteSheet } from './mournblade-pacte-sheet.mjs';
|
|||||||
export { default as MournbladeProtectionSheet } from './mournblade-protection-sheet.mjs';
|
export { default as MournbladeProtectionSheet } from './mournblade-protection-sheet.mjs';
|
||||||
export { default as MournbladeRuneSheet } from './mournblade-rune-sheet.mjs';
|
export { default as MournbladeRuneSheet } from './mournblade-rune-sheet.mjs';
|
||||||
export { default as MournbladeRuneEffectSheet } from './mournblade-runeeffect-sheet.mjs';
|
export { default as MournbladeRuneEffectSheet } from './mournblade-runeeffect-sheet.mjs';
|
||||||
|
export { default as MournbladePotionSheet } from './mournblade-potion-sheet.mjs';
|
||||||
export { default as MournbladeTendanceSheet } from './mournblade-tendance-sheet.mjs';
|
export { default as MournbladeTendanceSheet } from './mournblade-tendance-sheet.mjs';
|
||||||
export { default as MournbladeTraitChaotiqueSheet } from './mournblade-traitchaotique-sheet.mjs';
|
export { default as MournbladeTraitChaotiqueSheet } from './mournblade-traitchaotique-sheet.mjs';
|
||||||
export { default as MournbladeTraitEspeceSheet } from './mournblade-traitespece-sheet.mjs';
|
export { default as MournbladeTraitEspeceSheet } from './mournblade-traitespece-sheet.mjs';
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ export default class MournbladeActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
editItem: MournbladeActorSheet.#onEditItem,
|
editItem: MournbladeActorSheet.#onEditItem,
|
||||||
deleteItem: MournbladeActorSheet.#onDeleteItem,
|
deleteItem: MournbladeActorSheet.#onDeleteItem,
|
||||||
createItem: MournbladeActorSheet.#onCreateItem,
|
createItem: MournbladeActorSheet.#onCreateItem,
|
||||||
|
postItem: MournbladeActorSheet.#onPostItem,
|
||||||
equipItem: MournbladeActorSheet.#onEquipItem,
|
equipItem: MournbladeActorSheet.#onEquipItem,
|
||||||
modifyQuantity: MournbladeActorSheet.#onModifyQuantity,
|
modifyQuantity: MournbladeActorSheet.#onModifyQuantity,
|
||||||
modifySante: MournbladeActorSheet.#onModifySante,
|
modifySante: MournbladeActorSheet.#onModifySante,
|
||||||
@@ -52,6 +53,10 @@ export default class MournbladeActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
rollAttribut: MournbladeActorSheet.#onRollAttribut,
|
rollAttribut: MournbladeActorSheet.#onRollAttribut,
|
||||||
rollCompetence: MournbladeActorSheet.#onRollCompetence,
|
rollCompetence: MournbladeActorSheet.#onRollCompetence,
|
||||||
rollRune: MournbladeActorSheet.#onRollRune,
|
rollRune: MournbladeActorSheet.#onRollRune,
|
||||||
|
rollSortilege: MournbladeActorSheet.#onRollSortilege,
|
||||||
|
preparePotion: MournbladeActorSheet.#onPreparePotion,
|
||||||
|
invoquerElementaire: MournbladeActorSheet.#onInvoquerElementaire,
|
||||||
|
bannirElementaire: MournbladeActorSheet.#onBannirElementaire,
|
||||||
rollArmeOffensif: MournbladeActorSheet.#onRollArmeOffensif,
|
rollArmeOffensif: MournbladeActorSheet.#onRollArmeOffensif,
|
||||||
rollArmeSpecial: MournbladeActorSheet.#onRollArmeSpecial,
|
rollArmeSpecial: MournbladeActorSheet.#onRollArmeSpecial,
|
||||||
rollArmeDegats: MournbladeActorSheet.#onRollArmeDegats,
|
rollArmeDegats: MournbladeActorSheet.#onRollArmeDegats,
|
||||||
@@ -238,6 +243,16 @@ export default class MournbladeActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
await this.actor.createEmbeddedDocuments("Item", [{ name: `Nouveau ${itemType}`, type: itemType }], { renderSheet: true })
|
await this.actor.createEmbeddedDocuments("Item", [{ name: `Nouveau ${itemType}`, type: itemType }], { renderSheet: true })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle posting an item to chat
|
||||||
|
*/
|
||||||
|
static async #onPostItem(event, target) {
|
||||||
|
const li = target.closest(".item")
|
||||||
|
const itemId = li?.dataset.itemId ?? target.dataset.itemId
|
||||||
|
if (!itemId) return
|
||||||
|
MournbladeUtility.postItemToChat(this.actor.id, itemId)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle equipping an item
|
* Handle equipping an item
|
||||||
* @param {Event} event - The triggering event
|
* @param {Event} event - The triggering event
|
||||||
@@ -335,6 +350,39 @@ export default class MournbladeActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
await actor.rollRune(runeId)
|
await actor.rollRune(runeId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle launching a sortilège (multi-rune spell)
|
||||||
|
*/
|
||||||
|
static async #onRollSortilege(event, target) {
|
||||||
|
event.preventDefault()
|
||||||
|
await this.document.rollSortilege()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle preparing a potion
|
||||||
|
*/
|
||||||
|
static async #onPreparePotion(event, target) {
|
||||||
|
event.preventDefault()
|
||||||
|
await this.document.preparePotion()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle invoking an elemental
|
||||||
|
*/
|
||||||
|
static async #onInvoquerElementaire(event, target) {
|
||||||
|
event.preventDefault()
|
||||||
|
await this.document.invoquerElementaire()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle banishing an elemental invocation
|
||||||
|
*/
|
||||||
|
static async #onBannirElementaire(event, target) {
|
||||||
|
event.preventDefault()
|
||||||
|
const invocIndex = parseInt(target.dataset.invocIndex ?? "0")
|
||||||
|
await this.document.bannirElementaire(invocIndex)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle rolling an arme offensif
|
* Handle rolling an arme offensif
|
||||||
* @param {Event} event - The triggering event
|
* @param {Event} event - The triggering event
|
||||||
|
|||||||
@@ -122,21 +122,37 @@ export default class MournbladeItemSheet extends HandlebarsApplicationMixin(foun
|
|||||||
if (this.document.actor) {
|
if (this.document.actor) {
|
||||||
chatData.actor = { id: this.document.actor.id }
|
chatData.actor = { id: this.document.actor.id }
|
||||||
}
|
}
|
||||||
// Don't post any image for the item if the default image is used
|
if (chatData.img?.includes("/blank.png")) {
|
||||||
if (chatData.img.includes("/blank.png")) {
|
|
||||||
chatData.img = null
|
chatData.img = null
|
||||||
}
|
}
|
||||||
// JSON object for easy creation
|
|
||||||
chatData.jsondata = JSON.stringify({
|
chatData.jsondata = JSON.stringify({
|
||||||
compendium: "postedItem",
|
compendium: "postedItem",
|
||||||
payload: chatData,
|
payload: chatData,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Localized type label
|
||||||
|
const typeLabels = {
|
||||||
|
arme: "Arme", bouclier: "Bouclier", competence: "Compétence",
|
||||||
|
rune: "Rune", runeeffect: "Rune Active", don: "Don", pacte: "Pacte",
|
||||||
|
protection: "Protection", equipement: "Équipement", heritage: "Héritage",
|
||||||
|
metier: "Métier", capacite: "Capacité", tendance: "Tendance",
|
||||||
|
traitchaotique: "Trait Chaotique", traitespece: "Trait d'Espèce",
|
||||||
|
origine: "Origine", modifier: "Modificateur", monnaie: "Monnaie"
|
||||||
|
}
|
||||||
|
chatData.typeLabel = typeLabels[chatData.type] ?? chatData.type
|
||||||
|
|
||||||
|
// Type icon for the badge
|
||||||
|
const typeIcons = {
|
||||||
|
arme: "fa-sword", bouclier: "fa-shield-halved", competence: "fa-graduation-cap",
|
||||||
|
rune: "fa-star-of-david", runeeffect: "fa-star-of-david", don: "fa-hand-sparkles",
|
||||||
|
pacte: "fa-scroll", protection: "fa-shield", equipement: "fa-box",
|
||||||
|
heritage: "fa-dna", metier: "fa-hammer", capacite: "fa-bolt",
|
||||||
|
tendance: "fa-yin-yang", traitchaotique: "fa-skull", traitespece: "fa-paw",
|
||||||
|
origine: "fa-compass", modifier: "fa-sliders", monnaie: "fa-coins"
|
||||||
|
}
|
||||||
|
chatData.typeIcon = typeIcons[chatData.type] ?? "fa-cube"
|
||||||
|
|
||||||
const html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-mournblade/templates/post-item.hbs', chatData)
|
const html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-mournblade/templates/post-item.hbs', chatData)
|
||||||
const chatOptions = {
|
ChatMessage.create({ user: game.user.id, content: html })
|
||||||
user: game.user.id,
|
|
||||||
content: html,
|
|
||||||
}
|
|
||||||
ChatMessage.create(chatOptions)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -32,6 +32,7 @@ export default class MournbladeCreatureSheet extends MournbladeActorSheet {
|
|||||||
context.skills = actor.getSkills()
|
context.skills = actor.getSkills()
|
||||||
context.armes = foundry.utils.duplicate(actor.getWeapons())
|
context.armes = foundry.utils.duplicate(actor.getWeapons())
|
||||||
context.protections = foundry.utils.duplicate(actor.getArmors())
|
context.protections = foundry.utils.duplicate(actor.getArmors())
|
||||||
|
context.capacites = foundry.utils.duplicate(actor.getCapacites())
|
||||||
context.runes = foundry.utils.duplicate(actor.getRunes())
|
context.runes = foundry.utils.duplicate(actor.getRunes())
|
||||||
context.combat = actor.getCombatValues()
|
context.combat = actor.getCombatValues()
|
||||||
context.equipements = foundry.utils.duplicate(actor.getEquipments())
|
context.equipements = foundry.utils.duplicate(actor.getEquipments())
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
import MournbladeItemSheet from "./base-item-sheet.mjs"
|
||||||
|
|
||||||
|
export default class MournbladePotionSheet extends MournbladeItemSheet {
|
||||||
|
/** @override */
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
classes: ["potion"],
|
||||||
|
position: {
|
||||||
|
width: 640,
|
||||||
|
},
|
||||||
|
window: {
|
||||||
|
contentClasses: ["potion-content"],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
static PARTS = {
|
||||||
|
main: {
|
||||||
|
template: "systems/fvtt-mournblade/templates/item-potion-sheet.hbs",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
tabGroups = {
|
||||||
|
primary: "details",
|
||||||
|
}
|
||||||
|
|
||||||
|
#getTabs() {
|
||||||
|
const tabs = {
|
||||||
|
details: { id: "details", group: "primary", label: "Détails" },
|
||||||
|
effets: { id: "effets", group: "primary", label: "Effets" },
|
||||||
|
description: { id: "description", group: "primary", label: "Description" },
|
||||||
|
}
|
||||||
|
for (const v of Object.values(tabs)) {
|
||||||
|
v.active = this.tabGroups[v.group] === v.id
|
||||||
|
v.cssClass = v.active ? "active" : ""
|
||||||
|
}
|
||||||
|
return tabs
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
async _prepareContext() {
|
||||||
|
const context = await super._prepareContext()
|
||||||
|
context.tabs = this.#getTabs()
|
||||||
|
context.config = game.system.mournblade.config
|
||||||
|
return context
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ export default class CapaciteDataModel extends foundry.abstract.TypeDataModel {
|
|||||||
static defineSchema() {
|
static defineSchema() {
|
||||||
const fields = foundry.data.fields;
|
const fields = foundry.data.fields;
|
||||||
return {
|
return {
|
||||||
|
typeCapacite: new fields.StringField({ initial: "creature", blank: false }),
|
||||||
description: new fields.HTMLField({ initial: "" })
|
description: new fields.HTMLField({ initial: "" })
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ export default class CreatureDataModel extends foundry.abstract.TypeDataModel {
|
|||||||
name: new fields.StringField({ initial: "" }),
|
name: new fields.StringField({ initial: "" }),
|
||||||
age: new fields.NumberField({ initial: 0, integer: true }),
|
age: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
alignement: new fields.StringField({ initial: "" }),
|
alignement: new fields.StringField({ initial: "" }),
|
||||||
|
creatureType: new fields.StringField({ initial: "creature" }),
|
||||||
|
elementType: new fields.StringField({ initial: "" }),
|
||||||
poids: new fields.StringField({ initial: "" }),
|
poids: new fields.StringField({ initial: "" }),
|
||||||
taille: new fields.StringField({ initial: "" }),
|
taille: new fields.StringField({ initial: "" }),
|
||||||
cheveux: new fields.StringField({ initial: "" }),
|
cheveux: new fields.StringField({ initial: "" }),
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ export { default as PacteDataModel } from './pacte.mjs';
|
|||||||
export { default as ProtectionDataModel } from './protection.mjs';
|
export { default as ProtectionDataModel } from './protection.mjs';
|
||||||
export { default as RuneDataModel } from './rune.mjs';
|
export { default as RuneDataModel } from './rune.mjs';
|
||||||
export { default as RuneEffectDataModel } from './runeeffect.mjs';
|
export { default as RuneEffectDataModel } from './runeeffect.mjs';
|
||||||
|
export { default as PotionDataModel } from './potion.mjs';
|
||||||
export { default as TendanceDataModel } from './tendance.mjs';
|
export { default as TendanceDataModel } from './tendance.mjs';
|
||||||
export { default as TraitChaotiqueDataModel } from './traitchaotique.mjs';
|
export { default as TraitChaotiqueDataModel } from './traitchaotique.mjs';
|
||||||
export { default as TraitEspeceDataModel } from './traitespece.mjs';
|
export { default as TraitEspeceDataModel } from './traitespece.mjs';
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ export default class PersonnageDataModel extends foundry.abstract.TypeDataModel
|
|||||||
value: new fields.NumberField({ initial: 0, integer: true }),
|
value: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
traumatismes: new fields.StringField({ initial: "" })
|
traumatismes: new fields.StringField({ initial: "" })
|
||||||
}),
|
}),
|
||||||
|
invocationsElementaires: new fields.ArrayField(new fields.ObjectField(), { initial: [] }),
|
||||||
combat: new fields.SchemaField({
|
combat: new fields.SchemaField({
|
||||||
initbonus: new fields.NumberField({ initial: 0, integer: true }),
|
initbonus: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
vitessebonus: new fields.NumberField({ initial: 0, integer: true }),
|
vitessebonus: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
* Data model pour les potions à base de runes
|
||||||
|
*/
|
||||||
|
export default class PotionDataModel extends foundry.abstract.TypeDataModel {
|
||||||
|
static defineSchema() {
|
||||||
|
const fields = foundry.data.fields;
|
||||||
|
return {
|
||||||
|
description: new fields.HTMLField({ initial: "" }),
|
||||||
|
effetCuratif: new fields.HTMLField({ initial: "" }),
|
||||||
|
effetLetal: new fields.HTMLField({ initial: "" }),
|
||||||
|
effetSecondaire: new fields.HTMLField({ initial: "" }),
|
||||||
|
rune: new fields.StringField({ initial: "" }),
|
||||||
|
runeImg: new fields.StringField({ initial: "" }),
|
||||||
|
runeSeuil: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
pointsAme: new fields.NumberField({ initial: 1, integer: true, min: 1 }),
|
||||||
|
forme: new fields.StringField({ initial: "liquide" }),
|
||||||
|
statut: new fields.StringField({ initial: "inconnue" }),
|
||||||
|
virulence: new fields.NumberField({ initial: 0, integer: true }),
|
||||||
|
duree: new fields.StringField({ initial: "" }),
|
||||||
|
conservation: new fields.StringField({ initial: "" }),
|
||||||
|
tempsPreparation: new fields.StringField({ initial: "" }),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
import { MournbladeUtility } from "./mournblade-utility.js";
|
import { MournbladeUtility } from "./mournblade-utility.js";
|
||||||
import { MournbladeRollDialog } from "./applications/mournblade-roll-dialog.mjs";
|
import { MournbladeRollDialog } from "./applications/mournblade-roll-dialog.mjs";
|
||||||
|
import MournbladeInvocationDialog from "./applications/mournblade-invocation-dialog.mjs";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
const __degatsBonus = [-2, -2, -1, -1, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 8, 8, 9, 9, 10, 10]
|
const __degatsBonus = [-2, -2, -1, -1, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 8, 8, 9, 9, 10, 10]
|
||||||
@@ -215,6 +216,9 @@ export class MournbladeActor extends Actor {
|
|||||||
getArmors() {
|
getArmors() {
|
||||||
return this.getItemSorted(["protection"])
|
return this.getItemSorted(["protection"])
|
||||||
}
|
}
|
||||||
|
getCapacites() {
|
||||||
|
return this.getItemSorted(["capacite"])
|
||||||
|
}
|
||||||
getRuneEffects() {
|
getRuneEffects() {
|
||||||
return this.getItemSorted(["runeeffect"])
|
return this.getItemSorted(["runeeffect"])
|
||||||
}
|
}
|
||||||
@@ -455,7 +459,7 @@ export class MournbladeActor extends Actor {
|
|||||||
} else {
|
} else {
|
||||||
ame.currentmax -= value
|
ame.currentmax -= value
|
||||||
}
|
}
|
||||||
this.update({ 'system.ame': ame })
|
return this.update({ 'system.ame': ame })
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -650,6 +654,91 @@ export class MournbladeActor extends Actor {
|
|||||||
await MournbladeRollDialog.create(this, rollData)
|
await MournbladeRollDialog.create(this, rollData)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async rollSortilege() {
|
||||||
|
const runes = this.getRunes()
|
||||||
|
if (runes.length < 2) {
|
||||||
|
ui.notifications.warn("Il faut au moins deux Runes pour lancer un Sortilège.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const comp = this.items.find(c => c.type == "competence" && c.name.toLowerCase() == "savoir : runes")
|
||||||
|
if (!comp) {
|
||||||
|
ui.notifications.warn("La compétence Savoir : Runes n'a pas été trouvée, abandon.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let rollData = this.getCommonRollData("cla", undefined, "Savoir : Runes")
|
||||||
|
rollData.isSortilege = true
|
||||||
|
rollData.difficulte = 0
|
||||||
|
rollData.runemode = "prononcer"
|
||||||
|
rollData.runeame = 0
|
||||||
|
await MournbladeRollDialog.createSortilege(this, rollData)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async preparePotion() {
|
||||||
|
const runes = this.getRunes()
|
||||||
|
if (runes.length === 0) {
|
||||||
|
ui.notifications.warn("Aucune Rune disponible pour préparer une potion.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const comp = this.items.find(c => c.type == "competence" && c.name.toLowerCase() == "savoir : runes")
|
||||||
|
if (!comp) {
|
||||||
|
ui.notifications.warn("La compétence Savoir : Runes n'a pas été trouvée, abandon.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let rollData = this.getCommonRollData("cla", comp._id)
|
||||||
|
rollData.isPotion = true
|
||||||
|
rollData.mainDice = "1d10"
|
||||||
|
|
||||||
|
// Optionally cap by Savoir:Haut-Parler and Savoir:Alchimie
|
||||||
|
const hautParlerComp = this.items.find(c => c.type == "competence" && c.name.toLowerCase() == "savoir : haut-parler")
|
||||||
|
const alchimieComp = this.items.find(c => c.type == "competence" && c.name.toLowerCase() == "savoir : alchimie")
|
||||||
|
if (hautParlerComp) rollData.limitHautParlerValue = hautParlerComp.system.niveau
|
||||||
|
if (alchimieComp) rollData.limitAlchimieValue = alchimieComp.system.niveau
|
||||||
|
|
||||||
|
await MournbladeRollDialog.createPotion(this, rollData)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async invoquerElementaire() {
|
||||||
|
const persuasionComp = this.items.find(c => c.type == "competence" && c.name.toLowerCase() == "persuasion")
|
||||||
|
if (!persuasionComp) {
|
||||||
|
ui.notifications.warn("La compétence Persuasion est requise pour invoquer un Élémentaire.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let rollData = this.getCommonRollData("pre", persuasionComp._id)
|
||||||
|
rollData.isInvocationElementaire = true
|
||||||
|
rollData.mainDice = "1d10"
|
||||||
|
|
||||||
|
const hautParlerComp = this.items.find(c => c.type == "competence" && c.name.toLowerCase() == "savoir : haut-parler")
|
||||||
|
const seigneursElemComp = this.items.find(c => c.type == "competence" && c.name.toLowerCase() == "savoir : seigneurs élémentaires")
|
||||||
|
if (hautParlerComp) rollData.hautParlerNiveau = hautParlerComp.system.niveau
|
||||||
|
if (seigneursElemComp) rollData.seigneursElemNiveau = seigneursElemComp.system.niveau
|
||||||
|
|
||||||
|
await MournbladeInvocationDialog.create(this, rollData)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async bannirElementaire(invocIndex) {
|
||||||
|
const invocations = foundry.utils.duplicate(this.system.invocationsElementaires || [])
|
||||||
|
const invoc = invocations[invocIndex]
|
||||||
|
if (!invoc) return
|
||||||
|
|
||||||
|
// Free the blocked soul
|
||||||
|
await this.subPointsAme("prononcer", -invoc.soulCost)
|
||||||
|
|
||||||
|
// Delete the created actor if it still exists
|
||||||
|
if (invoc.actorId) {
|
||||||
|
const createdActor = game.actors.get(invoc.actorId)
|
||||||
|
if (createdActor) await createdActor.delete()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove from the list
|
||||||
|
invocations.splice(invocIndex, 1)
|
||||||
|
await this.update({ "system.invocationsElementaires": invocations })
|
||||||
|
ui.notifications.info(`L'Élémentaire ${invoc.actorName} a été banni. ${invoc.soulCost} points d'Âme libérés.`)
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async rollArmeOffensif(armeId) {
|
async rollArmeOffensif(armeId) {
|
||||||
let arme = this.items.get(armeId)
|
let arme = this.items.get(armeId)
|
||||||
|
|||||||
@@ -72,6 +72,36 @@ export class MournbladeConfig {
|
|||||||
loi: game.i18n.localize("MNBL.law"),
|
loi: game.i18n.localize("MNBL.law"),
|
||||||
betes: game.i18n.localize("MNBL.beastslords"),
|
betes: game.i18n.localize("MNBL.beastslords"),
|
||||||
elementaires: game.i18n.localize("MNBL.elementslords")
|
elementaires: game.i18n.localize("MNBL.elementslords")
|
||||||
|
},
|
||||||
|
potionFormeOptions: {
|
||||||
|
liquide: game.i18n.localize("MNBL.potionLiquide"),
|
||||||
|
onguent: game.i18n.localize("MNBL.potionOnguent"),
|
||||||
|
cachets: game.i18n.localize("MNBL.potionCachets"),
|
||||||
|
pilules: game.i18n.localize("MNBL.potionPilules"),
|
||||||
|
},
|
||||||
|
potionStatutOptions: {
|
||||||
|
inconnue: game.i18n.localize("MNBL.potionInconnue"),
|
||||||
|
efficace: game.i18n.localize("MNBL.potionEfficace"),
|
||||||
|
heroique: game.i18n.localize("MNBL.potionHeroique"),
|
||||||
|
inefficace: game.i18n.localize("MNBL.potionInnefficace"),
|
||||||
|
poison: game.i18n.localize("MNBL.potionPoison"),
|
||||||
|
},
|
||||||
|
typeCapaciteOptions: {
|
||||||
|
elue: game.i18n.localize("MNBL.typeCapaciteElue"),
|
||||||
|
elementaire: game.i18n.localize("MNBL.typeCapaciteElementaire"),
|
||||||
|
demoniaque: game.i18n.localize("MNBL.typeCapaciteDemoniaque"),
|
||||||
|
creature: game.i18n.localize("MNBL.typeCapaciteCreature"),
|
||||||
|
},
|
||||||
|
creatureTypeOptions: {
|
||||||
|
creature: game.i18n.localize("MNBL.creatureTypeCreature"),
|
||||||
|
demon: game.i18n.localize("MNBL.creatureTypeDemon"),
|
||||||
|
elementaire: game.i18n.localize("MNBL.creatureTypeElementaire"),
|
||||||
|
},
|
||||||
|
elementTypeOptions: {
|
||||||
|
air: game.i18n.localize("MNBL.elementTypeAir"),
|
||||||
|
terre: game.i18n.localize("MNBL.elementTypeTerre"),
|
||||||
|
feu: game.i18n.localize("MNBL.elementTypeFeu"),
|
||||||
|
eau: game.i18n.localize("MNBL.elementTypeEau"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,9 +12,11 @@ export const defaultItemImg = {
|
|||||||
protection: "systems/fvtt-mournblade/assets/icons/protection.webp",
|
protection: "systems/fvtt-mournblade/assets/icons/protection.webp",
|
||||||
rune: "systems/fvtt-mournblade/assets/icons/rune.webp",
|
rune: "systems/fvtt-mournblade/assets/icons/rune.webp",
|
||||||
runeeffect: "systems/fvtt-mournblade/assets/icons/rune.webp",
|
runeeffect: "systems/fvtt-mournblade/assets/icons/rune.webp",
|
||||||
|
potion: "systems/fvtt-mournblade/assets/icons/potion.webp",
|
||||||
tendance: "systems/fvtt-mournblade/assets/icons/tendance.webp",
|
tendance: "systems/fvtt-mournblade/assets/icons/tendance.webp",
|
||||||
traitchaotique: "systems/fvtt-mournblade/assets/icons/traitchaotique.webp",
|
traitchaotique: "systems/fvtt-mournblade/assets/icons/traitchaotique.webp",
|
||||||
traitespece: "systems/fvtt-mournblade/assets/icons/capacite.webp"
|
traitespece: "systems/fvtt-mournblade/assets/icons/capacite.webp",
|
||||||
|
potion: "systems/fvtt-mournblade/assets/icons/potion.svg",
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ Hooks.once("init", async function () {
|
|||||||
protection: models.ProtectionDataModel,
|
protection: models.ProtectionDataModel,
|
||||||
rune: models.RuneDataModel,
|
rune: models.RuneDataModel,
|
||||||
runeeffect: models.RuneEffectDataModel,
|
runeeffect: models.RuneEffectDataModel,
|
||||||
|
potion: models.PotionDataModel,
|
||||||
tendance: models.TendanceDataModel,
|
tendance: models.TendanceDataModel,
|
||||||
traitchaotique: models.TraitChaotiqueDataModel,
|
traitchaotique: models.TraitChaotiqueDataModel,
|
||||||
traitespece: models.TraitEspeceDataModel
|
traitespece: models.TraitEspeceDataModel
|
||||||
@@ -108,6 +109,7 @@ Hooks.once("init", async function () {
|
|||||||
foundry.documents.collections.Items.registerSheet("fvtt-mournblade", sheets.MournbladeProtectionSheet, { types: ["protection"], makeDefault: true });
|
foundry.documents.collections.Items.registerSheet("fvtt-mournblade", sheets.MournbladeProtectionSheet, { types: ["protection"], makeDefault: true });
|
||||||
foundry.documents.collections.Items.registerSheet("fvtt-mournblade", sheets.MournbladeRuneSheet, { types: ["rune"], makeDefault: true });
|
foundry.documents.collections.Items.registerSheet("fvtt-mournblade", sheets.MournbladeRuneSheet, { types: ["rune"], makeDefault: true });
|
||||||
foundry.documents.collections.Items.registerSheet("fvtt-mournblade", sheets.MournbladeRuneEffectSheet, { types: ["runeeffect"], makeDefault: true });
|
foundry.documents.collections.Items.registerSheet("fvtt-mournblade", sheets.MournbladeRuneEffectSheet, { types: ["runeeffect"], makeDefault: true });
|
||||||
|
foundry.documents.collections.Items.registerSheet("fvtt-mournblade", sheets.MournbladePotionSheet, { types: ["potion"], makeDefault: true });
|
||||||
foundry.documents.collections.Items.registerSheet("fvtt-mournblade", sheets.MournbladeTendanceSheet, { types: ["tendance"], makeDefault: true });
|
foundry.documents.collections.Items.registerSheet("fvtt-mournblade", sheets.MournbladeTendanceSheet, { types: ["tendance"], makeDefault: true });
|
||||||
foundry.documents.collections.Items.registerSheet("fvtt-mournblade", sheets.MournbladeTraitChaotiqueSheet, { types: ["traitchaotique"], makeDefault: true });
|
foundry.documents.collections.Items.registerSheet("fvtt-mournblade", sheets.MournbladeTraitChaotiqueSheet, { types: ["traitchaotique"], makeDefault: true });
|
||||||
foundry.documents.collections.Items.registerSheet("fvtt-mournblade", sheets.MournbladeTraitEspeceSheet, { types: ["traitespece"], makeDefault: true });
|
foundry.documents.collections.Items.registerSheet("fvtt-mournblade", sheets.MournbladeTraitEspeceSheet, { types: ["traitespece"], makeDefault: true });
|
||||||
|
|||||||
@@ -127,6 +127,12 @@ export class MournbladeUtility {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async chatListeners(html) {
|
static async chatListeners(html) {
|
||||||
|
|
||||||
|
$(html).on("click", '.mournblade-open-guide', async event => {
|
||||||
|
event.preventDefault()
|
||||||
|
const doc = await fromUuid("Compendium.fvtt-mournblade.journal-aide.JournalEntry.JurnlHelpGuide01")
|
||||||
|
if (doc) doc.sheet.render(true)
|
||||||
|
})
|
||||||
|
|
||||||
$(html).on("click", '.predilection-reroll', async event => {
|
$(html).on("click", '.predilection-reroll', async event => {
|
||||||
let predIdx = $(event.currentTarget).data("predilection-index")
|
let predIdx = $(event.currentTarget).data("predilection-index")
|
||||||
let messageId = MournbladeUtility.findChatMessageId(event.currentTarget)
|
let messageId = MournbladeUtility.findChatMessageId(event.currentTarget)
|
||||||
@@ -157,6 +163,52 @@ export class MournbladeUtility {
|
|||||||
game.socket.emit("system.fvtt-mournblade", { name: "msg_apply_damage", data: { rollData: rollData } })
|
game.socket.emit("system.fvtt-mournblade", { name: "msg_apply_damage", data: { rollData: rollData } })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
$(html).on("click", '.rune-post-chat', async event => {
|
||||||
|
event.preventDefault()
|
||||||
|
const btn = event.currentTarget
|
||||||
|
const actorId = btn.dataset.actorId
|
||||||
|
const itemId = btn.dataset.itemId
|
||||||
|
await MournbladeUtility.postItemToChat(actorId, itemId)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async postItemToChat(actorId, itemId) {
|
||||||
|
const actor = game.actors.get(actorId)
|
||||||
|
const item = actor?.items.get(itemId)
|
||||||
|
if (!item) { ui.notifications.warn("Item introuvable."); return }
|
||||||
|
|
||||||
|
let chatData = foundry.utils.duplicate(item)
|
||||||
|
if (actor) chatData.actor = { id: actor.id }
|
||||||
|
if (chatData.img?.includes("/blank.png")) chatData.img = null
|
||||||
|
|
||||||
|
chatData.jsondata = JSON.stringify({ compendium: "postedItem", payload: chatData })
|
||||||
|
|
||||||
|
const typeLabels = {
|
||||||
|
arme: "Arme", bouclier: "Bouclier", competence: "Compétence",
|
||||||
|
rune: "Rune", runeeffect: "Rune Active", don: "Don", pacte: "Pacte",
|
||||||
|
protection: "Protection", equipement: "Équipement", heritage: "Héritage",
|
||||||
|
metier: "Métier", capacite: "Capacité", tendance: "Tendance",
|
||||||
|
traitchaotique: "Trait Chaotique", traitespece: "Trait d'Espèce",
|
||||||
|
origine: "Origine", modifier: "Modificateur", monnaie: "Monnaie"
|
||||||
|
}
|
||||||
|
chatData.typeLabel = typeLabels[chatData.type] ?? chatData.type
|
||||||
|
|
||||||
|
const typeIcons = {
|
||||||
|
arme: "fa-sword", bouclier: "fa-shield-halved", competence: "fa-graduation-cap",
|
||||||
|
rune: "fa-star-of-david", runeeffect: "fa-star-of-david", don: "fa-hand-sparkles",
|
||||||
|
pacte: "fa-scroll", protection: "fa-shield", equipement: "fa-box",
|
||||||
|
heritage: "fa-dna", metier: "fa-hammer", capacite: "fa-bolt",
|
||||||
|
tendance: "fa-yin-yang", traitchaotique: "fa-skull", traitespece: "fa-paw",
|
||||||
|
origine: "fa-compass", modifier: "fa-sliders", monnaie: "fa-coins",
|
||||||
|
potion: "fa-flask"
|
||||||
|
}
|
||||||
|
chatData.typeIcon = typeIcons[chatData.type] ?? "fa-cube"
|
||||||
|
|
||||||
|
const html = await foundry.applications.handlebars.renderTemplate(
|
||||||
|
'systems/fvtt-mournblade/templates/post-item.hbs', chatData)
|
||||||
|
ChatMessage.create({ user: game.user.id, content: html })
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -166,7 +218,9 @@ export class MournbladeUtility {
|
|||||||
'systems/fvtt-mournblade/templates/editor-notes-gm.hbs',
|
'systems/fvtt-mournblade/templates/editor-notes-gm.hbs',
|
||||||
'systems/fvtt-mournblade/templates/partial-item-description.hbs',
|
'systems/fvtt-mournblade/templates/partial-item-description.hbs',
|
||||||
'systems/fvtt-mournblade/templates/partial-item-header.hbs',
|
'systems/fvtt-mournblade/templates/partial-item-header.hbs',
|
||||||
'systems/fvtt-mournblade/templates/partial-item-nav.hbs'
|
'systems/fvtt-mournblade/templates/partial-item-nav.hbs',
|
||||||
|
'systems/fvtt-mournblade/templates/dialog-invocation-elementaire.hbs',
|
||||||
|
'systems/fvtt-mournblade/templates/chat-invocation-result.hbs',
|
||||||
]
|
]
|
||||||
return foundry.applications.handlebars.loadTemplates(templatePaths);
|
return foundry.applications.handlebars.loadTemplates(templatePaths);
|
||||||
}
|
}
|
||||||
@@ -391,12 +445,16 @@ export class MournbladeUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rollData.rune) {
|
if (rollData.rune) {
|
||||||
rollData.runeduree = Math.ceil((rollData.runeame + 3) / 3)
|
const actionsBase = Math.ceil(rollData.runeame / 3)
|
||||||
|
rollData.runeActionsComplexes = (rollData.runemode == "inscrire") ? actionsBase * 2 : actionsBase
|
||||||
|
|
||||||
if (rollData.runemode == "inscrire") {
|
if (rollData.runemode == "inscrire") {
|
||||||
rollData.runeduree *= 2
|
rollData.runeduree = null // durée infinie
|
||||||
}
|
rollData.dureeLabel = "infinie"
|
||||||
if (rollData.runemode == "prononcer") {
|
} else {
|
||||||
rollData.runeduree = 1
|
// prononcer : 1 heure de base + 1 heure par tranche de 2 points d'âme
|
||||||
|
rollData.runeduree = 1 + Math.floor(rollData.runeame / 2)
|
||||||
|
rollData.dureeLabel = rollData.runeduree === 1 ? "1 heure" : `${rollData.runeduree} heures`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -412,17 +470,40 @@ export class MournbladeUtility {
|
|||||||
// Application immédiate selon type de jet
|
// Application immédiate selon type de jet
|
||||||
if (rollData.rune) {
|
if (rollData.rune) {
|
||||||
let subAme = rollData.runeame
|
let subAme = rollData.runeame
|
||||||
if (rollData.isEchec && !rollData.isDramatique) {
|
|
||||||
|
// Réussite héroïque + rune uniquement sur soi : coût d'âme divisé par 2 (arrondi sup.)
|
||||||
|
if (rollData.isHeroique && rollData.runeautocible) {
|
||||||
|
subAme = Math.ceil(subAme / 2)
|
||||||
|
rollData.runeameCostReduit = true
|
||||||
|
rollData.runeameCostFinal = subAme
|
||||||
|
} else if (rollData.isEchec && !rollData.isDramatique) {
|
||||||
|
// Échec simple : perd la moitié (arrondie sup.)
|
||||||
subAme = Math.ceil((subAme + 1) / 2)
|
subAme = Math.ceil((subAme + 1) / 2)
|
||||||
}
|
}
|
||||||
actor.subPointsAme(rollData.runemode, subAme)
|
actor.subPointsAme(rollData.runemode, subAme)
|
||||||
|
|
||||||
|
// Échec dramatique : dé du Chaos (d20)
|
||||||
|
if (rollData.isDramatique) {
|
||||||
|
const chaosRoll = await new Roll("1d20").evaluate()
|
||||||
|
await this.showDiceSoNice(chaosRoll, game.settings.get("core", "rollMode"))
|
||||||
|
const cr = chaosRoll.terms[0].results[0].result
|
||||||
|
rollData.chaosDieResult = cr
|
||||||
|
const claValue = rollData.attr?.value ?? 0
|
||||||
|
if (cr === 1 || cr === 11) {
|
||||||
|
rollData.chaosEffet = "desastre"
|
||||||
|
rollData.chaosEffetTexte = `Désastre extraordinaire ! La Rune se déclenche à des kilomètres de là sur des cibles inconnues. La Loi se manifeste : le sorcier ne peut plus utiliser l'Œil pendant ${claValue} semaine${claValue > 1 ? "s" : ""}.`
|
||||||
|
} else if (cr % 2 === 1) {
|
||||||
|
rollData.chaosEffet = "echec_absolu"
|
||||||
|
rollData.chaosEffetTexte = "Échec absolu. Le MJ décide si la Rune se manifeste sur des cibles autres, dans des proportions désavantageuses ou en un lieu très lointain."
|
||||||
|
} else {
|
||||||
|
rollData.chaosEffet = "rien"
|
||||||
|
rollData.chaosEffetTexte = "Rien de particulier ne se produit en plus de la perte des points d'Âme."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Créer l'effet de rune sur l'acteur si le jet est réussi
|
// Créer l'effet de rune sur l'acteur si le jet est réussi
|
||||||
if (rollData.isSuccess) {
|
if (rollData.isSuccess) {
|
||||||
const effetMode = (rollData.runemode == "prononcer") ? "prononcee" : "inscrite"
|
const effetMode = (rollData.runemode == "prononcer") ? "prononcee" : "inscrite"
|
||||||
const dureeLabel = rollData.runeduree === 1
|
|
||||||
? `${rollData.runeduree} tour`
|
|
||||||
: `${rollData.runeduree} tours`
|
|
||||||
await actor.createEmbeddedDocuments("Item", [{
|
await actor.createEmbeddedDocuments("Item", [{
|
||||||
name: rollData.rune.name,
|
name: rollData.rune.name,
|
||||||
type: "runeeffect",
|
type: "runeeffect",
|
||||||
@@ -430,7 +511,7 @@ export class MournbladeUtility {
|
|||||||
system: {
|
system: {
|
||||||
rune: rollData.rune.name,
|
rune: rollData.rune.name,
|
||||||
mode: effetMode,
|
mode: effetMode,
|
||||||
duree: dureeLabel,
|
duree: rollData.dureeLabel,
|
||||||
pointame: rollData.runeame
|
pointame: rollData.runeame
|
||||||
}
|
}
|
||||||
}])
|
}])
|
||||||
@@ -455,6 +536,99 @@ export class MournbladeUtility {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async rollSortilege(rollData) {
|
||||||
|
if (!rollData.sortilegeRunes || rollData.sortilegeRunes.length === 0) {
|
||||||
|
ui.notifications.warn("Aucune Rune sélectionnée pour le Sortilège.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const actor = rollData.tokenId
|
||||||
|
? game.canvas.tokens.get(rollData.tokenId)?.actor
|
||||||
|
: game.actors.get(rollData.actorId)
|
||||||
|
|
||||||
|
// Pré-calcul des infos du sortilège
|
||||||
|
const isInscrire = rollData.runemode === "inscrire"
|
||||||
|
|
||||||
|
rollData.sortilegeRunes.forEach(r => {
|
||||||
|
r.actionsComplexes = Math.ceil(r.pts / 3) * (isInscrire ? 2 : 1)
|
||||||
|
if (isInscrire) {
|
||||||
|
r.dureeLabel = "infinie"
|
||||||
|
} else {
|
||||||
|
const h = 1 + Math.floor(r.pts / 2)
|
||||||
|
r.dureeLabel = h === 1 ? "1 heure" : `${h} heures`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
rollData.runeActionsComplexes = rollData.sortilegeRunes.reduce((s, r) => s + r.actionsComplexes, 0)
|
||||||
|
|
||||||
|
// Construction de la formule de jet : mainDice + CLA + Savoir:Runes + malus + modificateur
|
||||||
|
const compNiveau = rollData.competence?.system?.niveau ?? 0
|
||||||
|
const compMod = compNiveau === 0 ? -3 : 0
|
||||||
|
rollData.diceFormula = `${rollData.mainDice}+${rollData.attr.value}+${compNiveau}+${rollData.modificateur}+${compMod}+${rollData.malusSante}+${rollData.malusAme}`
|
||||||
|
|
||||||
|
const myRoll = await new Roll(rollData.diceFormula).evaluate()
|
||||||
|
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
|
||||||
|
rollData.roll = foundry.utils.duplicate(myRoll)
|
||||||
|
rollData.diceResult = myRoll.terms[0].results[0].result
|
||||||
|
rollData.finalResult = myRoll.total
|
||||||
|
this.computeResult(rollData)
|
||||||
|
|
||||||
|
// Déduction des points d'âme
|
||||||
|
let totalCost = rollData.sortilegeRunes.reduce((s, r) => s + r.pts, 0)
|
||||||
|
if (rollData.isHeroique && rollData.runeautocible) {
|
||||||
|
totalCost = Math.ceil(totalCost / 2)
|
||||||
|
rollData.runeameCostReduit = true
|
||||||
|
rollData.runeameCostFinal = totalCost
|
||||||
|
} else if (rollData.isEchec && !rollData.isDramatique) {
|
||||||
|
totalCost = Math.ceil((totalCost + 1) / 2)
|
||||||
|
}
|
||||||
|
actor.subPointsAme(rollData.runemode, totalCost)
|
||||||
|
|
||||||
|
// Échec dramatique : dé du Chaos
|
||||||
|
if (rollData.isDramatique) {
|
||||||
|
const chaosRoll = await new Roll("1d20").evaluate()
|
||||||
|
await this.showDiceSoNice(chaosRoll, game.settings.get("core", "rollMode"))
|
||||||
|
const cr = chaosRoll.terms[0].results[0].result
|
||||||
|
rollData.chaosDieResult = cr
|
||||||
|
const claValue = rollData.attr?.value ?? 0
|
||||||
|
if (cr === 1 || cr === 11) {
|
||||||
|
rollData.chaosEffet = "desastre"
|
||||||
|
rollData.chaosEffetTexte = `Désastre extraordinaire ! Les Runes se déclenchent à des kilomètres de là sur des cibles inconnues. La Loi se manifeste : le sorcier ne peut plus utiliser l'Œil pendant ${claValue} semaine${claValue > 1 ? "s" : ""}.`
|
||||||
|
} else if (cr % 2 === 1) {
|
||||||
|
rollData.chaosEffet = "echec_absolu"
|
||||||
|
rollData.chaosEffetTexte = "Échec absolu. Le MJ décide si les Runes se manifestent sur des cibles autres, dans des proportions désavantageuses ou en un lieu très lointain."
|
||||||
|
} else {
|
||||||
|
rollData.chaosEffet = "rien"
|
||||||
|
rollData.chaosEffetTexte = "Rien de particulier ne se produit en plus de la perte des points d'Âme."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Succès : créer un runeeffect par rune
|
||||||
|
if (rollData.isSuccess) {
|
||||||
|
const effetMode = isInscrire ? "inscrite" : "prononcee"
|
||||||
|
const items = rollData.sortilegeRunes.map(r => ({
|
||||||
|
name: r.name,
|
||||||
|
type: "runeeffect",
|
||||||
|
img: r.img || "systems/fvtt-mournblade/assets/icons/rune.webp",
|
||||||
|
system: {
|
||||||
|
rune: r.name,
|
||||||
|
mode: effetMode,
|
||||||
|
duree: r.dureeLabel,
|
||||||
|
pointame: r.pts
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
await actor.createEmbeddedDocuments("Item", items)
|
||||||
|
}
|
||||||
|
|
||||||
|
rollData.runeame = rollData.sortilegeRunes.reduce((s, r) => s + r.pts, 0)
|
||||||
|
|
||||||
|
this.createChatWithRollMode(rollData.alias, {
|
||||||
|
content: await foundry.applications.handlebars.renderTemplate(
|
||||||
|
`systems/fvtt-mournblade/templates/chat-sortilege-result.hbs`, rollData)
|
||||||
|
}, rollData)
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async rollDegatsFromAttaque(rollData) {
|
static async rollDegatsFromAttaque(rollData) {
|
||||||
let maximize = false
|
let maximize = false
|
||||||
@@ -894,4 +1068,212 @@ export class MournbladeUtility {
|
|||||||
d.render(true);
|
d.render(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* Roll for potion preparation (blind mode — GM only sees result)
|
||||||
|
* @param {object} rollData
|
||||||
|
*/
|
||||||
|
static async rollPotion(rollData) {
|
||||||
|
if (!rollData.runeId) {
|
||||||
|
ui.notifications.warn("Aucune Rune sélectionnée pour la préparation de la potion.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const actor = rollData.tokenId
|
||||||
|
? game.canvas.tokens.get(rollData.tokenId)?.actor
|
||||||
|
: game.actors.get(rollData.actorId)
|
||||||
|
|
||||||
|
const pa = rollData.pointsAme ?? 1
|
||||||
|
const seuil = rollData.runeSeuil ?? 0
|
||||||
|
const difficulte = seuil + pa
|
||||||
|
const modificateur = rollData.modificateur ?? 0
|
||||||
|
rollData.difficulte = difficulte
|
||||||
|
|
||||||
|
const compNiveau = rollData.competence?.system?.niveau ?? 0
|
||||||
|
const compMod = compNiveau === 0 ? -3 : 0
|
||||||
|
|
||||||
|
rollData.diceFormula = `${rollData.mainDice ?? "1d10"}+${rollData.attr.value}+${compNiveau}+${modificateur}+${compMod}+${rollData.malusSante}+${rollData.malusAme}`
|
||||||
|
|
||||||
|
const myRoll = await new Roll(rollData.diceFormula).evaluate()
|
||||||
|
await this.showDiceSoNice(myRoll, "blindroll")
|
||||||
|
rollData.roll = foundry.utils.duplicate(myRoll)
|
||||||
|
rollData.diceResult = myRoll.terms[0].results[0].result
|
||||||
|
rollData.finalResult = myRoll.total
|
||||||
|
this.computeResult(rollData)
|
||||||
|
|
||||||
|
// Determine potion status
|
||||||
|
let potionStatut
|
||||||
|
let virulence = 0
|
||||||
|
let ameDeduct = pa
|
||||||
|
let potionCreated = false
|
||||||
|
|
||||||
|
if (rollData.isHeroique) {
|
||||||
|
potionStatut = "heroique"
|
||||||
|
} else if (rollData.isSuccess) {
|
||||||
|
potionStatut = "efficace"
|
||||||
|
} else if (rollData.isDramatique) {
|
||||||
|
potionStatut = "inconnue"
|
||||||
|
virulence = pa * 3
|
||||||
|
} else {
|
||||||
|
potionStatut = "inefficace"
|
||||||
|
ameDeduct = Math.ceil(pa / 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
rollData.virulence = virulence
|
||||||
|
actor.subPointsAme("prononcer", ameDeduct)
|
||||||
|
|
||||||
|
// Calculate durations and prep time
|
||||||
|
const forme = rollData.forme ?? "liquide"
|
||||||
|
const isSolide = ["onguent", "cachets", "pilules"].includes(forme)
|
||||||
|
const dureeHeures = pa
|
||||||
|
const conservationMois = isSolide ? pa * 6 : pa
|
||||||
|
const tempsPrep = Math.max(1, Math.ceil(pa / 3))
|
||||||
|
rollData.dureePotion = dureeHeures === 1 ? "1 heure" : `${dureeHeures} heures`
|
||||||
|
rollData.conservationPotion = `${conservationMois} mois`
|
||||||
|
rollData.tempsPreparation = tempsPrep === 1 ? "1 heure" : `${tempsPrep} heures`
|
||||||
|
|
||||||
|
const formeLabels = { liquide: "Liquide", onguent: "Onguent", cachets: "Cachets", pilules: "Pilules" }
|
||||||
|
rollData.formeLabel = formeLabels[forme] ?? forme
|
||||||
|
|
||||||
|
if (potionStatut !== "inefficace") {
|
||||||
|
const potionItem = {
|
||||||
|
name: `Potion de ${rollData.runeName}`,
|
||||||
|
type: "potion",
|
||||||
|
img: rollData.runeImg || "systems/fvtt-mournblade/assets/icons/potion.webp",
|
||||||
|
system: {
|
||||||
|
rune: rollData.runeName,
|
||||||
|
runeImg: rollData.runeImg ?? "",
|
||||||
|
runeSeuil: seuil,
|
||||||
|
pointsAme: pa,
|
||||||
|
forme: forme,
|
||||||
|
statut: potionStatut,
|
||||||
|
virulence: virulence,
|
||||||
|
duree: rollData.dureePotion,
|
||||||
|
conservation: rollData.conservationPotion,
|
||||||
|
tempsPreparation: rollData.tempsPreparation,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await actor.createEmbeddedDocuments("Item", [potionItem])
|
||||||
|
potionCreated = true
|
||||||
|
}
|
||||||
|
|
||||||
|
rollData.potionCreated = potionCreated
|
||||||
|
rollData.isGM = game.user.isGM
|
||||||
|
|
||||||
|
this.createChatWithRollMode(rollData.alias, {
|
||||||
|
content: await foundry.applications.handlebars.renderTemplate(
|
||||||
|
`systems/fvtt-mournblade/templates/chat-potion-result.hbs`, rollData)
|
||||||
|
}, { ...rollData, rollMode: "blindroll" })
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async rollInvocationElementaire(rollData) {
|
||||||
|
const actor = rollData.tokenId
|
||||||
|
? game.canvas.tokens.get(rollData.tokenId)?.actor
|
||||||
|
: game.actors.get(rollData.actorId)
|
||||||
|
|
||||||
|
if (!actor) {
|
||||||
|
ui.notifications.error("Acteur introuvable pour l'invocation.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const soulCost = rollData.invocationSoulCost ?? rollData.invocationSeuil ?? 15
|
||||||
|
const bonusPacte = rollData.bonusPacte ?? 0
|
||||||
|
const compNiveau = rollData.competence?.system?.niveau ?? 0
|
||||||
|
const compMod = compNiveau === 0 ? -3 : 0
|
||||||
|
const modificateur = rollData.modificateur ?? 0
|
||||||
|
|
||||||
|
// Validate that the actor has enough soul to invoke
|
||||||
|
const ameDisponible = Math.max(0, actor.system.ame.currentmax - actor.system.ame.value)
|
||||||
|
if (ameDisponible < soulCost) {
|
||||||
|
ui.notifications.warn(`Âme insuffisante pour cette invocation (requis : ${soulCost}, disponible : ${ameDisponible}).`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
rollData.difficulte = rollData.invocationSeuil
|
||||||
|
rollData.diceFormula = `${rollData.mainDice ?? "1d10"}+${rollData.attr.value}+${compNiveau}+${bonusPacte}+${modificateur}+${compMod}+${rollData.malusSante}+${rollData.malusAme}`
|
||||||
|
|
||||||
|
const myRoll = await new Roll(rollData.diceFormula).evaluate()
|
||||||
|
await this.showDiceSoNice(myRoll, "blindroll")
|
||||||
|
rollData.roll = foundry.utils.duplicate(myRoll)
|
||||||
|
rollData.diceResult = myRoll.terms[0].results[0].result
|
||||||
|
rollData.finalResult = myRoll.total
|
||||||
|
this.computeResult(rollData)
|
||||||
|
|
||||||
|
let ameDeduct = soulCost
|
||||||
|
let elementaireCreated = false
|
||||||
|
let createdActorId = null
|
||||||
|
let createdActorName = null
|
||||||
|
|
||||||
|
if (rollData.isSuccess || rollData.isHeroique) {
|
||||||
|
// Build elemental name for compendium lookup
|
||||||
|
const elementNames = { air: "d'Air", terre: "de Terre", feu: "de Feu", eau: "de l'Eau" }
|
||||||
|
const tierNames = { mineur: "Mineur", median: "Médian", majeur: "Majeur" }
|
||||||
|
const elemLabel = elementNames[rollData.invocationElement] ?? rollData.invocationElement
|
||||||
|
const tierLabel = tierNames[rollData.invocationTier] ?? rollData.invocationTier
|
||||||
|
const searchName = `Élémentaire ${elemLabel} ${tierLabel}`
|
||||||
|
|
||||||
|
// Import from compendium
|
||||||
|
const pack = game.packs.get("fvtt-mournblade.creatures-elementaires")
|
||||||
|
if (pack) {
|
||||||
|
const packIndex = await pack.getIndex()
|
||||||
|
const entry = packIndex.find(e => e.name === searchName)
|
||||||
|
if (entry) {
|
||||||
|
const doc = await pack.getDocument(entry._id)
|
||||||
|
if (doc) {
|
||||||
|
const createdActors = await Actor.createDocuments([doc.toObject()], { renderSheet: false })
|
||||||
|
const createdActor = createdActors[0]
|
||||||
|
if (createdActor) {
|
||||||
|
// Set elemental soul = soulCost invested by invoker
|
||||||
|
await createdActor.update({
|
||||||
|
"system.ame.fullmax": soulCost,
|
||||||
|
"system.ame.currentmax": soulCost,
|
||||||
|
"system.ame.value": 0,
|
||||||
|
})
|
||||||
|
createdActorId = createdActor.id
|
||||||
|
createdActorName = createdActor.name
|
||||||
|
elementaireCreated = true
|
||||||
|
|
||||||
|
// Soul blocked only on confirmed elemental creation
|
||||||
|
await actor.subPointsAme("prononcer", soulCost)
|
||||||
|
|
||||||
|
// Track invocation on personnage
|
||||||
|
const invocations = foundry.utils.duplicate(actor.system.invocationsElementaires || [])
|
||||||
|
invocations.push({
|
||||||
|
element: rollData.invocationElement,
|
||||||
|
tier: rollData.invocationTier,
|
||||||
|
soulCost,
|
||||||
|
actorId: createdActorId,
|
||||||
|
actorName: createdActorName,
|
||||||
|
})
|
||||||
|
await actor.update({ "system.invocationsElementaires": invocations })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ui.notifications.warn(`Élémentaire "${searchName}" introuvable dans le compendium creatures-elementaires.`)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ui.notifications.warn("Compendium creatures-elementaires introuvable.")
|
||||||
|
}
|
||||||
|
} else if (rollData.isDramatique) {
|
||||||
|
// All soul lost
|
||||||
|
actor.subPointsAme("prononcer", soulCost)
|
||||||
|
} else {
|
||||||
|
// Simple failure: half soul lost (round up)
|
||||||
|
ameDeduct = Math.ceil(soulCost / 2)
|
||||||
|
actor.subPointsAme("prononcer", ameDeduct)
|
||||||
|
}
|
||||||
|
|
||||||
|
rollData.invocationSoulDeducted = rollData.isSuccess || rollData.isHeroique ? soulCost : ameDeduct
|
||||||
|
rollData.elementaireCreated = elementaireCreated
|
||||||
|
rollData.createdActorName = createdActorName
|
||||||
|
rollData.bonusPacte = bonusPacte
|
||||||
|
rollData.isGM = game.user.isGM
|
||||||
|
|
||||||
|
this.createChatWithRollMode(rollData.alias, {
|
||||||
|
content: await foundry.applications.handlebars.renderTemplate(
|
||||||
|
`systems/fvtt-mournblade/templates/chat-invocation-result.hbs`, rollData)
|
||||||
|
}, { ...rollData, rollMode: "blindroll" })
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -9,11 +9,164 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"license": "SEE LICENSE IN LICENCE.txt",
|
"license": "SEE LICENSE IN LICENCE.txt",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@foundryvtt/foundryvtt-cli": "^3.0.3",
|
||||||
"gulp": "^4.0.2",
|
"gulp": "^4.0.2",
|
||||||
"gulp-less": "^5.0.0",
|
"gulp-less": "^5.0.0",
|
||||||
"gulp-sourcemaps": "^3.0.0"
|
"gulp-sourcemaps": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@foundryvtt/foundryvtt-cli": {
|
||||||
|
"version": "3.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@foundryvtt/foundryvtt-cli/-/foundryvtt-cli-3.0.3.tgz",
|
||||||
|
"integrity": "sha512-byNLOrZ9ev6PfW+gflhonT5Y+Goq2aHERwVGWO3eYRKez+lzZJoqMY/YMEi54XYozzWWn8d6LuRbBsVPJ30haw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"chalk": "^5.4.1",
|
||||||
|
"classic-level": "^1.4.1",
|
||||||
|
"esm": "^3.2.25",
|
||||||
|
"js-yaml": "^4.1.0",
|
||||||
|
"mkdirp": "^3.0.1",
|
||||||
|
"nedb-promises": "^6.2.3",
|
||||||
|
"yargs": "^17.7.2"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"fvtt": "fvtt.mjs"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">17.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@foundryvtt/foundryvtt-cli/node_modules/ansi-regex": {
|
||||||
|
"version": "5.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
||||||
|
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@foundryvtt/foundryvtt-cli/node_modules/cliui": {
|
||||||
|
"version": "8.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
|
||||||
|
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"string-width": "^4.2.0",
|
||||||
|
"strip-ansi": "^6.0.1",
|
||||||
|
"wrap-ansi": "^7.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@foundryvtt/foundryvtt-cli/node_modules/get-caller-file": {
|
||||||
|
"version": "2.0.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
|
||||||
|
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "ISC",
|
||||||
|
"engines": {
|
||||||
|
"node": "6.* || 8.* || >= 10.*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@foundryvtt/foundryvtt-cli/node_modules/is-fullwidth-code-point": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@foundryvtt/foundryvtt-cli/node_modules/string-width": {
|
||||||
|
"version": "4.2.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
||||||
|
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"emoji-regex": "^8.0.0",
|
||||||
|
"is-fullwidth-code-point": "^3.0.0",
|
||||||
|
"strip-ansi": "^6.0.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@foundryvtt/foundryvtt-cli/node_modules/strip-ansi": {
|
||||||
|
"version": "6.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
|
||||||
|
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"ansi-regex": "^5.0.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@foundryvtt/foundryvtt-cli/node_modules/wrap-ansi": {
|
||||||
|
"version": "7.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
||||||
|
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"ansi-styles": "^4.0.0",
|
||||||
|
"string-width": "^4.1.0",
|
||||||
|
"strip-ansi": "^6.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@foundryvtt/foundryvtt-cli/node_modules/y18n": {
|
||||||
|
"version": "5.0.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
|
||||||
|
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "ISC",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@foundryvtt/foundryvtt-cli/node_modules/yargs": {
|
||||||
|
"version": "17.7.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
|
||||||
|
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"cliui": "^8.0.1",
|
||||||
|
"escalade": "^3.1.1",
|
||||||
|
"get-caller-file": "^2.0.5",
|
||||||
|
"require-directory": "^2.1.1",
|
||||||
|
"string-width": "^4.2.3",
|
||||||
|
"y18n": "^5.0.5",
|
||||||
|
"yargs-parser": "^21.1.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@foundryvtt/foundryvtt-cli/node_modules/yargs-parser": {
|
||||||
|
"version": "21.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
|
||||||
|
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "ISC",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@gulp-sourcemaps/identity-map": {
|
"node_modules/@gulp-sourcemaps/identity-map": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-2.0.1.tgz",
|
||||||
@@ -80,6 +233,67 @@
|
|||||||
"xtend": "~4.0.1"
|
"xtend": "~4.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@seald-io/binary-search-tree": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@seald-io/binary-search-tree/-/binary-search-tree-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-qv3jnwoakeax2razYaMsGI/luWdliBLHTdC6jU55hQt1hcFqzauH/HsBollQ7IR4ySTtYhT+xyHoijpA16C+tA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"node_modules/@seald-io/nedb": {
|
||||||
|
"version": "4.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@seald-io/nedb/-/nedb-4.1.2.tgz",
|
||||||
|
"integrity": "sha512-bDr6TqjBVS2rDyYM9CPxAnotj5FuNL9NF8o7h7YyFXM7yruqT4ddr+PkSb2mJvvw991bqdftazkEo38gykvaww==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@seald-io/binary-search-tree": "^1.0.3",
|
||||||
|
"localforage": "^1.10.0",
|
||||||
|
"util": "^0.12.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/abstract-level": {
|
||||||
|
"version": "1.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz",
|
||||||
|
"integrity": "sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"buffer": "^6.0.3",
|
||||||
|
"catering": "^2.1.0",
|
||||||
|
"is-buffer": "^2.0.5",
|
||||||
|
"level-supports": "^4.0.0",
|
||||||
|
"level-transcoder": "^1.0.1",
|
||||||
|
"module-error": "^1.0.1",
|
||||||
|
"queue-microtask": "^1.2.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/abstract-level/node_modules/is-buffer": {
|
||||||
|
"version": "2.0.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
|
||||||
|
"integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
|
||||||
|
"dev": true,
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "patreon",
|
||||||
|
"url": "https://www.patreon.com/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "consulting",
|
||||||
|
"url": "https://feross.org/support"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/acorn": {
|
"node_modules/acorn": {
|
||||||
"version": "6.4.2",
|
"version": "6.4.2",
|
||||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
|
||||||
@@ -129,6 +343,22 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/ansi-styles": {
|
||||||
|
"version": "4.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
||||||
|
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"color-convert": "^2.0.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/ansi-wrap": {
|
"node_modules/ansi-wrap": {
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
|
||||||
@@ -183,6 +413,13 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/argparse": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "Python-2.0"
|
||||||
|
},
|
||||||
"node_modules/arr-diff": {
|
"node_modules/arr-diff": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
|
||||||
@@ -396,6 +633,22 @@
|
|||||||
"node": ">= 4.5.0"
|
"node": ">= 4.5.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/available-typed-arrays": {
|
||||||
|
"version": "1.0.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
|
||||||
|
"integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"possible-typed-array-names": "^1.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/bach": {
|
"node_modules/bach": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
|
||||||
@@ -456,6 +709,27 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/base64-js": {
|
||||||
|
"version": "1.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
|
||||||
|
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
|
||||||
|
"dev": true,
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "patreon",
|
||||||
|
"url": "https://www.patreon.com/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "consulting",
|
||||||
|
"url": "https://feross.org/support"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/binary-extensions": {
|
"node_modules/binary-extensions": {
|
||||||
"version": "1.13.1",
|
"version": "1.13.1",
|
||||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
|
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
|
||||||
@@ -510,6 +784,31 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/buffer": {
|
||||||
|
"version": "6.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
|
||||||
|
"integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
|
||||||
|
"dev": true,
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "patreon",
|
||||||
|
"url": "https://www.patreon.com/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "consulting",
|
||||||
|
"url": "https://feross.org/support"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"base64-js": "^1.3.1",
|
||||||
|
"ieee754": "^1.2.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/buffer-equal": {
|
"node_modules/buffer-equal": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz",
|
||||||
@@ -611,6 +910,29 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/catering": {
|
||||||
|
"version": "2.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz",
|
||||||
|
"integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/chalk": {
|
||||||
|
"version": "5.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
|
||||||
|
"integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.17.0 || ^14.13 || >=16.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/chalk/chalk?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/chokidar": {
|
"node_modules/chokidar": {
|
||||||
"version": "2.1.8",
|
"version": "2.1.8",
|
||||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
|
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
|
||||||
@@ -677,6 +999,24 @@
|
|||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/classic-level": {
|
||||||
|
"version": "1.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.4.1.tgz",
|
||||||
|
"integrity": "sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==",
|
||||||
|
"dev": true,
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"abstract-level": "^1.0.2",
|
||||||
|
"catering": "^2.1.0",
|
||||||
|
"module-error": "^1.0.1",
|
||||||
|
"napi-macros": "^2.2.2",
|
||||||
|
"node-gyp-build": "^4.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/cliui": {
|
"node_modules/cliui": {
|
||||||
"version": "3.2.0",
|
"version": "3.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
|
||||||
@@ -767,6 +1107,26 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/color-convert": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"color-name": "~1.1.4"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=7.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/color-name": {
|
||||||
|
"version": "1.1.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||||
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/color-support": {
|
"node_modules/color-support": {
|
||||||
"version": "1.1.3",
|
"version": "1.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
|
||||||
@@ -1071,6 +1431,13 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/emoji-regex": {
|
||||||
|
"version": "8.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
|
||||||
|
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/end-of-stream": {
|
"node_modules/end-of-stream": {
|
||||||
"version": "1.4.5",
|
"version": "1.4.5",
|
||||||
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
|
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
|
||||||
@@ -1194,6 +1561,26 @@
|
|||||||
"es6-symbol": "^3.1.1"
|
"es6-symbol": "^3.1.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/escalade": {
|
||||||
|
"version": "3.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
|
||||||
|
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/esm": {
|
||||||
|
"version": "3.2.25",
|
||||||
|
"resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
|
||||||
|
"integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/esniff": {
|
"node_modules/esniff": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
|
||||||
@@ -1488,6 +1875,22 @@
|
|||||||
"readable-stream": "^2.3.6"
|
"readable-stream": "^2.3.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/for-each": {
|
||||||
|
"version": "0.3.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
|
||||||
|
"integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"is-callable": "^1.2.7"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/for-in": {
|
"node_modules/for-in": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
|
||||||
@@ -1586,6 +1989,16 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/generator-function": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/get-caller-file": {
|
"node_modules/get-caller-file": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
|
||||||
@@ -1937,6 +2350,22 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/has-tostringtag": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"has-symbols": "^1.0.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/has-value": {
|
"node_modules/has-value": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
|
||||||
@@ -2026,6 +2455,27 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/ieee754": {
|
||||||
|
"version": "1.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
|
||||||
|
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
|
||||||
|
"dev": true,
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "patreon",
|
||||||
|
"url": "https://www.patreon.com/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "consulting",
|
||||||
|
"url": "https://feross.org/support"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "BSD-3-Clause"
|
||||||
|
},
|
||||||
"node_modules/image-size": {
|
"node_modules/image-size": {
|
||||||
"version": "0.5.5",
|
"version": "0.5.5",
|
||||||
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
|
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
|
||||||
@@ -2040,6 +2490,13 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/immediate": {
|
||||||
|
"version": "3.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
|
||||||
|
"integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/inflight": {
|
"node_modules/inflight": {
|
||||||
"version": "1.0.6",
|
"version": "1.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
||||||
@@ -2113,6 +2570,23 @@
|
|||||||
"node": ">= 0.10"
|
"node": ">= 0.10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is-arguments": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz",
|
||||||
|
"integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"call-bound": "^1.0.2",
|
||||||
|
"has-tostringtag": "^1.0.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/is-arrayish": {
|
"node_modules/is-arrayish": {
|
||||||
"version": "0.2.1",
|
"version": "0.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
||||||
@@ -2140,6 +2614,19 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/is-callable": {
|
||||||
|
"version": "1.2.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
|
||||||
|
"integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/is-core-module": {
|
"node_modules/is-core-module": {
|
||||||
"version": "2.16.1",
|
"version": "2.16.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
|
||||||
@@ -2216,6 +2703,26 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is-generator-function": {
|
||||||
|
"version": "1.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
|
||||||
|
"integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"call-bound": "^1.0.4",
|
||||||
|
"generator-function": "^2.0.0",
|
||||||
|
"get-proto": "^1.0.1",
|
||||||
|
"has-tostringtag": "^1.0.2",
|
||||||
|
"safe-regex-test": "^1.1.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/is-glob": {
|
"node_modules/is-glob": {
|
||||||
"version": "4.0.3",
|
"version": "4.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
|
||||||
@@ -2282,6 +2789,25 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/is-regex": {
|
||||||
|
"version": "1.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
|
||||||
|
"integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"call-bound": "^1.0.2",
|
||||||
|
"gopd": "^1.2.0",
|
||||||
|
"has-tostringtag": "^1.0.2",
|
||||||
|
"hasown": "^2.0.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/is-relative": {
|
"node_modules/is-relative": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
|
||||||
@@ -2295,6 +2821,22 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is-typed-array": {
|
||||||
|
"version": "1.1.15",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
|
||||||
|
"integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"which-typed-array": "^1.1.16"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/is-unc-path": {
|
"node_modules/is-unc-path": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
|
||||||
@@ -2366,6 +2908,19 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/js-yaml": {
|
||||||
|
"version": "4.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
|
||||||
|
"integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"argparse": "^2.0.1"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"js-yaml": "bin/js-yaml.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/json-stable-stringify-without-jsonify": {
|
"node_modules/json-stable-stringify-without-jsonify": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
|
||||||
@@ -2471,6 +3026,40 @@
|
|||||||
"source-map": "~0.6.0"
|
"source-map": "~0.6.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/level-supports": {
|
||||||
|
"version": "4.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz",
|
||||||
|
"integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/level-transcoder": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"buffer": "^6.0.3",
|
||||||
|
"module-error": "^1.0.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/lie": {
|
||||||
|
"version": "3.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz",
|
||||||
|
"integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"immediate": "~3.0.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/liftoff": {
|
"node_modules/liftoff": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz",
|
||||||
@@ -2531,6 +3120,16 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/localforage": {
|
||||||
|
"version": "1.10.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz",
|
||||||
|
"integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"lie": "3.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/lru-queue": {
|
"node_modules/lru-queue": {
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
|
||||||
@@ -2819,6 +3418,32 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/mkdirp": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"bin": {
|
||||||
|
"mkdirp": "dist/cjs/src/bin.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/module-error": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/ms": {
|
"node_modules/ms": {
|
||||||
"version": "2.1.3",
|
"version": "2.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
||||||
@@ -2917,6 +3542,23 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/napi-macros": {
|
||||||
|
"version": "2.2.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz",
|
||||||
|
"integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/nedb-promises": {
|
||||||
|
"version": "6.2.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/nedb-promises/-/nedb-promises-6.2.3.tgz",
|
||||||
|
"integrity": "sha512-enq0IjNyBz9Qy9W/QPCcLGh/QORGBjXbIeZeWvIjO3OMLyAvlKT3hiJubP2BKEiFniUlR3L01o18ktqgn5jxqA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@seald-io/nedb": "^4.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/needle": {
|
"node_modules/needle": {
|
||||||
"version": "3.3.1",
|
"version": "3.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz",
|
||||||
@@ -2942,6 +3584,18 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
|
"node_modules/node-gyp-build": {
|
||||||
|
"version": "4.8.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
|
||||||
|
"integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"bin": {
|
||||||
|
"node-gyp-build": "bin.js",
|
||||||
|
"node-gyp-build-optional": "optional.js",
|
||||||
|
"node-gyp-build-test": "build-test.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/normalize-package-data": {
|
"node_modules/normalize-package-data": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
|
||||||
@@ -3437,6 +4091,16 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/possible-typed-array-names": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/postcss": {
|
"node_modules/postcss": {
|
||||||
"version": "7.0.39",
|
"version": "7.0.39",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
|
||||||
@@ -3503,6 +4167,27 @@
|
|||||||
"pump": "^2.0.0"
|
"pump": "^2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/queue-microtask": {
|
||||||
|
"version": "1.2.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
|
||||||
|
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
|
||||||
|
"dev": true,
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "patreon",
|
||||||
|
"url": "https://www.patreon.com/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "consulting",
|
||||||
|
"url": "https://feross.org/support"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/read-pkg": {
|
"node_modules/read-pkg": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
|
||||||
@@ -3821,6 +4506,24 @@
|
|||||||
"ret": "~0.1.10"
|
"ret": "~0.1.10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/safe-regex-test": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"call-bound": "^1.0.2",
|
||||||
|
"es-errors": "^1.3.0",
|
||||||
|
"is-regex": "^1.2.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/safer-buffer": {
|
"node_modules/safer-buffer": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||||
@@ -4712,6 +5415,20 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/util": {
|
||||||
|
"version": "0.12.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
|
||||||
|
"integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"inherits": "^2.0.3",
|
||||||
|
"is-arguments": "^1.0.4",
|
||||||
|
"is-generator-function": "^1.0.7",
|
||||||
|
"is-typed-array": "^1.1.3",
|
||||||
|
"which-typed-array": "^1.1.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/util-deprecate": {
|
"node_modules/util-deprecate": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||||
@@ -4893,6 +5610,28 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
|
"node_modules/which-typed-array": {
|
||||||
|
"version": "1.1.20",
|
||||||
|
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz",
|
||||||
|
"integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"available-typed-arrays": "^1.0.7",
|
||||||
|
"call-bind": "^1.0.8",
|
||||||
|
"call-bound": "^1.0.4",
|
||||||
|
"for-each": "^0.3.5",
|
||||||
|
"get-proto": "^1.0.1",
|
||||||
|
"gopd": "^1.2.0",
|
||||||
|
"has-tostringtag": "^1.0.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/wrap-ansi": {
|
"node_modules/wrap-ansi": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
"author": "Uberwald/LeRatierBretonnien",
|
"author": "Uberwald/LeRatierBretonnien",
|
||||||
"license": "SEE LICENSE IN LICENCE.txt",
|
"license": "SEE LICENSE IN LICENCE.txt",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@foundryvtt/foundryvtt-cli": "^3.0.3",
|
||||||
"gulp": "^4.0.2",
|
"gulp": "^4.0.2",
|
||||||
"gulp-less": "^5.0.0",
|
"gulp-less": "^5.0.0",
|
||||||
"gulp-sourcemaps": "^3.0.0"
|
"gulp-sourcemaps": "^3.0.0"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-000325
|
MANIFEST-000368
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/04/09-23:45:58.303191 7f983b7fe6c0 Recovering log #323
|
2026/05/01-23:51:23.718556 7fd754fed6c0 Recovering log #366
|
||||||
2026/04/09-23:45:58.319529 7f983b7fe6c0 Delete type=3 #321
|
2026/05/01-23:51:23.773168 7fd754fed6c0 Delete type=3 #364
|
||||||
2026/04/09-23:45:58.319588 7f983b7fe6c0 Delete type=0 #323
|
2026/05/01-23:51:23.773253 7fd754fed6c0 Delete type=0 #366
|
||||||
2026/04/09-23:47:18.879327 7f983a7fc6c0 Level-0 table #328: started
|
2026/05/02-08:26:03.206863 7fd7477fe6c0 Level-0 table #371: started
|
||||||
2026/04/09-23:47:18.879356 7f983a7fc6c0 Level-0 table #328: 0 bytes OK
|
2026/05/02-08:26:03.206928 7fd7477fe6c0 Level-0 table #371: 0 bytes OK
|
||||||
2026/04/09-23:47:18.915679 7f983a7fc6c0 Delete type=0 #326
|
2026/05/02-08:26:03.241219 7fd7477fe6c0 Delete type=0 #369
|
||||||
2026/04/09-23:47:18.997838 7f983a7fc6c0 Manual compaction at level-0 from '!items!0swiE8k5zfUIqmXu' @ 72057594037927935 : 1 .. '!items!wv5EiePmPTpqFutt' @ 0 : 0; will stop at (end)
|
2026/05/02-08:26:03.317629 7fd7477fe6c0 Manual compaction at level-0 from '!items!0swiE8k5zfUIqmXu' @ 72057594037927935 : 1 .. '!items!wv5EiePmPTpqFutt' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/04/09-23:12:16.588194 7f20ecbfc6c0 Recovering log #318
|
2026/05/01-23:45:25.849265 7fd7557ee6c0 Recovering log #362
|
||||||
2026/04/09-23:12:16.608112 7f20ecbfc6c0 Delete type=3 #316
|
2026/05/01-23:45:25.858985 7fd7557ee6c0 Delete type=3 #360
|
||||||
2026/04/09-23:12:16.608181 7f20ecbfc6c0 Delete type=0 #318
|
2026/05/01-23:45:25.859069 7fd7557ee6c0 Delete type=0 #362
|
||||||
2026/04/09-23:25:18.054476 7f1e4ffff6c0 Level-0 table #324: started
|
2026/05/01-23:51:17.894067 7fd7477fe6c0 Level-0 table #367: started
|
||||||
2026/04/09-23:25:18.054490 7f1e4ffff6c0 Level-0 table #324: 0 bytes OK
|
2026/05/01-23:51:17.894105 7fd7477fe6c0 Level-0 table #367: 0 bytes OK
|
||||||
2026/04/09-23:25:18.060226 7f1e4ffff6c0 Delete type=0 #322
|
2026/05/01-23:51:17.920657 7fd7477fe6c0 Delete type=0 #365
|
||||||
2026/04/09-23:25:18.060329 7f1e4ffff6c0 Manual compaction at level-0 from '!items!0swiE8k5zfUIqmXu' @ 72057594037927935 : 1 .. '!items!wv5EiePmPTpqFutt' @ 0 : 0; will stop at (end)
|
2026/05/01-23:51:18.003271 7fd7477fe6c0 Manual compaction at level-0 from '!items!0swiE8k5zfUIqmXu' @ 72057594037927935 : 1 .. '!items!wv5EiePmPTpqFutt' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000006
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
2026/05/01-23:30:18.177776 7fd755fef6c0 Recovering log #4
|
||||||
|
2026/05/01-23:30:18.192738 7fd755fef6c0 Delete type=3 #2
|
||||||
|
2026/05/01-23:30:18.192830 7fd755fef6c0 Delete type=0 #4
|
||||||
|
2026/05/01-23:30:57.358830 7fd7477fe6c0 Level-0 table #9: started
|
||||||
|
2026/05/01-23:30:57.358954 7fd7477fe6c0 Level-0 table #9: 0 bytes OK
|
||||||
|
2026/05/01-23:30:57.365068 7fd7477fe6c0 Delete type=0 #7
|
||||||
|
2026/05/01-23:30:57.384807 7fd7477fe6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
2026/05/01-23:21:09.633678 7fd7557ee6c0 Delete type=3 #1
|
||||||
|
2026/05/01-23:30:12.668808 7fd7477fe6c0 Level-0 table #5: started
|
||||||
|
2026/05/01-23:30:12.668939 7fd7477fe6c0 Level-0 table #5: 0 bytes OK
|
||||||
|
2026/05/01-23:30:12.741575 7fd7477fe6c0 Delete type=0 #3
|
||||||
|
2026/05/01-23:30:12.842987 7fd7477fe6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000012
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
2026/05/01-23:51:23.539516 7fd754fed6c0 Delete type=3 #1
|
||||||
|
2026/05/02-08:26:02.910133 7fd7477fe6c0 Level-0 table #15: started
|
||||||
|
2026/05/02-08:26:02.928665 7fd7477fe6c0 Level-0 table #15: 17652 bytes OK
|
||||||
|
2026/05/02-08:26:02.971253 7fd7477fe6c0 Delete type=0 #13
|
||||||
|
2026/05/02-08:26:03.098794 7fd7477fe6c0 Manual compaction at level-0 from '!actors!ElemAirMaj0000003' @ 72057594037927935 : 1 .. '!actors.items!zYGQJ8FibxCCWynl' @ 0 : 0; will stop at '!actors.items!zYGQJ8FibxCCWynl' @ 118 : 1
|
||||||
|
2026/05/02-08:26:03.098818 7fd7477fe6c0 Compacting 2@0 + 0@1 files
|
||||||
|
2026/05/02-08:26:03.114677 7fd7477fe6c0 Generated table #16@0: 61 keys, 12773 bytes
|
||||||
|
2026/05/02-08:26:03.114714 7fd7477fe6c0 Compacted 2@0 + 0@1 files => 12773 bytes
|
||||||
|
2026/05/02-08:26:03.143492 7fd7477fe6c0 compacted to: files[ 0 1 0 0 0 0 0 ]
|
||||||
|
2026/05/02-08:26:03.143650 7fd7477fe6c0 Delete type=2 #10
|
||||||
|
2026/05/02-08:26:03.143790 7fd7477fe6c0 Delete type=2 #15
|
||||||
|
2026/05/02-08:26:03.143908 7fd7477fe6c0 Manual compaction at level-0 from '!actors.items!zYGQJ8FibxCCWynl' @ 118 : 1 .. '!actors.items!zYGQJ8FibxCCWynl' @ 0 : 0; will stop at (end)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
2026/05/01-23:51:23.458933 7fd754fed6c0 Log #8: 0 ops saved to Table #11 OK
|
||||||
|
2026/05/01-23:51:23.459064 7fd754fed6c0 Archiving /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-mournblade/packs/creatures-elementaires/creatures-elementaires/000008.log: OK
|
||||||
|
2026/05/01-23:51:23.459141 7fd754fed6c0 Table #10: 61 entries OK
|
||||||
|
2026/05/01-23:51:23.477072 7fd754fed6c0 **** Repaired leveldb /home/morr/foundry/foundrydata-dev/Data/systems/fvtt-mournblade/packs/creatures-elementaires/creatures-elementaires; recovered 1 files; 12818 bytes. Some data may have been lost. ****
|
||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-000324
|
MANIFEST-000367
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/04/09-23:45:58.356058 7f9888fff6c0 Recovering log #322
|
2026/05/01-23:51:23.899083 7fd755fef6c0 Recovering log #365
|
||||||
2026/04/09-23:45:58.371202 7f9888fff6c0 Delete type=3 #320
|
2026/05/01-23:51:23.963281 7fd755fef6c0 Delete type=3 #363
|
||||||
2026/04/09-23:45:58.371256 7f9888fff6c0 Delete type=0 #322
|
2026/05/01-23:51:23.963367 7fd755fef6c0 Delete type=0 #365
|
||||||
2026/04/09-23:47:18.998002 7f983a7fc6c0 Level-0 table #327: started
|
2026/05/02-08:26:03.439764 7fd7477fe6c0 Level-0 table #370: started
|
||||||
2026/04/09-23:47:18.998033 7f983a7fc6c0 Level-0 table #327: 0 bytes OK
|
2026/05/02-08:26:03.439860 7fd7477fe6c0 Level-0 table #370: 0 bytes OK
|
||||||
2026/04/09-23:47:19.033600 7f983a7fc6c0 Delete type=0 #325
|
2026/05/02-08:26:03.476944 7fd7477fe6c0 Delete type=0 #368
|
||||||
2026/04/09-23:47:19.180637 7f983a7fc6c0 Manual compaction at level-0 from '!items!5dGXNiL3WN4cAk7X' @ 72057594037927935 : 1 .. '!items!zzz9JrtWjELdoAfK' @ 0 : 0; will stop at (end)
|
2026/05/02-08:26:03.477143 7fd7477fe6c0 Manual compaction at level-0 from '!items!5dGXNiL3WN4cAk7X' @ 72057594037927935 : 1 .. '!items!zzz9JrtWjELdoAfK' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/04/09-23:12:16.653158 7f20ecbfc6c0 Recovering log #317
|
2026/05/01-23:45:25.887738 7fd755fef6c0 Recovering log #361
|
||||||
2026/04/09-23:12:16.667664 7f20ecbfc6c0 Delete type=3 #315
|
2026/05/01-23:45:25.897606 7fd755fef6c0 Delete type=3 #359
|
||||||
2026/04/09-23:12:16.667723 7f20ecbfc6c0 Delete type=0 #317
|
2026/05/01-23:45:25.897664 7fd755fef6c0 Delete type=0 #361
|
||||||
2026/04/09-23:25:18.072993 7f1e4ffff6c0 Level-0 table #323: started
|
2026/05/01-23:51:18.003483 7fd7477fe6c0 Level-0 table #366: started
|
||||||
2026/04/09-23:25:18.073014 7f1e4ffff6c0 Level-0 table #323: 0 bytes OK
|
2026/05/01-23:51:18.003518 7fd7477fe6c0 Level-0 table #366: 0 bytes OK
|
||||||
2026/04/09-23:25:18.078766 7f1e4ffff6c0 Delete type=0 #321
|
2026/05/01-23:51:18.037812 7fd7477fe6c0 Delete type=0 #364
|
||||||
2026/04/09-23:25:18.084786 7f1e4ffff6c0 Manual compaction at level-0 from '!items!5dGXNiL3WN4cAk7X' @ 72057594037927935 : 1 .. '!items!zzz9JrtWjELdoAfK' @ 0 : 0; will stop at (end)
|
2026/05/01-23:51:18.167176 7fd7477fe6c0 Manual compaction at level-0 from '!items!5dGXNiL3WN4cAk7X' @ 72057594037927935 : 1 .. '!items!zzz9JrtWjELdoAfK' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-000324
|
MANIFEST-000367
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/04/09-23:45:58.338180 7f983affd6c0 Recovering log #322
|
2026/05/01-23:51:23.839110 7fd754fed6c0 Recovering log #365
|
||||||
2026/04/09-23:45:58.354032 7f983affd6c0 Delete type=3 #320
|
2026/05/01-23:51:23.896151 7fd754fed6c0 Delete type=3 #363
|
||||||
2026/04/09-23:45:58.354088 7f983affd6c0 Delete type=0 #322
|
2026/05/01-23:51:23.896228 7fd754fed6c0 Delete type=0 #365
|
||||||
2026/04/09-23:47:18.915819 7f983a7fc6c0 Level-0 table #327: started
|
2026/05/02-08:26:03.403387 7fd7477fe6c0 Level-0 table #370: started
|
||||||
2026/04/09-23:47:18.915848 7f983a7fc6c0 Level-0 table #327: 0 bytes OK
|
2026/05/02-08:26:03.403427 7fd7477fe6c0 Level-0 table #370: 0 bytes OK
|
||||||
2026/04/09-23:47:18.954437 7f983a7fc6c0 Delete type=0 #325
|
2026/05/02-08:26:03.439575 7fd7477fe6c0 Delete type=0 #368
|
||||||
2026/04/09-23:47:18.997849 7f983a7fc6c0 Manual compaction at level-0 from '!items!1cZd2hlTV9tykDED' @ 72057594037927935 : 1 .. '!items!y47dBO3Mf5Pn7tOd' @ 0 : 0; will stop at (end)
|
2026/05/02-08:26:03.477128 7fd7477fe6c0 Manual compaction at level-0 from '!items!1cZd2hlTV9tykDED' @ 72057594037927935 : 1 .. '!items!y47dBO3Mf5Pn7tOd' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/04/09-23:12:16.632679 7f20ed3fd6c0 Recovering log #317
|
2026/05/01-23:45:25.874605 7fd754fed6c0 Recovering log #361
|
||||||
2026/04/09-23:12:16.648389 7f20ed3fd6c0 Delete type=3 #315
|
2026/05/01-23:45:25.884831 7fd754fed6c0 Delete type=3 #359
|
||||||
2026/04/09-23:12:16.648462 7f20ed3fd6c0 Delete type=0 #317
|
2026/05/01-23:45:25.884885 7fd754fed6c0 Delete type=0 #361
|
||||||
2026/04/09-23:25:18.066787 7f1e4ffff6c0 Level-0 table #323: started
|
2026/05/01-23:51:17.956955 7fd7477fe6c0 Level-0 table #366: started
|
||||||
2026/04/09-23:25:18.066820 7f1e4ffff6c0 Level-0 table #323: 0 bytes OK
|
2026/05/01-23:51:17.956995 7fd7477fe6c0 Level-0 table #366: 0 bytes OK
|
||||||
2026/04/09-23:25:18.072917 7f1e4ffff6c0 Delete type=0 #321
|
2026/05/01-23:51:18.002857 7fd7477fe6c0 Delete type=0 #364
|
||||||
2026/04/09-23:25:18.084778 7f1e4ffff6c0 Manual compaction at level-0 from '!items!1cZd2hlTV9tykDED' @ 72057594037927935 : 1 .. '!items!y47dBO3Mf5Pn7tOd' @ 0 : 0; will stop at (end)
|
2026/05/01-23:51:18.003348 7fd7477fe6c0 Manual compaction at level-0 from '!items!1cZd2hlTV9tykDED' @ 72057594037927935 : 1 .. '!items!y47dBO3Mf5Pn7tOd' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-000324
|
MANIFEST-000367
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/04/09-23:45:58.413719 7f983bfff6c0 Recovering log #322
|
2026/05/01-23:51:24.071860 7fd755fef6c0 Recovering log #365
|
||||||
2026/04/09-23:45:58.433922 7f983bfff6c0 Delete type=3 #320
|
2026/05/01-23:51:24.119019 7fd755fef6c0 Delete type=3 #363
|
||||||
2026/04/09-23:45:58.433990 7f983bfff6c0 Delete type=0 #322
|
2026/05/01-23:51:24.119097 7fd755fef6c0 Delete type=0 #365
|
||||||
2026/04/09-23:47:19.033751 7f983a7fc6c0 Level-0 table #327: started
|
2026/05/02-08:26:03.577938 7fd7477fe6c0 Level-0 table #370: started
|
||||||
2026/04/09-23:47:19.033783 7f983a7fc6c0 Level-0 table #327: 0 bytes OK
|
2026/05/02-08:26:03.577975 7fd7477fe6c0 Level-0 table #370: 0 bytes OK
|
||||||
2026/04/09-23:47:19.076272 7f983a7fc6c0 Delete type=0 #325
|
2026/05/02-08:26:03.614658 7fd7477fe6c0 Delete type=0 #368
|
||||||
2026/04/09-23:47:19.180652 7f983a7fc6c0 Manual compaction at level-0 from '!items!2GaJZsqr2c2mcDRv' @ 72057594037927935 : 1 .. '!items!ui4JGsGwHNlSXVK3' @ 0 : 0; will stop at (end)
|
2026/05/02-08:26:03.684819 7fd7477fe6c0 Manual compaction at level-0 from '!items!2GaJZsqr2c2mcDRv' @ 72057594037927935 : 1 .. '!items!ui4JGsGwHNlSXVK3' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/04/09-23:12:16.692032 7f20ed3fd6c0 Recovering log #317
|
2026/05/01-23:45:25.928160 7fd7557ee6c0 Recovering log #361
|
||||||
2026/04/09-23:12:16.709446 7f20ed3fd6c0 Delete type=3 #315
|
2026/05/01-23:45:25.938724 7fd7557ee6c0 Delete type=3 #359
|
||||||
2026/04/09-23:12:16.709514 7f20ed3fd6c0 Delete type=0 #317
|
2026/05/01-23:45:25.938783 7fd7557ee6c0 Delete type=0 #361
|
||||||
2026/04/09-23:25:18.091369 7f1e4ffff6c0 Level-0 table #323: started
|
2026/05/01-23:51:18.037971 7fd7477fe6c0 Level-0 table #366: started
|
||||||
2026/04/09-23:25:18.091389 7f1e4ffff6c0 Level-0 table #323: 0 bytes OK
|
2026/05/01-23:51:18.038026 7fd7477fe6c0 Level-0 table #366: 0 bytes OK
|
||||||
2026/04/09-23:25:18.097952 7f1e4ffff6c0 Delete type=0 #321
|
2026/05/01-23:51:18.080237 7fd7477fe6c0 Delete type=0 #364
|
||||||
2026/04/09-23:25:18.111053 7f1e4ffff6c0 Manual compaction at level-0 from '!items!2GaJZsqr2c2mcDRv' @ 72057594037927935 : 1 .. '!items!ui4JGsGwHNlSXVK3' @ 0 : 0; will stop at (end)
|
2026/05/01-23:51:18.167195 7fd7477fe6c0 Manual compaction at level-0 from '!items!2GaJZsqr2c2mcDRv' @ 72057594037927935 : 1 .. '!items!ui4JGsGwHNlSXVK3' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000027
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
2026/05/01-23:51:24.450092 7fd754fed6c0 Recovering log #25
|
||||||
|
2026/05/01-23:51:24.512021 7fd754fed6c0 Delete type=3 #23
|
||||||
|
2026/05/01-23:51:24.512123 7fd754fed6c0 Delete type=0 #25
|
||||||
|
2026/05/02-08:26:03.753438 7fd7477fe6c0 Level-0 table #30: started
|
||||||
|
2026/05/02-08:26:03.753526 7fd7477fe6c0 Level-0 table #30: 0 bytes OK
|
||||||
|
2026/05/02-08:26:03.797061 7fd7477fe6c0 Delete type=0 #28
|
||||||
|
2026/05/02-08:26:03.865053 7fd7477fe6c0 Manual compaction at level-0 from '!journal!JurnlHelpGuide01' @ 72057594037927935 : 1 .. '!journal.pages!JurnlHelpGuide01.JHelpPage0000008' @ 0 : 0; will stop at (end)
|
||||||
|
2026/05/02-08:26:03.911157 7fd7477fe6c0 Manual compaction at level-1 from '!journal!JurnlHelpGuide01' @ 72057594037927935 : 1 .. '!journal.pages!JurnlHelpGuide01.JHelpPage0000008' @ 0 : 0; will stop at (end)
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
2026/05/01-23:45:26.025091 7fd747fff6c0 Recovering log #21
|
||||||
|
2026/05/01-23:45:26.035419 7fd747fff6c0 Delete type=3 #19
|
||||||
|
2026/05/01-23:45:26.035499 7fd747fff6c0 Delete type=0 #21
|
||||||
|
2026/05/01-23:51:18.423732 7fd7477fe6c0 Level-0 table #26: started
|
||||||
|
2026/05/01-23:51:18.423792 7fd7477fe6c0 Level-0 table #26: 0 bytes OK
|
||||||
|
2026/05/01-23:51:18.458393 7fd7477fe6c0 Delete type=0 #24
|
||||||
|
2026/05/01-23:51:18.501042 7fd7477fe6c0 Manual compaction at level-0 from '!journal!JurnlHelpGuide01' @ 72057594037927935 : 1 .. '!journal.pages!JurnlHelpGuide01.JHelpPage0000008' @ 0 : 0; will stop at (end)
|
||||||
|
2026/05/01-23:51:18.535320 7fd7477fe6c0 Manual compaction at level-1 from '!journal!JurnlHelpGuide01' @ 72057594037927935 : 1 .. '!journal.pages!JurnlHelpGuide01.JHelpPage0000008' @ 0 : 0; will stop at (end)
|
||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-000324
|
MANIFEST-000367
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/04/09-23:45:58.436168 7f9888fff6c0 Recovering log #322
|
2026/05/01-23:51:24.121693 7fd747fff6c0 Recovering log #365
|
||||||
2026/04/09-23:45:58.451031 7f9888fff6c0 Delete type=3 #320
|
2026/05/01-23:51:24.175522 7fd747fff6c0 Delete type=3 #363
|
||||||
2026/04/09-23:45:58.451098 7f9888fff6c0 Delete type=0 #322
|
2026/05/01-23:51:24.175606 7fd747fff6c0 Delete type=0 #365
|
||||||
2026/04/09-23:47:19.180800 7f983a7fc6c0 Level-0 table #327: started
|
2026/05/02-08:26:03.543492 7fd7477fe6c0 Level-0 table #370: started
|
||||||
2026/04/09-23:47:19.180832 7f983a7fc6c0 Level-0 table #327: 0 bytes OK
|
2026/05/02-08:26:03.543537 7fd7477fe6c0 Level-0 table #370: 0 bytes OK
|
||||||
2026/04/09-23:47:19.217176 7f983a7fc6c0 Delete type=0 #325
|
2026/05/02-08:26:03.577774 7fd7477fe6c0 Delete type=0 #368
|
||||||
2026/04/09-23:47:19.353947 7f983a7fc6c0 Manual compaction at level-0 from '!items!09s33sFuju8zjPqI' @ 72057594037927935 : 1 .. '!items!xlyFCQClBZ1N3O1B' @ 0 : 0; will stop at (end)
|
2026/05/02-08:26:03.614845 7fd7477fe6c0 Manual compaction at level-0 from '!items!09s33sFuju8zjPqI' @ 72057594037927935 : 1 .. '!items!xlyFCQClBZ1N3O1B' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/04/09-23:12:16.716615 7f20ecbfc6c0 Recovering log #317
|
2026/05/01-23:45:25.941264 7fd755fef6c0 Recovering log #361
|
||||||
2026/04/09-23:12:16.732299 7f20ecbfc6c0 Delete type=3 #315
|
2026/05/01-23:45:25.951481 7fd755fef6c0 Delete type=3 #359
|
||||||
2026/04/09-23:12:16.732355 7f20ecbfc6c0 Delete type=0 #317
|
2026/05/01-23:45:25.951534 7fd755fef6c0 Delete type=0 #361
|
||||||
2026/04/09-23:25:18.104079 7f1e4ffff6c0 Level-0 table #323: started
|
2026/05/01-23:51:18.167311 7fd7477fe6c0 Level-0 table #366: started
|
||||||
2026/04/09-23:25:18.104101 7f1e4ffff6c0 Level-0 table #323: 0 bytes OK
|
2026/05/01-23:51:18.167365 7fd7477fe6c0 Level-0 table #366: 0 bytes OK
|
||||||
2026/04/09-23:25:18.110956 7f1e4ffff6c0 Delete type=0 #321
|
2026/05/01-23:51:18.213184 7fd7477fe6c0 Delete type=0 #364
|
||||||
2026/04/09-23:25:18.111069 7f1e4ffff6c0 Manual compaction at level-0 from '!items!09s33sFuju8zjPqI' @ 72057594037927935 : 1 .. '!items!xlyFCQClBZ1N3O1B' @ 0 : 0; will stop at (end)
|
2026/05/01-23:51:18.334580 7fd7477fe6c0 Manual compaction at level-0 from '!items!09s33sFuju8zjPqI' @ 72057594037927935 : 1 .. '!items!xlyFCQClBZ1N3O1B' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-000324
|
MANIFEST-000367
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/04/09-23:45:58.395467 7f9888fff6c0 Recovering log #322
|
2026/05/01-23:51:24.015685 7fd754fed6c0 Recovering log #365
|
||||||
2026/04/09-23:45:58.411559 7f9888fff6c0 Delete type=3 #320
|
2026/05/01-23:51:24.068740 7fd754fed6c0 Delete type=3 #363
|
||||||
2026/04/09-23:45:58.411609 7f9888fff6c0 Delete type=0 #322
|
2026/05/01-23:51:24.068836 7fd754fed6c0 Delete type=0 #365
|
||||||
2026/04/09-23:47:19.076420 7f983a7fc6c0 Level-0 table #327: started
|
2026/05/02-08:26:03.477243 7fd7477fe6c0 Level-0 table #370: started
|
||||||
2026/04/09-23:47:19.076448 7f983a7fc6c0 Level-0 table #327: 0 bytes OK
|
2026/05/02-08:26:03.477285 7fd7477fe6c0 Level-0 table #370: 0 bytes OK
|
||||||
2026/04/09-23:47:19.118899 7f983a7fc6c0 Delete type=0 #325
|
2026/05/02-08:26:03.516015 7fd7477fe6c0 Delete type=0 #368
|
||||||
2026/04/09-23:47:19.180664 7f983a7fc6c0 Manual compaction at level-0 from '!items!2t1KmBeQNuKK5qlN' @ 72057594037927935 : 1 .. '!items!yBvkQb9S64s908sR' @ 0 : 0; will stop at (end)
|
2026/05/02-08:26:03.614814 7fd7477fe6c0 Manual compaction at level-0 from '!items!2t1KmBeQNuKK5qlN' @ 72057594037927935 : 1 .. '!items!yBvkQb9S64s908sR' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/04/09-23:12:16.671707 7f20ee3ff6c0 Recovering log #317
|
2026/05/01-23:45:25.914723 7fd755fef6c0 Recovering log #361
|
||||||
2026/04/09-23:12:16.687095 7f20ee3ff6c0 Delete type=3 #315
|
2026/05/01-23:45:25.925030 7fd755fef6c0 Delete type=3 #359
|
||||||
2026/04/09-23:12:16.687160 7f20ee3ff6c0 Delete type=0 #317
|
2026/05/01-23:45:25.925095 7fd755fef6c0 Delete type=0 #361
|
||||||
2026/04/09-23:25:18.078816 7f1e4ffff6c0 Level-0 table #323: started
|
2026/05/01-23:51:18.080386 7fd7477fe6c0 Level-0 table #366: started
|
||||||
2026/04/09-23:25:18.078831 7f1e4ffff6c0 Level-0 table #323: 0 bytes OK
|
2026/05/01-23:51:18.080421 7fd7477fe6c0 Level-0 table #366: 0 bytes OK
|
||||||
2026/04/09-23:25:18.084691 7f1e4ffff6c0 Delete type=0 #321
|
2026/05/01-23:51:18.124527 7fd7477fe6c0 Delete type=0 #364
|
||||||
2026/04/09-23:25:18.084792 7f1e4ffff6c0 Manual compaction at level-0 from '!items!2t1KmBeQNuKK5qlN' @ 72057594037927935 : 1 .. '!items!yBvkQb9S64s908sR' @ 0 : 0; will stop at (end)
|
2026/05/01-23:51:18.167208 7fd7477fe6c0 Manual compaction at level-0 from '!items!2t1KmBeQNuKK5qlN' @ 72057594037927935 : 1 .. '!items!yBvkQb9S64s908sR' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||