diff --git a/ChroniquesGalactiques/ReadMe.md b/ChroniquesGalactiques/ReadMe.md index 053eaa631b..f7c7dc8b21 100644 --- a/ChroniquesGalactiques/ReadMe.md +++ b/ChroniquesGalactiques/ReadMe.md @@ -9,11 +9,17 @@ Cette feuilles de personnage inclue quelques jets et règles optionnelles. Le jeu complet est paru dans le magazine [Casus Belli](http://www.black-book-editions.fr/catalogue.php?id=207) #17,18 et 19. # Version courante -V3.10 [Screenshot](cog_v3.png) +V3.11 [Screenshot](cog_v3.png) # Notes de version -## V3.10 -* Retour à un schema de versionning sémantique classique (major.minor.patch) + +## V3.11 (2020.08.15) +* Amélioration de la logique d'import d'un statblock de PNJ ou de créature +* Lancement de l'import du statblock via un bouton + +## V3.10 (2020.08.04) +* Retour au schema de versionning sémantique classique (major.minor.patch) +* Modification de la logique de migration/mise à jour du sheetworker ## V2020.0525 * Reprise des dernières modifications de la fiche COC diff --git a/ChroniquesGalactiques/cog.css b/ChroniquesGalactiques/cog.css index ccde2c2bd1..d20e1965ed 100644 --- a/ChroniquesGalactiques/cog.css +++ b/ChroniquesGalactiques/cog.css @@ -1,3 +1,5 @@ +/* @import url('https://fonts.googleapis.com/css?family=Fira+Sans&display=swap'); */ + /* Couleurs Base bleu = #2F5860 Bleu light = #7F989D @@ -59,7 +61,7 @@ table.sheet-tabsep { } .sheet-boxtitre { - font-family: "Contrail One"; + font-family: 'Contrail One'; font-size: 15px; background-color: #2f5860; text-align: center; @@ -73,7 +75,7 @@ table.sheet-tabsep { } .sheet-boxtitresmall { - font-family: "Contrail One"; + font-family: 'Contrail One'; font-size: 13px; background-color: #2f5860; text-align: center; @@ -134,7 +136,7 @@ textarea.sheet-boxability { } .sheet-textfat { - font-family: "Contrail One"; + font-family: 'Contrail One'; /* 'Contrail One'; */ font-size: 15px; font-weight: bold; @@ -144,7 +146,7 @@ textarea.sheet-boxability { } .sheet-textfatleft { - font-family: "Contrail One"; + font-family: 'Contrail One'; /* 'Contrail One'; */ font-size: 15px; font-weight: bold; @@ -156,7 +158,7 @@ textarea.sheet-boxability { } .sheet-textbase { - font-family: "Contrail One"; + font-family: 'Contrail One'; /* 'Contrail One'; */ font-size: 14px; color: #2f5860; @@ -176,9 +178,9 @@ textarea.sheet-boxability { font-weight: normal; } -button[type="roll"].sheet-boxtitre { +button[type='roll'].sheet-boxtitre { height: 20px; - font-family: "Contrail One"; + font-family: 'Contrail One'; /* 'Contrail One'; */ font-size: 15px; font-weight: normal; @@ -190,14 +192,14 @@ button[type="roll"].sheet-boxtitre { text-shadow: none; } -button[type="roll"].sheet-boxtitre:hover { +button[type='roll'].sheet-boxtitre:hover { font-weight: bold; background-color: #7f989d; border: 1px solid white; } -button[type="roll"].sheet-neutre, -button[type="roll"].sheet-output { +button[type='roll'].sheet-neutre, +button[type='roll'].sheet-output { color: #2f5860; font-weight: normal; font-size: 20px; @@ -211,27 +213,31 @@ button[type="roll"].sheet-output { margin: 0px; } -button[type="roll"].sheet-neutre:hover, -button[type="roll"].sheet-output:hover { +button[type='roll'].sheet-neutre:hover, +button[type='roll'].sheet-output:hover { font-weight: bold; } -button[type="roll"].sheet-output { +button[type='roll'].sheet-output { font-family: pictos; } -button[type="roll"].sheet-output:before { - content: ""; +button[type='roll'].sheet-output:before { + content: ''; } -button[type="action"].sheet-boxtitre:hover { +button[type='action'].sheet-boxtitre:hover { border-radius: 2px; background-color: #7f989d; } -button[type="action"].sheet-iconbtn { +button.sheet-flatbtn { border: 0px; background-color: transparent; + font-size: 12px !important; +} + +button[type='action'].sheet-iconbtn { font-family: pictos; font-size: large; } @@ -268,12 +274,12 @@ select.sheet-selectmin { appearance: none; } -input[type="number"] { +input[type='number'] { width: 60px; text-align: right; } -input[type="text"] { +input[type='text'] { width: 100%; text-align: left; padding-left: 4px; @@ -395,7 +401,7 @@ input.sheet-hidden-tab { /* Switch -- styled checkboxes */ -input[type="checkbox"].sheet-block-switch { +input[type='checkbox'].sheet-block-switch { opacity: 0; width: 16px; height: 16px; @@ -407,20 +413,20 @@ input[type="checkbox"].sheet-block-switch { z-index: 1; } -input[type="checkbox"].sheet-block-switch + span::before { +input[type='checkbox'].sheet-block-switch + span::before { margin-right: 4px; line-height: 14px; text-align: center; display: inline-block; vertical-align: middle; - content: "►"; + content: '►'; width: 16px; height: 16px; font-size: 12px; } -input[type="checkbox"].sheet-block-switch:checked + span::before { - content: "▼"; +input[type='checkbox'].sheet-block-switch:checked + span::before { + content: '▼'; } .sheet-block-hidden, @@ -507,7 +513,7 @@ input[type="checkbox"].sheet-block-switch:checked + span::before { padding: 0px 5px 0px 5px; font-size: 16px; text-align: left; - font-family: "Contrail One"; + font-family: 'Contrail One'; font-variant: small-caps; font-weight: bold; white-space: nowrap; @@ -517,14 +523,14 @@ input[type="checkbox"].sheet-block-switch:checked + span::before { color: #000; font-size: 12px; font-style: italic; - font-family: "Verdana"; + font-family: 'Verdana'; font-variant: small-caps; text-align: right; white-space: nowrap; } .sheet-rolltemplate-co1 .sheet-tcat { - font-family: "Verdana"; + font-family: 'Verdana'; font-size: 12px; font-weight: normal; text-align: right; @@ -534,7 +540,7 @@ input[type="checkbox"].sheet-block-switch:checked + span::before { .sheet-rolltemplate-co1 td { margin: 0px; padding: 0px 5px 0px 5px; - font-family: "Verdana"; + font-family: 'Verdana'; font-size: 12px; font-weight: normal; white-space: nowrap; @@ -561,7 +567,7 @@ input[type="checkbox"].sheet-block-switch:checked + span::before { border-color: #7f989d; border-style: solid; border-radius: 25%; - font-family: "Contrail One"; + font-family: 'Contrail One'; font-size: 16px; } @@ -571,7 +577,7 @@ input[type="checkbox"].sheet-block-switch:checked + span::before { border-color: #3fb315; border-style: solid; border-radius: 25%; - font-family: "Contrail One"; + font-family: 'Contrail One'; font-size: 16px; } @@ -581,7 +587,7 @@ input[type="checkbox"].sheet-block-switch:checked + span::before { border-color: #b31515; border-style: solid; border-radius: 25%; - font-family: "Contrail One"; + font-family: 'Contrail One'; font-size: 16px; } @@ -591,6 +597,6 @@ input[type="checkbox"].sheet-block-switch:checked + span::before { border-color: #2f5860; border-style: solid; border-radius: 25%; - font-family: "Contrail One"; + font-family: 'Contrail One'; font-size: 16px; } diff --git a/ChroniquesGalactiques/cog.html b/ChroniquesGalactiques/cog.html index 55aae4a063..53e8082fe4 100644 --- a/ChroniquesGalactiques/cog.html +++ b/ChroniquesGalactiques/cog.html @@ -1,8 +1,8 @@
- - + + @@ -310,35 +310,35 @@ - - - - - - - - @@ -1520,7 +1520,7 @@
-
PARAMETRES
@@ -2515,6 +2515,7 @@ placeholder="Coller ici un statblock copié depuis le PDF">
+
@@ -2694,8 +2695,8 @@ /** * Log any type of data to the browser console - * @param {any} l - * @param {string} m + * @param {any} l + * @param {string} m */ function consoleLog(l, m) { m = m || ''; @@ -2706,8 +2707,7 @@ function consoleLog(l, m) { console.log(`[CO sheetworker${m}] <<<`); console.log(l); console.log(`[CO sheetworker${m}] >>>`); - } - else { + } else { console.log(`[CO sheetworker${m}] ${l}`); } } @@ -2751,12 +2751,24 @@ function parseNameValue(data, delim) { } parsed = { name: name, - value: value - } + value: value, + }; } return parsed; } +/** + * Remove all rows for a repeating section + * @param {string} sectionName Repeating section to clear + */ +function removeRepeating(sectionName) { + getSectionIDs(sectionName, function (ids) { + for (let id of ids) { + removeRepeatingRow(`repeating_${sectionName}_${id}`); + } + }); +} + /** * Add a trait/ability to an NPC object * @param {object} npcObj @@ -2778,64 +2790,113 @@ function addTrait(npcObj, traitObj) { */ function importStatblock(text) { text = text.replace(/\r/g, ''); - text = text.replace(/ \(DM/g, ' DM'); - text = text.replace(/ \(RD/g, ' RD'); - text = text.replace(/\, /g, ' '); text = text.replace(/\n[ ]*\+/g, '+'); - var npc = {}; + var npc = { + NC: 0, + PROFIL: '', + TAILLE: '', + FOR: '', + DEX: '', + CON: '', + INT: '', + PER: '', + SAG: '', + CHA: '', + INIT: 0, + PV: 0, + DEF: 0, + DEP: 0, + Atks: [], + Capas: [], + Extras: [], + }; + npc['ATP-PER'] = 0; + npc['ATP-CHA'] = 0; var rows = text.split(/\n/); var capacites = false; - var capacite = { 'nom': '', 'desc': '' }; + var capacite = { nom: '', desc: '' }; console.log('** CO sheetworker : parsing text <<<'); rows.forEach(function (row, rownr) { - console.log(row); - if (rownr === 0 && row.toUpperCase().indexOf('NC') === -1) { - npc['character_name'] = row.trim(); // assume first line is name + let dataRow = row.trim(); + console.log(dataRow); + if (rownr === 0 && dataRow.toUpperCase().indexOf('NC') === -1) { + // assume first line is name + npc['character_name'] = dataRow; return; } - if (!capacites && row.toUpperCase().indexOf('DM') !== -1) { // this is an attack line - row = row.replace(/\)$/g, ''); // handle CG statblocks - if (!npc.Atks) npc.Atks = []; - npc.Atks.push(row); + // reading attacks list + if (!capacites) { + const atkRow = dataRow.toUpperCase(); + if (atkRow.indexOf('ATTAQUE') === 0 || atkRow.indexOf('DM') !== -1) { + // this is an attack line, handle CG statblocks + dataRow = dataRow.replace(/ \(DM/g, ' DM'); + dataRow = dataRow.replace(/\)$/g, ''); + npc['Atks'].push(dataRow); + return; + } + } + // reading paths & ranks + if (dataRow.toUpperCase().startsWith('VOIE ')) { + npc['Extras'].push(dataRow); return; } - if (capacites) { // start parsing traits - let s = row.indexOf(':'); + if (capacites) { + // reading abilities list + let s = dataRow.indexOf(':'); if (s !== -1) { addTrait(npc, capacite); - capacite['nom'] = row.substring(0, s - 1).trim(); - if (capacite['nom'].indexOf(' RD') !== -1) capacite['nom'] = capacite['nom'].replace(' RD', ' (RD'); - capacite['desc'] = row.substring(s + 1).trim(); + capacite['nom'] = dataRow.substring(0, s - 1).trim(); + if (capacite['nom'].indexOf(' RD') !== -1) { + capacite['nom'] = capacite['nom'].replace(' RD', ' (RD'); + } + capacite['desc'] = dataRow.substring(s + 1).trim(); } else { - capacite['desc'] += ' ' + row.trim(); + capacite['desc'] += ' ' + dataRow.trim(); } return; } - if (row.trim().startsWith('---')) { - if (capacites) addTrait(npc, capacite); + // start of abilities list + if ( + dataRow.toUpperCase().startsWith('CAPACIT') || + dataRow.startsWith('---') || + dataRow.trim() === '' + ) { + addTrait(npc, capacite); capacites = !capacites; return; } - row = row.replace(/ \(/g, '('); // strip space before '( - row = row.replace(/très /g, 'très~'); // handle 'très petite' size - row = row.replace(/créature /g, 'PROFIL créature~'); // handle 'créature' mention - var items = row.split(' '); - for (var item = 0; item < items.length - 1; item++) { + // reading statistics + dataRow = dataRow.replace(/\, /g, ' '); + dataRow = dataRow.replace(/ \(\+/g, ' +'); + dataRow = dataRow.replace(/ \(RD/g, ' RD '); + dataRow = dataRow.replace(/ RD /g, ' RD '); + dataRow = dataRow.replace(/\) /g, ' '); + dataRow = dataRow.replace(/ATP \(/g, 'ATP-'); + dataRow = dataRow.replace(/très /g, 'très~'); // handle 'très petite' size + dataRow = dataRow.replace(/créature /g, 'PROFIL créature~'); // handle 'créature' mention + var items = dataRow.split(' '); + console.log(items); + for (var item = 0; item < items.length; item++) { if (item % 2 === 0) { - var k = items[item].toUpperCase().replace(/\./g, ''); - var v = items[item + 1]; - if (v) { - v.replace(/~/g, ' '); - if (v.charAt(v.length - 1) === ')' && v.charAt(0) !== '(') v = v.substring(0, v.length - 1); - } else { - v = ''; + const k = items[item].toUpperCase().replace(/\./g, ''); + if (Object.keys(npc).indexOf(k) === -1) { + items.splice(item, 1); + item--; + continue; + } + let v = items[item + 1]; + if (v.trim() !== '') { + v = v.replace(/~/g, ' '); + npc[k] = v; + if (k === 'SAG') delete npc['PER']; + if (k === 'PER') delete npc['SAG']; } - npc[k] = v; } } }); if (capacites) addTrait(npc, capacite); console.log('** CO sheetworker : parsing text >>>'); + return npc; } @@ -2849,10 +2910,8 @@ function processBaseAttributes(universe, pnjObj) { var result = ''; var pnj_sagorper = ''; var pnj_jetsagorper = ''; - var pnj_sagper = 'pnj_per'; - var pnj_jetsagper = 'pnj_jetper'; - var sagOrPer = pnjObj.PER; //might be undefined - if (universe == 'COF') { // COF uses SAG (Wisdom) + if (universe === 'COF') { + // COF uses SAG (Wisdom) pnj_sagper = 'pnj_sag'; pnj_jetsagper = 'pnj_jetsag'; if (!pnjObj.hasOwnProperty('SAG') && pnjObj.hasOwnProperty('PER')) { @@ -2863,7 +2922,8 @@ function processBaseAttributes(universe, pnjObj) { sagOrPer = pnjObj.SAG; } } - if (universe == 'COC' || universe == 'CG') { // CG & COC uses PER (Perception) + if (universe === 'COC' || universe === 'CG') { + // CG & COC uses PER (Perception) pnj_sagper = 'pnj_per'; pnj_jetsagper = 'pnj_jetper'; if (!pnjObj.hasOwnProperty('PER') && pnjObj.hasOwnProperty('SAG')) { @@ -2877,47 +2937,60 @@ function processBaseAttributes(universe, pnjObj) { var jnor = '1d20'; var jsup = '2d20kh1'; var pnjAttrs = {}; - if (pnjObj.hasOwnProperty('character_name')) pnjAttrs['character_name'] = pnjObj.character_name; - delete pnjObj['character_name']; - pnjAttrs.NIVEAU = parseInt(pnjObj.NC) || 0; - delete pnjObj.NC; - pnjAttrs.TAILLE = pnjObj.TAILLE || ''; - delete pnjObj.TAILLE; - if (pnjObj.hasOwnProperty('PROFIL')) pnjAttrs.PROFIL = pnjObj.PROFIL; - delete pnjObj.PROFIL; - pnjAttrs.pnj_for = parseInt(pnjObj.FOR.replace('*', '')); - pnjAttrs.pnj_jetfor = pnjObj.FOR.charAt(pnjObj.FOR.length - 1) == '*' ? jsup : jnor; - delete pnjObj.FOR; - pnjAttrs.pnj_dex = parseInt(pnjObj.DEX.replace('*', '')); - pnjAttrs.pnj_jetdex = pnjObj.DEX.charAt(pnjObj.DEX.length - 1) == '*' ? jsup : jnor; - delete pnjObj.DEX; - pnjAttrs.pnj_con = parseInt(pnjObj.CON.replace('*', '')); - pnjAttrs.pnj_jetcon = pnjObj.CON.charAt(pnjObj.CON.length - 1) == '*' ? jsup : jnor; - delete pnjObj.CON; - pnjAttrs.pnj_int = parseInt(pnjObj.INT.replace('*', '')); - pnjAttrs.pnj_jetint = pnjObj.INT.charAt(pnjObj.INT.length - 1) == '*' ? jsup : jnor; - delete pnjObj.INT; - pnjAttrs[pnj_sagper] = parseInt(sagOrPer.replace('*', '')); - pnjAttrs[pnj_jetsagper] = sagOrPer.charAt(sagOrPer.length - 1) == '*' ? jsup : jnor; - delete pnjObj.SAG; - delete pnjObj.PER; - pnjAttrs.pnj_cha = parseInt(pnjObj.CHA.replace('*', '')); - pnjAttrs.pnj_jetcha = pnjObj.CHA.charAt(pnjObj.CHA.length - 1) == '*' ? jsup : jnor; - delete pnjObj.CHA; - pnjAttrs.pnj_init = parseInt(pnjObj.INIT); - delete pnjObj.INIT; - pnjAttrs.pnj_def = parseInt(pnjObj.DEF); - delete pnjObj.DEF; - if (pnjObj.hasOwnProperty('DEP')) { - pnjAttrs.pnj_dep = parseInt(pnjObj.DEP); - delete pnjObj.DEP; + if (pnjObj.character_name !== '') { + pnjAttrs['character_name'] = pnjObj.character_name; } - pnjAttrs.pnj_pv = parseInt(pnjObj.PV); - pnjAttrs.pnj_pv_max = parseInt(pnjObj.PV); - delete pnjObj.PV; + delete pnjObj['character_name']; + pnjAttrs['NIVEAU'] = parseInt(pnjObj.NC) || 0; + delete pnjObj['NC']; + pnjAttrs['TAILLE'] = pnjObj.TAILLE || ''; + delete pnjObj['TAILLE']; + if (pnjObj.PROFIL !== '') { + pnjAttrs['PROFIL'] = pnjObj.PROFIL; + } + delete pnjObj['PROFIL']; + pnjAttrs['pnj_for'] = parseInt(pnjObj['FOR'].replace('*', '')); + pnjAttrs['pnj_jetfor'] = + pnjObj['FOR'].charAt(pnjObj['FOR'].length - 1) == '*' ? jsup : jnor; + delete pnjObj['FOR']; + pnjAttrs['pnj_dex'] = parseInt(pnjObj['DEX'].replace('*', '')); + pnjAttrs['pnj_jetdex'] = + pnjObj['DEX'].charAt(pnjObj['DEX'].length - 1) == '*' ? jsup : jnor; + delete pnjObj['DEX']; + pnjAttrs['pnj_con'] = parseInt(pnjObj['CON'].replace('*', '')); + pnjAttrs['pnj_jetcon'] = + pnjObj['CON'].charAt(pnjObj['CON'].length - 1) == '*' ? jsup : jnor; + delete pnjObj['CON']; + pnjAttrs['pnj_int'] = parseInt(pnjObj['INT'].replace('*', '')); + pnjAttrs['pnj_jetint'] = + pnjObj['INT'].charAt(pnjObj['INT'].length - 1) == '*' ? jsup : jnor; + delete pnjObj['INT']; + pnjAttrs[pnj_sagper] = parseInt(sagOrPer.replace('*', '')); + pnjAttrs[pnj_jetsagper] = + sagOrPer.charAt(sagOrPer.length - 1) == '*' ? jsup : jnor; + delete pnjObj['SAG']; + delete pnjObj['PER']; + pnjAttrs['pnj_cha'] = parseInt(pnjObj['CHA'].replace('*', '')); + pnjAttrs['pnj_jetcha'] = + pnjObj['CHA'].charAt(pnjObj['CHA'].length - 1) == '*' ? jsup : jnor; + delete pnjObj['CHA']; + pnjAttrs['pnj_init'] = parseInt(pnjObj.INIT); + delete pnjObj['INIT']; + pnjAttrs['pnj_def'] = parseInt(pnjObj.DEF); + delete pnjObj['DEF']; + if (universe === 'CG') { + pnjAttrs.pnj_dep = parseInt(pnjObj.DEP); + } + delete pnjObj.DEP; + pnjAttrs['pnj_pv'] = parseInt(pnjObj.PV); + pnjAttrs['pnj_pv_max'] = parseInt(pnjObj.PV); + delete pnjObj['PV']; + pnjAttrs['pnj_rd'] = parseInt(pnjObj.RD) || 0; + delete pnjObj['RD']; consoleLog(pnjAttrs, 'setting attributes'); - pnjAttrs.statblock = ''; + pnjAttrs['statblock'] = ''; setAttrs(pnjAttrs); + return result; } @@ -2928,84 +3001,107 @@ function processBaseAttributes(universe, pnjObj) { * @returns {string} Result message */ function processAttacks(universe, pnjObj) { - var result = ''; - for (var atk = 0; atk < pnjObj.Atks.length; atk++) { - var atkItems = pnjObj.Atks[atk].split(' '); + removeRepeating('pnjatk'); + let result = ''; + + for (const atk of pnjObj['Atks']) { + const atkItems = atk.split(' '); consoleLog(atkItems, 'attacks found'); - if (atkItems[atkItems.length - 1] == 'DM') atkItems.push('-'); - var atkAtt = 'attaque='; - var atkNom = ''; - var atkBonus = -1; - var atkDM = ''; - var atkSpec = ''; - var parsed = ''; - for (var item = 0; item < atkItems.length; item++) { - if (atkItems[item] == 'DM' && atkNom == '') { + if (atkItems[atkItems.length - 1] === 'DM') { + atkItems.push('-'); + } + let atkAtt = 'attaque='; + let atkNom = ''; + let atkBonus = -1; + let atkPortee = ''; + let atkDM = ''; + let atkSpec = ''; + let parsed = ''; + for (let atkItem of atkItems) { + if (atkItem === 'DM' && atkNom === '') { atkNom = parsed; parsed = 'DM'; continue; } - if (atkItems[item].charAt(0) == '+' && atkItems[item] != '+' && atkNom == '') { - atkBonus = parseInt(atkItems[item].replace('+', '')) || 0; + if (atkItem.charAt(0) === '+' && atkItem !== '+' && atkNom === '') { + atkBonus = parseInt(atkItem.replace('+', '')) || 0; atkNom = parsed; parsed = ''; continue; } if (parsed.endsWith('DM')) { - atkDM = atkItems[item]; + atkDM = atkItem; atkSpec = parsed.replace('DM', ''); parsed = ''; continue; } + if (atkItem.charAt(0) === '(' && atkItem.endsWith('m)')) { + atkPortee = atkItem.substring(1, atkItem.length - 1); + continue; + } parsed += parsed != '' ? ' ' : ''; - parsed += atkItems[item]; + parsed += atkItem; } consoleLog(atkNom + ' ' + atkBonus + ' ' + atkDM + ' ' + atkSpec); - if (atkBonus == -1) atkAtt = '0'; // No attack bonus found, damage only - var atkDmg = 'degats='; - var atkNbDe = 0; - var atkDe = ''; - var atkBonusDM = 0; - if (atkDM != '') { + if (atkBonus === -1) { + atkAtt = '0'; // No attack bonus found, damage only + } + let atkDmg = atkDM !== '' ? 'degats=' : '0'; + let atkNbDe = 0; + let atkDe = ''; + let atkBonusDM = 0; + if (atkDM !== '') { atkDM = atkDM.replace('d', '|'); atkDM = atkDM.replace('+', '|+'); atkDM = atkDM.replace('-', '|-'); - var dm = atkDM.split('|'); + let dm = atkDM.split('|'); atkNbDe = parseInt(dm[0]) || 0; - if (atkNbDe == 0) atkDmg = '0'; // No damage dice, attack only + if (atkNbDe === 0) { + atkDmg = '0'; // No damage dice, attack only + } atkDe = dm[1]; - if (universe === 'COC') atkDe += '!'; + if (universe === 'COC') { + atkDe += '!'; + } atkBonusDM = parseInt(dm[2]) || 0; } - if (atkNom != '' && atkNbDe >= 0 && atkDe != '') { - newRowID = generateRowID(); - var atkRow = {}; - atkRow[`repeating_pnjatk_${newRowID}_atkatt`] = atkAtt; - atkRow[`repeating_pnjatk_${newRowID}_atknom`] = atkNom; - atkRow[`repeating_pnjatk_${newRowID}_atkjet`] = '1d20'; - atkRow[`repeating_pnjatk_${newRowID}_atkbonus`] = atkBonus; - atkRow[`repeating_pnjatk_${newRowID}_atkcrit`] = '20'; - atkRow[`repeating_pnjatk_${newRowID}_atkdmg`] = atkDmg; - atkRow[`repeating_pnjatk_${newRowID}_atkdmnbde`] = atkNbDe; - atkRow[`repeating_pnjatk_${newRowID}_atkdmde`] = atkDe; - atkRow[`repeating_pnjatk_${newRowID}_atkdmbonus`] = atkBonusDM; + if (atkNom !== '' && (atkAtt !== '0' || atkDmg !== '0')) { + newRowID = 'repeating_pnjatk_' + generateRowID(); + let atkRow = {}; + atkRow[`${newRowID}_atkatt`] = atkAtt; + atkRow[`${newRowID}_atknom`] = atkNom; + atkRow[`${newRowID}_atkjet`] = '1d20'; + atkRow[`${newRowID}_atkbonus`] = atkBonus; + atkRow[`${newRowID}_atkcrit`] = '20'; + atkRow[`${newRowID}_atkdmg`] = atkDmg; + atkRow[`${newRowID}_atkdmnbde`] = atkNbDe; + atkRow[`${newRowID}_atkdmde`] = atkDe; + atkRow[`${newRowID}_atkdmbonus`] = atkBonusDM; + atkRow[`${newRowID}_atkportee`] = atkPortee; atkSpec += parsed; atkSpec = atkSpec.replace(/\d+d\d+/g, '[[$&]]'); // search for d and replace with in-line roll - if (atkSpec != '') atkRow[`repeating_pnjatk_${newRowID}_atkspec`] = atkSpec; + if (atkSpec !== '') { + atkRow[`${newRowID}_atkspec`] = atkSpec; + } consoleLog(atkRow, 'adding attack'); setAttrs(atkRow); } else { - result += (result.length > 0 ? '\n' : '') + 'Err: impossible d\'analyser le contenu de "' + pnjObj.Atks[atk] + '"'; + result += + (result.length > 0 ? '\n' : '') + + 'Err: impossible d\'analyser le contenu de "' + + pnjObj.Atks[atk] + + '"'; } } - for (let attr of ['ATP(PER)', 'ATP(CHA)']) { - if (pnjObj.hasOwnProperty(attr)) { + + for (let attr of ['ATP-PER', 'ATP-CHA']) { + if (pnjObj[attr] !== 0) { newRowID = generateRowID(); let atkRow = {}; - atkRow[`repeating_pnjatk_${newRowID}_atkatt`] = atkAtt; - if (attr === 'ATP(PER)') { + atkRow[`repeating_pnjatk_${newRowID}_atkatt`] = 'attaque='; + if (attr === 'ATP-PER') { atkRow[`repeating_pnjatk_${newRowID}_atknom`] = 'Psy Intuition'; - } else if (attr === 'ATP(CHA)') { + } else if (attr === 'ATP-CHA') { atkRow[`repeating_pnjatk_${newRowID}_atknom`] = 'Psy Influence'; } else { continue; @@ -3019,9 +3115,10 @@ function processAttacks(universe, pnjObj) { atkRow[`repeating_pnjatk_${newRowID}_atkdmbonus`] = 0; consoleLog(atkRow, 'adding attack'); setAttrs(atkRow); - delete pnjObj[attr]; } + delete pnjObj[attr]; } + return result; } @@ -3032,28 +3129,40 @@ function processAttacks(universe, pnjObj) { * @returns {string} Result message */ function processTraits(universe, pnjObj) { + removeRepeating('pnjcapas'); let result = ''; - for (let capa of pnjObj['Capas']) { - let capacite = capa.split('~') + + for (const capa of pnjObj['Capas']) { + const capacite = capa.split('~'); if (capacite.length == 2) { let name = capacite[0] || ''; let desc = capacite[1] || ''; if (name !== '' && desc !== '') { - newRowID = generateRowID(); + newRowID = 'repeating_pnjcapas_' + generateRowID(); let capaRow = {}; - capaRow[`repeating_pnjcapas_${newRowID}_capanom`] = name; - desc = desc.replace(/\d+d\d+[+-]*\d*/g, '{{$&}}'); // search for d+/- + capaRow[`${newRowID}_capanom`] = name; + ['FOR', 'DEX', 'CON', 'INT', 'PER', 'SAG', 'CHA'].forEach((attr) => { + regExp = new RegExp(`Mod\. de ${attr}`, 'gi'); + desc = desc.replace(regExp, `@{pnj_${attr.toLowerCase()}}`); + }); + desc = desc.replace(/\d+d\d+[+-]*\d*/g, '{{$&}}'); // search for d+/- desc = desc.replace(/\[\d+d\d+[+-]*\d*\]/g, '{$&}'); // search for [d+/-] desc = desc.replace(/\[{{/g, '[['); desc = desc.replace(/}}\]/g, ']]'); desc = desc.replace(/{{/g, '[['); desc = desc.replace(/}}/g, ']]'); - capaRow[`repeating_pnjcapas_${newRowID}_capadesc`] = desc; + desc = desc.replace(/\]\] \+ /g, ' + '); + desc = desc.replace(/}\]/g, '} ]]'); + capaRow[`${newRowID}_capadesc`] = desc; consoleLog(capaRow, 'adding trait'); setAttrs(capaRow); } } else { - result += (result.length > 0 ? '\n' : '') + 'Err: impossible d\'analyser le contenu de "' + capacite + '"'; + result += + (result.length > 0 ? '\n' : '') + + 'Err: impossible d\'analyser le contenu de "' + + capacite + + '"'; } } @@ -3064,40 +3173,68 @@ function processTraits(universe, pnjObj) { * (Re-)Build the CARACS serialized objects */ function buildCaracs() { - getAttrs([ - 'FORCE', 'DEXTERITE', 'CONSTITUTION', 'INTELLIGENCE', 'PERCEPTION', 'CHARISME', 'NIVEAU', - 'RANG_VOIE1', 'RANG_VOIE2', 'RANG_VOIE3', 'RANG_VOIE4', 'RANG_VOIE5', 'RANG_VOIE6', 'RANG_VOIE7', 'RANG_VOIE8', 'RANG_VOIE9', - 'voie1nom', 'voie2nom', 'voie3nom', 'voie4nom', 'voie5nom', 'voie6nom', 'voie7nom', 'voie8nom', 'voie9nom' - ], function (values) { - let caracs = { - FOR: 0, - DEX: 0, - CON: 0, - INT: 0, - PER: 0, - CHA: 0 - }; - for (let car in values) { - let vcar = values[car]; - if (vcar && !isNaN(vcar)) vcar = parseInt(vcar) || 0; - let mod = car.substring(0, 3); - if (caracs.hasOwnProperty(mod)) caracs[mod] = Math.floor((vcar - 10) / 2); - if (car.startsWith('RANG_')) { - if (!caracs.hasOwnProperty('rangs')) caracs.rangs = [0, 0, 0, 0, 0, 0, 0, 0, 0]; - let voie = parseInt(car.substring(car.length - 1)) || 0; - if (voie > 0) caracs.rangs[voie - 1] = vcar; - } else if (car.startsWith('voie') && car.endsWith('nom')) { - if (!caracs.hasOwnProperty('voies')) caracs.voies = ['', '', '', '', '', '', '', '', '']; - let voie = parseInt(car.substring(4, 5)) || 0; - if (voie > 0 && vcar) caracs.voies[voie - 1] = vcar.toUpperCase(); - } else { - caracs[car] = vcar; + getAttrs( + [ + 'FORCE', + 'DEXTERITE', + 'CONSTITUTION', + 'INTELLIGENCE', + 'PERCEPTION', + 'CHARISME', + 'NIVEAU', + 'RANG_VOIE1', + 'RANG_VOIE2', + 'RANG_VOIE3', + 'RANG_VOIE4', + 'RANG_VOIE5', + 'RANG_VOIE6', + 'RANG_VOIE7', + 'RANG_VOIE8', + 'RANG_VOIE9', + 'voie1nom', + 'voie2nom', + 'voie3nom', + 'voie4nom', + 'voie5nom', + 'voie6nom', + 'voie7nom', + 'voie8nom', + 'voie9nom', + ], + function (values) { + let caracs = { + FOR: 0, + DEX: 0, + CON: 0, + INT: 0, + PER: 0, + CHA: 0, + }; + for (let car in values) { + let vcar = values[car]; + if (vcar && !isNaN(vcar)) vcar = parseInt(vcar) || 0; + let mod = car.substring(0, 3); + if (caracs.hasOwnProperty(mod)) + caracs[mod] = Math.floor((vcar - 10) / 2); + if (car.startsWith('RANG_')) { + if (!caracs.hasOwnProperty('rangs')) + caracs.rangs = [0, 0, 0, 0, 0, 0, 0, 0, 0]; + let voie = parseInt(car.substring(car.length - 1)) || 0; + if (voie > 0) caracs.rangs[voie - 1] = vcar; + } else if (car.startsWith('voie') && car.endsWith('nom')) { + if (!caracs.hasOwnProperty('voies')) + caracs.voies = ['', '', '', '', '', '', '', '', '']; + let voie = parseInt(car.substring(4, 5)) || 0; + if (voie > 0 && vcar) caracs.voies[voie - 1] = vcar.toUpperCase(); + } else { + caracs[car] = vcar; + } } + setAttrs({ + CARACS: JSON.stringify(caracs), + }); } - setAttrs({ - CARACS: JSON.stringify(caracs) - }); - }); + ); } /** @@ -3106,142 +3243,177 @@ function buildCaracs() { function migrateSheet(verfdp) { if (verfdp.major === 0) { // Version 1.6 vers 1.7 - getAttrs(["FOR_SUP", "DEX_SUP", "CON_SUP", "INT_SUP", "PER_SUP", "CHA_SUP"], function (jets) { - var sfor, sdex, scon, sint, sper, scha = ""; - if (jets.FOR_SUP == "2") { - sfor = "@{JETSUP}"; - } else { - sfor = "@{JETNORMAL}"; + getAttrs( + ['FOR_SUP', 'DEX_SUP', 'CON_SUP', 'INT_SUP', 'PER_SUP', 'CHA_SUP'], + function (jets) { + var sfor, + sdex, + scon, + sint, + sper, + scha = ''; + if (jets.FOR_SUP == '2') { + sfor = '@{JETSUP}'; + } else { + sfor = '@{JETNORMAL}'; + } + if (jets.DEX_SUP == '2') { + sdex = '@{JETSUP}'; + } else { + sdex = '@{JETNORMAL}'; + } + if (jets.CON_SUP == '2') { + scon = '@{JETSUP}'; + } else { + scon = '@{JETNORMAL}'; + } + if (jets.INT_SUP == '2') { + sint = '@{JETSUP}'; + } else { + sint = '@{JETNORMAL}'; + } + if (jets.PER_SUP == '2') { + sper = '@{JETSUP}'; + } else { + sper = '@{JETNORMAL}'; + } + if (jets.CHA_SUP == '2') { + scha = '@{JETSUP}'; + } else { + scha = '@{JETNORMAL}'; + } + setAttrs({ + FOR_SUP: sfor, + DEX_SUP: sdex, + CON_SUP: scon, + INT_SUP: sint, + PER_SUP: sper, + CHA_SUP: scha, + VERSION: '2.0', + }); } - if (jets.DEX_SUP == "2") { - sdex = "@{JETSUP}"; - } else { - sdex = "@{JETNORMAL}"; - } - if (jets.CON_SUP == "2") { - scon = "@{JETSUP}"; - } else { - scon = "@{JETNORMAL}"; - } - if (jets.INT_SUP == "2") { - sint = "@{JETSUP}"; - } else { - sint = "@{JETNORMAL}"; - } - if (jets.PER_SUP == "2") { - sper = "@{JETSUP}"; - } else { - sper = "@{JETNORMAL}"; - } - if (jets.CHA_SUP == "2") { - scha = "@{JETSUP}"; - } else { - scha = "@{JETNORMAL}"; - } - setAttrs({ - FOR_SUP: sfor, - DEX_SUP: sdex, - CON_SUP: scon, - INT_SUP: sint, - PER_SUP: sper, - CHA_SUP: scha, - VERSION: "2.0" - }); - }); + ); } - if (verfdp.major < 3) { // version 2.0 > 3.0 - getAttrs(['UNIVERS', 'FOR_BONUS', 'DEX_BONUS', 'CON_BONUS', 'INT_BONUS', 'PER_BONUS', 'CHA_BONUS', 'ATKCAC_DIV', 'ATKTIR_DIV', 'ATKMAG_DIV', 'ATKMEN_DIV', 'PSYINTUI_DIV', 'PSYINFLU_DIV', 'INIT_DIV', 'DEFDIV', 'DEPDIV'], function (values) { - let for_bonus = parseInt(values.FOR_BONUS) || 0; - let for_bonus_desc = (for_bonus !== 0) ? 'Bonus FOR' : ''; - let dex_bonus = parseInt(values.DEX_BONUS) || 0; - let dex_bonus_desc = (dex_bonus !== 0) ? 'Bonus DEX' : ''; - let con_bonus = parseInt(values.CON_BONUS) || 0; - let con_bonus_desc = (con_bonus !== 0) ? 'Bonus CON' : ''; - let int_bonus = parseInt(values.INT_BONUS) || 0; - let int_bonus_desc = (int_bonus !== 0) ? 'Bonus INT' : ''; - let per_bonus = parseInt(values.PER_BONUS) || 0; - let per_bonus_desc = (per_bonus !== 0) ? 'Bonus PER' : ''; - let cha_bonus = parseInt(values.CHA_BONUS) || 0; - let cha_bonus_desc = (cha_bonus !== 0) ? 'Bonus CHA' : ''; - let atkcac_div = parseInt(values.ATKCAC_DIV) || 0; - let atkcac_bonus_desc = (atkcac_div !== 0) ? 'Bonus ATC' : ''; - let atktir_div = parseInt(values.ATKTIR_DIV) || 0; - let atktir_bonus_desc = (atktir_div !== 0) ? 'Bonus ATD' : ''; - let atkmag_div = parseInt(values.ATKMAG_DIV) || 0; - let atkmag_bonus_desc = (atkmag_div !== 0) ? 'Bonus MAG' : ''; - let atkmen_div = parseInt(values.ATKMEN_DIV) || 0; - let atkmen_bonus_desc = (atkmen_div !== 0) ? 'Bonus MEN' : ''; - let psyinflu_div = parseInt(values.ATKPSYINFLU_DIV) || 0; - let psyinflu_bonus_desc = (psyinflu_div !== 0) ? 'Bonus Psy Inf.' : ''; - let psyintui_div = parseInt(values.ATKPSYINTUI_DIV) || 0; - let psyintui_bonus_desc = (psyintui_div !== 0) ? 'Bonus Psy Int.' : ''; - let init_div = parseInt(values.INIT_DIV) || 0; - let init_bonus_desc = (init_div !== 0) ? 'Bonus Init.' : ''; - let defdiv = parseInt(values.DEFDIV) || 0; - let def_bonus_desc = (defdiv !== 0) ? 'Bonus DEF' : ''; - let depdiv = parseInt(values.DEPDIV) || 0; - let dep_bonus_desc = (depdiv !== 0) ? 'Bonus DEP' : ''; - setAttrs({ - FOR_BUFF1_DESC: for_bonus_desc, - FOR_BUFF1: for_bonus, - FOR_BUFF: for_bonus, - DEX_BUFF1_DESC: dex_bonus_desc, - DEX_BUFF1: dex_bonus, - DEX_BUFF: dex_bonus, - CON_BUFF1_DESC: con_bonus_desc, - CON_BUFF1: con_bonus, - CON_BUFF: con_bonus, - INT_BUFF1_DESC: int_bonus_desc, - INT_BUFF1: int_bonus, - INT_BUFF: int_bonus, - PER_BUFF1_DESC: per_bonus_desc, - PER_BUFF1: per_bonus, - PER_BUFF: per_bonus, - CHA_BUFF1_DESC: cha_bonus_desc, - CHA_BUFF1: cha_bonus, - CHA_BUFF: cha_bonus, - ATKCAC_BUFF1_DESC: atkcac_bonus_desc, - ATKCAC_BUFF1: atkcac_div, - ATKCAC_BUFF: atkcac_div, - ATKTIR_BUFF1_DESC: atktir_bonus_desc, - ATKTIR_BUFF1: atktir_div, - ATKTIR_BUFF: atktir_div, - ATKMAG_BUFF1_DESC: atkmag_bonus_desc, - ATKMAG_BUFF1: atkmag_div, - ATKMAG_BUFF: atkmag_div, - ATKMEN_BUFF1_DESC: atkmen_bonus_desc, - ATKMEN_BUFF1: atkmen_div, - ATKMEN_BUFF: atkmen_div, - PSYINFLU_BUFF1_DESC: psyinflu_bonus_desc, - PSYINFLU_BUFF1: psyinflu_div, - PSYINFLU_BUFF: psyinflu_div, - PSYINTUI_BUFF1_DESC: psyintui_bonus_desc, - PSYINTUI_BUFF1: psyintui_div, - PSYINTUI_BUFF: psyintui_div, - INIT_BUFF1_DESC: init_bonus_desc, - INIT_BUFF1: init_div, - INIT_BUFF: init_div, - DEF_BUFF1_DESC: def_bonus_desc, - DEF_BUFF1: defdiv, - DEF_BUFF: defdiv, - DEP_BUFF1_DESC: dep_bonus_desc, - DEP_BUFF1: depdiv, - DEP_BUFF: depdiv, - ATKTIRV_BUFF: 0, - VERSION: '3.0' - }); - }); + if (verfdp.major < 3) { + // version 2.0 > 3.0 + getAttrs( + [ + 'UNIVERS', + 'FOR_BONUS', + 'DEX_BONUS', + 'CON_BONUS', + 'INT_BONUS', + 'PER_BONUS', + 'CHA_BONUS', + 'ATKCAC_DIV', + 'ATKTIR_DIV', + 'ATKMAG_DIV', + 'ATKMEN_DIV', + 'PSYINTUI_DIV', + 'PSYINFLU_DIV', + 'INIT_DIV', + 'DEFDIV', + 'DEPDIV', + ], + function (values) { + let for_bonus = parseInt(values.FOR_BONUS) || 0; + let for_bonus_desc = for_bonus !== 0 ? 'Bonus FOR' : ''; + let dex_bonus = parseInt(values.DEX_BONUS) || 0; + let dex_bonus_desc = dex_bonus !== 0 ? 'Bonus DEX' : ''; + let con_bonus = parseInt(values.CON_BONUS) || 0; + let con_bonus_desc = con_bonus !== 0 ? 'Bonus CON' : ''; + let int_bonus = parseInt(values.INT_BONUS) || 0; + let int_bonus_desc = int_bonus !== 0 ? 'Bonus INT' : ''; + let per_bonus = parseInt(values.PER_BONUS) || 0; + let per_bonus_desc = per_bonus !== 0 ? 'Bonus PER' : ''; + let cha_bonus = parseInt(values.CHA_BONUS) || 0; + let cha_bonus_desc = cha_bonus !== 0 ? 'Bonus CHA' : ''; + let atkcac_div = parseInt(values.ATKCAC_DIV) || 0; + let atkcac_bonus_desc = atkcac_div !== 0 ? 'Bonus ATC' : ''; + let atktir_div = parseInt(values.ATKTIR_DIV) || 0; + let atktir_bonus_desc = atktir_div !== 0 ? 'Bonus ATD' : ''; + let atkmag_div = parseInt(values.ATKMAG_DIV) || 0; + let atkmag_bonus_desc = atkmag_div !== 0 ? 'Bonus MAG' : ''; + let atkmen_div = parseInt(values.ATKMEN_DIV) || 0; + let atkmen_bonus_desc = atkmen_div !== 0 ? 'Bonus MEN' : ''; + let psyinflu_div = parseInt(values.ATKPSYINFLU_DIV) || 0; + let psyinflu_bonus_desc = psyinflu_div !== 0 ? 'Bonus Psy Inf.' : ''; + let psyintui_div = parseInt(values.ATKPSYINTUI_DIV) || 0; + let psyintui_bonus_desc = psyintui_div !== 0 ? 'Bonus Psy Int.' : ''; + let init_div = parseInt(values.INIT_DIV) || 0; + let init_bonus_desc = init_div !== 0 ? 'Bonus Init.' : ''; + let defdiv = parseInt(values.DEFDIV) || 0; + let def_bonus_desc = defdiv !== 0 ? 'Bonus DEF' : ''; + let depdiv = parseInt(values.DEPDIV) || 0; + let dep_bonus_desc = depdiv !== 0 ? 'Bonus DEP' : ''; + setAttrs({ + FOR_BUFF1_DESC: for_bonus_desc, + FOR_BUFF1: for_bonus, + FOR_BUFF: for_bonus, + DEX_BUFF1_DESC: dex_bonus_desc, + DEX_BUFF1: dex_bonus, + DEX_BUFF: dex_bonus, + CON_BUFF1_DESC: con_bonus_desc, + CON_BUFF1: con_bonus, + CON_BUFF: con_bonus, + INT_BUFF1_DESC: int_bonus_desc, + INT_BUFF1: int_bonus, + INT_BUFF: int_bonus, + PER_BUFF1_DESC: per_bonus_desc, + PER_BUFF1: per_bonus, + PER_BUFF: per_bonus, + CHA_BUFF1_DESC: cha_bonus_desc, + CHA_BUFF1: cha_bonus, + CHA_BUFF: cha_bonus, + ATKCAC_BUFF1_DESC: atkcac_bonus_desc, + ATKCAC_BUFF1: atkcac_div, + ATKCAC_BUFF: atkcac_div, + ATKTIR_BUFF1_DESC: atktir_bonus_desc, + ATKTIR_BUFF1: atktir_div, + ATKTIR_BUFF: atktir_div, + ATKMAG_BUFF1_DESC: atkmag_bonus_desc, + ATKMAG_BUFF1: atkmag_div, + ATKMAG_BUFF: atkmag_div, + ATKMEN_BUFF1_DESC: atkmen_bonus_desc, + ATKMEN_BUFF1: atkmen_div, + ATKMEN_BUFF: atkmen_div, + PSYINFLU_BUFF1_DESC: psyinflu_bonus_desc, + PSYINFLU_BUFF1: psyinflu_div, + PSYINFLU_BUFF: psyinflu_div, + PSYINTUI_BUFF1_DESC: psyintui_bonus_desc, + PSYINTUI_BUFF1: psyintui_div, + PSYINTUI_BUFF: psyintui_div, + INIT_BUFF1_DESC: init_bonus_desc, + INIT_BUFF1: init_div, + INIT_BUFF: init_div, + DEF_BUFF1_DESC: def_bonus_desc, + DEF_BUFF1: defdiv, + DEF_BUFF: defdiv, + DEP_BUFF1_DESC: dep_bonus_desc, + DEP_BUFF1: depdiv, + DEP_BUFF: depdiv, + ATKTIRV_BUFF: 0, + VERSION: '3.0', + }); + } + ); } - if (verfdp.major == 3 && verfdp.minor < 4) { // version 3.3 > 3.4 + if (verfdp.major == 3 && verfdp.minor < 4) { + // version 3.3 > 3.4 getAttrs(['TRAITS'], function (values) { var traits = values.TRAITS.split(':'); if (traits.length >= 2) { newRowID = generateRowID(); var traitRow = {}; - traitRow['repeating_traits_' + newRowID + '_traitnom'] = traits[0].trim(); - traitRow['repeating_traits_' + newRowID + '_traittype'] = 'Race / Humain'; + traitRow[ + 'repeating_traits_' + newRowID + '_traitnom' + ] = traits[0].trim(); + traitRow['repeating_traits_' + newRowID + '_traittype'] = + 'Race / Humain'; traits.splice(0, 1); - traitRow['repeating_traits_' + newRowID + '_traitdesc'] = traits.join(':').trim(); + traitRow['repeating_traits_' + newRowID + '_traitdesc'] = traits + .join(':') + .trim(); setAttrs(traitRow); setAttrs({ VERSION: '3.4' }); } @@ -3250,19 +3422,19 @@ function migrateSheet(verfdp) { if (verfdp.major == 3 && verfdp.minor < 5) { // version 3.4 > 3.5 const attrList = [ - "FOR", - "DEX", - "CON", - "INT", - "PER", - "CHA", - "ATKCAC", - "ATKTIR", - "PSYINFLU", - "PSYINTUI", - "INIT", - "DEF", - "DEP", + 'FOR', + 'DEX', + 'CON', + 'INT', + 'PER', + 'CHA', + 'ATKCAC', + 'ATKTIR', + 'PSYINFLU', + 'PSYINTUI', + 'INIT', + 'DEF', + 'DEP', ]; for (let a = 0; a < attrList.length; a++) { let attr = attrList[a]; @@ -3287,78 +3459,87 @@ function migrateSheet(verfdp) { } setAttrs({ VERSION: '3.5' }); } - if (verfdp.major == 3 && verfdp.minor < 9) { // version 3.50 > 3.90 - getAttrs([ - 'FOR_BUFF_LIST', - 'DEX_BUFF_LIST', - 'CON_BUFF_LIST', - 'INT_BUFF_LIST', - 'PER_BUFF_LIST', - 'CHA_BUFF_LIST', - 'ATKCAC_BUFF_LIST', - 'ATKTIR_BUFF_LIST', - 'PSYINFLU_BUFF_LIST', - 'PSYINTUI_BUFF_LIST', - 'INIT_BUFF_LIST', - 'DEF_BUFF_LIST', - 'DEP_BUFF_LIST', - 'PV_BUFF_LIST' - ], function (values) { - const aliases = { - 'FOR_BUFF_LIST': 'FOR', - 'DEX_BUFF_LIST': 'DEX', - 'CON_BUFF_LIST': 'CON', - 'INT_BUFF_LIST': 'INT', - 'PER_BUFF_LIST': 'PER', - 'CHA_BUFF_LIST': 'CHA', - 'ATKCAC_BUFF_LIST': 'ATC', - 'ATKTIR_BUFF_LIST': 'ATD', - 'PSYINFLU_BUFF_LIST': 'PSYINF', - 'PSYINTUI_BUFF_LIST': 'PSYINT', - 'INIT_BUFF_LIST': 'INIT', - 'DEF_BUFF_LIST': 'DEF', - 'DEP_BUFF_LIST': 'DEP', - 'PV_BUFF_LIST': 'PV' - } - buffRepeat = []; - for (const buffs of Object.keys(values)) { - const buffList = values[buffs] || ''; - if (buffList == '') { - continue; - } - for (const buff of buffList.split(';')) { - let buffName = buff.split(':')[0] || ''; - let buffVal = buff.split(':')[1] || ''; - if (buffName != '' && buffVal != '') { - buffName = buffName.trim().toLowerCase(); - buffEnabled = !buffName.startsWith('-'); - if (!buffEnabled) buffName = buffName.substring(1); - buffVal = buffVal.trim(); - const newItem = { - name: buffName, - value: `${aliases[buffs]} : ${buffVal}`, - enabled: buffEnabled - }; - const foundItem = buffRepeat.findIndex((item) => item.name == newItem.name); - if (foundItem == -1) { - buffRepeat.push(newItem); - } else { - buffRepeat[foundItem].value += `; ${newItem.value}`; + if (verfdp.major == 3 && verfdp.minor < 9) { + // version 3.50 > 3.90 + getAttrs( + [ + 'FOR_BUFF_LIST', + 'DEX_BUFF_LIST', + 'CON_BUFF_LIST', + 'INT_BUFF_LIST', + 'PER_BUFF_LIST', + 'CHA_BUFF_LIST', + 'ATKCAC_BUFF_LIST', + 'ATKTIR_BUFF_LIST', + 'PSYINFLU_BUFF_LIST', + 'PSYINTUI_BUFF_LIST', + 'INIT_BUFF_LIST', + 'DEF_BUFF_LIST', + 'DEP_BUFF_LIST', + 'PV_BUFF_LIST', + ], + function (values) { + const aliases = { + FOR_BUFF_LIST: 'FOR', + DEX_BUFF_LIST: 'DEX', + CON_BUFF_LIST: 'CON', + INT_BUFF_LIST: 'INT', + PER_BUFF_LIST: 'PER', + CHA_BUFF_LIST: 'CHA', + ATKCAC_BUFF_LIST: 'ATC', + ATKTIR_BUFF_LIST: 'ATD', + PSYINFLU_BUFF_LIST: 'PSYINF', + PSYINTUI_BUFF_LIST: 'PSYINT', + INIT_BUFF_LIST: 'INIT', + DEF_BUFF_LIST: 'DEF', + DEP_BUFF_LIST: 'DEP', + PV_BUFF_LIST: 'PV', + }; + buffRepeat = []; + for (const buffs of Object.keys(values)) { + const buffList = values[buffs] || ''; + if (buffList == '') { + continue; + } + for (const buff of buffList.split(';')) { + let buffName = buff.split(':')[0] || ''; + let buffVal = buff.split(':')[1] || ''; + if (buffName != '' && buffVal != '') { + buffName = buffName.trim().toLowerCase(); + buffEnabled = !buffName.startsWith('-'); + if (!buffEnabled) buffName = buffName.substring(1); + buffVal = buffVal.trim(); + const newItem = { + name: buffName, + value: `${aliases[buffs]} : ${buffVal}`, + enabled: buffEnabled, + }; + const foundItem = buffRepeat.findIndex( + (item) => item.name == newItem.name + ); + if (foundItem == -1) { + buffRepeat.push(newItem); + } else { + buffRepeat[foundItem].value += `; ${newItem.value}`; + } } } } + for (buffItem of buffRepeat) { + const rowId = 'repeating_buffs_' + generateRowID(); + let newRow = {}; + newRow[`${rowId}_buffon`] = buffItem.enabled ? '1' : '0'; + newRow[`${rowId}_buffnom`] = + buffItem.name.substring(0, 1).toUpperCase() + + buffItem.name.substring(1); + newRow[`${rowId}_buffmods`] = buffItem.value; + setAttrs(newRow); + } } - for (buffItem of buffRepeat) { - const rowId = 'repeating_buffs_' + generateRowID(); - let newRow = {}; - newRow[`${rowId}_buffon`] = buffItem.enabled ? '1' : '0'; - newRow[`${rowId}_buffnom`] = buffItem.name.substring(0, 1).toUpperCase() + buffItem.name.substring(1); - newRow[`${rowId}_buffmods`] = buffItem.value; - setAttrs(newRow); - } - }); + ); } - if (verfdp.major == 3 && verfdp.minor < 91) { // version 3.90 > 3.91 + if (verfdp.major == 3 && verfdp.minor < 91) { + // version 3.90 > 3.91 getSectionIDs('repeating_materiel', function (ids) { for (const id of ids) { getAttrs([`repeating_materiel_${id}_mater-nom`], function (value) { @@ -3384,9 +3565,9 @@ function migrateSheet(verfdp) { getAttrs(vrNames, function (values) { const vrFlags = {}; Object.keys(values).forEach((name) => { - const flag = name.replace("oie", "").replace("-", "r"); - if (values[name] !== "") { - vrFlags[flag] = "1"; + const flag = name.replace('oie', '').replace('-', 'r'); + if (values[name] !== '') { + vrFlags[flag] = '1'; } else { vrFlags[flag] = "0"; } @@ -3398,16 +3579,16 @@ function migrateSheet(verfdp) { /** * Parse semantic version label - * @param {string} version + * @param {string} version */ function parseSemVer(version) { version += '.0.0'; if (version.toLowerCase().startsWith('v')) version = version.slice(1); const semVer = version.split('.'); return { - major: parseInt(semver[0]) || 0, - minor: parseInt(semver[1]) || 0, - patch: parseInt(semver[2]) || 0, + major: parseInt(semVer[0]) || 0, + minor: parseInt(semVer[1]) || 0, + patch: parseInt(semVer[2]) || 0, }; } @@ -3435,43 +3616,64 @@ on('sheet:opened', function () { } }); // Activer Buffs PSY ou de vaisseau - getAttrs(['UNIVERS', 'type_personnage', 'PE_ONCE', 'FOR_BUFF1_DESC', 'DEX_BUFF1_DESC', 'INT_BUFF1_DESC', 'PER_BUFF1_DESC', 'CHA_BUFF1_DESC', 'ATKTIRV_BUFF1_DESC', 'INIT_BUFF1_DESC', 'DEFVPIL_BUFF1_DESC', 'DEFVPIL_BUFF2_DESC', 'DEFVSEN_BUFF1_DESC', 'DEFVSEN_BUFF2_DESC'], function (values) { - if (values.UNIVERS == 'CG') { - if (values.type_personnage == 'vaisseau' && values.PE_ONCE !== '') { - var for_buff_desc = (values.FOR_BUFF1_DESC) || values.PE_ONCE; - var dex_buff_desc = (values.DEX_BUFF1_DESC) || values.PE_ONCE; - var int_buff_desc = (values.INT_BUFF1_DESC) || values.PE_ONCE; - var per_buff_desc = (values.PER_BUFF1_DESC) || values.PE_ONCE; - var cha_buff_desc = (values.CHA_BUFF1_DESC) || values.PE_ONCE; - var atktirv_buff_desc = (values.ATKTIRV_BUFF1_DESC) || values.PE_ONCE; - var init_buff_desc = (values.INIT_BUFF1_DESC) || 'Valeur DEX pilote'; - var defvpil_buff1_desc = (values.DEFVPIL_BUFF1_DESC) || 'Mod. DEX Pilote'; - var defvpil_buff2_desc = (values.DEFVPIL_BUFF2_DESC) || 'Rang Pilotage'; - var defvsen_buff1_desc = (values.DEFVSEN_BUFF1_DESC) || 'Mod. INT Scantech'; - var defvsen_buff2_desc = (values.DEFVSEN_BUFF2_DESC) || 'Rang Electronique'; - setAttrs({ - FOR_BUFF1_DESC: for_buff_desc, - DEX_BUFF1_DESC: dex_buff_desc, - INT_BUFF1_DESC: int_buff_desc, - PER_BUFF1_DESC: per_buff_desc, - CHA_BUFF1_DESC: cha_buff_desc, - ATKTIRV_BUFF1_DESC: atktirv_buff_desc, - INIT_BUFF1_DESC: init_buff_desc, - DEFVPIL_BUFF1_DESC: defvpil_buff1_desc, - DEFVPIL_BUFF2_DESC: defvpil_buff2_desc, - DEFVSEN_BUFF1_DESC: defvsen_buff1_desc, - DEFVSEN_BUFF2_DESC: defvsen_buff2_desc, - PE_ONCE: '', - type_personnage: 'vaisseau' - }); + getAttrs( + [ + 'UNIVERS', + 'type_personnage', + 'PE_ONCE', + 'FOR_BUFF1_DESC', + 'DEX_BUFF1_DESC', + 'INT_BUFF1_DESC', + 'PER_BUFF1_DESC', + 'CHA_BUFF1_DESC', + 'ATKTIRV_BUFF1_DESC', + 'INIT_BUFF1_DESC', + 'DEFVPIL_BUFF1_DESC', + 'DEFVPIL_BUFF2_DESC', + 'DEFVSEN_BUFF1_DESC', + 'DEFVSEN_BUFF2_DESC', + ], + function (values) { + if (values.UNIVERS == 'CG') { + if (values.type_personnage == 'vaisseau' && values.PE_ONCE !== '') { + var for_buff_desc = values.FOR_BUFF1_DESC || values.PE_ONCE; + var dex_buff_desc = values.DEX_BUFF1_DESC || values.PE_ONCE; + var int_buff_desc = values.INT_BUFF1_DESC || values.PE_ONCE; + var per_buff_desc = values.PER_BUFF1_DESC || values.PE_ONCE; + var cha_buff_desc = values.CHA_BUFF1_DESC || values.PE_ONCE; + var atktirv_buff_desc = values.ATKTIRV_BUFF1_DESC || values.PE_ONCE; + var init_buff_desc = values.INIT_BUFF1_DESC || 'Valeur DEX pilote'; + var defvpil_buff1_desc = + values.DEFVPIL_BUFF1_DESC || 'Mod. DEX Pilote'; + var defvpil_buff2_desc = values.DEFVPIL_BUFF2_DESC || 'Rang Pilotage'; + var defvsen_buff1_desc = + values.DEFVSEN_BUFF1_DESC || 'Mod. INT Scantech'; + var defvsen_buff2_desc = + values.DEFVSEN_BUFF2_DESC || 'Rang Electronique'; + setAttrs({ + FOR_BUFF1_DESC: for_buff_desc, + DEX_BUFF1_DESC: dex_buff_desc, + INT_BUFF1_DESC: int_buff_desc, + PER_BUFF1_DESC: per_buff_desc, + CHA_BUFF1_DESC: cha_buff_desc, + ATKTIRV_BUFF1_DESC: atktirv_buff_desc, + INIT_BUFF1_DESC: init_buff_desc, + DEFVPIL_BUFF1_DESC: defvpil_buff1_desc, + DEFVPIL_BUFF2_DESC: defvpil_buff2_desc, + DEFVSEN_BUFF1_DESC: defvsen_buff1_desc, + DEFVSEN_BUFF2_DESC: defvsen_buff2_desc, + PE_ONCE: '', + type_personnage: 'vaisseau', + }); + } } } - }); + ); // MAJ Version, LAST_PV getAttrs(['verfdp', 'PV'], function (values) { setAttrs({ VERSION: values.verfdp, - LAST_PV: values.PV + LAST_PV: values.PV, }); }); // ARMURE_MALUS @@ -3489,7 +3691,7 @@ on('sheet:opened', function () { let seuil_enc = parseInt(values.seuil_enc) || 0; if (seuil_enc === 0) { setAttrs({ - seuil_enc: parseInt(values.FORCE) || 0 + seuil_enc: parseInt(values.FORCE) || 0, }); } }); @@ -3512,7 +3714,7 @@ on('change:character_name', function () { var charName = values.character_name; charName = charName.replace(/ "/g, ' «'); charName = charName.replace(/" /g, '» '); - setAttrs({ character_name: charName }) + setAttrs({ character_name: charName }); }); }); @@ -3553,7 +3755,8 @@ function buffValue(v, caracs) { // c'est un mod. de carac bv = caracs[v]; } - } else { // c'est une valeur fixe + } else { + // c'est une valeur fixe bv = v; } return parseInt(bv) * bm || 0; @@ -3574,7 +3777,7 @@ function parseBuff(buffAttr) { for (let b = 0; b < buffs.length; b++) { let buff = buffs[b]; if (buff && buff !== '') { - let delim = (buff.indexOf(':') !== -1) ? ':' : ' '; + let delim = buff.indexOf(':') !== -1 ? ':' : ' '; let buffv = buff.split(delim); let buffName = ''; let buffVal = 0; @@ -3605,7 +3808,16 @@ function updateBuffs(e) { const caracs = ['FOR', 'DEX', 'CON', 'INT', 'PER', 'CHA']; let mod = e.sourceAttribute.substring(0, 3).toUpperCase(); if (!caracs.includes(mod)) return; - const attrs = [...caracs, 'ATKCAC', 'ATKTIR', 'PSYINTUI', 'PSYINFLU', 'INIT', 'DEF', 'DEP']; + const attrs = [ + ...caracs, + 'ATKCAC', + 'ATKTIR', + 'PSYINTUI', + 'PSYINFLU', + 'INIT', + 'DEF', + 'DEP', + ]; for (let a = 0; a < attrs.length; a++) { attrs[a] = `${attrs[a]}_BUFF_LIST`; } @@ -3614,7 +3826,8 @@ function updateBuffs(e) { let props = Object.keys(values); for (let p = 1; p < props.length; p++) { if (props[p].startsWith(props[0])) continue; - if (values[props[p]].indexOf(`[${props[0]}]`) !== -1) parseBuff(props[p].replace('_BUFF_LIST', '')); + if (values[props[p]].indexOf(`[${props[0]}]`) !== -1) + parseBuff(props[p].replace('_BUFF_LIST', '')); } }); } @@ -3622,53 +3835,52 @@ function updateBuffs(e) { /** * On changing an attribute serialized in the CARACS attribute */ -on([ - 'change:force', - 'change:dexterite', - 'change:constitution', - 'change:intelligence', - 'change:perception', - 'change:charisme', - 'change:niveau', - 'change:defarmureon', - 'change:voie1nom', - 'change:voie2nom', - 'change:voie3nom', - 'change:voie4nom', - 'change:voie5nom', - 'change:voie6nom', - 'change:voie7nom', - 'change:voie8nom', - 'change:voie9nom', - 'change:rang_voie1', - 'change:rang_voie2', - 'change:rang_voie3', - 'change:rang_voie4', - 'change:rang_voie5', - 'change:rang_voie6', - 'change:rang_voie7', - 'change:rang_voie8', - 'change:rang_voie9', -].join(' '), function (eventInfo) { - // on reconstruit d'abord l'attribut caché CARACS... - buildCaracs(); - // ... puis on met à jour les buffs qui contiennent une référence à la caractéristique modifiée - updateBuffs(eventInfo); -}); +on( + [ + 'change:force', + 'change:dexterite', + 'change:constitution', + 'change:intelligence', + 'change:perception', + 'change:charisme', + 'change:niveau', + 'change:defarmureon', + 'change:voie1nom', + 'change:voie2nom', + 'change:voie3nom', + 'change:voie4nom', + 'change:voie5nom', + 'change:voie6nom', + 'change:voie7nom', + 'change:voie8nom', + 'change:voie9nom', + 'change:rang_voie1', + 'change:rang_voie2', + 'change:rang_voie3', + 'change:rang_voie4', + 'change:rang_voie5', + 'change:rang_voie6', + 'change:rang_voie7', + 'change:rang_voie8', + 'change:rang_voie9', + ].join(' '), + function (eventInfo) { + // on reconstruit d'abord l'attribut caché CARACS... + buildCaracs(); + // ... puis on met à jour les buffs qui contiennent une référence à la caractéristique modifiée + updateBuffs(eventInfo); + } +); /** * Update the INIT(iative) attribute */ function updateINIT() { - getAttrs([ - 'DEXTERITE', - 'INIT_BUFF', - 'ARMURE_MALUS' - ], function (values) { + getAttrs(['DEXTERITE', 'INIT_BUFF', 'ARMURE_MALUS'], function (values) { let initVal = 0; initVal += parseInt(values.DEXTERITE) || 0; initVal += parseInt(values.INIT_BUFF) || 0; - initVal -= (parseInt(values.ARMURE_MALUS) || 0); + initVal -= parseInt(values.ARMURE_MALUS) || 0; setAttrs({ INIT: initVal }); }); } @@ -3677,53 +3889,60 @@ function updateINIT() { * On changing the relevant attributes * Update the INIT(iative) attribute */ -on([ - 'change:dexterite', - 'change:init_buff', - 'change:armure_malus' -].join(' '), function () { - updateINIT(); -}) - +on( + ['change:dexterite', 'change:init_buff', 'change:armure_malus'].join(' '), + function () { + updateINIT(); + } +); /** * Update the DEF(ense) attribute */ function updateDEF() { - getAttrs([ - 'DEFARMURE', - 'DEFARMUREON', - 'DEFBOUCLIER', - 'DEFBOUCLIERON', - 'DEXTERITE', - 'DEF_BUFF', - 'DEFACT' - ], function (values) { - let defVal = 10; - defVal += (parseInt(values.DEFARMURE) || 0) * (parseInt(values.DEFARMUREON) || 0); - defVal += (parseInt(values.DEFBOUCLIER) || 0) * (parseInt(values.DEFBOUCLIERON) || 0); - defVal += getMod(values.DEXTERITE); - defVal += parseInt(values.DEF_BUFF) || 0; - defVal += parseInt(values.DEFACT) || 0; - setAttrs({ DEF: defVal }); - }); + getAttrs( + [ + 'DEFARMURE', + 'DEFARMUREON', + 'DEFBOUCLIER', + 'DEFBOUCLIERON', + 'DEXTERITE', + 'DEF_BUFF', + 'DEFACT', + ], + function (values) { + let defVal = 10; + defVal += + (parseInt(values.DEFARMURE) || 0) * (parseInt(values.DEFARMUREON) || 0); + defVal += + (parseInt(values.DEFBOUCLIER) || 0) * + (parseInt(values.DEFBOUCLIERON) || 0); + defVal += getMod(values.DEXTERITE); + defVal += parseInt(values.DEF_BUFF) || 0; + defVal += parseInt(values.DEFACT) || 0; + setAttrs({ DEF: defVal }); + } + ); } /** * On changing the relevant attributes * Update the DEF(ense) attribute */ -on([ - 'change:defarmure', - 'change:defarmureon', - 'change:defbouclier', - 'change:defbouclieron', - 'change:dexterite', - 'change:def_buff', - 'change:defact', -].join(' '), function () { - updateDEF(); -}); +on( + [ + 'change:defarmure', + 'change:defarmureon', + 'change:defbouclier', + 'change:defbouclieron', + 'change:dexterite', + 'change:def_buff', + 'change:defact', + ].join(' '), + function () { + updateDEF(); + } +); /** * On changing the buff lists @@ -3788,18 +4007,18 @@ on('change:pv_buff_list', function () { * Rebuild the buff lists from the buffs repeating section */ function rebuildBuffs() { - getSectionIDs("buffs", function (ids) { + getSectionIDs('buffs', function (ids) { const aliases = { - 'atc': 'atkcac', - 'atd': 'atktir', - 'cac': 'atkcac', - 'contact': 'atkcac', - 'cad': 'atktir', - 'distance': 'atktir', - 'psyint': 'psyintui', - 'psyinf': 'psyinflu', - 'tir': 'atktir', - 'initiative': 'init' + atc: 'atkcac', + atd: 'atktir', + cac: 'atkcac', + contact: 'atkcac', + cad: 'atktir', + distance: 'atktir', + psyint: 'psyintui', + psyinf: 'psyinflu', + tir: 'atktir', + initiative: 'init', }; let buffs = { for: '', @@ -3815,33 +4034,40 @@ function rebuildBuffs() { init: '', def: '', dep: '', - pv: '' + pv: '', }; for (const id of ids) { - getAttrs([`repeating_buffs_${id}_buffon`, `repeating_buffs_${id}_buffnom`, `repeating_buffs_${id}_buffmods`], function (values) { - const enabled = parseInt(values[Object.keys(values)[0]]) || 0; - const buffName = values[Object.keys(values)[1]]; - const buffMods = values[Object.keys(values)[2]]; - if (enabled == 1 && buffName !== '' && buffMods !== '') { - const mods = buffMods.split(';'); - for (const mod of mods) { - const parsed = parseNameValue(mod); - let attrName = parsed.name.toLowerCase(); - let attrBuff = parsed.value; - if (Object.keys(aliases).indexOf(attrName) != -1) { - attrName = aliases[attrName]; - } - if (attrName !== '' && attrBuff !== '') { - buffs[attrName] += `${buffName} : ${attrBuff}; `; + getAttrs( + [ + `repeating_buffs_${id}_buffon`, + `repeating_buffs_${id}_buffnom`, + `repeating_buffs_${id}_buffmods`, + ], + function (values) { + const enabled = parseInt(values[Object.keys(values)[0]]) || 0; + const buffName = values[Object.keys(values)[1]]; + const buffMods = values[Object.keys(values)[2]]; + if (enabled == 1 && buffName !== '' && buffMods !== '') { + const mods = buffMods.split(';'); + for (const mod of mods) { + const parsed = parseNameValue(mod); + let attrName = parsed.name.toLowerCase(); + let attrBuff = parsed.value; + if (Object.keys(aliases).indexOf(attrName) != -1) { + attrName = aliases[attrName]; + } + if (attrName !== '' && attrBuff !== '') { + buffs[attrName] += `${buffName} : ${attrBuff}; `; + } } } + let setBuffs = {}; + for (const attr in buffs) { + setBuffs[`${attr.toUpperCase()}_BUFF_LIST`] = buffs[attr]; + } + setAttrs(setBuffs); } - let setBuffs = {}; - for (const attr in buffs) { - setBuffs[`${attr.toUpperCase()}_BUFF_LIST`] = buffs[attr]; - } - setAttrs(setBuffs); - }); + ); } }); } @@ -3879,125 +4105,155 @@ function setBuff(v, buffAttr) { setAttrs(buff); } -on([ - 'change:for_buff1', - 'change:for_buff2', - 'change:for_buff3', - 'change:for_buff4', - 'change:for_buff5' -].join(' '), function () { - getAttrs(attrBuff('FOR'), function (values) { - setBuff(values, 'FOR'); - }); -}); +on( + [ + 'change:for_buff1', + 'change:for_buff2', + 'change:for_buff3', + 'change:for_buff4', + 'change:for_buff5', + ].join(' '), + function () { + getAttrs(attrBuff('FOR'), function (values) { + setBuff(values, 'FOR'); + }); + } +); -on([ - 'change:dex_buff1', - 'change:dex_buff2', - 'change:dex_buff3', - 'change:dex_buff4', - 'change:dex_buff5' -].join(' '), function () { - getAttrs(attrBuff('DEX'), function (values) { - setBuff(values, 'DEX'); - }); -}); +on( + [ + 'change:dex_buff1', + 'change:dex_buff2', + 'change:dex_buff3', + 'change:dex_buff4', + 'change:dex_buff5', + ].join(' '), + function () { + getAttrs(attrBuff('DEX'), function (values) { + setBuff(values, 'DEX'); + }); + } +); -on([ - 'change:con_buff1', - 'change:con_buff2', - 'change:con_buff3', - 'change:con_buff4', - 'change:con_buff5' -].join(' '), function () { - getAttrs(attrBuff('CON'), function (values) { - setBuff(values, 'CON'); - }); -}); +on( + [ + 'change:con_buff1', + 'change:con_buff2', + 'change:con_buff3', + 'change:con_buff4', + 'change:con_buff5', + ].join(' '), + function () { + getAttrs(attrBuff('CON'), function (values) { + setBuff(values, 'CON'); + }); + } +); -on([ - 'change:int_buff1', - 'change:int_buff2', - 'change:int_buff3', - 'change:int_buff4', - 'change:int_buff5' -].join(' '), function () { - getAttrs(attrBuff('INT'), function (values) { - setBuff(values, 'INT'); - }); -}); +on( + [ + 'change:int_buff1', + 'change:int_buff2', + 'change:int_buff3', + 'change:int_buff4', + 'change:int_buff5', + ].join(' '), + function () { + getAttrs(attrBuff('INT'), function (values) { + setBuff(values, 'INT'); + }); + } +); -on([ - 'change:per_buff1', - 'change:per_buff2', - 'change:per_buff3', - 'change:per_buff4', - 'change:per_buff5' -].join(' '), function () { - getAttrs(attrBuff('PER'), function (values) { - setBuff(values, 'PER'); - }); -}); +on( + [ + 'change:per_buff1', + 'change:per_buff2', + 'change:per_buff3', + 'change:per_buff4', + 'change:per_buff5', + ].join(' '), + function () { + getAttrs(attrBuff('PER'), function (values) { + setBuff(values, 'PER'); + }); + } +); -on([ - 'change:cha_buff1', - 'change:cha_buff2', - 'change:cha_buff3', - 'change:cha_buff4', - 'change:cha_buff5' -].join(' '), function () { - getAttrs(attrBuff('CHA'), function (values) { - setBuff(values, 'CHA'); - }); -}); +on( + [ + 'change:cha_buff1', + 'change:cha_buff2', + 'change:cha_buff3', + 'change:cha_buff4', + 'change:cha_buff5', + ].join(' '), + function () { + getAttrs(attrBuff('CHA'), function (values) { + setBuff(values, 'CHA'); + }); + } +); -on([ - 'change:atktirv_buff1', - 'change:atktirv_buff2', - 'change:atktirv_buff3', - 'change:atktirv_buff4', - 'change:atktirv_buff5' -].join(' '), function () { - getAttrs(attrBuff('ATKTIRV'), function (values) { - setBuff(values, 'ATKTIRV'); - }); -}); +on( + [ + 'change:atktirv_buff1', + 'change:atktirv_buff2', + 'change:atktirv_buff3', + 'change:atktirv_buff4', + 'change:atktirv_buff5', + ].join(' '), + function () { + getAttrs(attrBuff('ATKTIRV'), function (values) { + setBuff(values, 'ATKTIRV'); + }); + } +); -on([ - 'change:defvpil_buff1', - 'change:defvpil_buff2', - 'change:defvpil_buff3', - 'change:defvpil_buff4', - 'change:defvpil_buff5' -].join(' '), function () { - getAttrs(attrBuff('DEFVPIL'), function (values) { - setBuff(values, 'DEFVPIL'); - }); -}); +on( + [ + 'change:defvpil_buff1', + 'change:defvpil_buff2', + 'change:defvpil_buff3', + 'change:defvpil_buff4', + 'change:defvpil_buff5', + ].join(' '), + function () { + getAttrs(attrBuff('DEFVPIL'), function (values) { + setBuff(values, 'DEFVPIL'); + }); + } +); -on([ - 'change:defvsen_buff1', - 'change:defvsen_buff2', - 'change:defvsen_buff3', - 'change:defvsen_buff4', - 'change:defvsen_buff5' -].join(' '), function () { - getAttrs(attrBuff('DEFVSEN'), function (values) { - setBuff(values, 'DEFVSEN'); - }); -}); +on( + [ + 'change:defvsen_buff1', + 'change:defvsen_buff2', + 'change:defvsen_buff3', + 'change:defvsen_buff4', + 'change:defvsen_buff5', + ].join(' '), + function () { + getAttrs(attrBuff('DEFVSEN'), function (values) { + setBuff(values, 'DEFVSEN'); + }); + } +); -on([ - 'change:pev_buff1', - 'change:pev_buff2', - 'change:pev_buff3', - 'change:pev_buff4', - 'change:pev_buff5' -].join(' '), function () { - getAttrs(attrBuff('PEV'), function (values) { - setBuff(values, 'PEV'); - }); -}); +on( + [ + 'change:pev_buff1', + 'change:pev_buff2', + 'change:pev_buff3', + 'change:pev_buff4', + 'change:pev_buff5', + ].join(' '), + function () { + getAttrs(attrBuff('PEV'), function (values) { + setBuff(values, 'PEV'); + }); + } +); /** * On changing the 'Blessure' checkbox @@ -4005,9 +4261,9 @@ on([ */ on('change:blessure', function () { getAttrs(['BLESSURE'], function (values) { - var etatde = (values.BLESSURE == '1') ? '12' : '20'; + var etatde = values.BLESSURE == '1' ? '12' : '20'; setAttrs({ - ETATDE: etatde + ETATDE: etatde, }); }); }); @@ -4018,10 +4274,11 @@ on('change:blessure', function () { */ on('change:poisse', function () { getAttrs(['POISSE'], function (values) { - var jetn = (values.POISSE == '1') ? '2d@{ETATDE}kl1' : '1d@{ETATDE}'; - var jets = (values.POISSE == '1') ? '1d@{ETATDE}' : '2d@{ETATDE}kh1'; - var jetsh = (values.POISSE == '1') ? '2d@{ETATDE}kh1' : '{2d@{ETATDE}kh1, 0d20+10}kh1'; - var jetr = (values.POISSE == '1') ? '2d12kl1' : '1d12'; + var jetn = values.POISSE == '1' ? '2d@{ETATDE}kl1' : '1d@{ETATDE}'; + var jets = values.POISSE == '1' ? '1d@{ETATDE}' : '2d@{ETATDE}kh1'; + var jetsh = + values.POISSE == '1' ? '2d@{ETATDE}kh1' : '{2d@{ETATDE}kh1, 0d20+10}kh1'; + var jetr = values.POISSE == '1' ? '2d12kl1' : '1d12'; setAttrs({ JETNORMAL: jetn, JETSUP: jets, @@ -4030,7 +4287,7 @@ on('change:poisse', function () { JDEX: jetn, JDEXSUP: jets, JDEXSUPHERO: jetsh, - JDEXRISQUE: jetr + JDEXRISQUE: jetr, }); }); }); @@ -4040,7 +4297,9 @@ on('change:poisse', function () { * - Set the 'BLESSURE' attribute */ on('change:pv', function () { - getAttrs(['PV', 'PV_max', 'LAST_PV', 'SEUILBG', 'BLESSURE'], function (values) { + getAttrs(['PV', 'PV_max', 'LAST_PV', 'SEUILBG', 'BLESSURE'], function ( + values + ) { var seuilbg = parseInt(values.SEUILBG) || 0; var max_pv = parseInt(values.PV_max) || 0; var last_pv = parseInt(values.LAST_PV) || max_pv; @@ -4051,7 +4310,7 @@ on('change:pv', function () { } setAttrs({ LAST_PV: values.PV, - BLESSURE: blessure + BLESSURE: blessure, }); }); }); @@ -4061,39 +4320,48 @@ on('change:pv', function () { * - Parse the statblock text * - Create the NPC character sheet */ -on('change:statblock', function (eventInfo) { - if (eventInfo.newValue === '') return; +on('clicked:sb_import', function () { getAttrs(['UNIVERS', 'statblock'], function (values) { - var messages = ''; - var pnjObj = importStatblock(values.statblock); + if (values.statblock.trim() === '') return; + let messages = ''; + // parse statblock text + pnjObj = importStatblock(values.statblock); if (pnjObj) { consoleLog(pnjObj, 'NPC object'); + // process characteristics & combat attributes messages = processBaseAttributes(values.UNIVERS, pnjObj); - if (pnjObj.hasOwnProperty('Atks')) { - var result = processAttacks(values.UNIVERS, pnjObj); - if (result !== '' && messages !== '') result = '\n' + result; - messages += result; - delete pnjObj.Atks; - } - if (pnjObj.hasOwnProperty('Capas')) { - result = processTraits(values.UNIVERS, pnjObj); - if (result != '' && messages != '') result = '\n' + result; - messages += result; - delete pnjObj['Capas']; - } - // Other attributes go to DIVERS field - var divers = ''; - var otherAttrs = Object.keys(pnjObj); - consoleLog(otherAttrs, 'additional data'); - if (otherAttrs.length > 0) { - for (var other = 0; other < otherAttrs.length; other++) { - var k = otherAttrs[other]; - divers += k + ' ' + pnjObj[k] + '\n'; + // process attack lines + if (pnjObj['Atks'].length > 0) { + result = processAttacks(values.UNIVERS, pnjObj); + if (result != '' && messages != '') { + result = '\n' + result; } + messages += result; + } + delete pnjObj['Atks']; + // process trait/ability lines + if (pnjObj['Capas'].length > 0) { + result = processTraits(values.UNIVERS, pnjObj); + if (result != '' && messages != '') { + result = '\n' + result; + } + messages += result; + } + delete pnjObj['Capas']; + // Other attributes go to DIVERS field + let divers = ''; + if (pnjObj['Extras'].length > 0) { + divers = pnjObj['Extras'].join('\n'); + } + delete pnjObj['Extras']; + let otherAttrs = Object.keys(pnjObj); + consoleLog(otherAttrs, 'additional data'); + for (const other in otherAttrs) { + divers += other + ' ' + pnjObj[other] + '\n'; } setAttrs({ pnj_divers: divers, - sbresult: messages + sbresult: messages, }); } }); @@ -4110,106 +4378,154 @@ const npcAtkAttribs = [ 'atkdmde', 'atkdmbonus', 'atkportee', - 'atkspec' -] + 'atkspec', +]; /** * Convert an NPC to a PC character sheet */ function convertToPC() { - getAttrs([ - 'pnj_for', 'pnj_dex', 'pnj_con', 'pnj_int', 'pnj_per', 'pnj_cha', - 'pnj_jetfor', 'pnj_jetdex', 'pnj_jetcon', 'pnj_jetint', 'pnj_jetper', 'pnj_jetcha', - 'pnj_init', 'pnj_def', 'pnj_dep', 'pnj_pv', 'pnj_pv_max' - ], function (values) { - let attrs = {}; - for (let attr of ['FORCE', 'DEXTERITE', 'CONSTITUTION', 'INTELLIGENCE', 'PERCEPTION', 'CHARISME']) { - let attrv = parseInt(values[`pnj_${attr.substring(0, 3).toLowerCase()}`]) || 0; - attrs[attr] = 10 + (2 * attrv); - if (attr === 'DEXTERITE') { - let init = parseInt(values.pnj_init) || 0; - if (init === attrv + 1) { - attrs[attr]++; - } else { - attrs['INIT_BUFF_LIST'] = 'Bonus Init.'; - attrs['INIT_BUFF'] = init - attrs[attr]; - } - let defb = 10 + attrv; - let def = parseInt(values.pnj_def) || 0; - if (def !== defb) { - attrs['DEF_BUFF_LIST'] = 'Bonus DEF'; - attrs['DEF_BUFF'] = def - defb; - } - attrs['DEX_SUP'] = (values['pnj_jetdex'] === '2d20kh1') ? '@{JDEXSUP}' : '@{JDEX}'; - } else if (attr === 'CHARISME') { - let depb = 10 + attrv; - let dep = parseInt(values.pnj_dep) || 0; - if (dep !== depb) { - attrs['DEP_BUFF_LIST'] = 'Bonus DEP'; - attrs['DEP_BUFF'] = dep - depb; - } - } else { - attrs[`${attr.substring(0, 3)}_SUP`] = (values[`pnj_jet${attr.substring(0, 3).toLowerCase()}`] === '2d20kh1') ? '@{JETSUP}' : '@{JETNORMAL}'; - } - } - attrs['PV'] = parseInt(values.pnj_pv) || 0; - attrs['PV_max'] = parseInt(values.pnj_pv_max) || 0; - getSectionIDs('repeating_armes', function (ids) { - for (let id of ids) { - removeRepeatingRow(`repeating_armes_${id}`); - } - }); - getSectionIDs('repeating_pnjatk', function (ids) { - for (let id of ids) { - getAttrs([...npcAtkAttribs.map(attr => `repeating_pnjatk_${id}_${attr}`), 'pnj_for', 'pnj_dex', 'pnj_cha'], function (values) { - consoleLog(values); - let v = {}; - for (let attr of npcAtkAttribs) { - v[attr] = values[`repeating_pnjatk_${id}_${attr}`] || ''; - } - newRowID = generateRowID(); - let atkRow = {}; - atkRow[`repeating_armes_${newRowID}_armeatt`] = v['atkatt']; - atkRow[`repeating_armes_${newRowID}_armenom`] = v['atknom']; - let psyint = v['atknom'].toLowerCase().includes('psy intuition'); - let psyinf = v['atknom'].toLowerCase().includes('psy influence'); - let tohit = parseInt(v['atkbonus']) || 0; - let atk = 0; - let bdm = 0; - if (v['atkportee'] && v['atkportee'] !== '') { - atk = values.pnj_dex || 0; - if (psyint) atk = values.pnj_int || 0; - if (psyinf) atk = values.pnj_cha || 0; - atkRow[`repeating_armes_${newRowID}_armeatk`] = '@{ATKTIR}'; - if (psyint) atkRow[`repeating_armes_${newRowID}_armeatk`] = '@{ATKPSYINTUI}'; - if (psyinf) atkRow[`repeating_armes_${newRowID}_armeatk`] = '@{ATKPSYINFLU}'; - atkRow[`repeating_armes_${newRowID}_armedmcar`] = '0'; + getAttrs( + [ + 'pnj_for', + 'pnj_dex', + 'pnj_con', + 'pnj_int', + 'pnj_per', + 'pnj_cha', + 'pnj_jetfor', + 'pnj_jetdex', + 'pnj_jetcon', + 'pnj_jetint', + 'pnj_jetper', + 'pnj_jetcha', + 'pnj_init', + 'pnj_def', + 'pnj_dep', + 'pnj_pv', + 'pnj_pv_max', + ], + function (values) { + let attrs = {}; + for (let attr of [ + 'FORCE', + 'DEXTERITE', + 'CONSTITUTION', + 'INTELLIGENCE', + 'PERCEPTION', + 'CHARISME', + ]) { + let attrv = + parseInt(values[`pnj_${attr.substring(0, 3).toLowerCase()}`]) || 0; + attrs[attr] = 10 + 2 * attrv; + if (attr === 'DEXTERITE') { + let init = parseInt(values.pnj_init) || 0; + if (init === attrv + 1) { + attrs[attr]++; } else { - atk = values.pnj_for || 0; - if (psyint) atk = values.pnj_int || 0; - if (psyinf) atk = values.pnj_cha || 0; - bdm = (psyint || psyinf) ? 0 : atk; - atkRow[`repeating_armes_${newRowID}_armeatk`] = '@{ATKCAC}'; - if (psyint) atkRow[`repeating_armes_${newRowID}_armeatk`] = '@{ATKPSYINTUI}'; - if (psyinf) atkRow[`repeating_armes_${newRowID}_armeatk`] = '@{ATKPSYINFLU}'; - atkRow[`repeating_armes_${newRowID}_armedmcar`] = (psyint || psyinf) ? '0' : '@{FOR}'; + attrs['INIT_BUFF_LIST'] = 'Bonus Init.'; + attrs['INIT_BUFF'] = init - attrs[attr]; } - if (tohit !== atk) atkRow[`repeating_armes_${newRowID}_armeatkdiv`] = tohit - atk; - atkRow[`repeating_armes_${newRowID}_armejetd`] = v['atkjet']; - atkRow[`repeating_armes_${newRowID}_armecrit`] = v['atkcrit']; - atkRow[`repeating_armes_${newRowID}_armedmg`] = v['atkdmg']; - atkRow[`repeating_armes_${newRowID}_armedmnbde`] = v['atkdmnbde']; - atkRow[`repeating_armes_${newRowID}_armedmde`] = v['atkdmde']; - let dmdiv = parseInt(v['atkdmbonus']) || 0; - if (dmdiv !== bdm) atkRow[`repeating_armes_${newRowID}_armedmdiv`] = dmdiv - bdm; - atkRow[`repeating_armes_${newRowID}_armeportee`] = v['atkportee']; - atkRow[`repeating_armes_${newRowID}_armespec`] = v['atkspec']; - setAttrs(atkRow); - }); + let defb = 10 + attrv; + let def = parseInt(values.pnj_def) || 0; + if (def !== defb) { + attrs['DEF_BUFF_LIST'] = 'Bonus DEF'; + attrs['DEF_BUFF'] = def - defb; + } + attrs['DEX_SUP'] = + values['pnj_jetdex'] === '2d20kh1' ? '@{JDEXSUP}' : '@{JDEX}'; + } else if (attr === 'CHARISME') { + let depb = 10 + attrv; + let dep = parseInt(values.pnj_dep) || 0; + if (dep !== depb) { + attrs['DEP_BUFF_LIST'] = 'Bonus DEP'; + attrs['DEP_BUFF'] = dep - depb; + } + } else { + attrs[`${attr.substring(0, 3)}_SUP`] = + values[`pnj_jet${attr.substring(0, 3).toLowerCase()}`] === '2d20kh1' + ? '@{JETSUP}' + : '@{JETNORMAL}'; + } } - }); - setAttrs(attrs); - }); + attrs['PV'] = parseInt(values.pnj_pv) || 0; + attrs['PV_max'] = parseInt(values.pnj_pv_max) || 0; + getSectionIDs('repeating_armes', function (ids) { + for (let id of ids) { + removeRepeatingRow(`repeating_armes_${id}`); + } + }); + getSectionIDs('repeating_pnjatk', function (ids) { + for (let id of ids) { + getAttrs( + [ + ...npcAtkAttribs.map((attr) => `repeating_pnjatk_${id}_${attr}`), + 'pnj_for', + 'pnj_dex', + 'pnj_cha', + ], + function (values) { + consoleLog(values); + let v = {}; + for (let attr of npcAtkAttribs) { + v[attr] = values[`repeating_pnjatk_${id}_${attr}`] || ''; + } + newRowID = generateRowID(); + let atkRow = {}; + atkRow[`repeating_armes_${newRowID}_armeatt`] = v['atkatt']; + atkRow[`repeating_armes_${newRowID}_armenom`] = v['atknom']; + let psyint = v['atknom'].toLowerCase().includes('psy intuition'); + let psyinf = v['atknom'].toLowerCase().includes('psy influence'); + let tohit = parseInt(v['atkbonus']) || 0; + let atk = 0; + let bdm = 0; + if (v['atkportee'] && v['atkportee'] !== '') { + atk = values.pnj_dex || 0; + if (psyint) atk = values.pnj_int || 0; + if (psyinf) atk = values.pnj_cha || 0; + atkRow[`repeating_armes_${newRowID}_armeatk`] = '@{ATKTIR}'; + if (psyint) + atkRow[`repeating_armes_${newRowID}_armeatk`] = + '@{ATKPSYINTUI}'; + if (psyinf) + atkRow[`repeating_armes_${newRowID}_armeatk`] = + '@{ATKPSYINFLU}'; + atkRow[`repeating_armes_${newRowID}_armedmcar`] = '0'; + } else { + atk = values.pnj_for || 0; + if (psyint) atk = values.pnj_int || 0; + if (psyinf) atk = values.pnj_cha || 0; + bdm = psyint || psyinf ? 0 : atk; + atkRow[`repeating_armes_${newRowID}_armeatk`] = '@{ATKCAC}'; + if (psyint) + atkRow[`repeating_armes_${newRowID}_armeatk`] = + '@{ATKPSYINTUI}'; + if (psyinf) + atkRow[`repeating_armes_${newRowID}_armeatk`] = + '@{ATKPSYINFLU}'; + atkRow[`repeating_armes_${newRowID}_armedmcar`] = + psyint || psyinf ? '0' : '@{FOR}'; + } + if (tohit !== atk) + atkRow[`repeating_armes_${newRowID}_armeatkdiv`] = tohit - atk; + atkRow[`repeating_armes_${newRowID}_armejetd`] = v['atkjet']; + atkRow[`repeating_armes_${newRowID}_armecrit`] = v['atkcrit']; + atkRow[`repeating_armes_${newRowID}_armedmg`] = v['atkdmg']; + atkRow[`repeating_armes_${newRowID}_armedmnbde`] = v['atkdmnbde']; + atkRow[`repeating_armes_${newRowID}_armedmde`] = v['atkdmde']; + let dmdiv = parseInt(v['atkdmbonus']) || 0; + if (dmdiv !== bdm) + atkRow[`repeating_armes_${newRowID}_armedmdiv`] = dmdiv - bdm; + atkRow[`repeating_armes_${newRowID}_armeportee`] = v['atkportee']; + atkRow[`repeating_armes_${newRowID}_armespec`] = v['atkspec']; + setAttrs(atkRow); + } + ); + } + }); + setAttrs(attrs); + } + ); } /** @@ -4217,7 +4533,8 @@ function convertToPC() { * - Convert an NPC to a PC */ on('change:type_personnage', function (eventInfo) { - if (eventInfo.previousValue === 'pnj' && eventInfo.newValue === 'pj') convertToPC(); + if (eventInfo.previousValue === 'pnj' && eventInfo.newValue === 'pj') + convertToPC(); // if (eventInfo.previousValue === 'pj' && eventInfo.newValue === 'pnj') convertToNPC(); getAttrs(['type_personnage'], function (value) { let attrs = {}; @@ -4229,7 +4546,7 @@ on('change:type_personnage', function (eventInfo) { }); /** - * Return attributes array for a starsgip station + * Return attributes array for a starsgip station * @param {string} attr Spaceship station shortname */ function attrStation(attr) { @@ -4262,7 +4579,9 @@ function setStation(v, attr, fill) { } else { station_attr = `POSTE_${attr}`; } - station[station_attr] = `[[${station_name}]][${fill[1]}] + ${station_bonus}[${fill[2]}]`; + station[ + station_attr + ] = `[[${station_name}]][${fill[1]}] + ${station_bonus}[${fill[2]}]`; setAttrs(station); } @@ -4270,50 +4589,48 @@ function setStation(v, attr, fill) { * On change of spaceship stations character names of bonus * - Rebuild hidden macro formulas */ -on([ - 'change:poste_pil_nom', - 'change:poste_pil_bonus' -].join(' '), function () { +on(['change:poste_pil_nom', 'change:poste_pil_bonus'].join(' '), function () { getAttrs(attrStation('PIL'), function (values) { setStation(values, 'PIL', ['DEX', 'DEX pilote', 'Pilotage']); }); }); -on([ - 'change:poste_mot_nom', - 'change:poste_mot_bonus' -].join(' '), function () { +on(['change:poste_mot_nom', 'change:poste_mot_bonus'].join(' '), function () { getAttrs(attrStation('MOT'), function (values) { setStation(values, 'MOT', ['INT', 'INT mécano', 'Moteurs']); }); }); -on([ - 'change:poste_sen_nom', - 'change:poste_sen_bonus' -].join(' '), function () { +on(['change:poste_sen_nom', 'change:poste_sen_bonus'].join(' '), function () { getAttrs(attrStation('SEN'), function (values) { - setStation(values, 'SEN', ['INT', 'INT scan', 'Electronique/Investigation']); + setStation(values, 'SEN', [ + 'INT', + 'INT scan', + 'Electronique/Investigation', + ]); }); }); -on([ - 'change:poste_ord_nom', - 'change:poste_ord_bonus' -].join(' '), function () { +on(['change:poste_ord_nom', 'change:poste_ord_bonus'].join(' '), function () { getAttrs(attrStation('ORD'), function (values) { setStation(values, 'ORD', ['INT', 'INT info', 'Electronique']); }); }); -on([ - 'change:repeating_armesv:armecan_nom', - 'change:repeating_armesv:armecan_bonus' -].join(' '), function () { - getAttrs(['repeating_armesv_armecan_nom', 'repeating_armesv_armecan_bonus'], function (values) { - setStation(values, 'CAN', ['DEX', 'DEX canonnier', 'Armes lourdes']); - }); -}); +on( + [ + 'change:repeating_armesv:armecan_nom', + 'change:repeating_armesv:armecan_bonus', + ].join(' '), + function () { + getAttrs( + ['repeating_armesv_armecan_nom', 'repeating_armesv_armecan_bonus'], + function (values) { + setStation(values, 'CAN', ['DEX', 'DEX canonnier', 'Armes lourdes']); + } + ); + } +); /** * Initialize an array of abilities @@ -4355,149 +4672,176 @@ function setRank(voie) { * - Determine the current rank in the path * - Rebuild the CARACS attribute */ -on([ - 'change:voie1nom', - 'change:voie1-1', - 'change:voie1-2', - 'change:voie1-3', - 'change:voie1-4', - 'change:voie1-5', - 'change:v1r1', - 'change:v1r2', - 'change:v1r3', - 'change:v1r4', - 'change:v1r5' -].join(' '), function () { - setRank('1'); -}); +on( + [ + 'change:voie1nom', + 'change:voie1-1', + 'change:voie1-2', + 'change:voie1-3', + 'change:voie1-4', + 'change:voie1-5', + 'change:v1r1', + 'change:v1r2', + 'change:v1r3', + 'change:v1r4', + 'change:v1r5', + ].join(' '), + function () { + setRank('1'); + } +); -on([ - 'change:voie2nom', - 'change:voie2-1', - 'change:voie2-2', - 'change:voie2-3', - 'change:voie2-4', - 'change:voie2-5', - 'change:v2r1', - 'change:v2r2', - 'change:v2r3', - 'change:v2r4', - 'change:v2r5' -].join(' '), function () { - setRank('2'); -}); +on( + [ + 'change:voie2nom', + 'change:voie2-1', + 'change:voie2-2', + 'change:voie2-3', + 'change:voie2-4', + 'change:voie2-5', + 'change:v2r1', + 'change:v2r2', + 'change:v2r3', + 'change:v2r4', + 'change:v2r5', + ].join(' '), + function () { + setRank('2'); + } +); -on([ - 'change:voie3nom', - 'change:voie3-1', - 'change:voie3-2', - 'change:voie3-3', - 'change:voie3-4', - 'change:voie3-5', - 'change:v3r1', - 'change:v3r2', - 'change:v3r3', - 'change:v3r4', - 'change:v3r5' -].join(' '), function () { - setRank('3'); -}); +on( + [ + 'change:voie3nom', + 'change:voie3-1', + 'change:voie3-2', + 'change:voie3-3', + 'change:voie3-4', + 'change:voie3-5', + 'change:v3r1', + 'change:v3r2', + 'change:v3r3', + 'change:v3r4', + 'change:v3r5', + ].join(' '), + function () { + setRank('3'); + } +); -on([ - 'change:voie4nom', - 'change:voie4-1', - 'change:voie4-2', - 'change:voie4-3', - 'change:voie4-4', - 'change:voie4-5', - 'change:v4r1', - 'change:v4r2', - 'change:v4r3', - 'change:v4r4', - 'change:v4r5' -].join(' '), function () { - setRank('4'); -}); +on( + [ + 'change:voie4nom', + 'change:voie4-1', + 'change:voie4-2', + 'change:voie4-3', + 'change:voie4-4', + 'change:voie4-5', + 'change:v4r1', + 'change:v4r2', + 'change:v4r3', + 'change:v4r4', + 'change:v4r5', + ].join(' '), + function () { + setRank('4'); + } +); -on([ - 'change:voie5nom', - 'change:voie5-1', - 'change:voie5-2', - 'change:voie5-3', - 'change:voie5-4', - 'change:voie5-5', - 'change:v5r1', - 'change:v5r2', - 'change:v5r3', - 'change:v5r4', - 'change:v5r5' -].join(' '), function () { - setRank('5'); -}); +on( + [ + 'change:voie5nom', + 'change:voie5-1', + 'change:voie5-2', + 'change:voie5-3', + 'change:voie5-4', + 'change:voie5-5', + 'change:v5r1', + 'change:v5r2', + 'change:v5r3', + 'change:v5r4', + 'change:v5r5', + ].join(' '), + function () { + setRank('5'); + } +); -on([ - 'change:voie6nom', - 'change:voie6-1', - 'change:voie6-2', - 'change:voie6-3', - 'change:voie6-4', - 'change:voie6-5', - 'change:v6r1', - 'change:v6r2', - 'change:v6r3', - 'change:v6r4', - 'change:v6r5' -].join(' '), function () { - setRank('6'); -}); +on( + [ + 'change:voie6nom', + 'change:voie6-1', + 'change:voie6-2', + 'change:voie6-3', + 'change:voie6-4', + 'change:voie6-5', + 'change:v6r1', + 'change:v6r2', + 'change:v6r3', + 'change:v6r4', + 'change:v6r5', + ].join(' '), + function () { + setRank('6'); + } +); -on([ - 'change:voie7nom', - 'change:voie7-1', - 'change:voie7-2', - 'change:voie7-3', - 'change:voie7-4', - 'change:voie7-5', - 'change:v7r1', - 'change:v7r2', - 'change:v7r3', - 'change:v7r4', - 'change:v7r5' -].join(' '), function () { - setRank('7'); -}); +on( + [ + 'change:voie7nom', + 'change:voie7-1', + 'change:voie7-2', + 'change:voie7-3', + 'change:voie7-4', + 'change:voie7-5', + 'change:v7r1', + 'change:v7r2', + 'change:v7r3', + 'change:v7r4', + 'change:v7r5', + ].join(' '), + function () { + setRank('7'); + } +); -on([ - 'change:voie8nom', - 'change:voie8-1', - 'change:voie8-2', - 'change:voie8-3', - 'change:voie8-4', - 'change:voie8-5', - 'change:v8r1', - 'change:v8r2', - 'change:v8r3', - 'change:v8r4', - 'change:v8r5' -].join(' '), function () { - setRank('8'); -}); +on( + [ + 'change:voie8nom', + 'change:voie8-1', + 'change:voie8-2', + 'change:voie8-3', + 'change:voie8-4', + 'change:voie8-5', + 'change:v8r1', + 'change:v8r2', + 'change:v8r3', + 'change:v8r4', + 'change:v8r5', + ].join(' '), + function () { + setRank('8'); + } +); -on([ - 'change:voie9nom', - 'change:voie9-1', - 'change:voie9-2', - 'change:voie9-3', - 'change:voie9-4', - 'change:voie9-5', - 'change:v9r1', - 'change:v9r2', - 'change:v9r3', - 'change:v9r4', - 'change:v9r5' -].join(' '), function () { - setRank('9'); -}); +on( + [ + 'change:voie9nom', + 'change:voie9-1', + 'change:voie9-2', + 'change:voie9-3', + 'change:voie9-4', + 'change:voie9-5', + 'change:v9r1', + 'change:v9r2', + 'change:v9r3', + 'change:v9r4', + 'change:v9r5', + ].join(' '), + function () { + setRank('9'); + } +); /** * Compute the armor malus @@ -4507,7 +4851,7 @@ function setArmorMalus() { let armure_on = values.DEFARMUREON || 0; let armure_malus = values.DEFARMUREMALUS || 0; setAttrs({ - ARMURE_MALUS: armure_on * armure_malus + ARMURE_MALUS: armure_on * armure_malus, }); }); } @@ -4516,10 +4860,9 @@ function setArmorMalus() { * On changing the armor attributes * - Re-compute the armor malus */ -on([ - 'change:defarmureon', - 'change:defarmuremalus' -].join(' '), function (eventInfo) { +on(['change:defarmureon', 'change:defarmuremalus'].join(' '), function ( + eventInfo +) { setArmorMalus(); }); @@ -4527,21 +4870,27 @@ on([ * On changing the 2nd damage info * - Set the roll macro for the 2nd damage */ -on([ - 'change:repeating_armes:armedm2_de', - 'change:repeating_armes:armedm2_desc' -].join(' '), function (eventInfo) { - getAttrs(['repeating_armes_armedm2_de', 'repeating_armes_armedm2_desc'], function (values) { - let dm2_de = values.repeating_armes_armedm2_de || ''; - let dm2_desc = values.repeating_armes_armedm2_desc || ''; - let dmg2 = ''; - if (dm2_desc !== '') dm2_desc = `[${dm2_desc}] `; - if (dm2_de !== '') dmg2 = `[[${dm2_de}${dm2_desc}]]`; - setAttrs({ - repeating_armes_armedmg2: dmg2 - }); - }); -}); +on( + [ + 'change:repeating_armes:armedm2_de', + 'change:repeating_armes:armedm2_desc', + ].join(' '), + function (eventInfo) { + getAttrs( + ['repeating_armes_armedm2_de', 'repeating_armes_armedm2_desc'], + function (values) { + let dm2_de = values.repeating_armes_armedm2_de || ''; + let dm2_desc = values.repeating_armes_armedm2_desc || ''; + let dmg2 = ''; + if (dm2_desc !== '') dm2_desc = `[${dm2_desc}] `; + if (dm2_de !== '') dmg2 = `[[${dm2_de}${dm2_desc}]]`; + setAttrs({ + repeating_armes_armedmg2: dmg2, + }); + } + ); + } +); /** * On changing the attack range @@ -4560,7 +4909,9 @@ on('change:repeating_armes:armeportee', function () { let portees = parseInt(portee) || 0; if (portees !== 0) { setAttrs({ - repeating_armes_armeportees: `${portees}m | ${portees * 2}m (DM/2) | ${portees * 3}m (DM/3)` + repeating_armes_armeportees: `${portees}m | ${portees * 2}m (DM/2) | ${ + portees * 3 + }m (DM/3)`, }); } }); @@ -4582,7 +4933,7 @@ function actionLimitee(v) { on('change:repeating_armes:arme_al', function () { getAttrs(['repeating_armes_arme_al'], function (value) { setAttrs({ - repeating_armes_armelim: actionLimitee(value) + repeating_armes_armelim: actionLimitee(value), }); }); }); @@ -4594,7 +4945,7 @@ on('change:repeating_armes:arme_al', function () { on('change:repeating_jetcapas:jetcapa_al', function () { getAttrs(['repeating_jetcapas_jetcapa_al'], function (value) { setAttrs({ - repeating_jetcapas_jetcapalim: actionLimitee(value) + repeating_jetcapas_jetcapalim: actionLimitee(value), }); }); }); @@ -4603,41 +4954,47 @@ on('change:repeating_jetcapas:jetcapa_al', function () { * On changing ranks modifier attributes * - Set the ability/skill description */ -on([ - 'change:repeating_jetcapas:jetcapavoie', - 'change:repeating_jetcapas:jetcapacoeff', - 'change:repeating_jetcapas:jetcaparang' -].join(' '), function () { - getAttrs([ - 'repeating_jetcapas_jetcapavoie', - 'repeating_jetcapas_jetcapacoeff', - 'repeating_jetcapas_jetcaparang', - 'CARACS' - ], function (values) { - const caracs = JSON.parse(values.CARACS); - const voierang = values.repeating_jetcapas_jetcapavoie || ''; - const coeff = parseInt(values.repeating_jetcapas_jetcapacoeff) || 0; - let vn = 0; - let rang = values.repeating_jetcapas_jetcaparang || ''; - if (rang.startsWith('@{') && rang.endsWith('}')) { - vn = parseInt(rang.slice(rang.length - 2, rang.length - 1)) || -1; - if (vn >= 0) { - voie = caracs['voies'][vn - 1] || ''; - if (voie !== '') { - voie = voie.slice(0, 1) + voie.slice(1).toLowerCase(); +on( + [ + 'change:repeating_jetcapas:jetcapavoie', + 'change:repeating_jetcapas:jetcapacoeff', + 'change:repeating_jetcapas:jetcaparang', + ].join(' '), + function () { + getAttrs( + [ + 'repeating_jetcapas_jetcapavoie', + 'repeating_jetcapas_jetcapacoeff', + 'repeating_jetcapas_jetcaparang', + 'CARACS', + ], + function (values) { + const caracs = JSON.parse(values.CARACS); + const voierang = values.repeating_jetcapas_jetcapavoie || ''; + const coeff = parseInt(values.repeating_jetcapas_jetcapacoeff) || 0; + let vn = 0; + let rang = values.repeating_jetcapas_jetcaparang || ''; + if (rang.startsWith('@{') && rang.endsWith('}')) { + vn = parseInt(rang.slice(rang.length - 2, rang.length - 1)) || -1; + if (vn >= 0) { + voie = caracs['voies'][vn - 1] || ''; + if (voie !== '') { + voie = voie.slice(0, 1) + voie.slice(1).toLowerCase(); + } + rang = caracs['rangs'][vn - 1] || 0; + } } - rang = caracs['rangs'][vn - 1] || 0; + let skill = voierang; + if (voie !== '' && coeff !== 0 && rang !== 0) { + skill = `Bonus ${voie}, rang ${rang} : [[${coeff}[Bonus]*${rang}[rang ${voie}] ]]`; + } + setAttrs({ + repeating_jetcapas_jetcapaskill: skill, + }); } - } - let skill = voierang; - if (voie !== '' && coeff !== 0 && rang !== 0) { - skill = `Bonus ${voie}, rang ${rang} : [[${coeff}[Bonus]*${rang}[rang ${voie}] ]]`; - } - setAttrs({ - repeating_jetcapas_jetcapaskill: skill - }); - }); -}); + ); + } +); /** * Compute character encumbrance @@ -4647,30 +5004,33 @@ function encumbrance() { setAttrs({ total_enc: 0 }); const encombrement = { total: 0, - zeros: 0 - } + zeros: 0, + }; for (const id of ids) { - getAttrs([ - `repeating_equipement_${id}_equip-qte`, - `repeating_equipement_${id}_equip-enc`, - `repeating_equipement_${id}_equip-on`, - ], function (values) { - const qte = parseInt(values[Object.keys(values)[0]]) || 0; - const enc = parseInt(values[Object.keys(values)[1]]) || 0; - const equipe = parseInt(values[Object.keys(values)[2]]) || 0; - if (equipe === 1) { - if (enc === 0) { - encombrement.zeros += qte; - if (encombrement.zeros >= 3) { - encombrement.total += Math.floor(encombrement.zeros / 3); - encombrement.zeros %= 3; + getAttrs( + [ + `repeating_equipement_${id}_equip-qte`, + `repeating_equipement_${id}_equip-enc`, + `repeating_equipement_${id}_equip-on`, + ], + function (values) { + const qte = parseInt(values[Object.keys(values)[0]]) || 0; + const enc = parseInt(values[Object.keys(values)[1]]) || 0; + const equipe = parseInt(values[Object.keys(values)[2]]) || 0; + if (equipe === 1) { + if (enc === 0) { + encombrement.zeros += qte; + if (encombrement.zeros >= 3) { + encombrement.total += Math.floor(encombrement.zeros / 3); + encombrement.zeros %= 3; + } + } else { + encombrement.total += qte * enc; } - } else { - encombrement.total += qte * enc; + setAttrs({ total_enc: encombrement.total }); } - setAttrs({ total_enc: encombrement.total }); } - }); + ); } }); } @@ -4679,122 +5039,131 @@ function encumbrance() { * On changing character equipment * - Recompute character encumbrance */ -on([ - 'change:repeating_equipement', - 'remove:repeating_equipement' -].join(' '), function () { - encumbrance(); -}); +on( + ['change:repeating_equipement', 'remove:repeating_equipement'].join(' '), + function () { + encumbrance(); + } +); /** * On changing equipment properties * - Change DEF & RD for armor & shield * - Add or remove attack line for a weapon */ -on([ - 'change:repeating_equipement:equip-desc', - 'change:repeating_equipement:equip-props', - 'change:repeating_equipement:equip-on', - 'change:repeating_equipement:equip-atk' -].join(' '), function (eventInfo) { - getAttrs([ - 'repeating_equipement_equip-props', - 'repeating_equipement_equip-on', - 'repeating_equipement_equip-atk', - 'repeating_equipement_equip-atkid', - 'repeating_equipement_equip-desc', - 'DEFARMURE', - 'DEFARMUREON', - 'DEFARMUREMALUS', - 'DEFBOUCLIER', - 'DEFBOUCLIERON', - 'RD' - ], function (values) { - const props = values[Object.keys(values)[0]]; - const eqpon = parseInt(values[Object.keys(values)[1]]) || 0; +on( + [ + 'change:repeating_equipement:equip-desc', + 'change:repeating_equipement:equip-props', + 'change:repeating_equipement:equip-on', + 'change:repeating_equipement:equip-atk', + ].join(' '), + function (eventInfo) { + getAttrs( + [ + 'repeating_equipement_equip-props', + 'repeating_equipement_equip-on', + 'repeating_equipement_equip-atk', + 'repeating_equipement_equip-atkid', + 'repeating_equipement_equip-desc', + 'DEFARMURE', + 'DEFARMUREON', + 'DEFARMUREMALUS', + 'DEFBOUCLIER', + 'DEFBOUCLIERON', + 'RD', + ], + function (values) { + const props = values[Object.keys(values)[0]]; + const eqpon = parseInt(values[Object.keys(values)[1]]) || 0; - const attrs = {}; + const attrs = {}; - const hasAtk = parseInt(values[Object.keys(values)[2]]) || 0; - let atkId = values[Object.keys(values)[3]]; - if (eventInfo.sourceAttribute.endsWith('equip-atk') && !hasAtk) { - if (atkId) { - removeRepeatingRow(`repeating_armes_${atkId}`); - attrs['repeating_equipement_equip-atkid'] = ''; - setAttrs(attrs); - } - return; - } - - const atkName = values[Object.keys(values)[4]]; - let atkInfo = {}; - - for (const prop of props.split(',')) { - const parsed = parseNameValue(prop); - const propName = (parsed.name) ? parsed.name.toUpperCase() : ''; - if (propName === 'DEF') { - const defAttr = (atkName.toUpperCase().indexOf('BOUCLIER') !== -1) ? 'DEFBOUCLIER' : 'DEFARMURE'; - const propVal = parseInt(parsed.value) || 0; - attrs[`${defAttr}ON`] = eqpon; - if (eqpon === 1) { - if (propVal !== parseInt(values[defAttr])) { - attrs[defAttr] = propVal; + const hasAtk = parseInt(values[Object.keys(values)[2]]) || 0; + let atkId = values[Object.keys(values)[3]]; + if (eventInfo.sourceAttribute.endsWith('equip-atk') && !hasAtk) { + if (atkId) { + removeRepeatingRow(`repeating_armes_${atkId}`); + attrs['repeating_equipement_equip-atkid'] = ''; + setAttrs(attrs); } - if (values[`${defAttr}MALUS`]) { - if (propVal !== parseInt(values[`${defAttr}MALUS`])) { - attrs[`${defAttr}MALUS`] = propVal; + return; + } + + const atkName = values[Object.keys(values)[4]]; + let atkInfo = {}; + + for (const prop of props.split(',')) { + const parsed = parseNameValue(prop); + const propName = parsed.name ? parsed.name.toUpperCase() : ''; + if (propName === 'DEF') { + const defAttr = + atkName.toUpperCase().indexOf('BOUCLIER') !== -1 + ? 'DEFBOUCLIER' + : 'DEFARMURE'; + const propVal = parseInt(parsed.value) || 0; + attrs[`${defAttr}ON`] = eqpon; + if (eqpon === 1) { + if (propVal !== parseInt(values[defAttr])) { + attrs[defAttr] = propVal; + } + if (values[`${defAttr}MALUS`]) { + if (propVal !== parseInt(values[`${defAttr}MALUS`])) { + attrs[`${defAttr}MALUS`] = propVal; + } + } } } - } - } - if (propName === 'RD') { - const rds = values['RD']; - const propVal = parseInt(parsed.value) || 0; - if (eqpon === 1) { - if (propVal !== rds) { - attrs['RD'] = propVal; + if (propName === 'RD') { + const rds = values['RD']; + const propVal = parseInt(parsed.value) || 0; + if (eqpon === 1) { + if (propVal !== rds) { + attrs['RD'] = propVal; + } + } + } + if (propName === 'DM') { + atkInfo['dm'] = []; + if (parsed.value) { + atkInfo['dm'] = parsed.value.toLowerCase().split('d'); + } + } + if (propName === 'ATD') { + atkInfo['portee'] = parsed.value || ''; + atkInfo['type'] = '@{ATKTIR}'; + } else { + atkInfo['type'] = '@{ATKCAC}'; } } - } - if (propName === 'DM') { - atkInfo['dm'] = []; - if (parsed.value) { - atkInfo['dm'] = parsed.value.toLowerCase().split('d'); + if (hasAtk) { + if (!atkId) { + atkId = generateRowID(); + } + attrs['repeating_equipement_equip-atkid'] = atkId; + atkId = `repeating_armes_${atkId}`; + attrs[`${atkId}_armenom`] = atkName; + attrs[`${atkId}_armeatt`] = 'attaque='; + attrs[`${atkId}_armeatk`] = atkInfo.type; + attrs[`${atkId}_armeportee`] = atkInfo.portee || ''; + if (atkInfo.dm.length) { + attrs[`${atkId}_armedmg`] = 'degats='; + attrs[`${atkId}_armedmnbde`] = atkInfo.dm[0]; + attrs[`${atkId}_armedmde`] = atkInfo.dm[1]; + if (atkInfo.type === '@{ATKTIR}') { + attrs[`${atkId}_armedmcar`] = '0'; + } + } else { + attrs[`${atkId}_armedmg`] = ''; + } + } + if (Object.keys(attrs).length > 0) { + setAttrs(attrs); } } - if (propName === 'ATD') { - atkInfo['portee'] = (parsed.value) || ''; - atkInfo['type'] = '@{ATKTIR}'; - } else { - atkInfo['type'] = '@{ATKCAC}'; - } - } - if (hasAtk) { - if (!atkId) { - atkId = generateRowID(); - } - attrs['repeating_equipement_equip-atkid'] = atkId; - atkId = `repeating_armes_${atkId}`; - attrs[`${atkId}_armenom`] = atkName; - attrs[`${atkId}_armeatt`] = 'attaque='; - attrs[`${atkId}_armeatk`] = atkInfo.type; - attrs[`${atkId}_armeportee`] = atkInfo.portee || ''; - if (atkInfo.dm.length) { - attrs[`${atkId}_armedmg`] = 'degats='; - attrs[`${atkId}_armedmnbde`] = atkInfo.dm[0]; - attrs[`${atkId}_armedmde`] = atkInfo.dm[1]; - if (atkInfo.type === '@{ATKTIR}') { - attrs[`${atkId}_armedmcar`] = '0'; - } - } else { - attrs[`${atkId}_armedmg`] = ''; - } - } - if (Object.keys(attrs).length > 0) { - setAttrs(attrs); - } - }) -}); + ); + } +); /** * On changing the total character's encumbrance @@ -4809,7 +5178,7 @@ on('change:total_enc', function () { if (seuil_enc > 0 && encombrement > 0) { let cond = {}; if (encombrement > seuil_enc * 3) { - cond.CONDITION = 'I'; // Immobilisé + cond.CONDITION = 'I'; // Immobilisé } else if (encombrement > seuil_enc * 2) { cond.CONDITION = 'L'; // Ralenti cond.ETATDE = '12'; // +Affaibli @@ -4880,7 +5249,7 @@ function updateMatchBuffs(buffName, buffOn) { } /** - * Rebuild the attack/dm modifiers + * Rebuild the attack/dm modifiers * @param {string} section Repeating section name * @param {string} buffAttr Attack modifier attribute being rebuilt */ @@ -4894,8 +5263,9 @@ function rebuildModAtkDM(section, buffAttr) { `${section}_${id}_${sectId}on`, `${section}_${id}_${sectId}nom`, `${section}_${id}_${sectId}val`, - 'CARACS' - ], function (values) { + 'CARACS', + ], + function (values) { let caracs = JSON.parse(values.CARACS); const modOn = values[Object.keys(values)[0]] || '0'; const modNom = values[Object.keys(values)[1]] || ''; @@ -4909,7 +5279,8 @@ function rebuildModAtkDM(section, buffAttr) { armebuff += ` ${modVal}[${modNom}]`; } updateMatchBuffs(modNom, modOn); - }); + } + ); getSectionIDs('repeating_armes', function (ids) { const attrs = {}; for (const id of ids) { @@ -4925,21 +5296,18 @@ function rebuildModAtkDM(section, buffAttr) { * On changing or removing attack modifiers * - Rebuild attack buffs from modifiers */ -on([ - 'change:repeating_modatk', - 'remove:repeating_modatk' -].join(' '), function () { - rebuildModAtkDM('repeating_modatk', 'armebuff'); -}); +on( + ['change:repeating_modatk', 'remove:repeating_modatk'].join(' '), + function () { + rebuildModAtkDM('repeating_modatk', 'armebuff'); + } +); /** * On changing or removing damage modifiers * - Rebuild damage buffs from modifiers */ -on([ - 'change:repeating_moddm', - 'remove:repeating_moddm' -].join(' '), function () { +on(['change:repeating_moddm', 'remove:repeating_moddm'].join(' '), function () { rebuildModAtkDM('repeating_moddm', 'armebuffdm'); }); @@ -4947,84 +5315,84 @@ on([ * Condition codes */ const conditions = { - 'aveugle': 'A', - 'effraye': 'F', - 'etourdi': 'E', - 'immobilise': 'I', - 'panique': 'P', - 'ralenti': 'L', - 'renverse': 'R', - 'surpris': 'S' -} + aveugle: 'A', + effraye: 'F', + etourdi: 'E', + immobilise: 'I', + panique: 'P', + ralenti: 'L', + renverse: 'R', + surpris: 'S', +}; /** * Condition modifiers */ const conditions_data = { '': { - 'atc': 0, - 'atd': 0, - 'def': 0, - 'init': 0, - 'title': '' + atc: 0, + atd: 0, + def: 0, + init: 0, + title: '', }, - 'A': { - 'atc': 5, - 'atd': 10, - 'def': 5, - 'init': 5, - 'title': 'Aveuglé' + A: { + atc: 5, + atd: 10, + def: 5, + init: 5, + title: 'Aveuglé', }, - 'E': { - 'atc': 0, - 'atd': 0, - 'def': 5, - 'init': 0, - 'title': 'Etourdi' + E: { + atc: 0, + atd: 0, + def: 5, + init: 0, + title: 'Etourdi', }, - 'F': { - 'atc': 5, - 'atd': 5, - 'def': 0, - 'init': 0, - 'title': 'Effrayé' + F: { + atc: 5, + atd: 5, + def: 0, + init: 0, + title: 'Effrayé', }, - 'I': { - 'atc': 0, - 'atd': 0, - 'def': 0, - 'init': 0, - 'title': 'Immobilisé' + I: { + atc: 0, + atd: 0, + def: 0, + init: 0, + title: 'Immobilisé', }, - 'P': { - 'atc': 0, - 'atd': 0, - 'def': 2, - 'init': 0, - 'title': 'Paniqué' + P: { + atc: 0, + atd: 0, + def: 2, + init: 0, + title: 'Paniqué', }, - 'L': { - 'atc': 0, - 'atd': 0, - 'def': 0, - 'init': 0, - 'title': 'Ralenti' + L: { + atc: 0, + atd: 0, + def: 0, + init: 0, + title: 'Ralenti', }, - 'R': { - 'atc': 5, - 'atd': 5, - 'def': 5, - 'init': 0, - 'title': 'Renversé' + R: { + atc: 5, + atd: 5, + def: 5, + init: 0, + title: 'Renversé', }, - 'S': { - 'atc': 0, - 'atd': 0, - 'def': 5, - 'init': 0, - 'title': 'Surpris' - } -} + S: { + atc: 0, + atd: 0, + def: 5, + init: 0, + title: 'Surpris', + }, +}; /** * Apply condition(s) as buffs to combat stats @@ -5046,137 +5414,176 @@ function applyConditions(buffs, conditionAttr, s) { * On changing the enabled condition(s) * - Set/Unset combat stats buffs */ -on([ - 'clicked:cond_aveugle', - 'clicked:cond_effraye', - 'clicked:cond_etourdi', - 'clicked:cond_immobilise', - 'clicked:cond_panique', - 'clicked:cond_ralenti', - 'clicked:cond_renverse', - 'clicked:cond_surpris' -].join(' '), function (eventInfo) { - var clickedCondition = conditions[eventInfo.triggerName.replace('clicked:cond_', '')]; - getAttrs(['PCONDITION', 'CONDITION', 'ATKCAC_BUFF', 'ATKTIR_BUFF', 'INIT_BUFF', 'DEF_BUFF', 'ETATDE'], function (values) { - let buffs = { - 'atc': parseInt(values.ATKCAC_BUFF) || 0, - 'atd': parseInt(values.ATKTIR_BUFF) || 0, - 'def': parseInt(values.DEF_BUFF) || 0, - 'init': parseInt(values.INIT_BUFF) || 0 - }; - // debuffs prior condition - let pcondition = values.PCONDITION || ''; - applyConditions(buffs, pcondition, +1); - // change condition - let condition = values.CONDITION || ''; - if (condition.includes(clickedCondition)) { - condition = condition.replace(clickedCondition, ''); - } else { - condition += clickedCondition; - } - // buff new condition - applyConditions(buffs, condition, -1); - // check prior condition for die roll - let etatde = values.ETATDE; - if (pcondition !== '' && (pcondition.includes(conditions.immobilise) || pcondition.includes(conditions.panique))) etatde = '20'; - // check condition for die roll - if (condition !== '' && (condition.includes(conditions.immobilise) || condition.includes(conditions.panique))) etatde = '12'; - // - let displayConditions = ''; - if (condition !== '') { - for (cond of Object.keys(conditions)) { - if (condition.includes(conditions[cond])) { - displayConditions += (displayConditions === '' ? '' : ', ') + conditions_data[conditions[cond]].title; +on( + [ + 'clicked:cond_aveugle', + 'clicked:cond_effraye', + 'clicked:cond_etourdi', + 'clicked:cond_immobilise', + 'clicked:cond_panique', + 'clicked:cond_ralenti', + 'clicked:cond_renverse', + 'clicked:cond_surpris', + ].join(' '), + function (eventInfo) { + var clickedCondition = + conditions[eventInfo.triggerName.replace('clicked:cond_', '')]; + getAttrs( + [ + 'PCONDITION', + 'CONDITION', + 'ATKCAC_BUFF', + 'ATKTIR_BUFF', + 'INIT_BUFF', + 'DEF_BUFF', + 'ETATDE', + ], + function (values) { + let buffs = { + atc: parseInt(values.ATKCAC_BUFF) || 0, + atd: parseInt(values.ATKTIR_BUFF) || 0, + def: parseInt(values.DEF_BUFF) || 0, + init: parseInt(values.INIT_BUFF) || 0, + }; + // debuffs prior condition + let pcondition = values.PCONDITION || ''; + applyConditions(buffs, pcondition, +1); + // change condition + let condition = values.CONDITION || ''; + if (condition.includes(clickedCondition)) { + condition = condition.replace(clickedCondition, ''); + } else { + condition += clickedCondition; } + // buff new condition + applyConditions(buffs, condition, -1); + // check prior condition for die roll + let etatde = values.ETATDE; + if ( + pcondition !== '' && + (pcondition.includes(conditions.immobilise) || + pcondition.includes(conditions.panique)) + ) + etatde = '20'; + // check condition for die roll + if ( + condition !== '' && + (condition.includes(conditions.immobilise) || + condition.includes(conditions.panique)) + ) + etatde = '12'; + // + let displayConditions = ''; + if (condition !== '') { + for (cond of Object.keys(conditions)) { + if (condition.includes(conditions[cond])) { + displayConditions += + (displayConditions === '' ? '' : ', ') + + conditions_data[conditions[cond]].title; + } + } + } + if (displayConditions === '') displayConditions = ' '; + setAttrs({ + ATKCAC_BUFF: buffs.atc, + ATKTIR_BUFF: buffs.atd, + DEF_BUFF: buffs.def, + INIT_BUFF: buffs.init, + ETATDE: etatde, + CONDITION: condition, + PCONDITION: condition, + conditions: displayConditions, + }); } - } - if (displayConditions === '') displayConditions = ' '; - setAttrs({ - ATKCAC_BUFF: buffs.atc, - ATKTIR_BUFF: buffs.atd, - DEF_BUFF: buffs.def, - INIT_BUFF: buffs.init, - ETATDE: etatde, - CONDITION: condition, - PCONDITION: condition, - conditions: displayConditions - }); - }); -}); + ); + } +); /** * Adjust total hit points based on attribute value change * @param {string} attr Attribute name */ function hitPoints(attr) { - getAttrs(['NIVEAU', 'DV', 'CONSTITUTION', 'PV_NIVEAU', 'PV_BUFF', 'prog_pv'], function (values) { - let niveau = parseInt(values.NIVEAU) || 0; - if (niveau === 0) return; - let dv = parseInt(values.DV) || 0; - if (dv === 0) return; - let constitution = parseInt(values.CONSTITUTION) || 0; - let modcon = 0; - if (constitution > 0) modcon = Math.floor((constitution - 10) / 2); - let pv_niveau = values.PV_NIVEAU || ''; - let pv = []; - if (attr === 'niveau' || attr === 'constitution' || attr === 'pv_buff') { - if (pv_niveau !== '') pv = JSON.parse(pv_niveau); - } - let average = (parseInt(values.prog_pv) || 0 === 1) ? 1 + (dv / 2) : 0; - let pv_buff = parseInt(values.PV_BUFF) || 0; - let pv_max = 0; - for (let n = 1; n <= niveau; n++) { - let pvie = 0; - if (n === 1) { - pvie = dv + modcon; // niveau 1 : Max. DV + Mod. CON - } else { - if (n > 10) { // niveaux > 10 : 1 ou 2 PV selon DV - if (dv >= 10) pvie = 2; - else pvie = 1; - } else { // niveaux <= 10 - if (n % 2 === 0) { // niveau pair - if (n > pv.length) { // nouveau niveau - if (average !== 0) { - pvie = average; // ... soit moyenne du DV + 1 + getAttrs( + ['NIVEAU', 'DV', 'CONSTITUTION', 'PV_NIVEAU', 'PV_BUFF', 'prog_pv'], + function (values) { + let niveau = parseInt(values.NIVEAU) || 0; + if (niveau === 0) return; + let dv = parseInt(values.DV) || 0; + if (dv === 0) return; + let constitution = parseInt(values.CONSTITUTION) || 0; + let modcon = 0; + if (constitution > 0) modcon = Math.floor((constitution - 10) / 2); + let pv_niveau = values.PV_NIVEAU || ''; + let pv = []; + if (attr === 'niveau' || attr === 'constitution' || attr === 'pv_buff') { + if (pv_niveau !== '') pv = JSON.parse(pv_niveau); + } + let average = parseInt(values.prog_pv) || 0 === 1 ? 1 + dv / 2 : 0; + let pv_buff = parseInt(values.PV_BUFF) || 0; + let pv_max = 0; + for (let n = 1; n <= niveau; n++) { + let pvie = 0; + if (n === 1) { + pvie = dv + modcon; // niveau 1 : Max. DV + Mod. CON + } else { + if (n > 10) { + // niveaux > 10 : 1 ou 2 PV selon DV + if (dv >= 10) pvie = 2; + else pvie = 1; + } else { + // niveaux <= 10 + if (n % 2 === 0) { + // niveau pair + if (n > pv.length) { + // nouveau niveau + if (average !== 0) { + pvie = average; // ... soit moyenne du DV + 1 + } else { + pvie = getRandom(dv); // ... soit tirage de DV + } + if (modcon < 0) pvie += modcon; // ... + Mod. CON si négative + if (pvie < 0) pvie = 0; // ... mais on ne perd pas de PV } else { - pvie = getRandom(dv); // ... soit tirage de DV + // niveau existant + pvie = pv[n - 1]; } - if (modcon < 0) pvie += modcon; // ... + Mod. CON si négative - if (pvie < 0) pvie = 0; // ... mais on ne perd pas de PV - } else { // niveau existant - pvie = pv[n - 1]; + } else { + // niveau impair + if (modcon > 0) pvie = modcon; // Mod. CON si positif } - } else { // niveau impair - if (modcon > 0) pvie = modcon; // Mod. CON si positif } } + if (n > pv.length) pv.push(pvie); + else pv[n - 1] = pvie; + pv_max += pvie; } - if (n > pv.length) pv.push(pvie); - else pv[n - 1] = pvie; - pv_max += pvie; + pv_max += pv_buff; + setAttrs({ + PV_NIVEAU: JSON.stringify(pv), + PV_max: pv_max, + PV: pv_max, + }); } - pv_max += pv_buff; - setAttrs({ - PV_NIVEAU: JSON.stringify(pv), - PV_max: pv_max, - PV: pv_max - }); - }); + ); } /** * On changing any attribute related to hit points * - Re-compute the total hit points */ -on([ - 'change:niveau', - 'change:dv', - 'change:constitution', - 'change:pv_buff', - 'change:prog_pv' -].join(' '), function (eventInfo) { - hitPoints(eventInfo.sourceAttribute); -}); +on( + [ + 'change:niveau', + 'change:dv', + 'change:constitution', + 'change:pv_buff', + 'change:prog_pv', + ].join(' '), + function (eventInfo) { + hitPoints(eventInfo.sourceAttribute); + } +); /** * On Hit Dice button click @@ -5187,7 +5594,7 @@ on('clicked:dv_btn', function () { let niveau = parseInt(value.NIVEAU) || 0; if (niveau > 0 && niveau <= 20) { setAttrs({ - NIVEAU: niveau + 1 + NIVEAU: niveau + 1, }); } });