swade-fr-content/modules/swade-fr-init.js

459 lines
17 KiB
JavaScript
Raw Normal View History

2023-10-20 22:25:59 +02:00
import { SWDELUXStatBlockParser } from "./sw-statblock-parser.js";
2021-03-15 09:22:27 +01:00
2023-04-04 07:48:22 +02:00
const __compFolderTranslation = [
{
2022-02-05 00:23:39 +01:00
compendium: 'swade-core-rules.swade-vehicles',
2023-04-04 07:48:22 +02:00
words: [
{ source: 'Vehicles', translation: 'Véhicules' },
{ source: 'Aircraft', translation: 'Avions' },
{ source: 'Civilian', translation: 'Civils' },
{ source: 'Modern Military Aircraft', translation: 'Avions Militaires Modernes' },
{ source: 'World War II Military Aircraft', translation: 'Avions Seconde Guerre Mondiale' },
2022-02-05 00:23:39 +01:00
]
}
]
class FolderTranslate {
2023-04-04 07:48:22 +02:00
2022-02-05 00:23:39 +01:00
static async translateFolders() {
2023-04-04 07:48:22 +02:00
for (let tData of __compFolderTranslation) {
2022-02-05 00:23:39 +01:00
let pack = game.packs.get(tData.compendium);
let wasLocked = false;
2023-04-04 07:48:22 +02:00
if (pack.locked) {
await pack.configure({ locked: false })
2022-02-05 00:23:39 +01:00
wasLocked = true;
}
let folders = await game.CF.FICFolderAPI.loadFolders(tData.compendium);
for (let trans of tData.words) {
2023-04-04 07:48:22 +02:00
let folderToChange = folders.contents.find(f => f.name === trans.source);
if (folderToChange) {
2022-02-05 00:23:39 +01:00
await game.CF.FICFolderAPI.renameFolder(folderToChange, trans.translation);
}
}
2023-04-04 07:48:22 +02:00
if (wasLocked) {
await pack.configure({ locked: true })
2022-02-05 00:23:39 +01:00
}
}
2023-04-04 07:48:22 +02:00
}
2022-02-05 00:23:39 +01:00
}
/************************************************************************************/
Hooks.once('translateCompendiumFolders', () => {
console.log("LOADED !!!!!!")
});
/************************************************************************************/
class swadeFrTranslator {
2023-04-04 07:48:22 +02:00
static getRank(rank) {
if (rank == 'Novice') return 'Novice';
if (rank == 'Seasoned') return 'Aguerri';
if (rank == 'Veteran') return 'Vétéran';
if (rank == 'Heroic') return 'Héroïque';
if (rank == 'Legendary') return 'Légendaire';
return false
}
2023-04-04 07:48:22 +02:00
static getAttribute(attr) {
console.log("Attr is", attr)
2023-04-04 07:48:22 +02:00
if (attr == "Agility") return 'Agilité';
if (attr == "Smarts") return 'Intellect';
if (attr == "Spirit") return 'Ame';
if (attr == "Strength") return 'Force';
if (attr == "Vigor") return 'Vigueur';
return false
}
}
2021-03-15 09:22:27 +01:00
/************************************************************************************/
Hooks.once('init', () => {
2021-03-28 18:33:31 +02:00
2023-10-20 22:25:59 +02:00
console.log("INIT !!!!!!")
2023-04-04 07:48:22 +02:00
if (typeof Babele !== 'undefined') {
2021-03-15 09:22:27 +01:00
console.log("BABELE LOADED !!!");
2023-04-04 07:48:22 +02:00
Babele.get().register({
module: 'swade-fr-content',
lang: 'fr',
dir: 'compendiums'
});
2021-03-28 18:33:31 +02:00
Babele.get().registerConverters({
2021-11-16 14:53:31 +01:00
"gear_skill": (skill) => {
let transl = skill
2023-10-20 22:25:59 +02:00
//console.log("Testing", skill)
2021-11-16 14:53:31 +01:00
if (skill) {
2023-04-04 07:48:22 +02:00
let translated = game.babele.translate("swade-core-rules.swade-skills", { name: skill.trim() }, true)
transl = translated.name || skill.trim()
}
return transl
},
2023-10-20 22:25:59 +02:00
"skill_swid": (swid) => {
2023-10-25 21:27:00 +02:00
if (swid == "combat") return "fighting";
if (swid == "tir") return "shooting";
2023-10-20 22:25:59 +02:00
return swid
},
2023-05-02 21:25:23 +02:00
"category_converter": (category) => {
return game.i18n.localize(category)
},
"edge_requirements": (req) => {
let reqTab = req.split(",")
let results = []
for (let item of reqTab) {
let keyName = item.match(/([\w\s\(\)]+) (d[\w\+]*)/)
//console.log("Keyword", item, keyName)
if (keyName && keyName[2]) { // This is a skill or attribute
let toTranslate = keyName[1].trim()
2023-04-04 07:48:22 +02:00
let attr = swadeFrTranslator.getAttribute(toTranslate)
if (attr) { // Test if attribute
results.push(attr + " " + keyName[2].trim())
} else { // Test if skill
2023-04-04 07:48:22 +02:00
let translated = game.babele.translate("swade-core-rules.swade-skills", { name: toTranslate }, true)
if (!translated.name) {
translated = game.babele.translate("deadlands-core-rules.deadlands-skills", { name: toTranslate }, true)
}
let transResult = translated.name || toTranslate
2023-04-04 07:48:22 +02:00
results.push(transResult + " " + keyName[2].trim())
}
} else { // Rank or edge
let itemName = item.trim()
let rank = swadeFrTranslator.getRank(itemName)
if (rank) {
2023-04-04 07:48:22 +02:00
results.push(rank)
} else {
2023-04-04 07:48:22 +02:00
let translated = game.babele.translate("swade-core-rules.swade-edges", { name: itemName }, true)
if (!translated.name) {
translated = game.babele.translate("deadlands-core-rules.deadlands-edges", { name: itemName }, true)
}
let transResult = translated.name || itemName
2023-04-04 07:48:22 +02:00
results.push(transResult)
}
2023-04-04 07:48:22 +02:00
}
2021-11-16 14:53:31 +01:00
}
2023-05-02 21:25:23 +02:00
//console.log(">>>>>>>>>>>>>>>>>>>>>>>>><REQ !!!!", req, results)
return results.join(", ")
2021-11-16 14:53:31 +01:00
},
"gear_range": (range) => {
if (range) {
2023-04-04 07:48:22 +02:00
if (range == 'Cone Template') return 'Gabarit de cone';
2021-11-16 14:53:31 +01:00
}
return range;
},
"gear_ammo": (ammo) => {
if (ammo) {
2023-04-04 07:48:22 +02:00
if (ammo == 'Arrows/Bolts') return 'Flèches/Carreaux';
if (ammo == 'Canister Shot (Cannon)') return 'Cartouches (Canon)';
if (ammo == 'Shrapnel Shot (Cannon)') return 'Shrapnel (Canon)';
if (ammo == 'Solid Shot (Cannon)') return 'Solide (Canon)';
if (ammo == 'Bullets, Medium') return 'Balles, Moyenne';
if (ammo == 'Shotgun Shells') return 'Cartouche de Shotgun';
if (ammo == 'Laser Battery, Pistol') return 'Batterie pour laser, Pistolet';
if (ammo == 'Laser Battery, Rifle / SMG') return 'Batterie pour laser, Fusil';
2021-11-16 14:53:31 +01:00
}
return ammo;
2023-04-04 07:48:22 +02:00
},
2021-03-28 18:33:31 +02:00
"powers_duration": (duration) => {
2023-04-04 07:48:22 +02:00
if (duration == 'One hour') return '1 heure';
if (duration == 'Instant (slot); 5 (speed)') return 'Instantanée (apathie), 5 (vitesse)';
if (duration == '(boost); Instant (lower)') return '5 (augmentation), Instantanée (diminution)';
if (duration == 'Instant') return 'Instantannée';
if (duration == 'Until the end of the victim\'s next turn') return 'Jusquà la fin du prochain tour de la victime';
if (duration == 'A brief conversation of about five minutes') return 'Une brève conversation d\'environ 5 minutes';
if (duration == '5 (detect), one hour (conceal)') return '5 (détection), 1 heure (dissimulation)';
if (duration == 'Instant (Sound); 5 (Silence)') return 'Instantanée (son), 5 (silence)';
2021-03-28 18:33:31 +02:00
return duration;
},
"powers_range": (range) => {
2023-04-04 07:48:22 +02:00
if (range == 'Smarts x5 (Sound); Smarts (Silence)')
return 'Intellect ×5 (son), Intellect (silence)';
2023-04-04 07:48:22 +02:00
if (range == "Cone Template")
return "Gabarit de cône"
2023-04-04 07:48:22 +02:00
if (range == "Touch")
2021-03-28 18:33:31 +02:00
return "Toucher"
2023-04-04 07:48:22 +02:00
if (range == "Sm")
return "Intellect"
2023-04-04 07:48:22 +02:00
if (range == "Sm x 2" || range == "Sm x2")
return "Intellect x2"
2023-04-04 07:48:22 +02:00
if (range == "Self")
return "Personnel"
2021-03-28 18:33:31 +02:00
return range;
},
"powers_rank": (rank) => {
2023-04-04 07:48:22 +02:00
return swadeFrTranslator.getRank(rank)
}
2023-04-04 07:48:22 +02:00
});
2021-03-15 09:22:27 +01:00
}
});
2023-04-04 07:48:22 +02:00
/* -------------------------------------------- */
export class SwadeFRContentCommands {
static init() {
2023-10-20 22:25:59 +02:00
2023-04-04 07:48:22 +02:00
if (!game.swadeFRContent) {
const swadeFRCommands = new SwadeFRContentCommands()
swadeFRCommands.registerCommand({ path: ["/montremonsecret"], func: (content, msg, params) => SwadeFRContentCommands.enableSecret(), descr: "Affiche les compendiums secrets" });
swadeFRCommands.registerCommand({ path: ["/cachemonsecret"], func: (content, msg, params) => SwadeFRContentCommands.disableSecret(), descr: "Cache les compendiums secrets" });
2023-10-20 22:25:59 +02:00
swadeFRCommands.registerCommand({ path: ["/statparser"], func: (content, msg, params) => SwadeFRContentCommands.statParser(), descr: "Parse SW Delux stat block" });
2023-04-04 07:48:22 +02:00
game.swadeFRContent = { commands: swadeFRCommands }
}
Hooks.on("chatMessage", (html, content, msg) => {
2023-10-20 22:25:59 +02:00
console.log("CHAT PARSER!!!")
2023-04-04 07:48:22 +02:00
if (content[0] == '/') {
let regExp = /(\S+)/g;
let commands = content.match(regExp);
if (game.swadeFRContent.commands.processChatCommand(commands, content, msg)) {
return false;
}
}
return true
})
}
constructor() {
this.commandsTable = {}
}
/* -------------------------------------------- */
registerCommand(command) {
this._addCommand(this.commandsTable, command.path, '', command);
}
/* -------------------------------------------- */
_addCommand(targetTable, path, fullPath, command) {
if (!this._validateCommand(targetTable, path, command)) {
return;
}
const term = path[0];
fullPath = fullPath + term + ' '
if (path.length == 1) {
command.descr = `<strong>${fullPath}</strong>: ${command.descr}`;
targetTable[term] = command;
}
else {
if (!targetTable[term]) {
targetTable[term] = { subTable: {} };
}
this._addCommand(targetTable[term].subTable, path.slice(1), fullPath, command)
}
}
/* -------------------------------------------- */
_validateCommand(targetTable, path, command) {
if (path.length > 0 && path[0] && command.descr && (path.length != 1 || targetTable[path[0]] == undefined)) {
return true;
}
console.warn("Commande invalide", targetTable, path, command);
return false;
}
/* -------------------------------------------- */
/* Manage chat commands */
processChatCommand(commandLine, content = '', msg = {}) {
// Setup new message's visibility
let rollMode = game.settings.get("core", "rollMode");
if (["gmroll", "blindroll"].includes(rollMode)) msg["whisper"] = ChatMessage.getWhisperRecipients("GM");
if (rollMode === "blindroll") msg["blind"] = true;
msg["type"] = 0;
let command = commandLine[0].toLowerCase();
let params = commandLine.slice(1);
return this.process(command, params, content, msg);
}
/* -------------------------------------------- */
process(command, params, content, msg) {
return this._processCommand(this.commandsTable, command, params, content, msg);
}
/* -------------------------------------------- */
static enableSecret() {
game.settings.set("world", "swade-fr-content-hidden-compendiums", true)
}
/* -------------------------------------------- */
static disableSecret() {
game.settings.set("world", "swade-fr-content-hidden-compendiums", false)
}
2023-10-20 22:25:59 +02:00
/* -------------------------------------------- */
static statParser() {
let dialogue = new Dialog({
title: `Import`,
content: `<p>Stab block: <textarea id="swdelux-stat-parser" rows="20" cols="40"></textarea></p>`,
buttons: {
one: {
icon: '',
label: 'Parser !',
callback: (html) => {
let text = html.find('#swdelux-stat-parser').val();
let parser = new SWDELUXStatBlockParser(text);
parser.parse(text);
}
}
}
})
dialogue.render(true)
}
2023-04-04 07:48:22 +02:00
/* -------------------------------------------- */
_processCommand(commandsTable, name, params, content = '', msg = {}, path = "") {
console.log("===> Processing command")
let command = commandsTable[name];
path = path + name + " ";
2023-10-20 22:25:59 +02:00
if (command?.subTable) {
2023-04-04 07:48:22 +02:00
if (params[0]) {
return this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path)
}
else {
this.help(msg, command.subTable);
return true;
}
}
2023-10-20 22:25:59 +02:00
if (command?.func) {
2023-04-04 07:48:22 +02:00
const result = command.func(content, msg, params);
if (result == false) {
BoLCommands._chatAnswer(msg, command.descr);
}
return true;
}
return false;
}
}
/************************************************************************************/
2023-04-04 07:48:22 +02:00
const transFolder = { "Actor": "Acteur", "Edges": "Atouts" }
const subFolder = {
'Social Edges': 'Atouts sociaux', 'Background Edges': 'Atouts de Background', 'Combat Edges': 'Atouts de combat',
'Leadership Edges': 'Atouts de commandement', 'Legendary Edges': 'Atouts légendaires', 'Power Edges': 'Atouts de pouvoir',
'Professional Edges': 'Atouts professionnels', 'Weird Edges': 'Atouts étranges', 'Edges': 'Atouts', 'Hindrances': 'Handicaps', 'Skills': 'Compétences',
'Equipment': 'Equipement', 'Ammo': 'Munitions', 'Armor': 'Armure', 'Common Gear': 'Matériel commun', 'Modern Firearms': 'Armes à feu modernes',
'Personal Weapons': 'Armes', 'Special Weapons': 'Armes spéciales', 'Bullet': 'Balles', 'Cannon': 'Canon', 'Laser Battery': 'Batterie Laser',
'Adventuring Gear': 'Matériel d\'aventure', 'Animals and Tack': 'Animaux', 'Clothing': 'Vêtements', 'Computers & Electronics': 'Ordinateurs et Electroniques',
'Firearms Accessories': 'Accessoires armes à feu', 'Food': 'Nourriture', 'Personal Defense': 'Auto-défense', 'Futuristic': 'Futuriste',
'Medieval & Ancient': 'Médiévale et Antiquité', 'Modern': 'Moderne', 'Shields': 'Boucliers', 'Laser (Futuristic)': 'Laser (Fururiste)',
'Machine Guns': 'Mitraillettes', 'Pistols': 'Pistolets', 'Rifles': 'Fusils', 'Submachine Guns': 'Semi-automatiques', 'Cannons': 'Canons',
'Catapults': 'Catapultes', 'Flamethrowers': 'Lance-flammes', 'Rocket Launchers & Torpedoes': 'Lance roquettes et torpilles',
'Vehicular Weapons': 'Armes de véhicules'
}
2021-03-28 18:58:41 +02:00
2023-04-04 07:48:22 +02:00
/************************************************************************************/
2022-02-06 19:07:10 +01:00
// Register world usage statistics
2023-04-04 07:48:22 +02:00
function registerUsageCount(registerKey) {
if (game.user.isGM) {
2022-02-06 19:07:10 +01:00
game.settings.register(registerKey, "world-key", {
name: "Unique world key",
scope: "world",
config: false,
default: "",
2022-02-06 19:07:10 +01:00
type: String
});
let worldKey = game.settings.get(registerKey, "world-key")
2023-04-04 07:48:22 +02:00
if (worldKey == undefined || worldKey == "") {
2022-02-06 19:07:10 +01:00
worldKey = randomID(32)
2023-04-04 07:48:22 +02:00
game.settings.set(registerKey, "world-key", worldKey)
2022-02-06 19:07:10 +01:00
}
// Simple API counter
2022-10-09 21:54:52 +02:00
let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"`
2022-02-19 09:30:35 +01:00
$.ajax(regURL)
2022-02-06 19:07:10 +01:00
/* -------------------------------------------- */
}
}
2023-04-04 07:48:22 +02:00
/************************************************************************************/
async function loadSecretCompendiums() {
if (game.settings.get("world", "swade-fr-content-hidden-compendiums")) {
console.log(">>>>> Load hidden compendiums!")
/* Load rules */
let urls = ["modules/swade-fr-content/compendiums/swade-core-rules.swade-rules-secret.json"]
const [translations] = await Promise.all(
[Promise.all(urls.map((url) => fetch(url).then((r) => r.json()).catch(e => { })))]);
let metadata = game.data.packs.find(p => p.name == "swade-rules")
if (metadata) {
let translation;
translations.forEach(t => {
if (t) {
translation = t; // the last valid
}
});
if (translation) {
let babele = Babele.get()
let entry = mergeObject(translation, { collection: metadata.id })
babele.translations.push(entry)
console.log(">>>>", babele.translations)
babele.packs.set(metadata.id, new TranslatedCompendium(metadata, entry))
}
}
}
}
2023-10-25 21:27:00 +02:00
/************************************************************************************/
function processItemSwid(actor, item) {
let swid = item.system.swid
let newSwid = swid
if (swid == "combat") newSwid = "fighting";
if (swid == "tir") newSwid = "shooting";
if (swid != newSwid) {
console.log("Item to update", item.name, swid, newSwid)
actor.updateEmbeddedDocuments('Item', [{ _id: item.id, "system.swid": newSwid }])
}
}
/************************************************************************************/
function migrateSwid() {
for (let actor of game.actors) {
for (let item of actor.items) {
if (item.system?.swid) {
processItemSwid(actor, item)
}
}
}
}
/************************************************************************************/
function checkSwidSettings() {
let swidFighting = game.settings.get('swade', 'parryBaseSwid')
if (swidFighting != "fighting") {
ui.notifications.warn("Votre compétence de parade n'est pas positionnée à 'fighting' dans les paramètres de SWADE. Nous vous recommandons de le faire pour éviter des problèmes de calcul de la parade.")
//game.settings.set('swade', 'parryBaseSwid', "fighting")
}
}
/************************************************************************************/
Hooks.once('ready', () => {
2023-10-20 22:25:59 +02:00
console.log(">>>>>>>>>>")
2022-02-05 00:23:39 +01:00
2023-04-04 07:48:22 +02:00
// add hidden register
game.settings.register("world", "swade-fr-content-hidden-compendiums", {
name: "Montrer les compendiums cachés",
scope: "world",
config: false,
default: false,
type: Boolean,
onChange: lang => window.location.reload()
})
2023-10-20 22:25:59 +02:00
2023-04-04 07:48:22 +02:00
SwadeFRContentCommands.init()
2023-10-25 21:27:00 +02:00
migrateSwid()
checkSwidSettings()
2023-04-04 07:48:22 +02:00
2022-02-06 17:48:39 +01:00
//FolderTranslate.translateFolders()
2022-04-29 15:30:12 +02:00
registerUsageCount("swade-fr-content")
2021-03-17 18:10:14 +01:00
});
2022-02-06 19:07:10 +01:00
2023-04-04 07:48:22 +02:00
/************************************************************************************/
Hooks.once('babele.ready', () => {
2023-10-20 22:25:59 +02:00
console.log(">>>>>>>>>> BABELE READY")
2023-04-04 07:48:22 +02:00
loadSecretCompendiums()
});
2023-10-20 22:25:59 +02:00
console.log(">>>>>>>>>>>> LOADED")