Add all systems effects scripts + translations
This commit is contained in:
parent
fa73f9d49c
commit
2ed5a36282
@ -3,8 +3,8 @@ F Cheminade -> Items UA1 -> DONE
|
|||||||
Faytoto -> acteurs UA1
|
Faytoto -> acteurs UA1
|
||||||
Dwim -> RNHD actors
|
Dwim -> RNHD actors
|
||||||
Highcrown -> Acteurs Ennemi Ombre -> DONE
|
Highcrown -> Acteurs Ennemi Ombre -> DONE
|
||||||
|
KeylaKhaine -> Acteurs Mort sur le Reik (27/03/24 :en cours)
|
||||||
|
|
||||||
En cours :
|
En cours :
|
||||||
KeylaKhaine -> Acteurs Mort sur le Reik (27/03/24 :en cours)
|
|
||||||
Kyllian -> Acteurs Middenheim (15/05/24, en cours)
|
Kyllian -> Acteurs Middenheim (15/05/24, en cours)
|
||||||
|
Bobours -> Acteurs PBTT (15/05/24, en cours)
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"url": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr",
|
"url": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr",
|
||||||
"version": "7.1.4",
|
"version": "7.1.5",
|
||||||
"esmodules": [
|
"esmodules": [
|
||||||
"modules/babele-register.js",
|
"modules/babele-register.js",
|
||||||
"modules/addon-register.js",
|
"modules/addon-register.js",
|
||||||
@ -117,7 +117,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/raw/v10/module.json",
|
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/raw/v10/module.json",
|
||||||
"download": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/archive/foundryvtt-wh4-lang-fr-7.1.4.zip",
|
"download": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/archive/foundryvtt-wh4-lang-fr-7.1.5.zip",
|
||||||
"id": "wh4-fr-translation",
|
"id": "wh4-fr-translation",
|
||||||
"compatibility": {
|
"compatibility": {
|
||||||
"minimum": "11",
|
"minimum": "11",
|
||||||
|
445
modules/addon-register.js
Normal file
445
modules/addon-register.js
Normal file
@ -0,0 +1,445 @@
|
|||||||
|
/************************************************************************************/
|
||||||
|
//import WFRP_Tables from "/systems/wfrp4e/modules/system/tables-wfrp4e.js";
|
||||||
|
import { WH4FRPatchConfig } from "./config-patch.js";
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
const _patch_eis = () => {
|
||||||
|
if (game.wfrp4e.config && game.wfrp4e.config.symptoms && game.wfrp4e.config.symptoms["delirium"] ) {
|
||||||
|
game.wfrp4e.config.symptoms["delirium"] = "Délire";
|
||||||
|
|
||||||
|
game.wfrp4e.config.symptomDescriptions["delirium"] = "Votre sensibilité va et vient, avec des moments de clarté remplaçés subitement Your sensibility comes and goes, with moments of clarity replaced suddenly par des accès de délire, des hallucinations et de la terreur. Faites un <b>Test de Force Mentale Intermédiaire (+0)</b> chaque heure, et consultez la table <b><a class='table-click' data-table='delirium'>Délires</a></b> table.";
|
||||||
|
game.wfrp4e.config.symptomTreatment["delirium"] = "Certaines autorités traitent le délire comme un fièvre, avec les mêmes prescriptions. Les médicaments coutent quelques sous à quelques pistoles, en seulement 10% sont efficaces.<br><br>Avec des soins corrects, un test de <b>Guérison Intermédiaire (0)</b> arrêtes les hallucinations pour <b><a class = 'chat-roll'>1d10</a></b> heures.<br><br>Il est aussi courant de soigner les patients délirants avec des drogues tranquillisantes, comme la Fleur de Lune ou même de la Racine de Mandragore, pour garder les patients calmes pendant la crise, les envoyant dans un sommeil agité jusqu'à ce qu'il erécupèrent ou meurent.";
|
||||||
|
|
||||||
|
game.wfrp4e.config.symptoms["swelling"] = "Gonflement";
|
||||||
|
game.wfrp4e.config.symptomDescriptions["swelling"] = "Une partie du corps gonfle jusqu'à plusieurs fois sa taille normale, devenant rouge vif ou violette et devenant presque inutilisable. La partie du corps affectée correspond normalement à une plaie ou une morsure provoquant le gonflement, ou l'endroit où une maladie ou une infection est entrée dans le corps. <br> <br> <b> Tête </b>: Les yeux et la langue enflent, les joues deviennent livides, la mâchoire est toujours ouverte. Il est impossible de manger, mais des liquides légers peuvent être sirotés en petites quantités. Tous les tests nécessitant la parole sont plus difficiles de 3 niveaux. <br> <b> Bras </b>: le bras et la main gonflent, les articulations des épaules et du coude ne peuvent plus bouger et la main devient inutile. Pour la durée du gonflement, le bras compte comme Amputé. <br> <b> Corps </b>: Le corps entier gonfle jusqu'à ce que la victime ne puisse plus porter de vêtements. Tous les tests impliquant le mouvement deviennent difficiles de 3 niveaux. <br> <b> Jambe </b>: La jambe gonfle de manière grotesque, devenant aussi large que la partie la plus large de la cuisse sur toute sa longueur. Le pied est presque indiscernable. Pour la durée du gonflement, la jambe compte comme amputée (WFRP, page 180).";
|
||||||
|
|
||||||
|
game.wfrp4e.config.symptomTreatment["swelling"] = "La plupart des traitements consistent à plonger la partie affectée, ou parfois tout le corps, dans un bain d'eau glacée pour réduire la chaleur qui accompagne les gonflements. Un <b> Test de Guérison Difficile (-20) étendu </b> nécessitant +3 DR réduit le renflement de <b> <a class ='chat-roll'> 2d10 </a> </b> heures. Chaque test dure une heure. Le patient se retrouve avec l'Etat Exténué +1 pour chaque test effectué au cours du processus. <br> <br> A la place, certains médecins saignent le patient avec une lame ou des sangsues. Un <b>Test de Guérison étendu </b> réussi nécessitant +4 SL et des Outils (médecin) réduit le renflement de (<a class ='chat-roll'> 1d10 </a> + Bonus d'Endurance du patient) heures. Chaque test a une difficulté de base <b> impossible (-50) </b> et dure une demi-heure.";
|
||||||
|
|
||||||
|
game.wfrp4e.config.loreEffects["tzeentch"] = {
|
||||||
|
label: "Domaine de Tzeentch",
|
||||||
|
icon: "modules/wfrp4e-core/icons/spells/tzeentch.png",
|
||||||
|
transfer: true,
|
||||||
|
flags: {
|
||||||
|
wfrp4e: {
|
||||||
|
"effectApplication": "apply",
|
||||||
|
"effectTrigger": "oneTime",
|
||||||
|
"lore": true,
|
||||||
|
"script": `
|
||||||
|
if (this.actor.isOwner)
|
||||||
|
args.actor.setupSkill("Résistance", {context : {failure: "1 Point de Corruption reçu", success : "1 Point de Chance gagné"}}).then(setupData => {
|
||||||
|
args.actor.basicTest(setupData).then(test =>
|
||||||
|
{
|
||||||
|
if (test.result.result == "success" && args.actor.type == "character")
|
||||||
|
{
|
||||||
|
args.actor.update({"system.status.fortune.value" : args.actor.system.status.fortune.value + 1})
|
||||||
|
}
|
||||||
|
else if (test.result.result == "failure" && args.actor.type == "character")
|
||||||
|
{
|
||||||
|
args.actor.update({"system.status.corruption.value" : args.actor.system.status.corruption.value + 1})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
const _patch_up_in_arms = () => {
|
||||||
|
|
||||||
|
game.wfrp4e.config.hitLocationTables["quadruped"] = "Quadrupède";
|
||||||
|
let batter = game.wfrp4e.config.groupAdvantageActions.find(ga => ga.name == "Batter")
|
||||||
|
if (batter) {
|
||||||
|
batter.name = "Battre"
|
||||||
|
batter.description = "En face d'un adversaire plus expérimenté, quelque fois la force brute peut réussir là où d'autres approches échouent.",
|
||||||
|
batter.effect = "<strong>Action Spéciale</strong>: Pour Battre votre adversaire, vous devez réussir un Test Opposé de Force contre votre adversaire. Celui qui obtient le DR le plus élevé gagne. Si vous gagnez ce Test, votre adversaire reçoit l'état @Condition[A Terre] et vous recevez +1 Avantage. Si vous perdez le Test Opposé, votre opposant gagne +1 Avantage and votre action est terminée. Vous ne gagnez pas d'Avantage due à la victoire d'un test Opposé lorsque vous gagnez ce test (ie 1 seul avantage octroyé au total si le Test Opposé de Force est remporté)."
|
||||||
|
}
|
||||||
|
let trick = game.wfrp4e.config.groupAdvantageActions.find(ga => ga.name == "Trick")
|
||||||
|
if (trick) {
|
||||||
|
trick.name = "Duper"
|
||||||
|
trick.description = "Vous prenez un instant pour lancer de la poussière dans les yeux de votre adversaire ou bien lui lancer de l'huile enflammée. Cette manoeuvre est risquée, et peu d'ennemis se font avoir deux fois de la même manière",
|
||||||
|
trick.effect = "<strong>Action Spéciale</strong>: Pour Duper votre adversaire, vous devez réussir un Test Opposé d'Agilité contre lui. Celui qui obtient le plus haut DR gagne le Test. Si vous gagnez le Test, vous recevez +1 Avantage. En fonction des circonstances, le MJ peut vous autoriser à attribuer à votre adversaire l'un des états suivants : @Condition[En Flammes], @Condition[Aveuglé], or @Condition[Empêtré]. Si vous perdez le Test Opposé, votre adversaire gagne +1 Avantage et votre action est terminée. Le MJ peut interdire certains de ces états si vous n'avez d'objet applicables dans votre main, ou bien si vous avez déja infligé un état identique precedemment à cet adversaire. Vous ne gagnez pas d'Avantages due à la victoire d'un test Opposé lorsque vous gagnez ce test (ie 1 seul avantage octroyé au total si le Test Opposé de Force est remporté)."
|
||||||
|
}
|
||||||
|
let addeffort = game.wfrp4e.config.groupAdvantageActions.find(ga => ga.name == "Additional Effort")
|
||||||
|
if (addeffort) {
|
||||||
|
addeffort.name = "Effort Supplémentaire"
|
||||||
|
addeffort.description = "Dans des circonstances désespérées, vous pouvez utiliser l'élan que vous avez acquis pour augmenter vos chances de succès.",
|
||||||
|
addeffort.effect = "<strong>Action Gratuite</strong>: Vous gagnez un bonus de +10% pour n'importe quel test. Vous pouvez dépenser des avantages supplémentaires pour ajouter +10% par Avantage dépensé en plus. Par exemple, vous pouvez dépenser 3 Avantages pour un bonus de +10%, 4 avantages pour un +30%, etc. Le Test qui en découle ne procure jamais d'Avantages pour le personnage qui le réalise."
|
||||||
|
}
|
||||||
|
let flee = game.wfrp4e.config.groupAdvantageActions.find(ga => ga.name == "Flee from Harm")
|
||||||
|
if (flee) {
|
||||||
|
flee.name = "Fuir le Mal"
|
||||||
|
flee.description = "Vous profitez d'un moment de distraction de votre adversaire pour fuir le combat.",
|
||||||
|
flee.effect = "<strong>Mouvement</strong>: Vous pouvez vous éloignez de votre adversaire sans aucune pénalité. Cela remplace la règle de @UUID[Compendium.wfrp4e-core.journal-entries.NS3YGlJQxwTggjRX.JournalEntryPage.bdfiyhEYtKs7irqc#disengaging]{Désengagement}."
|
||||||
|
}
|
||||||
|
let addaction = game.wfrp4e.config.groupAdvantageActions.find(ga => ga.name == "Additional Action")
|
||||||
|
if (addaction) {
|
||||||
|
addaction.name = "Action Supplémentaire"
|
||||||
|
addaction.description = "Vous profitez d'une opportunité pour accomplir une action remarquable.",
|
||||||
|
addaction.effect = "<strong>Action Gratuite</strong>: Vous réalisez une action supplémentaire. Cette action ne génère jamais d'Avantage pour vous. Vous pouvez réaliser cette dépense d'Avantages seulement une seule fois par Tour."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
/* Manages /auberge command */
|
||||||
|
const _manage_inn_roll = async (content, msg) => {
|
||||||
|
// Split input into arguments
|
||||||
|
let command = content.split(" ").map(function (item) {
|
||||||
|
return item.trim();
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log("COMMANDES", command);
|
||||||
|
if (command[0] == "/auberge" && command[1]) {
|
||||||
|
msg["type"] = 0;
|
||||||
|
msg["rollMode"] = "gmroll";
|
||||||
|
var compendium = game.packs.get('wh4-fr-translation.plats-dauberges')
|
||||||
|
const pack = game.packs.get(compendium);
|
||||||
|
let rollList = await compendium.getDocuments()
|
||||||
|
//console.log("AUBERGE", rollList)
|
||||||
|
for (var i = 0; i < rollList.length; i++) {
|
||||||
|
var rollTab = rollList[i];
|
||||||
|
console.log("Got compendium...", rollList, rollTab.name);
|
||||||
|
if (rollTab.name.toLowerCase().includes(command[1].toLowerCase())) {
|
||||||
|
let my_rollTable;
|
||||||
|
await compendium.getDocument(rollTab._id).then(mytab => my_rollTable = mytab);
|
||||||
|
my_rollTable.draw({ rollMode: "gmroll" });
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (content.includes("/auberge")) {
|
||||||
|
msg["type"] = 0;
|
||||||
|
msg["rollMode"] = "gmroll";
|
||||||
|
msg["content"] = "Syntaxe : /auberge MOT_CLE, avec MOT_CLE parmi:<br>BoissonsBase, BoissonsFortes, Desserts, PlatsCommuns, PlatsExcellents, PlatsMaritimes, PlatsMédiocres, PlatsQualité, PlatsRivières<br>Des raccourcis sont possibles avec une partie du nom : /auberge Base (correspond à BoissonBase) ou /auberge Mari (correspond à PlatsMaritimes), etc."
|
||||||
|
ChatMessage.create(msg);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
let __eis_tables = {
|
||||||
|
"animalmishap": 1, "beasthead": 1, "coincedentalenc": 1, "demonic-mien": 1,
|
||||||
|
"expandedmutatemental": 1, "expandedmutatephys": 1, "fixations": 1,
|
||||||
|
"harmfulenc": 1, "positiveenc": 1, "weather": 1, "mutatephys": 1,
|
||||||
|
"vehiclemishap": 1, "quadruped": 1, "ridingmishap": 1, "weather": 1,
|
||||||
|
"delirium": 1
|
||||||
|
}
|
||||||
|
let __dotr_tables = {
|
||||||
|
"rowingboat": 1, "sailingboat": 1, "wind-direction": 1, "waterborne": 1, "traderumour": 1
|
||||||
|
}
|
||||||
|
let __wfrp4e_tables = {
|
||||||
|
"career": 1, "critbody": 1, "critleg": 1, "doom": 1, "doom2": 1, "eyes": 1, "majormis": 1, "mutatemental": 1, "oops": 1, "species": 1, "travel": 1,
|
||||||
|
"hitloc": 1, "critarm": 1, "crithead": 1, "delirium": 1, "event": 1, "hair": 1, "minormis": 1, "mutatephys": 1, "talents": 1, "wrath": 1,
|
||||||
|
"astral": 1, "corruption": 1, "snake": 1, "spider": 1, "job": 1
|
||||||
|
|
||||||
|
}
|
||||||
|
let __to_table_translate = [{ name: "traits", transl: "Traits" }, { name: "talents", transl: "Talents" }, { name: "skills", transl: "Compétences" },
|
||||||
|
{ name: "careers", transl: "Carrières" }, { name: "spells", transl: "Sorts" }, { name: "prayers", transl: "Bénédictions et Miracles" },
|
||||||
|
{ name: "injuries", transl: "Blessures" }, { name: "criticals", transl: "Critiques" }, { name: "trappings", transl: "Equipement" },
|
||||||
|
{ name: "bestiary", transl: "Bestiaire" }, { name: "diseases", transl: "Maladies" }
|
||||||
|
]
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
const __create_translation_tables = async (compmod) => {
|
||||||
|
for (let iterData of __to_table_translate) {
|
||||||
|
|
||||||
|
let entityName = compmod + '.' + iterData.name;
|
||||||
|
let compData = game.packs.get(entityName);
|
||||||
|
let compFull = await compData.getContent();
|
||||||
|
let htmlTab = "<table border='1'><tbody>";
|
||||||
|
for (let entryData of compFull) {
|
||||||
|
htmlTab += "<tr><td>" + entryData.data.originalName + "</td><td>@Compendium[" + entityName + '.' + entryData.id + "]{" + entryData.name + "}</td></tr>\n";
|
||||||
|
};
|
||||||
|
htmlTab += "</table>";
|
||||||
|
let myjournal = await JournalEntry.create({ name: 'Traduction des ' + iterData.transl, content: htmlTab });
|
||||||
|
game.journal.insert(myjournal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* The default static compendium of translation tables must be aut-mapped to the relevant
|
||||||
|
* compendium content name (ie either wfrp4e or wfrp4e-core up to now).
|
||||||
|
* */
|
||||||
|
const __auto_patch_translation_journal_compendium = async (compmod) => {
|
||||||
|
if (game.user.isGM) {
|
||||||
|
let compData = game.packs.get("WH4-fr-translation.tables-des-traductions");
|
||||||
|
compData.locked = false;
|
||||||
|
let translEntries = await compData.getContent();
|
||||||
|
for (let entryData of translEntries) {
|
||||||
|
let mydata = duplicate(entryData.data);
|
||||||
|
mydata.content = mydata.content.replace(/wfrp4e-content/g, compmod);
|
||||||
|
entryData.update(mydata);
|
||||||
|
}
|
||||||
|
compData.locked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
const loadCompendiumData = async (compendium) => {
|
||||||
|
const pack = game.packs.get(compendium);
|
||||||
|
return await pack?.getDocuments() ?? [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/************************************************************************************/
|
||||||
|
const loadCompendium = async (compendium, filter = item => true) => {
|
||||||
|
let compendiumData = await loadCompendiumData(compendium);
|
||||||
|
return compendiumData.filter(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
const patch_core_tables = (tableList) => {
|
||||||
|
if (game.version) { // v9 and above
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
FilePicker.browse("data", "modules/WH4-fr-translation/tables/").then(resp => {
|
||||||
|
for (var file of resp.files) {
|
||||||
|
let filename = file.substring(file.lastIndexOf("/") + 1, file.indexOf(".json"))
|
||||||
|
if (tableList[filename] == 1) { // Matching table name -> patch !
|
||||||
|
fetch(file).then(r => r.json()).then(records => {
|
||||||
|
//console.log("Patch !!!", filename, records);
|
||||||
|
//WFRP_Tables[filename] = records;
|
||||||
|
game.wfrp4e.tables[filename] = records;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
const patch_trade_gazeteer = () => {
|
||||||
|
if (game.wfrp4e.config.trade?.gazetteer) {
|
||||||
|
fetch("modules/wh4-fr-translation/trade/gazetteer_dotr.json").then(r => r.json()).then(records => {
|
||||||
|
game.wfrp4e.config.trade.gazetteer = records;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
const __check_fix_wrong_modules = (chatFlag, patchFinished) => {
|
||||||
|
|
||||||
|
WH4FRPatchConfig.perform_patch();
|
||||||
|
|
||||||
|
game.modules.forEach((module, name) => {
|
||||||
|
|
||||||
|
//console.log("TESTING MODULE", module)
|
||||||
|
if (module.id == "wfrp4e-core" && module.active) {
|
||||||
|
patch_core_tables(__wfrp4e_tables);
|
||||||
|
}
|
||||||
|
if (module.id == "wfrp4e-eis" && module.active) {
|
||||||
|
patch_core_tables(__eis_tables);
|
||||||
|
_patch_eis();
|
||||||
|
}
|
||||||
|
if (module.id == "wfrp4e-dotr" && module.active) {
|
||||||
|
patch_core_tables(__dotr_tables);
|
||||||
|
patch_trade_gazeteer()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (module.id == "wfrp4e-up-in-arms" && module.active) {
|
||||||
|
_patch_up_in_arms();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (module.id == 'ogre-kingdom-wfrp4e' && module.active) {
|
||||||
|
WH4FRPatchConfig.perform_ogrekingdom_patch();
|
||||||
|
if (game.user.isGM && chatFlag)
|
||||||
|
ChatMessage.create({ content: "<div><strong>Le module Ogre-Kingdom a été detecté et automatiquement patché.</strong></div>", whisper: ChatMessage.getWhisperRecipients("GM") });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (module.id == "wfrp4e-ew" && module.active && game.user.isGM && chatFlag) {
|
||||||
|
ChatMessage.create({
|
||||||
|
content: "<div><strong>Vous avez le module EW (wfrp4e-ew ?) installé. Malheureusement, ce module n'est pas compatible avec" +
|
||||||
|
" les traductions et vient casser le fonctionnement de la traduction. Veuillez recopier les compendiums dans votre monde, désactiver le module et re-démarrer le monde</strong></div>",
|
||||||
|
whisper: ChatMessage.getWhisperRecipients("GM")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (game.user.isGM && patchFinished) {
|
||||||
|
ChatMessage.create({
|
||||||
|
content: "<div>Les modules WFRP4E ont été <strong>patchés avec succés</strong>. Vous pouvez y aller et que <strong>Shallya vous garde !</strong></div><div>Derniers changements : correction pour acteurs de RNHD et ajout des traductions des items de Aventures à Ubesreik 1 (François Cheminade)</div></ul>",
|
||||||
|
user: game.user.id,
|
||||||
|
whisper: ChatMessage.getWhisperRecipients("GM")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const __history = [
|
||||||
|
"Nouveautés 7.0.28: <ul><li>Traduction des items du Starter Set (Ashbury77)</li><li>Traduction des items du d'Archives of the Empire (Bimkiz)</li></ul>"
|
||||||
|
]
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
const convertColumnToMulti = (table) => {
|
||||||
|
let columns = table.columns;
|
||||||
|
let newTable = duplicate(table)
|
||||||
|
|
||||||
|
delete newTable.columns;
|
||||||
|
newTable.rows = table.rows.map(i => { return { range: {} } })
|
||||||
|
newTable.multi = table.columns
|
||||||
|
|
||||||
|
for (let column of columns) {
|
||||||
|
for (let row of newTable.rows) {
|
||||||
|
row[column] = {}
|
||||||
|
row.range[column] = []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let index in newTable.rows) {
|
||||||
|
for (let column in table.rows[index].range) {
|
||||||
|
newTable.rows[index][column] = { name: table.rows[index].name }
|
||||||
|
newTable.rows[index].range[column] = table.rows[index].range[column]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
const __patchStyleSheet = () => {
|
||||||
|
for (let styleSheet of document.styleSheets) {
|
||||||
|
if (styleSheet.href && styleSheet.href.includes("wfrp4e.css")) {
|
||||||
|
let found = 0
|
||||||
|
for (let i = 0; i < styleSheet.cssRules.length; i++) {
|
||||||
|
let rule = styleSheet.cssRules[i]
|
||||||
|
if (rule.selectorText == '.sidebar-popout') {
|
||||||
|
console.log("DELETE RULE", rule)
|
||||||
|
found = i
|
||||||
|
/*rule.cssText = ".sidebar-popout { }"
|
||||||
|
rule.style.width = ""
|
||||||
|
console.log("Found rul2", rule)*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
styleSheet.deleteRule(found)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
const __add_actors_translation = () => {
|
||||||
|
const lang = game.settings.get('core', 'language');
|
||||||
|
if (lang == "fr") {
|
||||||
|
let pack_array = [];
|
||||||
|
for (let metadata of game.packs) {
|
||||||
|
if (!game.babele.isTranslated(metadata) &&
|
||||||
|
metadata.collection != "wfrp4e-core.actors" &&
|
||||||
|
metadata.collection != "wfrp4e-core.bestiary" &&
|
||||||
|
metadata.collection != "wfrp4e-ua1.actors" &&
|
||||||
|
metadata.collection != "wfrp4e-altdorf.actors" &&
|
||||||
|
metadata.collection != "wfrp4e-rnhd.actors" &&
|
||||||
|
metadata.collection != "wfrp4e-dotr.actors" &&
|
||||||
|
metadata.collection != "wfrp4e-eis.actors" &&
|
||||||
|
metadata.collection != "wfrp4e-pbtt.actors" &&
|
||||||
|
metadata.collection != "wfrp4e-middenheim.actors" &&
|
||||||
|
metadata.documentName === 'Actor') {
|
||||||
|
//console.log("REPLACE PACK : ", metadata);
|
||||||
|
let translations = {
|
||||||
|
"label": metadata.name,
|
||||||
|
"mapping": {
|
||||||
|
"name": "name",
|
||||||
|
"description": "system.details.biography.value",
|
||||||
|
"items": {
|
||||||
|
"path": "items",
|
||||||
|
"converter": "bestiary_traits"
|
||||||
|
},
|
||||||
|
"characteristics": {
|
||||||
|
"path": "system.characteristics",
|
||||||
|
"converter": "npc_characteristics"
|
||||||
|
},
|
||||||
|
"details": {
|
||||||
|
"path": "system.details",
|
||||||
|
"converter": "npc_details"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//console.log(metadata, translations)
|
||||||
|
game.babele.packs.set(metadata.metadata.id, new TranslatedCompendium(metadata.metadata, translations))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
/* Hook for specific command */
|
||||||
|
Hooks.on("chatMessage", (html, content, msg) => {
|
||||||
|
|
||||||
|
if (content.toLowerCase().includes('auberge')) {
|
||||||
|
_manage_inn_roll(content, msg);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
/* Additionnal hooks ready */
|
||||||
|
Hooks.once('ready', () => {
|
||||||
|
|
||||||
|
if (game.user.isGM) {
|
||||||
|
let chatData = {
|
||||||
|
user: game.user.id,
|
||||||
|
rollMode: game.settings.get("core", "rollMode"),
|
||||||
|
whisper: ChatMessage.getWhisperRecipients('GM'),
|
||||||
|
content: `<div>Les modules WFRP4E sont <strong>en cours de patch pour traduction</strong>... Merci <strong>d'attendre le message de fin</strong> (dans environ 20 secondes)<p>Pour rappel et à titre informatif, il faut activer ce module de traduction FR <strong>avant</strong> de procéder à l'importation des données des modules C7 (core compris). Autrement dit, activez ce module FR <strong>AVANT</strong> tout autre module.</p><p>Support et informations sur le Discord FR de Foundry : https://discord.gg/pPSDNJk</p></div>`
|
||||||
|
}
|
||||||
|
ChatMessage.create(chatData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** New modifiers */
|
||||||
|
game.wfrp4e.config.difficultyModifiers = {
|
||||||
|
"veasy": 60,
|
||||||
|
"easy": 40,
|
||||||
|
"banal": 30,
|
||||||
|
"average": 20,
|
||||||
|
"medium": 10,
|
||||||
|
"challenging": 0,
|
||||||
|
"difficult": -10,
|
||||||
|
"hard": -20,
|
||||||
|
"vhard": -30,
|
||||||
|
"doom": -40
|
||||||
|
}
|
||||||
|
game.wfrp4e.config.difficultyLabels = {
|
||||||
|
|
||||||
|
"veasy": "Trés Facile (+60)",
|
||||||
|
"easy": "Facile (+40)",
|
||||||
|
"banal": "Banal (+30)",
|
||||||
|
"average": "Accessible (+20)",
|
||||||
|
"medium": "Faisable (+10)",
|
||||||
|
"challenging": "Intermédiaire (+0)",
|
||||||
|
"difficult": "Complexe (-10)",
|
||||||
|
"hard": "Difficile (-20)",
|
||||||
|
"vhard": "Très Difficile (-30)",
|
||||||
|
"doom": "Maudit (-40)"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//setTimeout( __check_fix_wrong_modules, 2000, true, false);
|
||||||
|
setTimeout(__check_fix_wrong_modules, 20000, true, true);
|
||||||
|
setTimeout(__add_actors_translation, 21000, false, true);
|
||||||
|
|
||||||
|
//__patchStyleSheet()
|
||||||
|
|
||||||
|
/* ATTEMPT !!
|
||||||
|
loadCompendium("wfrp4e-core.spells").then( comp => {
|
||||||
|
let sorted = {};
|
||||||
|
for (let spell of comp) {
|
||||||
|
if ( !sorted[spell.data.data.lore.value]) {
|
||||||
|
sorted[spell.data.data.lore.value] = [];
|
||||||
|
}
|
||||||
|
sorted[spell.data.data.lore.value].push( duplicate(spell.data) );
|
||||||
|
}
|
||||||
|
console.log("SORTED", sorted);
|
||||||
|
});*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
let compmod = "wfrp4e";
|
||||||
|
// Check various settings in the installation
|
||||||
|
game.modules.forEach((module, name) => {
|
||||||
|
if ( name == "wfrp4e-core" && module.active) {
|
||||||
|
compmod = "wfrp4e-core";
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
__auto_patch_translation_journal_compendium( compmod )
|
||||||
|
/* Uncomment this to auto-create the translation tables
|
||||||
|
Auto-create translation journal tables
|
||||||
|
__create_translation_tables(compmod);
|
||||||
|
*/
|
||||||
|
|
||||||
|
});
|
639
modules/babele-register.js
Normal file
639
modules/babele-register.js
Normal file
@ -0,0 +1,639 @@
|
|||||||
|
/************************************************************************************/
|
||||||
|
import loadScripts from "./loadScripts.js";
|
||||||
|
import statParserFR from "./import-stat-2.js";
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
var compmod = "wfrp4e-core";
|
||||||
|
const vo_conditions = {
|
||||||
|
"ablaze": "Ablaze",
|
||||||
|
"bleeding": "Bleeding",
|
||||||
|
"blinded": "Blinded",
|
||||||
|
"broken": "Broken",
|
||||||
|
"deafened": "Deafened",
|
||||||
|
"entangled": "Entangled",
|
||||||
|
"fatigued": "Fatigued",
|
||||||
|
"poisoned": "Poisoned",
|
||||||
|
"prone": "Prone",
|
||||||
|
"stunned": "Stunned",
|
||||||
|
"surprised": "Surprised",
|
||||||
|
"unconscious": "Unconscious",
|
||||||
|
"grappling": "Grappling",
|
||||||
|
"fear": "Fear",
|
||||||
|
"defeated": "Defeated"
|
||||||
|
}
|
||||||
|
|
||||||
|
const __SELECT_BONUS_PREFIX_D = {
|
||||||
|
"initiative": 1,
|
||||||
|
"intelligence": 1,
|
||||||
|
"endurance": 1,
|
||||||
|
"agilite": 1,
|
||||||
|
"agilité": 1
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
export class WFRP4FrTranslation {
|
||||||
|
|
||||||
|
static parseSpellContent(spell) {
|
||||||
|
if (spell.system.range?.value) {
|
||||||
|
spell.system.range.value = this.processSpellContent(spell.system.range.value)
|
||||||
|
}
|
||||||
|
if (spell.system.damage?.value) {
|
||||||
|
spell.system.damage.value = this.processSpellContent(spell.system.damage.value)
|
||||||
|
}
|
||||||
|
if (spell.system.duration?.value) {
|
||||||
|
spell.system.duration.value = this.processSpellContent(spell.system.duration?.value)
|
||||||
|
}
|
||||||
|
if ( spell.system.range?.value) {
|
||||||
|
spell.system.range.value = this.processSpellContent(spell.system.range?.value)
|
||||||
|
}
|
||||||
|
if (spell.system.target?.value ) {
|
||||||
|
spell.system.target.value = this.processSpellContent(spell.system.target?.value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static processSpellContent(value) {
|
||||||
|
//console.log("Spell duration/range/damage/target :", value);
|
||||||
|
if (value == "") return ""; // Hop !
|
||||||
|
if (value == "Touch") return "Contact"; // Hop !
|
||||||
|
if (value == "You") return "Vous"; // Hop !
|
||||||
|
if (value == "Instant") return "Instantané"; // Hop !
|
||||||
|
let translw = value;
|
||||||
|
let re = /(.*)\s+[Bb]onus\s*(\w*)/i;
|
||||||
|
let res = re.exec(value);
|
||||||
|
//console.log("RES1:", res);
|
||||||
|
let unit = "";
|
||||||
|
if (res) { // Test "<charac> Bonus <unit>" pattern
|
||||||
|
if (res[1]) { // We have char name, then convert it
|
||||||
|
translw = game.i18n.localize(res[1].trim());
|
||||||
|
let bonusPrefix = (translw.toLowerCase() in __SELECT_BONUS_PREFIX_D) ? "Bonus d'" : "Bonus de ";
|
||||||
|
translw = bonusPrefix + translw
|
||||||
|
}
|
||||||
|
unit = res[2];
|
||||||
|
} else {
|
||||||
|
re = /(\d+) (\w+)/i;
|
||||||
|
res = re.exec(value);
|
||||||
|
if (res) { // Test : "<number> <unit>" pattern
|
||||||
|
translw = res[1];
|
||||||
|
unit = res[2];
|
||||||
|
} else { // Test
|
||||||
|
re = /(\w+) (\w+)/i;
|
||||||
|
res = re.exec(value);
|
||||||
|
if (res) { // Test : "<charac> <unit>" pattern
|
||||||
|
translw = game.i18n.localize(res[1].trim());
|
||||||
|
unit = res[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (unit == "hour") unit = "heure";
|
||||||
|
if (unit == "hours") unit = "heures";
|
||||||
|
if (unit == "days") unit = "jours";
|
||||||
|
if (unit == "yard") unit = "mètre";
|
||||||
|
if (unit == "yards") unit = "mètres";
|
||||||
|
if (unit == "Bonus") { // Another weird management
|
||||||
|
console.log("Translating bonus", unit);
|
||||||
|
translw = "Bonus de " + translw;
|
||||||
|
} else {
|
||||||
|
translw += " " + unit;
|
||||||
|
}
|
||||||
|
return translw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************************************/
|
||||||
|
Hooks.once('init', () => {
|
||||||
|
|
||||||
|
// Check various settings in the installation
|
||||||
|
game.modules.forEach((module, id) => {
|
||||||
|
if (id == "wfrp4e-core" && module.active) {
|
||||||
|
compmod = "wfrp4e-core";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
game.wfrp4efr = {
|
||||||
|
compmod: compmod,
|
||||||
|
vo_conditions: vo_conditions
|
||||||
|
}
|
||||||
|
|
||||||
|
game.wfrp4e.apps.StatBlockParser.parseStatBlock = async function (statString, type = "npc") {
|
||||||
|
console.log("PARSER FR DONE");
|
||||||
|
return statParserFR(statString, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
loadScripts();
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------*/
|
||||||
|
/* DEPRECATED : game.wfrp4e.entities.ItemWfrp4e.prototype.computeSpellDamage = function (formula, isMagicMissile) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
formula = formula.toLowerCase();
|
||||||
|
|
||||||
|
if (isMagicMissile) // If it's a magic missile, damage includes willpower bonus
|
||||||
|
{
|
||||||
|
formula += "+ " + this.actor.characteristics["wp"].bonus
|
||||||
|
}
|
||||||
|
|
||||||
|
// Specific case, to avoid wrong matching with "Force"
|
||||||
|
if (formula.includes("toughness bonus")) {
|
||||||
|
formula = formula.replace("toughness bonus", this.actor.characteristics["t"].bonus);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Specific case, to avoid wrong matching with "Force"
|
||||||
|
if (formula.includes("force mentale")) {
|
||||||
|
// Determine if it's looking for the bonus or the value
|
||||||
|
if (formula.includes('bonus')) {
|
||||||
|
formula = formula.replace("bonus de force mentale", this.actor.characteristics["wp"].bonus);
|
||||||
|
formula = formula.replace("force mentale bonus", this.actor.characteristics["wp"].bonus);
|
||||||
|
} else
|
||||||
|
formula = formula.replace("force mentale", this.actor.characteristics["wp"].value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterate through characteristics
|
||||||
|
for (let ch in this.actor.characteristics) {
|
||||||
|
// If formula includes characteristic name
|
||||||
|
while (formula.includes(this.actor.characteristics[ch].label.toLowerCase())) {
|
||||||
|
// Determine if it's looking for the bonus or the value
|
||||||
|
if (formula.includes('bonus')) {
|
||||||
|
formula = formula.replace("bonus de " + game.wfrp4e.config.characteristics[ch].toLowerCase(), this.actor.characteristics[ch].bonus);
|
||||||
|
formula = formula.replace(game.wfrp4e.config.characteristics[ch].toLowerCase() + " bonus", this.actor.characteristics[ch].bonus);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
formula = formula.replace(game.wfrp4e.config.characteristics[ch].toLowerCase(), this.actor.characteristics[ch].value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return eval(formula);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
throw ui.notifications.error("Error: could not parse spell damage. See console for details")
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------*/
|
||||||
|
/* DEPRECATED : game.wfrp4e.entities.ItemWfrp4e.prototype.computeSpellPrayerFormula = function (type, aoe = false, formulaOverride) {
|
||||||
|
let formula = formulaOverride || this[type]?.value
|
||||||
|
if (Number.isNumeric(formula))
|
||||||
|
return formula
|
||||||
|
|
||||||
|
//console.log("Compute FR")
|
||||||
|
formula = formula.toLowerCase();
|
||||||
|
|
||||||
|
// Do not process these special values
|
||||||
|
if (formula != game.i18n.localize("You").toLowerCase() && formula != game.i18n.localize("Special").toLowerCase() && formula != game.i18n.localize("Instant").toLowerCase()) {
|
||||||
|
// Specific case, to avoid wrong matching with "Force"
|
||||||
|
if (formula.includes("force mentale")) {
|
||||||
|
// Determine if it's looking for the bonus or the value
|
||||||
|
if (formula.includes('bonus')) {
|
||||||
|
formula = formula.replace("bonus de force mentale", this.actor.characteristics["wp"].bonus);
|
||||||
|
formula = formula.replace("force mentale bonus", this.actor.characteristics["wp"].bonus);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
formula = formula.replace("force mentale", this.actor.characteristics["wp"].value);
|
||||||
|
}
|
||||||
|
if (formula.includes("yard"))
|
||||||
|
formula = formula.replace('yard', "mètre");
|
||||||
|
if (formula.includes("yds"))
|
||||||
|
formula = formula.replace('yds', "m.");
|
||||||
|
// Iterate through remaining characteristics
|
||||||
|
for (let ch in this.actor.characteristics) {
|
||||||
|
// If formula includes characteristic name
|
||||||
|
//console.log("Testing :", ch, WFRP4E.characteristics[ch].toLowerCase());
|
||||||
|
if (formula.includes(game.wfrp4e.config.characteristics[ch].toLowerCase())) {
|
||||||
|
// Determine if it's looking for the bonus or the value
|
||||||
|
if (formula.includes('bonus')) {
|
||||||
|
formula = formula.replace("bonus de " + game.wfrp4e.config.characteristics[ch].toLowerCase(), this.actor.characteristics[ch].bonus);
|
||||||
|
formula = formula.replace(game.wfrp4e.config.characteristics[ch].toLowerCase() + " bonus", this.actor.characteristics[ch].bonus);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
formula = formula.replace(game.wfrp4e.config.characteristics[ch].toLowerCase(), this.actor.characteristics[ch].value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If AoE - wrap with AoE ( )
|
||||||
|
if (aoe)
|
||||||
|
formula = "AoE (" + formula.capitalize() + ")";
|
||||||
|
|
||||||
|
//console.log("calculateSpellAttributes -> " + formula );
|
||||||
|
return formula.capitalize();
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------*/
|
||||||
|
// Converters area
|
||||||
|
if (typeof Babele !== 'undefined') {
|
||||||
|
|
||||||
|
Babele.get().register({
|
||||||
|
module: 'wh4-fr-translation',
|
||||||
|
lang: 'fr',
|
||||||
|
dir: 'compendium'
|
||||||
|
})
|
||||||
|
|
||||||
|
Babele.get().registerConverters({
|
||||||
|
|
||||||
|
"career_skills": (skills_list) => {
|
||||||
|
let validCompendiums = game.wfrp4e.tags.getPacksWithTag("skill")
|
||||||
|
//DEBUG: console.log( "Thru here ...", compendium, skills_list);
|
||||||
|
if (skills_list) {
|
||||||
|
let i;
|
||||||
|
let len = skills_list.length;
|
||||||
|
let re = /(.*)\((.*)\)/i;
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
skills_list[i] = skills_list[i].trim();
|
||||||
|
for (let compData of validCompendiums) {
|
||||||
|
let translItem = game.babele.translate(compData.metadata.id, { name: skills_list[i], type: "skill" }, true)
|
||||||
|
let transl = translItem?.name || undefined
|
||||||
|
if (!transl) transl = skills_list[i]
|
||||||
|
//console.log("List ...", skills_list[i], compData.metadata.id, translItem);
|
||||||
|
if (transl == skills_list[i]) {
|
||||||
|
let res = re.exec(skills_list[i]);
|
||||||
|
if (res) {
|
||||||
|
//console.log("Matched/split:", res[1], res[2]);
|
||||||
|
let subword = game.i18n.localize(res[2].trim());
|
||||||
|
let s1 = res[1].trim() + " ()";
|
||||||
|
translItem = game.babele.translate(compData.metadata.id, { name: s1, type: "skill" }, true)
|
||||||
|
let translw = translItem?.name || undefined
|
||||||
|
if (translw && translw != s1) {
|
||||||
|
let res2 = re.exec(translw);
|
||||||
|
transl = res2[1] + "(" + subword + ")";
|
||||||
|
} else {
|
||||||
|
s1 = res[1].trim() + " ( )";
|
||||||
|
translItem = game.babele.translate(compData.metadata.id, { name: s1, type: "skill" }, true)
|
||||||
|
translw = translItem?.name || undefined
|
||||||
|
let res2 = re.exec(translw);
|
||||||
|
transl = res2[1] + "(" + subword + ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
skills_list[i] = transl;
|
||||||
|
if (translItem?.system)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return skills_list;
|
||||||
|
},
|
||||||
|
|
||||||
|
"resultConverter": (results, translated) => {
|
||||||
|
//console.log("STUF PARSING", results, translated)
|
||||||
|
if (translated) {
|
||||||
|
for (let data of results) {
|
||||||
|
if (translated[`${data.range[0]}-${data.range[1]}`]) {
|
||||||
|
data.text = translated[`${data.range[0]}-${data.range[1]}`]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return results
|
||||||
|
}
|
||||||
|
// Auto patch
|
||||||
|
if (results[0].text.includes("wfrp4e-core.career-descriptions")) {
|
||||||
|
if (game.system.version.match("7.")) {
|
||||||
|
results[0].text = "wfrp4e-core.journals"
|
||||||
|
} else {
|
||||||
|
results[0].text = "wfrp4e-core.journal-entries"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (results[0].text.includes("wfrp4e-core.journal")) {
|
||||||
|
for (let data of results) {
|
||||||
|
let career = data.text.match(/{(.*)}/)
|
||||||
|
//console.log(">>>>>", career)
|
||||||
|
if (career && career[1]) {
|
||||||
|
let careerFR = Babele.instance.converters.career_careergroup(career[1])
|
||||||
|
data.text = data.text.replace(career[1], careerFR)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (results[0].documentCollection) {
|
||||||
|
return Babele.instance.converters.tableResults(results)
|
||||||
|
}
|
||||||
|
return results
|
||||||
|
},
|
||||||
|
|
||||||
|
"npc_details": (details) => {
|
||||||
|
//console.log("DETAILS: ", details);
|
||||||
|
let newDetails = duplicate(details);
|
||||||
|
if (details.species?.value)
|
||||||
|
newDetails.species.value = game.i18n.localize(details.species.value);
|
||||||
|
if (details.gender?.value)
|
||||||
|
newDetails.gender.value = game.i18n.localize(details.gender.value);
|
||||||
|
if (details.class?.value)
|
||||||
|
newDetails.class.value = game.i18n.localize(details.class.value);
|
||||||
|
return newDetails;
|
||||||
|
},
|
||||||
|
|
||||||
|
"career_talents": (talents_list) => {
|
||||||
|
let validCompendiums = game.wfrp4e.tags.getPacksWithTag("talent")
|
||||||
|
let i;
|
||||||
|
if (talents_list) {
|
||||||
|
let len = talents_list.length;
|
||||||
|
let re = /(.*)\((.*)\)/i;
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
for (let compData of validCompendiums) {
|
||||||
|
let translItem = game.babele.translate(compData.metadata.id, { name: talents_list[i] }, true);
|
||||||
|
//console.log("Search talent name:", compData.metadata.id, talents_list[i], translItem);
|
||||||
|
let transl = translItem?.name || undefined
|
||||||
|
if (!transl) transl = talents_list[i]
|
||||||
|
if (transl == talents_list[i]) {
|
||||||
|
let res = re.exec(talents_list[i]);
|
||||||
|
if (res) {
|
||||||
|
let subword = game.i18n.localize(res[2].trim());
|
||||||
|
let s1 = res[1].trim(); // No () in talents table
|
||||||
|
translItem = game.babele.translate(compData.metadata.id, { name: s1 }, true)
|
||||||
|
let translw = translItem?.name || undefined
|
||||||
|
console.log("Search talent name:", compData.metadata.id, s1, translw);
|
||||||
|
if (translw && translw != s1) {
|
||||||
|
transl = translw + " (" + subword + ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
talents_list[i] = transl;
|
||||||
|
if (translItem?.system)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return talents_list;
|
||||||
|
},
|
||||||
|
"npc_characteristics": (chars) => { // Auto-convert char names in the sheet
|
||||||
|
for (let key in chars) {
|
||||||
|
let char = chars[key];
|
||||||
|
//console.log("Was here !", key, char );
|
||||||
|
let abrev = char["abrev"];
|
||||||
|
let toTransl = "CHAR." + abrev;
|
||||||
|
if (game.i18n.localize(toTransl) != toTransl) { // Manages unknown language
|
||||||
|
char["label"] = game.i18n.localize("CHAR." + abrev);
|
||||||
|
char["abrev"] = game.i18n.localize("CHARAbbrev." + abrev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return chars;
|
||||||
|
},
|
||||||
|
"bestiary_traits": (beast_traits, translations) => {
|
||||||
|
if (!beast_traits) {
|
||||||
|
console.log("No beast traits found here ...")
|
||||||
|
return beast_traits
|
||||||
|
}
|
||||||
|
//console.log("TRANS:", beast_traits)
|
||||||
|
for (let trait_en of beast_traits) {
|
||||||
|
let special = "";
|
||||||
|
let nbt = "";
|
||||||
|
let name_en = trait_en.name.trim(); // strip \r in some traits name
|
||||||
|
if (!trait_en.name || trait_en.name.length == 0) {
|
||||||
|
console.log("Wrong item name found!!!!")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
//console.log(">>>>>>>> Parsing", trait_en.name)
|
||||||
|
if (trait_en.type == "trait") {
|
||||||
|
//console.log("Trait translation", compmod, trait_en)
|
||||||
|
if (name_en.includes("Tentacles")) { // Process specific Tentacles case
|
||||||
|
let re = /(.d*)x Tentacles/i;
|
||||||
|
let res = re.exec(name_en);
|
||||||
|
if (res && res[1])
|
||||||
|
nbt = res[1] + "x ";
|
||||||
|
name_en = "Tentacles";
|
||||||
|
} else if (name_en.includes("(") && name_en.includes(")")) { // Then process specific traits name with (xxxx) inside
|
||||||
|
let re = /(.*) \((.*)\)/i;
|
||||||
|
let res = re.exec(name_en);
|
||||||
|
name_en = res[1]; // Get the root traits name
|
||||||
|
special = " (" + game.i18n.localize(res[2].trim()) + ")"; // And the special keyword
|
||||||
|
}
|
||||||
|
let validCompendiums = game.wfrp4e.tags.getPacksWithTag("trait")
|
||||||
|
for (let compData of validCompendiums) {
|
||||||
|
let trait_fr = game.babele.translate(compData.metadata.id, { name: name_en }, true)
|
||||||
|
if (trait_fr?.system) {
|
||||||
|
trait_fr.name = trait_fr.name || trait_en.name
|
||||||
|
trait_en.name = nbt + trait_fr.name + special;
|
||||||
|
trait_en.system.description.value = trait_fr.system.description.value;
|
||||||
|
if (trait_en.system?.specification && isNaN(trait_en.system.specification.value)) { // This is a string, so translate it
|
||||||
|
//console.log("Translating : ", trait_en.system.specification.value);
|
||||||
|
trait_en.system.specification.value = game.i18n.localize(trait_en.system.specification.value.trim());
|
||||||
|
}
|
||||||
|
break // Translation has been found, skip other compendiums
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (trait_en.type == "skill") {
|
||||||
|
if (name_en.includes("(") && name_en.includes(")")) { // Then process specific skills name with (xxxx) inside
|
||||||
|
let re = /(.*) +\((.*)\)/i;
|
||||||
|
let res = re.exec(name_en);
|
||||||
|
name_en = res[1].trim(); // Get the root skill name
|
||||||
|
special = " (" + game.i18n.localize(res[2].trim()) + ")"; // And the special keyword
|
||||||
|
}
|
||||||
|
let validCompendiums = game.wfrp4e.tags.getPacksWithTag("skill")
|
||||||
|
for (let compData of validCompendiums) {
|
||||||
|
let trait_fr = game.babele.translate(compData.metadata.id, { name: name_en }, true)
|
||||||
|
if (trait_fr?.system) {
|
||||||
|
//console.log(">>>>> Skill ?", name_en, special, trait_fr.name, trait_fr);
|
||||||
|
trait_fr.name = trait_fr.name || name_en
|
||||||
|
trait_en.name = trait_fr.name + special;
|
||||||
|
trait_en.system.description.value = trait_fr.system.description.value;
|
||||||
|
break; // Translation has been found, skip other compendiums
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (trait_en.type == "prayer") {
|
||||||
|
let validCompendiums = game.wfrp4e.tags.getPacksWithTag("prayer")
|
||||||
|
for (let compData of validCompendiums) {
|
||||||
|
let trait_fr = game.babele.translate(compData.metadata.id, { name: name_en }, true)
|
||||||
|
if (trait_fr?.system) {
|
||||||
|
//DEBUG : console.log(">>>>> Prayer ?", name_en, special, trait_fr.name );
|
||||||
|
WFRP4FrTranslation.parseSpellContent(trait_en)
|
||||||
|
trait_fr.name = trait_fr.name || name_en
|
||||||
|
trait_en.name = trait_fr.name + special;
|
||||||
|
if (trait_fr.system?.description?.value) {
|
||||||
|
trait_en.system.description.value = trait_fr.system.description.value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (trait_en.type == "spell") {
|
||||||
|
let validCompendiums = game.wfrp4e.tags.getPacksWithTag("spell")
|
||||||
|
for (let compData of validCompendiums) {
|
||||||
|
let trait_fr = game.babele.translate(compData.metadata.id, { name: name_en }, true)
|
||||||
|
if (trait_fr?.system) {
|
||||||
|
//DEBUG : console.log(">>>>> Spell ?", name_en, special, trait_fr);
|
||||||
|
WFRP4FrTranslation.parseSpellContent(trait_en)
|
||||||
|
trait_fr.name = trait_fr.name || name_en
|
||||||
|
trait_en.name = trait_fr.name + special;
|
||||||
|
if (trait_fr.system?.description?.value) {
|
||||||
|
trait_en.system.description.value = trait_fr.system.description.value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (trait_en.type == "talent") {
|
||||||
|
if (name_en.includes("(") && name_en.includes(")")) { // Then process specific skills name with (xxxx) inside
|
||||||
|
let re = /(.*) +\((.*)\)/i;
|
||||||
|
let res = re.exec(name_en);
|
||||||
|
name_en = res[1].trim(); // Get the root talent name, no parenthesis this time...
|
||||||
|
special = " (" + game.i18n.localize(res[2].trim()) + ")"; // And the special keyword
|
||||||
|
}
|
||||||
|
let validCompendiums = game.wfrp4e.tags.getPacksWithTag("talent")
|
||||||
|
for (let compData of validCompendiums) {
|
||||||
|
let trait_fr = game.babele.translate(compData.metadata.id, { name: name_en }, true)
|
||||||
|
if (trait_fr?.system) {
|
||||||
|
trait_fr.name = trait_fr.name || name_en // Security since babele v10
|
||||||
|
//console.log(">>>>> Talent ?", trait_fr, name_en, special, trait_fr.name);
|
||||||
|
if (trait_fr.name && (trait_fr.name == "Sprinter" || trait_fr.name != name_en)) { // Talent translated!
|
||||||
|
trait_en.name = trait_fr.name.trim() + special
|
||||||
|
if (trait_fr.system?.description?.value) { // Why ???
|
||||||
|
trait_en.system.description.value = trait_fr.system.description.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (trait_en.type == "career") {
|
||||||
|
let validCompendiums = game.wfrp4e.tags.getPacksWithTag("career")
|
||||||
|
for (let compData of validCompendiums) {
|
||||||
|
let career_fr = game.babele.translate(compData.metadata.id, { name: name_en }, true);
|
||||||
|
if (career_fr?.system) {
|
||||||
|
trait_en.name = career_fr.name || trait_en.name
|
||||||
|
// DEBG: console.log(">>>>> Career ?", career_fr.name );
|
||||||
|
trait_en.system = duplicate(career_fr.system);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (trait_en.type == "trapping" || trait_en.type == "weapon" || trait_en.type == "armour" || trait_en.type == "container" || trait_en.type == "money") {
|
||||||
|
let validCompendiums = game.wfrp4e.tags.getPacksWithTag(["trapping"], ["weapon", "armour", "container", "money"])
|
||||||
|
for (let compData of validCompendiums) {
|
||||||
|
let trapping_fr = game.babele.translate(compData.metadata.id, { name: name_en }, true);
|
||||||
|
if (trapping_fr?.system) {
|
||||||
|
//console.log(">>>>> Trapping ?", name_en, trapping_fr.name);
|
||||||
|
trait_en.name = trapping_fr.name || trait_en.name
|
||||||
|
if (trapping_fr.system?.description?.value) {
|
||||||
|
trait_en.system.description.value = trapping_fr.system.description.value
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//console.log(">>>>>>>><OUTPUT", beast_traits)
|
||||||
|
return beast_traits
|
||||||
|
},
|
||||||
|
// To avoid duplicateing class for all careers
|
||||||
|
"generic_localization": (value) => {
|
||||||
|
let ret = value
|
||||||
|
if (value) {
|
||||||
|
ret = game.i18n.localize(value.trim());
|
||||||
|
if (!ret) ret = value
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
},
|
||||||
|
"trapping_qualities_flaws": (value) => {
|
||||||
|
if (value) {
|
||||||
|
let newQF = [];
|
||||||
|
//console.log("ATOUTS", value, typeof(value));
|
||||||
|
let list = value
|
||||||
|
if (typeof (value) == "string") {
|
||||||
|
let myList = value.split(",")
|
||||||
|
list = []
|
||||||
|
for (let l of myList) {
|
||||||
|
list.push({ name: l.trim() })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (let i = 0; i < list.length; i++) {
|
||||||
|
newQF[i] = duplicate(list[i])
|
||||||
|
if (newQF[i].name == "Trap Blade") {
|
||||||
|
newQF[i].name = "TrapBlade"; // Auto-patch, without space!
|
||||||
|
//console.log("PATCHED", trim);
|
||||||
|
}
|
||||||
|
let oldName = newQF[i].name
|
||||||
|
newQF[i].name = game.i18n.localize(oldName)
|
||||||
|
if (!newQF[i].name) newQF[i].name = oldName
|
||||||
|
}
|
||||||
|
return newQF;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Search back in careers the translated name of the groupe (as it is the name of the level career itself)
|
||||||
|
"career_careergroup": (value) => {
|
||||||
|
// Manage exception - Dirty hack
|
||||||
|
if (value == 'Slayer') {
|
||||||
|
return "Tueur";
|
||||||
|
}
|
||||||
|
if (value == 'Druidic Priest') {
|
||||||
|
return "Druide";
|
||||||
|
}
|
||||||
|
//console.log("Carre groupe : ", value )
|
||||||
|
// Per default
|
||||||
|
let validCompendiums = game.wfrp4e.tags.getPacksWithTag("career")
|
||||||
|
for (let compData of validCompendiums) {
|
||||||
|
let newName = game.babele.translate(compData.metadata.id, { name: value }).name
|
||||||
|
if (!newName) newName = value
|
||||||
|
return newName
|
||||||
|
}
|
||||||
|
ui.notifications.error("Impossible de trouver la carrière " + value + ". Elle n'est probablement pas traduite.", { permanent: true })
|
||||||
|
return value
|
||||||
|
},
|
||||||
|
|
||||||
|
"mutations_modifier": (value) => { // This is really UGLYYYY i know, but i started like this and discovered afterward that many strings were not easy to automate... Sorry :)
|
||||||
|
//console.log("Parsing mutation :", value);
|
||||||
|
value = value.toLowerCase();
|
||||||
|
value = value.replace("gain a broken condition if you fail a test derived from ", "Gagnez un état Brisé si vous échouez à un test dérivé de ");
|
||||||
|
value = value.replace("weapon skill", "Capacité de Combat");
|
||||||
|
value = value.replace("ballistic skill", "Capacité de Tir");
|
||||||
|
value = value.replace("strength", "Force");
|
||||||
|
value = value.replace("toughness", "Endurance");
|
||||||
|
value = value.replace("agility", "Agilité");
|
||||||
|
value = value.replace("dexterity", "Dextérité");
|
||||||
|
value = value.replace("willpower", "Force Mentale");
|
||||||
|
value = value.replace("fellowship", "Sociabilité");
|
||||||
|
value = value.replace("initiative", "Initiative");
|
||||||
|
value = value.replace("intelligence", "Intelligence");
|
||||||
|
value = value.replace("armor points to the head", "PA à la Tête");
|
||||||
|
value = value.replace("subject to frenzy", "Sujet à la Frénésie");
|
||||||
|
value = value.replace("you do not scar", "Aucune cicatrice");
|
||||||
|
value = value.replace("movement", "Mouvement");
|
||||||
|
value = value.replace("armor points to all locations", "PA sur tout le corps");
|
||||||
|
value = value.replace("to any test when alone", "à tout les tests lorsque seul");
|
||||||
|
value = value.replace("track", "Pistage");
|
||||||
|
value = value.replace("to any test not hurting another", "à tout les Tests n'aggressant pas autrui");
|
||||||
|
value = value.replace("on tests to hurt", "pour les tests impliquant une agression")
|
||||||
|
value = value.replace("to all language tests when speaking", "à tout les Tests de Langue lorsque vous parlez");
|
||||||
|
value = value.replace("on perception tests involving sight", "aux Tests de Perception impliquant la Vue");
|
||||||
|
value = value.replace("to all Sociabilité tests", "à tout les Tests de Sociabilité");
|
||||||
|
return value;
|
||||||
|
},
|
||||||
|
"talent_name": (name, translation) => {
|
||||||
|
console.log("NAME !!!", name, translation)
|
||||||
|
},
|
||||||
|
"effects": (effects, translations) => {
|
||||||
|
if (!effects) return;
|
||||||
|
if (!translations) return;
|
||||||
|
for (let i = 0; i < effects.length; i++) {
|
||||||
|
let effect = effects[i];
|
||||||
|
//console.log("EFFECT LABEL1:", effect );
|
||||||
|
effect.label = translations['label' + i];
|
||||||
|
}
|
||||||
|
return effects
|
||||||
|
},
|
||||||
|
"diseases_effects": (effects, translations) => {
|
||||||
|
if (!effects) return;
|
||||||
|
for (let i = 0; i < effects.length; i++) {
|
||||||
|
let effect = effects[i];
|
||||||
|
let label = effect.label;
|
||||||
|
let gravity = "";
|
||||||
|
if (label.includes("(") && label.includes(")")) { // Then process specific skills name with (xxxx) inside
|
||||||
|
let re = /(.*) +\((.*)\)/i;
|
||||||
|
let res = re.exec(label);
|
||||||
|
label = res[1].trim(); // Get the gravity
|
||||||
|
gravity = " (" + game.i18n.localize(res[2].trim()) + ")"; // And the special keyword
|
||||||
|
}
|
||||||
|
effect.label = game.i18n.localize(label) + gravity;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Auto-translate duration
|
||||||
|
"spells_duration_range_target_damage": (value) => {
|
||||||
|
return WFRP4FrTranslation.processSpellContent(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------*/
|
||||||
|
Hooks.once('ready', () => {
|
||||||
|
|
||||||
|
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter => {
|
||||||
|
console.log("ClassCounter loaded", moduleCounter)
|
||||||
|
moduleCounter.ClassCounter.registerUsageCount("wh4-fr-translation")
|
||||||
|
}).catch(err =>
|
||||||
|
console.log("No stats available, giving up.")
|
||||||
|
)
|
||||||
|
|
||||||
|
});
|
5
modules/loadScripts.js
Normal file
5
modules/loadScripts.js
Normal file
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
|||||||
MANIFEST-000701
|
MANIFEST-000705
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
2024/05/17-11:04:57.796036 7f27116006c0 Recovering log #699
|
2024/05/17-12:49:53.730645 7f2710c006c0 Recovering log #703
|
||||||
2024/05/17-11:04:57.806593 7f27116006c0 Delete type=3 #697
|
2024/05/17-12:49:53.741035 7f2710c006c0 Delete type=3 #701
|
||||||
2024/05/17-11:04:57.806662 7f27116006c0 Delete type=0 #699
|
2024/05/17-12:49:53.741135 7f2710c006c0 Delete type=0 #703
|
||||||
2024/05/17-12:44:44.836364 7f270d8006c0 Level-0 table #704: started
|
2024/05/17-12:51:16.309488 7f270d8006c0 Level-0 table #708: started
|
||||||
2024/05/17-12:44:44.836392 7f270d8006c0 Level-0 table #704: 0 bytes OK
|
2024/05/17-12:51:16.309514 7f270d8006c0 Level-0 table #708: 0 bytes OK
|
||||||
2024/05/17-12:44:44.842760 7f270d8006c0 Delete type=0 #702
|
2024/05/17-12:51:16.315801 7f270d8006c0 Delete type=0 #706
|
||||||
2024/05/17-12:44:44.863585 7f270d8006c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal!suuYN87Al1ZZWtQQ' @ 0 : 0; will stop at (end)
|
2024/05/17-12:51:16.322991 7f270d8006c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal!suuYN87Al1ZZWtQQ' @ 0 : 0; will stop at (end)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
2024/05/17-09:18:35.938297 7fe534c006c0 Recovering log #695
|
2024/05/17-11:04:57.796036 7f27116006c0 Recovering log #699
|
||||||
2024/05/17-09:18:35.991443 7fe534c006c0 Delete type=3 #693
|
2024/05/17-11:04:57.806593 7f27116006c0 Delete type=3 #697
|
||||||
2024/05/17-09:18:35.991560 7fe534c006c0 Delete type=0 #695
|
2024/05/17-11:04:57.806662 7f27116006c0 Delete type=0 #699
|
||||||
2024/05/17-09:19:36.697860 7fe52e2006c0 Level-0 table #700: started
|
2024/05/17-12:44:44.836364 7f270d8006c0 Level-0 table #704: started
|
||||||
2024/05/17-09:19:36.697941 7fe52e2006c0 Level-0 table #700: 0 bytes OK
|
2024/05/17-12:44:44.836392 7f270d8006c0 Level-0 table #704: 0 bytes OK
|
||||||
2024/05/17-09:19:36.704693 7fe52e2006c0 Delete type=0 #698
|
2024/05/17-12:44:44.842760 7f270d8006c0 Delete type=0 #702
|
||||||
2024/05/17-09:19:36.718677 7fe52e2006c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal!suuYN87Al1ZZWtQQ' @ 0 : 0; will stop at (end)
|
2024/05/17-12:44:44.863585 7f270d8006c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal!suuYN87Al1ZZWtQQ' @ 0 : 0; will stop at (end)
|
||||||
|
Binary file not shown.
@ -1 +1 @@
|
|||||||
MANIFEST-000703
|
MANIFEST-000707
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
2024/05/17-11:04:57.809771 7f27102006c0 Recovering log #701
|
2024/05/17-12:49:53.743180 7f27102006c0 Recovering log #705
|
||||||
2024/05/17-11:04:57.819116 7f27102006c0 Delete type=3 #699
|
2024/05/17-12:49:53.753361 7f27102006c0 Delete type=3 #703
|
||||||
2024/05/17-11:04:57.819179 7f27102006c0 Delete type=0 #701
|
2024/05/17-12:49:53.753419 7f27102006c0 Delete type=0 #705
|
||||||
2024/05/17-12:44:44.850421 7f270d8006c0 Level-0 table #706: started
|
2024/05/17-12:51:16.315894 7f270d8006c0 Level-0 table #710: started
|
||||||
2024/05/17-12:44:44.850451 7f270d8006c0 Level-0 table #706: 0 bytes OK
|
2024/05/17-12:51:16.315916 7f270d8006c0 Level-0 table #710: 0 bytes OK
|
||||||
2024/05/17-12:44:44.856700 7f270d8006c0 Delete type=0 #704
|
2024/05/17-12:51:16.322697 7f270d8006c0 Delete type=0 #708
|
||||||
2024/05/17-12:44:44.863623 7f270d8006c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
|
2024/05/17-12:51:16.323011 7f270d8006c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
2024/05/17-09:18:35.994766 7fe5360006c0 Recovering log #697
|
2024/05/17-11:04:57.809771 7f27102006c0 Recovering log #701
|
||||||
2024/05/17-09:18:36.058245 7fe5360006c0 Delete type=3 #695
|
2024/05/17-11:04:57.819116 7f27102006c0 Delete type=3 #699
|
||||||
2024/05/17-09:18:36.058349 7fe5360006c0 Delete type=0 #697
|
2024/05/17-11:04:57.819179 7f27102006c0 Delete type=0 #701
|
||||||
2024/05/17-09:19:36.690166 7fe52e2006c0 Level-0 table #702: started
|
2024/05/17-12:44:44.850421 7f270d8006c0 Level-0 table #706: started
|
||||||
2024/05/17-09:19:36.690204 7fe52e2006c0 Level-0 table #702: 0 bytes OK
|
2024/05/17-12:44:44.850451 7f270d8006c0 Level-0 table #706: 0 bytes OK
|
||||||
2024/05/17-09:19:36.697272 7fe52e2006c0 Delete type=0 #700
|
2024/05/17-12:44:44.856700 7f270d8006c0 Delete type=0 #704
|
||||||
2024/05/17-09:19:36.697681 7fe52e2006c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
|
2024/05/17-12:44:44.863623 7f270d8006c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end)
|
||||||
|
Binary file not shown.
@ -1 +1 @@
|
|||||||
MANIFEST-000701
|
MANIFEST-000705
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
2024/05/17-11:04:57.835858 7f27102006c0 Recovering log #699
|
2024/05/17-12:49:53.768830 7f27102006c0 Recovering log #703
|
||||||
2024/05/17-11:04:57.847048 7f27102006c0 Delete type=3 #697
|
2024/05/17-12:49:53.779190 7f27102006c0 Delete type=3 #701
|
||||||
2024/05/17-11:04:57.847236 7f27102006c0 Delete type=0 #699
|
2024/05/17-12:49:53.779238 7f27102006c0 Delete type=0 #703
|
||||||
2024/05/17-12:44:44.864033 7f270d8006c0 Level-0 table #704: started
|
2024/05/17-12:51:16.329721 7f270d8006c0 Level-0 table #708: started
|
||||||
2024/05/17-12:44:44.864082 7f270d8006c0 Level-0 table #704: 0 bytes OK
|
2024/05/17-12:51:16.329747 7f270d8006c0 Level-0 table #708: 0 bytes OK
|
||||||
2024/05/17-12:44:44.871498 7f270d8006c0 Delete type=0 #702
|
2024/05/17-12:51:16.337070 7f270d8006c0 Delete type=0 #706
|
||||||
2024/05/17-12:44:44.871752 7f270d8006c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal!cZtNgayIw2QFhC9u' @ 0 : 0; will stop at (end)
|
2024/05/17-12:51:16.337186 7f270d8006c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal!cZtNgayIw2QFhC9u' @ 0 : 0; will stop at (end)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
2024/05/17-09:18:36.119253 7fe5360006c0 Recovering log #695
|
2024/05/17-11:04:57.835858 7f27102006c0 Recovering log #699
|
||||||
2024/05/17-09:18:36.181358 7fe5360006c0 Delete type=3 #693
|
2024/05/17-11:04:57.847048 7f27102006c0 Delete type=3 #697
|
||||||
2024/05/17-09:18:36.181531 7fe5360006c0 Delete type=0 #695
|
2024/05/17-11:04:57.847236 7f27102006c0 Delete type=0 #699
|
||||||
2024/05/17-09:19:36.704879 7fe52e2006c0 Level-0 table #700: started
|
2024/05/17-12:44:44.864033 7f270d8006c0 Level-0 table #704: started
|
||||||
2024/05/17-09:19:36.704925 7fe52e2006c0 Level-0 table #700: 0 bytes OK
|
2024/05/17-12:44:44.864082 7f270d8006c0 Level-0 table #704: 0 bytes OK
|
||||||
2024/05/17-09:19:36.711528 7fe52e2006c0 Delete type=0 #698
|
2024/05/17-12:44:44.871498 7f270d8006c0 Delete type=0 #702
|
||||||
2024/05/17-09:19:36.718713 7fe52e2006c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal!cZtNgayIw2QFhC9u' @ 0 : 0; will stop at (end)
|
2024/05/17-12:44:44.871752 7f270d8006c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal!cZtNgayIw2QFhC9u' @ 0 : 0; will stop at (end)
|
||||||
|
Binary file not shown.
@ -1 +1 @@
|
|||||||
MANIFEST-000701
|
MANIFEST-000705
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
2024/05/17-11:04:57.782664 7f27102006c0 Recovering log #699
|
2024/05/17-12:49:53.717738 7f27102006c0 Recovering log #703
|
||||||
2024/05/17-11:04:57.792823 7f27102006c0 Delete type=3 #697
|
2024/05/17-12:49:53.728205 7f27102006c0 Delete type=3 #701
|
||||||
2024/05/17-11:04:57.792891 7f27102006c0 Delete type=0 #699
|
2024/05/17-12:49:53.728307 7f27102006c0 Delete type=0 #703
|
||||||
2024/05/17-12:44:44.856874 7f270d8006c0 Level-0 table #704: started
|
2024/05/17-12:51:16.303437 7f270d8006c0 Level-0 table #708: started
|
||||||
2024/05/17-12:44:44.856907 7f270d8006c0 Level-0 table #704: 0 bytes OK
|
2024/05/17-12:51:16.303459 7f270d8006c0 Level-0 table #708: 0 bytes OK
|
||||||
2024/05/17-12:44:44.863227 7f270d8006c0 Delete type=0 #702
|
2024/05/17-12:51:16.309354 7f270d8006c0 Delete type=0 #706
|
||||||
2024/05/17-12:44:44.863636 7f270d8006c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal!yzw9I0r3hCK7PJnz' @ 0 : 0; will stop at (end)
|
2024/05/17-12:51:16.322968 7f270d8006c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal!yzw9I0r3hCK7PJnz' @ 0 : 0; will stop at (end)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
2024/05/17-09:18:35.865103 7fe5360006c0 Recovering log #695
|
2024/05/17-11:04:57.782664 7f27102006c0 Recovering log #699
|
||||||
2024/05/17-09:18:35.934830 7fe5360006c0 Delete type=3 #693
|
2024/05/17-11:04:57.792823 7f27102006c0 Delete type=3 #697
|
||||||
2024/05/17-09:18:35.934985 7fe5360006c0 Delete type=0 #695
|
2024/05/17-11:04:57.792891 7f27102006c0 Delete type=0 #699
|
||||||
2024/05/17-09:19:36.676671 7fe52e2006c0 Level-0 table #700: started
|
2024/05/17-12:44:44.856874 7f270d8006c0 Level-0 table #704: started
|
||||||
2024/05/17-09:19:36.676749 7fe52e2006c0 Level-0 table #700: 0 bytes OK
|
2024/05/17-12:44:44.856907 7f270d8006c0 Level-0 table #704: 0 bytes OK
|
||||||
2024/05/17-09:19:36.683586 7fe52e2006c0 Delete type=0 #698
|
2024/05/17-12:44:44.863227 7f270d8006c0 Delete type=0 #702
|
||||||
2024/05/17-09:19:36.697623 7fe52e2006c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal!yzw9I0r3hCK7PJnz' @ 0 : 0; will stop at (end)
|
2024/05/17-12:44:44.863636 7f270d8006c0 Manual compaction at level-0 from '!journal!50u8VAjdmovyr0hx' @ 72057594037927935 : 1 .. '!journal!yzw9I0r3hCK7PJnz' @ 0 : 0; will stop at (end)
|
||||||
|
Binary file not shown.
@ -1 +1 @@
|
|||||||
MANIFEST-000701
|
MANIFEST-000705
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
2024/05/17-11:04:57.769897 7f27116006c0 Recovering log #699
|
2024/05/17-12:49:53.704948 7f2710c006c0 Recovering log #703
|
||||||
2024/05/17-11:04:57.779543 7f27116006c0 Delete type=3 #697
|
2024/05/17-12:49:53.714865 7f2710c006c0 Delete type=3 #701
|
||||||
2024/05/17-11:04:57.779674 7f27116006c0 Delete type=0 #699
|
2024/05/17-12:49:53.714977 7f2710c006c0 Delete type=0 #703
|
||||||
2024/05/17-12:44:44.827875 7f270d8006c0 Level-0 table #704: started
|
2024/05/17-12:51:16.291228 7f270d8006c0 Level-0 table #708: started
|
||||||
2024/05/17-12:44:44.827939 7f270d8006c0 Level-0 table #704: 0 bytes OK
|
2024/05/17-12:51:16.291300 7f270d8006c0 Level-0 table #708: 0 bytes OK
|
||||||
2024/05/17-12:44:44.835981 7f270d8006c0 Delete type=0 #702
|
2024/05/17-12:51:16.303358 7f270d8006c0 Delete type=0 #706
|
||||||
2024/05/17-12:44:44.836202 7f270d8006c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
|
2024/05/17-12:51:16.322939 7f270d8006c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
2024/05/17-09:18:35.800961 7fe534c006c0 Recovering log #695
|
2024/05/17-11:04:57.769897 7f27116006c0 Recovering log #699
|
||||||
2024/05/17-09:18:35.861612 7fe534c006c0 Delete type=3 #693
|
2024/05/17-11:04:57.779543 7f27116006c0 Delete type=3 #697
|
||||||
2024/05/17-09:18:35.861767 7fe534c006c0 Delete type=0 #695
|
2024/05/17-11:04:57.779674 7f27116006c0 Delete type=0 #699
|
||||||
2024/05/17-09:19:36.683771 7fe52e2006c0 Level-0 table #700: started
|
2024/05/17-12:44:44.827875 7f270d8006c0 Level-0 table #704: started
|
||||||
2024/05/17-09:19:36.683809 7fe52e2006c0 Level-0 table #700: 0 bytes OK
|
2024/05/17-12:44:44.827939 7f270d8006c0 Level-0 table #704: 0 bytes OK
|
||||||
2024/05/17-09:19:36.690012 7fe52e2006c0 Delete type=0 #698
|
2024/05/17-12:44:44.835981 7f270d8006c0 Delete type=0 #702
|
||||||
2024/05/17-09:19:36.697655 7fe52e2006c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
|
2024/05/17-12:44:44.836202 7f270d8006c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end)
|
||||||
|
Binary file not shown.
@ -1 +1 @@
|
|||||||
MANIFEST-000344
|
MANIFEST-000348
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
2024/05/17-11:04:57.822877 7f27116006c0 Recovering log #342
|
2024/05/17-12:49:53.756075 7f2710c006c0 Recovering log #346
|
||||||
2024/05/17-11:04:57.832725 7f27116006c0 Delete type=3 #340
|
2024/05/17-12:49:53.766731 7f2710c006c0 Delete type=3 #344
|
||||||
2024/05/17-11:04:57.832777 7f27116006c0 Delete type=0 #342
|
2024/05/17-12:49:53.766827 7f2710c006c0 Delete type=0 #346
|
||||||
2024/05/17-12:44:44.842930 7f270d8006c0 Level-0 table #347: started
|
2024/05/17-12:51:16.323195 7f270d8006c0 Level-0 table #351: started
|
||||||
2024/05/17-12:44:44.842995 7f270d8006c0 Level-0 table #347: 0 bytes OK
|
2024/05/17-12:51:16.323228 7f270d8006c0 Level-0 table #351: 0 bytes OK
|
||||||
2024/05/17-12:44:44.850266 7f270d8006c0 Delete type=0 #345
|
2024/05/17-12:51:16.329597 7f270d8006c0 Delete type=0 #349
|
||||||
2024/05/17-12:44:44.863607 7f270d8006c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal!yfZxl4I7XAuUF6r3' @ 0 : 0; will stop at (end)
|
2024/05/17-12:51:16.337175 7f270d8006c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal!yfZxl4I7XAuUF6r3' @ 0 : 0; will stop at (end)
|
||||||
2024/05/17-12:44:44.864005 7f270d8006c0 Manual compaction at level-1 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal!yfZxl4I7XAuUF6r3' @ 0 : 0; will stop at (end)
|
2024/05/17-12:51:16.337202 7f270d8006c0 Manual compaction at level-1 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal!yfZxl4I7XAuUF6r3' @ 0 : 0; will stop at (end)
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
2024/05/17-09:18:36.061831 7fe534c006c0 Recovering log #338
|
2024/05/17-11:04:57.822877 7f27116006c0 Recovering log #342
|
||||||
2024/05/17-09:18:36.115673 7fe534c006c0 Delete type=3 #336
|
2024/05/17-11:04:57.832725 7f27116006c0 Delete type=3 #340
|
||||||
2024/05/17-09:18:36.115838 7fe534c006c0 Delete type=0 #338
|
2024/05/17-11:04:57.832777 7f27116006c0 Delete type=0 #342
|
||||||
2024/05/17-09:19:36.711754 7fe52e2006c0 Level-0 table #343: started
|
2024/05/17-12:44:44.842930 7f270d8006c0 Level-0 table #347: started
|
||||||
2024/05/17-09:19:36.711813 7fe52e2006c0 Level-0 table #343: 0 bytes OK
|
2024/05/17-12:44:44.842995 7f270d8006c0 Level-0 table #347: 0 bytes OK
|
||||||
2024/05/17-09:19:36.718459 7fe52e2006c0 Delete type=0 #341
|
2024/05/17-12:44:44.850266 7f270d8006c0 Delete type=0 #345
|
||||||
2024/05/17-09:19:36.718736 7fe52e2006c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal!yfZxl4I7XAuUF6r3' @ 0 : 0; will stop at (end)
|
2024/05/17-12:44:44.863607 7f270d8006c0 Manual compaction at level-0 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal!yfZxl4I7XAuUF6r3' @ 0 : 0; will stop at (end)
|
||||||
2024/05/17-09:19:36.718776 7fe52e2006c0 Manual compaction at level-1 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal!yfZxl4I7XAuUF6r3' @ 0 : 0; will stop at (end)
|
2024/05/17-12:44:44.864005 7f270d8006c0 Manual compaction at level-1 from '!journal!056ILNNrLiPq3Gi3' @ 72057594037927935 : 1 .. '!journal!yfZxl4I7XAuUF6r3' @ 0 : 0; will stop at (end)
|
||||||
|
Binary file not shown.
BIN
packs/tables-des-traductions/MANIFEST-000348
Normal file
BIN
packs/tables-des-traductions/MANIFEST-000348
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user