translation updates

This commit is contained in:
Riccarr
2021-12-10 10:08:37 -08:00
parent 70c776e3c9
commit 4e39bedb99
4 changed files with 768 additions and 766 deletions
@@ -319,7 +319,7 @@ var ConanAPI = ConanAPI || (function()
let expertise = findInArray(a,"expertise",0);
let skilled_roll_index = findInArray(a,"successes1",0);
let unskilled_roll_index = findInArray(a,"successes2",0);
let num_dice_index = findInArray(a,"num_dice",0);
let show_tn = findInArray(aclone,"show_tn",0);
//get these actual roll values from the converted clone
let expertise_chk = findInArray(aclone,"expertise_chk",0);
@@ -328,9 +328,8 @@ var ConanAPI = ConanAPI || (function()
let encumbered_chk = findInArray(aclone,"encumbered",0);
let num_dice = findInArray(aclone,"num_dice",0);
let target_number = findInArray(aclone,"target_number",0);
let show_tn = findInArray(aclone,"show_tn",0);
let bk_nbr = findInArray(aclone,"bk_nbr",0);
let api_chk = findInArray(aclone,"api_chk",0);
let bk_nbr = findInArray(aclone,"bk_nbr",3);
let api_chk = findInArray(aclone,"api_chk",1);
let fail_count = libInline.getDice(msg.inlinerolls[0], 'fumble').length;
let crit_count = libInline.getDice(msg.inlinerolls[0], 'crit').length;
@@ -345,13 +344,17 @@ var ConanAPI = ConanAPI || (function()
total_successes += crit_count;
let roll_msg = "";
let roll_msg = "&{template:skillapi} {{skill_name="+skill_name+"}} {{character_name="+character_name+"}} {{successes1="+libInline.getRollTip(msg.inlinerolls[skilled_roll_index])+"}}{{successes2="+libInline.getRollTip(msg.inlinerolls[unskilled_roll_index])+"}}{{num_dice="+num_dice+"}} {{target_number="+target_number+"}}{{expertise_chk=[["+expertise_chk+"]]}}{{expertise="+expertise+"}}{{crit_chk=[["+crit_count+"]]}}{{fail_chk=[["+fail_count+"]]}}{{crit_count="+crit_count+"}}{{fail_count="+fail_count+"}}{{total_successes="+total_successes+"}}{{api_chk=[[1]]}}{{bk_nbr=[["+bk_nbr+"]]}}";
if (show_tn > 0)
roll_msg += "{{show_tn="+show_tn+"}}";
if (trauma_chk > -1)
//tramuma based roll
roll_msg = "&{template:skillapi} {{skill_name="+skill_name+"}} {{character_name="+character_name+"}} {{successes1="+libInline.getRollTip(msg.inlinerolls[skilled_roll_index])+"}} {{successes2="+libInline.getRollTip(msg.inlinerolls[unskilled_roll_index])+"}}{{num_dice="+num_dice+"}} {{target_number="+target_number+"}}{{trauma_chk=[["+trauma_chk+"]]}}{{trauma="+trauma+"}}{{trauma_treated="+trauma_treated+"}}{{expertise_chk=[["+expertise_chk+"]]}}{{expertise="+expertise+"}}{{crit_chk=[["+crit_count+"]]}}{{fail_chk=[["+fail_count+"]]}}{{crit_count="+crit_count+"}}{{fail_count="+fail_count+"}}{{total_successes="+total_successes+"}}{{show_tn=[["+show_tn+"]]}}{{api_chk=[[1]]}}{{bk_nbr=[["+bk_nbr+"]]}}";
roll_msg += "{{trauma_chk=[["+trauma_chk+"]]}}{{trauma="+trauma+"}}{{trauma_treated="+trauma_treated+"}}";
else
//physcical based roll
roll_msg = "&{template:skillapi} {{skill_name="+skill_name+"}} {{character_name="+character_name+"}} {{successes1="+libInline.getRollTip(msg.inlinerolls[skilled_roll_index])+"}} {{successes2="+libInline.getRollTip(msg.inlinerolls[unskilled_roll_index])+"}}{{num_dice="+num_dice+"}} {{target_number="+target_number+"}}{{wounds_chk=[["+wounds_chk+"]]}}{{wounds="+wounds+"}}{{wounds_treated="+wounds_treated+"}}{{expertise_chk=[["+expertise_chk+"]]}}{{expertise="+expertise+"}}{{encumbered=[["+encumbered_chk+"]]}}{{crit_chk=[["+crit_count+"]]}}{{fail_chk=[["+fail_count+"]]}}{{crit_count="+crit_count+"}}{{fail_count="+fail_count+"}}{{total_successes="+total_successes+"}}{{show_tn=[["+show_tn+"]]}}{{api_chk=[[1]]}}{{bk_nbr=[["+bk_nbr+"]]}}";
roll_msg += "{{wounds_chk=[["+wounds_chk+"]]}}{{wounds="+wounds+"}}{{wounds_treated="+wounds_treated+"}}{{encumbered=[["+encumbered_chk+"]]}}";
if (api_chk > 0) //only sending to skillapi template if chk value greater than zero
sendChat(msg.who, roll_msg);
File diff suppressed because it is too large Load Diff
@@ -1,332 +0,0 @@
/*
=========================================================
Name : libInline
GitHub : https://github.com/TimRohr22/Cauldron/tree/master/libInline
Roll20 Contact : timmaugh & The Aaron
Version : 1.0.3
Last Update : 5/10/2021
=========================================================
*/
var API_Meta = API_Meta || {};
API_Meta.libInline = { offset: Number.MAX_SAFE_INTEGER, lineCount: -1 };
{
try { throw new Error(''); } catch (e) { API_Meta.libInline.offset = (parseInt(e.stack.split(/\n/)[1].replace(/^.*:(\d+):.*$/, '$1'), 10) - (13)); }
}
const libInline = (() => {
// ==================================================
// VERSION
// ==================================================
const apiproject = 'libInline';
API_Meta[apiproject].version = '1.0.3';
const vd = new Date(1620699540738);
const versionInfo = () => {
log(`\u0166\u0166 ${apiproject} v${API_Meta[apiproject].version}, ${vd.getFullYear()}/${vd.getMonth() + 1}/${vd.getDate()} \u0166\u0166 -- offset ${API_Meta[apiproject].offset}`);
return;
};
const logsig = () => {
// initialize shared namespace for all signed projects, if needed
state.torii = state.torii || {};
// initialize siglogged check, if needed
state.torii.siglogged = state.torii.siglogged || false;
state.torii.sigtime = state.torii.sigtime || Date.now() - 3001;
if (!state.torii.siglogged || Date.now() - state.torii.sigtime > 3000) {
const logsig = '\n' +
' _____________________________________________ ' + '\n' +
' )_________________________________________( ' + '\n' +
' )_____________________________________( ' + '\n' +
' ___| |_______________| |___ ' + '\n' +
' |___ _______________ ___| ' + '\n' +
' | | | | ' + '\n' +
' | | | | ' + '\n' +
' | | | | ' + '\n' +
' | | | | ' + '\n' +
' | | | | ' + '\n' +
'______________|_|_______________|_|_______________' + '\n' +
' ' + '\n';
log(`${logsig}`);
state.torii.siglogged = true;
state.torii.sigtime = Date.now();
}
return;
};
// ==================================================
// MESSAGING / CHAT REPORTING
// ==================================================
const HE = (() => {
const esRE = (s) => s.replace(/(\\|\/|\[|\]|\(|\)|\{|\}|\?|\+|\*|\||\.|\^|\$)/g, '\\$1');
const e = (s) => `&${s};`;
const entities = {
'<': e('lt'),
'>': e('gt'),
"'": e('#39'),
'@': e('#64'),
'{': e('#123'),
'|': e('#124'),
'}': e('#125'),
'[': e('#91'),
']': e('#93'),
'"': e('quot'),
'*': e('#42')
};
const re = new RegExp(`(${Object.keys(entities).map(esRE).join('|')})`, 'g');
return (s) => s.replace(re, (c) => (entities[c] || c));
})();
// ==================================================
// PARSING OPERATIONS
// ==================================================
const conditionalPluck = (array, key, cobj = {}) => {
// test array of objects to return a given property of each object if all conditions are met
// cobj properties are functions testing that property (k) in the evaluated object (o)
// to test if testedproperty equals a given value: { testedProperty: (k,o) => { return o[k] === 'given value'; } }
// to test if testedproperty exists: { testedProperty: (k,o) => { return o.hasOwnProperty(k); } }
return array.map(o => {
let b = true;
if (cobj) {
Object.keys(cobj).forEach(k => {
if (b && !cobj[k](k, o)) {
b = false;
}
});
}
if (b) return o[key];
}).filter(e => e);
};
const ops = {
'==': (v, p) => v === p,
'>=': (v, p) => v >= p,
'<=': (v, p) => v <= p
};
const getQuantum = (roll) => {
return (roll.dice.length || roll.total) ? true : false;
};
const fatedie = {
[-2]: '=',
[-1]: '-',
[0]: '0',
[1]: '+'
};
const typeLib = {
all: {},
included: { type: (k, o) => { return o[k] !== 'drop'; } },
success: { type: (k, o) => { return o[k] === 'success'; } },
crit: { type: (k, o) => { return o[k] === 'success'; } },
fail: { type: (k, o) => { return o[k] === 'fail'; } },
fumble: { type: (k, o) => { return o[k] === 'fail'; } },
allcrit: { type: (k, o) => { return ['fail', 'success'].includes(o[k]); } },
dropped: { type: (k, o) => { return o[k] === 'drop'; } }
};
const collectRollData = (r) => {
const rollspancss1 = `<span class="basicdiceroll`;
const rollspanend = `</span>`;
const cssClassLib = {
dropped: 'drop',
critfail: 'fail',
critsuccess: 'success',
'critsuccess critfail': 'fail'
};
let matchFormatObj = {};
let rollData = {
parsed: '',
tableReturns: [],
display: '',
dice: [],
};
let gRoll,
cssclass = '',
type = '';
switch (r.type) {
case 'R': // ROLL
if (r.table) { // table roll
rollData.parsed = '(' + r.results.map(nr => nr.tableItem ? nr.tableItem.name : nr.v).join('+') + ')';
rollData.display = rollData.parsed;
rollData.tableReturns.push({ table: r.table, returns: r.results.map(nr => nr.tableItem ? nr.tableItem.name : nr.v) });
} else { // standard roll (might include fate or matched dice)
// fate dice should be joined on empty string (no operator); normal rolls on +
rollData.parsed = !r.results ? '{}' : '(' + r.results.map(nr => r.fate ? fatedie[nr.v] : nr.v).join(r.fate ? '' : '+') + ')';
rollData.dice = !r.results ? [] : r.results.map(nr => {
cssclass = '';
if (nr.d) cssclass = 'dropped'; //dropped die
if (!cssclass) {
if (r.mods && r.mods.hasOwnProperty('customCrit')) {
if (r.mods.customCrit.reduce((m, o) => ops[o.comp](nr.v, o.point) || m, false)) cssclass = 'critsuccess';
} else if (!r.fate && nr.v === r.sides) { // standard success
cssclass = 'critsuccess';
} // fate has no default success threshold
if (r.mods && r.mods.hasOwnProperty('customFumble')) {
if (r.mods.customFumble.reduce((m, o) => ops[o.comp](nr.v, o.point) || m, false)) cssclass = cssclass ? cssclass + ' ': 'critfail';
} else if (!r.fate && nr.v === 1) { // standard fail
cssclass = cssclass ? cssclass + ' critfail' : 'critfail';
} // fate has no default fail threshold
}
type = cssClassLib[cssclass] || '';
// match (and drop) dice formatting
matchFormatObj = { drop: ` style="color: #888;"` }; // initialize with dropped-die coloration
if (r.mods && r.mods.match && r.mods.match.matches) {
matchFormatObj = { drop: ` style="color: #888;"` }; // initialize with dropped-die coloration
if (Array.isArray(r.mods.match.matches)) {
r.mods.match.matches.forEach((m, i) => {
if (m) matchFormatObj[i] = ` style="color: ${m}"`;
});
} else {
Object.keys(r.mods.match.matches).forEach(k => matchFormatObj[k] = ` style="color: ${r.mods.match.matches[k]}"`);
}
}
return { v: nr.v, type: type, display: `${rollspancss1}${cssclass ? ' ' : ''}${cssclass}${/^crit/g.test(cssclass) ? ' ' : ''}"${matchFormatObj[type] || matchFormatObj[nr.v] || ''}>${r.fate ? fatedie[nr.v] : nr.v}${rollspanend}` };
});
// fate dice should be joined on empty string (no operator); normal rolls on +
rollData.display = '(' + conditionalPluck(rollData.dice, 'display').join(r.fate ? '' : '+') + ')';
}
break;
case 'G': // ROLL
gRoll = r.rolls.map(nr => {
return nr.map(collectRollData);
});
rollData.parsed = '{' + gRoll.map(nr => nr.map(nr2 => nr2.parsed).join('')).join(',') + '}';
rollData.dice = [].concat(...gRoll.map(nr => [].concat(...nr.map(nr2 => nr2.dice))));
rollData.tableReturns = [].concat(...gRoll.map(nr => [].concat(...nr.map(nr2 => nr2.tableReturns))));
rollData.display = '{' + gRoll.map(nr => nr.map(nr2 => nr2.display).join('')).join(',') + '}';
break;
case 'M': // MODIFIER
rollData.parsed = r.expr;
rollData.display = r.expr;
break;
case 'L': // LABEL
break;
case 'C': // CATCH
break;
default: // UNKNOWN
break;
}
return rollData;
};
const parseInlineRolls = (inlinerolls) => {
let labelrx = /(?:\s*(\+|-|\\|\*)\s*)?(?<value>[^\]{}]+)(?<!\d+t)\[(?<key>.*?)]/g;
const baseInlineCSS = `style="-webkit-tap-highlight-color: rgba(0,0,0,0);font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif;color: #404040;line-height: 1.25em;` +
`box-sizing: content-box; background-color: #FEF68E; padding: 0 3px 0 3px; font-weight: bold; cursor: help; font-size: 1.1em;border: 2px solid `;
const bordercolors = {
0: '#FEF68E;',
1: '#B31515;',
2: '#3FB315;',
3: '#4A57ED;'
};
return inlinerolls.map(r => {
let roll = {
expression: HE(r.expression.replace(/</g,'&#xFF1C;')),
parsed: '',
resultType: r.results.resultType,
total: r.results.total,
value: r.results.total, // changed later, if necessary
labels: [],
tableReturns: [],
display: '',
dice: [],
};
// LABELS
let m;
labelrx.lastIndex = 0;
while ((m = labelrx.exec(r.expression)) !== null) {
if (m.index === labelrx.lastIndex) {
labelrx.lastIndex++;
}
roll.labels.push({ label: m.groups.key, value: m.groups.value });
};
let rollData = r.results.rolls.map(collectRollData);
// PARSED
roll.parsed = conditionalPluck(rollData, 'parsed').join('');
// TABLE RETURNS
roll.tableReturns = [].concat(...conditionalPluck(rollData, 'tableReturns'));
// ALL DICE
roll.dice = [].concat(...conditionalPluck(rollData, 'dice'));
// CHAT VALUE
roll.value = getQuantum(roll) || !roll.tableReturns.length ? roll.total : roll.tableReturns[0].returns[0];
// DISPLAY
roll.display = conditionalPluck(rollData, 'display').join('');
// LATE EVAL METHODS
roll.getDice = (type) => { return conditionalPluck(roll.dice, 'v', (typeLib[type] || typeLib.included)) };
roll.getTableValues = () => {
return roll.tableReturns.reduce((m, r) => {
m.push(...r.returns);
return m;
}, []);
};
roll.getRollTip = () => {
let parts = [];
parts.push(`<span class="inlinerollresult showtip tipsy-n-right" ${baseInlineCSS}`);
parts.push(`${bordercolors[(/basicdiceroll(?:\scritsuccess)?\scritfail/.test(roll.display) ? 1 : 0) + (/basicdiceroll\scritsuccess/.test(roll.display) ? 2 : 0)]}" `);
parts.push(`title="${HE(HE(`Rolling ${roll.expression} = ${roll.display}`))}">${roll.value}</span>`);
return parts.join('');
};
return roll;
});
};
const getRollFromInline = (ira) => {
if (Array.isArray(ira) && ira.length) {
return parseInlineRolls([ira[0]])[0];
} else if (typeof ira === 'object') {
return parseInlineRolls([ira])[0];
} else return;
};
// ==================================================
// EXPOSED INTERFACE FUNCTIONS
// ==================================================
const getRollData = (ira) => {
let pir;
if (typeof ira === 'object' && ira.hasOwnProperty('inlinerolls')) {
pir = parseInlineRolls(ira.inlinerolls);
} else if (Array.isArray(ira) && ira.length) {
pir = parseInlineRolls(ira);
}
return pir;
};
const getDice = (inlinerolls, type = 'included') => {
return conditionalPluck((getRollFromInline(inlinerolls) || { dice: [] }).dice, 'v', (typeLib[type] || typeLib.included));
};
const getValue = (inlinerolls) => {
return (getRollFromInline(inlinerolls) || { value: '' }).value;
};
const getTables = (inlinerolls, reduce = true) => {
if (reduce) {
return (getRollFromInline(inlinerolls) || { getTableValues: () => { return ''; } }).getTableValues();
} else {
return (getRollFromInline(inlinerolls) || { tableReturns: [] }).tableReturns;
}
};
const getParsed = (inlinerolls) => {
return (getRollFromInline(inlinerolls) || { parsed: '' }).parsed;
};
const getRollTip = (inlinerolls) => {
return (getRollFromInline(inlinerolls) || { display: '' }).getRollTip();
};
// ==================================================
// ON READY
// ==================================================
on('ready', () => {
versionInfo();
logsig();
});
return {
getRollData: getRollData,
getDice: getDice,
getValue: getValue,
getTables: getTables,
getParsed: getParsed,
getRollTip: getRollTip
};
})();
{ try { throw new Error(''); } catch (e) { API_Meta.libInline.lineCount = (parseInt(e.stack.split(/\n/)[1].replace(/^.*:(\d+):.*$/, '$1'), 10) - API_Meta.libInline.offset); } }
@@ -0,0 +1,289 @@
{
"log": "Log",
"status": "Status",
"info": "Info",
"encumbrance": "Encumbrance",
"fortune-points": "Fortune Points",
"gold": "Gold",
"trauma-treated": "Trauma Treated",
"wounds-treated": "Wounds Treated",
"shows-item": "Show Items",
"damage-dice": "Damage Dice",
"weapon-damage": "Weapon Damage",
"bonus-damage": "Bonus Damage",
"total-damage": "Total Damage",
"area-struck": "Area Struck",
"despair": "Despair",
"fatigue": "Fatigue",
"pa-primary-attack": "Primary Attacks",
"pa-bonus-damage-tt": "Bonus damage is based on Awareness (Ranged), Brawn (Melee), and Personality (Threaten)",
"pa-bonus-damage": "BONUS DAMAGE",
"pa-bonus-damage-tt-ranged": "",
"pa-ranged-bonus": "Ranged",
"pa-bonus-damage-tt-melee": "",
"pa-melee-bonus": "Melee",
"pa-bonus-damage-tt-threaten": "",
"pa-threaten-bonus": "Threaten",
"pa-weapon-name": "Weapon Name",
"pa-dmg": "DMG:",
"pa-type": "Type",
"pa-range-reach": "Range/Reach",
"pa-size": "Size",
"pa-weapon-size-tt": "Weapon Size: 1-Handed, 2-Handed, Unbalanced, Unwieldy, Fixed, Monstrous",
"pa-damage": "Damage",
"pa-loads": "Loads",
"pa-melee": "Melee",
"pa-ranged": "Ranged",
"pa-threaten": "Threaten",
"pa-1H": "1H",
"pa-2H": "2H",
"pa-display": "Display",
"pa-ub": "UB",
"pa-uw": "UW",
"pa-fixed": "Fixed",
"pa-m": "M",
"pa-qualities": "Qualities",
"sh-stress-and-harms": "Stress &amp; Harms",
"sh-physical": "PHYSICAL",
"sh-vigor": "Vigor",
"sh-courage": "COURAGE",
"sh-armour-soak": "Armour Soak",
"sh-armour-soak-tt": "Click to mark this armour damaged or sacrificed",
"sh-head": "HEAD",
"sh-0-naked": "(0) Naked",
"sh-0-cloth-hat-coif": "(0) Cloth Hat or Coif",
"sh-1-padded-coif": "(1) Padded Coif",
"sh-1-leather-cap": "(1) Leather Cap",
"sh-2-mail-coif": "(2) Mail Coif",
"sh-2-skull-cap": "(2) Skull Cap",
"sh-3-aventail-heavy": "(3) Aventail (heavy)",
"sh-3-sallet-heavy": "(3) Sallet (heavy)",
"sh-3-bascinet-heavy": "(3) Bascinet (heavy)",
"sh-3-helmut-coif-heavy": "(3) Helmut Coif (heavy)",
"sh-3-turban-helmut-heavy": "(3) Turban Helmut (heavy)",
"sh-3-nord-helmut-heavy": "(3) Nord Helmut (heavy)",
"sh-4-great-helm-noisy-very-heavy": "(4) Great Helm (noisy/very heavy)",
"sh-4-bascient-with-visor-noisy-very-heavy": "(4) Bascient w/visor (noisy/very heavy)",
"sh-wounds": "Wounds",
"sh-r-arm": "R. ARM",
"sh-l-arm": "L. ARM",
"sh-treated": "Treated:",
"sh-fatigue": "Fatigue:",
"sh-torso": "TORSO",
"sh-mental": "MENTAL",
"sh-resolve": "Resolve",
"sh-0-light-cloth": "(0) Light cloth",
"sh-0-skins-leather": "(0) Skins/Leather",
"sh-1-padded-gambeson": "(1) Padded Gambeson",
"sh-1-thick-furs-hides": "(1) Thick Furs &amp; Hides",
"sh-1-brigadine-jacket": "(2) Brigandine Jacket",
"sh-2-brigadine-sleeve": "(2) Brigandine Sleeve",
"sh-2-ring-armour": "(2) Ring Armour",
"sh-2-light-scale": "(2) Light Scale",
"sh-2-bone-wood": "(2) Bone/Wood",
"sh-2-mail": "(2) Mail",
"sh-3-scale-noisy-heavy": "(3) Scale (noisy/heavy)",
"sh-3-lamellar-noisy-heavy": "(3) Lamellar (noisy/heavy)",
"sh-3-coat-of-plates-noisy-heavy": "(3) Coat of Plates (noisy/heavy)",
"sh-3-bronze-plate-noisy-heavy": "(3) Bronze Plate (noisy/heavy)",
"sh-3-heavy-hauberk-coat-noisy-heavy": "(3) Heavy Hauberk/Coat (noisy/heavy)",
"sh-3-heavy-shirt-heavy": "(3) Heavy Shirt (heavy)",
"sh-3-heavy-sleeves-heavy": "(3) Heavy Sleeve (heavy)",
"sh-4-arm-plates-noisy-heavy": "(4) Arm Plates (noisy/heavy)",
"sh-4-full-plate-noisy-heavy": "(4) Full Plate (noisy/heavy)",
"sh-2-brigadine-jacket": "(2) Brigandine Jacket",
"sh-2-brigadine-vest": "(2) Brigandine Vest",
"sh-3-heavy-vest-heavy": "(3) Heavy Vest (heavy)",
"sh-3-mail-noisy-heavy": "(3) Mail (noisy/heavy)",
"sh-4-cuirass-noisy-very-heavy": "(4) Cuirass (noisy/very heavy)",
"sh-4-full-plate-noisy-very-heavy": "(4) Full Plate (noisy/very heavy)",
"sh-r-leg": "R. LEG",
"sh-l-leg": "L. LEG",
"sh-1-trousers": "(1) Trousers",
"sh-2-brigadine-trousers": "(2) Brigandine Trousers",
"sh-trauma": "Trauma",
"sh-armour-qualities": "Armour Qualities",
"sh-treaated": "Treated:",
"sh-despair": "Despair:",
"b-belongings": "Belongings",
"b-gold": "GOLD",
"b-upkeep": "UPKEEP",
"b-spend": "Spend",
"b-name-type": "Name/Type",
"b-location": "Location",
"b-condition": "Condition",
"b-value": "Value",
"b-equip": "Equip",
"b-description": "Description",
"b-total-worth": "Total Worth: ",
"b-total-encumbrance": "Total Encumbrance:",
"b-you-are-emcumbered": "You are encumbered!",
"b-your-emcumrance-limit-is-your-brawn-times-2": "Your encumbrance limit is your Brawn x 2",
"npc-npc-companions": "NPC / Companions",
"npc-name": "Name",
"npc-dmg": "DMG:",
"npc-agility": "Agility",
"npc-awareness": "Awareness",
"npc-brawn": "Brawn",
"npc-coordination": "Coord.",
"npc-intelligence": "Intell.",
"npc-personality": "Person.",
"npc-willpower": "Willpower",
"npc-skills-details": "Skills/Details",
"char-gender": "Gender&nbsp;&nbsp;",
"char-age": "Age&nbsp;&nbsp;",
"char-homeland": "Homeland&nbsp;&nbsp;",
"char-caste": "Caste&nbsp;&nbsp;",
"char-trait": "Trait&nbsp;&nbsp;",
"char-archetype": "Archetype&nbsp;&nbsp;",
"char-nature": "Nature&nbsp;&nbsp;",
"char-education": "Education&nbsp;&nbsp;",
"char-appearance": "Appearance&nbsp;&nbsp;",
"char-personality": "Personality&nbsp;&nbsp;",
"char-languages": "Languages&nbsp;&nbsp;",
"char-war-story": "War Story&nbsp;&nbsp;",
"char-fortune-points": "FORTUNE POINTS",
"char-renown": "RENOWN",
"char-standing": "STANDING",
"char-xp-total-spent-available": "XP TOTAL / SPENT / AVAIL.",
"char-xp": "XP",
"t-talents": "Talents",
"t-base": "Base",
"t-base-talents": "BASE TALENTS",
"t-homeland": "Homeland",
"t-caste-a": "Caste A",
"t-caste-b": "Caste B",
"t-bloodline": "Bloodline",
"t-education": "Education",
"t-nature": "Nature",
"t-archetype": "Archetype",
"t-other": "Other",
"t-attributes": "ATTRIBUTES",
"t-agility": "Agility",
"t-awareness": "Awareness",
"t-brawn": "Brawn",
"t-coordination": "Coordination",
"t-intelligence": "Intelligence",
"t-personality": "Personality",
"t-willpower": "Willpower",
"t-name": "Name",
"t-rank": "Rank",
"t-skill": "Skill",
"t-none": "None",
"t-acrobat": "Acrobatics",
"t-alchemy": "Alchemy",
"t-animal-handling": "Animal Handling",
"t-athletics": "Athletics",
"t-command": "Command",
"t-counsel": "Counsel",
"t-craft": "Craft",
"t-discipline": "Discipline",
"t-healing": "Healing",
"t-insight": "Insight",
"t-linguistics": "Linguistics",
"t-lore": "Lore",
"t-melee": "Melee",
"t-observation": "Observation",
"t-parry": "Parry",
"t-persude": "Persuade",
"t-ranged-weapons": "Ranged Weapons",
"t-resistance": "Resistance",
"t-sailing": "Sailing",
"t-society": "Society",
"t-sorcery": "Sorcery",
"t-stealth": "Stealth",
"t-survival": "Survival",
"t-thievery": "Thievery",
"t-warfare": "Warfare",
"t-effect": "Effect",
"as-attributes-and-skills": "Attributes &amp; Skills",
"as-agility": "AGILITY",
"as-skill": "Skill",
"as-expertise": "Exp",
"as-focus": "Foc",
"as-target-number": "TN",
"as-acrobatics": "Acrobatics",
"as-melee": "Melee",
"as-stealth": "Stealth",
"as-awareness": "AWARENESS",
"as-insight": "Insight",
"as-observation": "Observation",
"as-survival": "Survival",
"as-thievery": "Thievery",
"as-brawn": "BRAWN",
"as-athletics": "Athletics",
"as-resistance": "Resistance",
"as-coordination": "COORDINATION",
"as-parry": "Parry",
"as-ranged-weapons": "Ranged/W",
"as-sailing": "Sailing",
"as-intelligence": "INTELLIGENCE",
"as-alchemy": "Alchemy",
"as-craft": "Craft",
"as-healing": "Healing",
"as-linguistics": "Linguistics",
"as-lore": "Lore",
"as-warfare": "Warfare",
"as-personality": "PERSONALITY",
"as-animal-handling": "Animal/H",
"as-command": "Command",
"as-counsel": "Counsel",
"as-persuade": "Persuade",
"as-society": "Society",
"as-willpower": "WILLPOWER",
"as-discipline": "Discipline",
"as-sorcery": "Sorcery",
"m-magic": "Magic",
"m-spell": "Spell",
"m-difficulty": "Difficulty",
"m-duration": "Duration",
"m-cost": "Cost",
"m-momentum": "Momentum",
"m-description": "Description",
"xp-xp-tracker": "XP Tracker",
"xp-total-xp": "Total XP:",
"xp-spent-xp": "Spent XP:",
"xp-available-xp": "Available XP:",
"xp-date": "Date",
"xp-xp-gain": "XP Gain",
"xp-xp-spend": "XP Spend",
"xp-spend-description": "Spend Description",
"al-adventuring-log": "Adventuring Log",
"al-date": "Date:",
"al-title": "Title:",
"al-value-amount": "Value/Amt:",
"al-search": "Search",
"al-clear": "Clear",
"tp-4": "Skill",
"tp-5": "Rolls ",
"tp-6": "dice!",
"tp-7": "Target number is:",
"tp-16": "Roll result:",
"tp-23": "Total Success:",
"tp-17": "",
"tp-18": "Unskilled!",
"tp-9": "Scores $[[2]]",
"tp-10": "unskilled!",
"tp-11": "successes!",
"tp-8": "Scores $[[1]] successes!",
"tp-1": "You are missing the api_chk key/value in your macro.",
"tp-2": "Please see the character sheet ",
"tp-3": " scroll for more details.",
"tp-31": "Location",
"tp-32": "Weight",
"tp-33": "Condition",
"tp-35": "Value",
"tp-36": "Equipped",
"tp-37": "Description :",
"tp-24": "Wounds,",
"tp-25": "Treated",
"tp-15": "You are Encumbered !!!",
"tp-19": "Plus",
"tp-20": "focus!",
"tp-27": "Base",
"tp-28": "Skill",
"tp-29": "Rank",
"tp-30": "Effects :",
"tp-39": "Qualities :"
}