diff --git a/system/lang/en-en.json b/system/lang/en-en.json index 59ac91e..4b9e133 100644 --- a/system/lang/en-en.json +++ b/system/lang/en-en.json @@ -249,12 +249,13 @@ "advancements": { "title": "Advancements", "title_new": "New advancement", + "school_rank": "School rank", "total": "Total", "cost": "Cost", "spent": "Used", "saved": "Saved", - "rank": "Rank Total Xp", - "curriculum": "in curriculum", + "total_xp_rank": "Xp spent", + "curriculum": "In curriculum", "curriculum_validate": "Complete this rank" }, "npc": { diff --git a/system/lang/es-es.json b/system/lang/es-es.json index 577f3d1..f1186f3 100644 --- a/system/lang/es-es.json +++ b/system/lang/es-es.json @@ -249,12 +249,13 @@ "advancements": { "title": "Advancements", "title_new": "New advancement", + "school_rank": "School rank", "total": "Total", "cost": "Cost", "spent": "Usada", "saved": "Restante", - "rank": "Rank Total Xp", - "curriculum": "in curriculum", + "total_xp_rank": "Xp spent", + "curriculum": "In curriculum", "curriculum_validate": "Complete this rank" }, "npc": { diff --git a/system/lang/fr-fr.json b/system/lang/fr-fr.json index 694df07..fc21613 100644 --- a/system/lang/fr-fr.json +++ b/system/lang/fr-fr.json @@ -249,11 +249,12 @@ "advancements": { "title": "Progressions", "title_new": "Nouvelle progression", + "school_rank": "Rang d'école", "total": "Totale", "cost": "Coût", "spent": "Dépensée", "saved": "Restante", - "total_xp_rank": "Xp Total du rang", + "total_xp_rank": "Xp dépensée", "curriculum": "Inclus dans le cursus", "curriculum_validate": "Valider la progression" }, diff --git a/system/scripts/actors/character-sheet.js b/system/scripts/actors/character-sheet.js index e27a730..24578d0 100644 --- a/system/scripts/actors/character-sheet.js +++ b/system/scripts/actors/character-sheet.js @@ -39,20 +39,17 @@ export class CharacterSheetL5r5e extends BaseSheetL5r5e { getData() { const sheetData = super.getData(); - // Sort Items by rank 1->6 for advancements tab - sheetData.items.sort((a, b) => { - return (a.data.bought_at_rank || 1) - (b.data.bought_at_rank || 1); - }); - // Min rank = 1 this.actor.data.data.identity.school_rank = Math.max(1, this.actor.data.data.identity.school_rank); - // Xp spent only in current rank - const totalXp = this._getXpSpent(); - sheetData.data.xp_spent_rank = totalXp.rank; - sheetData.data.xp_spent = totalXp.total; + // Sort Items by name + sheetData.items.sort((a, b) => { + return a.name.localeCompare(b.name); + }); + + // split advancements list by rank, and calculate xp spent + this._prepareAdvancement(sheetData); sheetData.data.xp_saved = sheetData.data.xp_total - sheetData.data.xp_spent; - sheetData.data.xp_goal = CONFIG.l5r5e.xp.costPerRank[this.actor.data.data.identity.school_rank - 1] || null; return sheetData; } @@ -60,24 +57,34 @@ export class CharacterSheetL5r5e extends BaseSheetL5r5e { /** * Return the total xp spent and the current total xp spent for this rank */ - _getXpSpent() { - const total = { - total: 0, - rank: 0, - }; - const currentRank = this.actor.data.data.identity.school_rank; - this.actor.items.map((item) => { - let xp = item.data.data.xp_used || 0; - total.total = total.total + xp; - - if (currentRank === item.data.data.rank) { - // if not in curriculum, xp spent /2 for this item - if (!item.data.data.in_curriculum && xp > 0) { - xp = Math.floor(xp / 2); - } - total.rank = total.rank + xp; + _prepareAdvancement(sheetData) { + const adv = []; + sheetData.data.xp_spent = 0; + sheetData.items.forEach((item) => { + if (!["peculiarity", "technique", "advancement"].includes(item.type)) { + return; } + + let xp = item.data.xp_used || 0; + sheetData.data.xp_spent = sheetData.data.xp_spent + xp; + + // if not in curriculum, xp spent /2 for this item + if (!item.data.in_curriculum && xp > 0) { + xp = Math.floor(xp / 2); + } + + const rank = Math.max(0, item.data.bought_at_rank - 1); + if (!adv[rank]) { + adv[rank] = { + rank: rank + 1, + spent: 0, + goal: CONFIG.l5r5e.xp.costPerRank[rank] || null, + list: [], + }; + } + adv[rank].list.push(item); + adv[rank].spent = adv[rank].spent + xp; }); - return total; + sheetData.advancementsListByRank = adv; } } diff --git a/system/templates/actors/character/experience.html b/system/templates/actors/character/experience.html index fd29b93..1a39bb6 100644 --- a/system/templates/actors/character/experience.html +++ b/system/templates/actors/character/experience.html @@ -27,27 +27,28 @@ - {{#each actor.items as |advancement advancementId|}} - {{#ifCond '["peculiarity", "technique","advancement"]' 'includes' advancement.type}} - {{> 'systems/l5r5e/templates/actors/character/advancement.html' advancement=advancement editable=../editable }} - {{/ifCond}} - {{/each}} - + {{#each advancementsListByRank as |rankObject|}} + + {{localize 'l5r5e.advancements.school_rank'}} {{rankObject.rank}} + + {{#each rankObject.list as |advancement advancementId|}} + {{> 'systems/l5r5e/templates/actors/character/advancement.html' advancement=advancement editable=../../editable }} + {{/each}} - {{#ifCond data.xp_spent_rank '>=' data.xp_goal}} + {{#ifCond (ifCond ../data.identity.school_rank '==' rankObject.rank) '&&' (ifCond rankObject.spent '>=' rankObject.goal)}} {{/ifCond}} - {{ localize 'l5r5e.advancements.total_xp_rank' }} ({{data.identity.school_rank}}) : - {{ data.xp_spent_rank }} - {{#if data.xp_goal}}/{{data.xp_goal}}{{/if}} + {{ localize 'l5r5e.advancements.total_xp_rank' }} : + {{ rankObject.spent }} + {{#if rankObject.goal}}/{{rankObject.goal}}{{/if}} - + {{/each}}