Working on 0.8.x
- Xp spent curriculum/total for titles
This commit is contained in:
@@ -329,7 +329,8 @@
|
|||||||
"cost": "Cost",
|
"cost": "Cost",
|
||||||
"spent": "Used",
|
"spent": "Used",
|
||||||
"saved": "Saved",
|
"saved": "Saved",
|
||||||
"total_xp_rank": "Xp spent",
|
"total_xp_spent": "Xp spent",
|
||||||
|
"total_xp_curriculum": "Xp spent on curriculum",
|
||||||
"curriculum": "In curriculum",
|
"curriculum": "In curriculum",
|
||||||
"curriculum_validate": "Complete this rank",
|
"curriculum_validate": "Complete this rank",
|
||||||
"rarity_modifier": "Rarity modifier",
|
"rarity_modifier": "Rarity modifier",
|
||||||
|
|||||||
@@ -329,7 +329,8 @@
|
|||||||
"cost": "Coste",
|
"cost": "Coste",
|
||||||
"spent": "Gastado",
|
"spent": "Gastado",
|
||||||
"saved": "Guardado",
|
"saved": "Guardado",
|
||||||
"total_xp_rank": "PE gastados",
|
"total_xp_spent": "PE gastados",
|
||||||
|
"total_xp_curriculum": "Xp spent on curriculum",
|
||||||
"curriculum": "En programa de estudio",
|
"curriculum": "En programa de estudio",
|
||||||
"curriculum_validate": "Completar este rango",
|
"curriculum_validate": "Completar este rango",
|
||||||
"rarity_modifier": "Rarity modifier",
|
"rarity_modifier": "Rarity modifier",
|
||||||
|
|||||||
@@ -329,7 +329,8 @@
|
|||||||
"cost": "Coût",
|
"cost": "Coût",
|
||||||
"spent": "Dépensée",
|
"spent": "Dépensée",
|
||||||
"saved": "Restante",
|
"saved": "Restante",
|
||||||
"total_xp_rank": "Xp dépensée",
|
"total_xp_spent": "Xp dépensée",
|
||||||
|
"total_xp_curriculum": "Xp dépensée dans le cursus",
|
||||||
"curriculum": "Inclus dans le cursus",
|
"curriculum": "Inclus dans le cursus",
|
||||||
"curriculum_validate": "Valider la progression",
|
"curriculum_validate": "Valider la progression",
|
||||||
"rarity_modifier": "Modificateur de rareté",
|
"rarity_modifier": "Modificateur de rareté",
|
||||||
|
|||||||
@@ -111,25 +111,24 @@ export class CharacterSheetL5r5e extends BaseSheetL5r5e {
|
|||||||
sheetData.items
|
sheetData.items
|
||||||
.filter((item) => ["peculiarity", "technique", "advancement"].includes(item.type))
|
.filter((item) => ["peculiarity", "technique", "advancement"].includes(item.type))
|
||||||
.forEach((item) => {
|
.forEach((item) => {
|
||||||
let xp = parseInt(item.data.xp_used) || 0;
|
const { xp_used_total, xp_used } = game.l5r5e.HelpersL5r5e.getItemsXpCost(item);
|
||||||
sheetData.data.data.xp_spent = parseInt(sheetData.data.data.xp_spent) + xp;
|
sheetData.data.data.xp_spent += xp_used_total;
|
||||||
|
|
||||||
// if not in curriculum, xp spent /2 for this item
|
|
||||||
if (!item.data.in_curriculum && xp > 0) {
|
|
||||||
xp = Math.ceil(xp / 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
const rank = Math.max(0, item.data.bought_at_rank);
|
const rank = Math.max(0, item.data.bought_at_rank);
|
||||||
if (!adv[rank]) {
|
if (!adv[rank]) {
|
||||||
adv[rank] = {
|
adv[rank] = {
|
||||||
rank: rank,
|
rank: rank,
|
||||||
spent: 0,
|
spent: {
|
||||||
|
total: 0,
|
||||||
|
curriculum: 0,
|
||||||
|
},
|
||||||
goal: CONFIG.l5r5e.xp.costPerRank[rank] || null,
|
goal: CONFIG.l5r5e.xp.costPerRank[rank] || null,
|
||||||
list: [],
|
list: [],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
adv[rank].list.push(item);
|
adv[rank].list.push(item);
|
||||||
adv[rank].spent = adv[rank].spent + xp;
|
adv[rank].spent.total += xp_used_total;
|
||||||
|
adv[rank].spent.curriculum += xp_used;
|
||||||
});
|
});
|
||||||
sheetData.data.advancementsListByRank = adv;
|
sheetData.data.advancementsListByRank = adv;
|
||||||
}
|
}
|
||||||
@@ -146,15 +145,14 @@ export class CharacterSheetL5r5e extends BaseSheetL5r5e {
|
|||||||
// Sort by rank desc
|
// Sort by rank desc
|
||||||
sheetData.data.advancementsOthers.sort((a, b) => (b.data.rank || 0) - (a.data.rank || 0));
|
sheetData.data.advancementsOthers.sort((a, b) => (b.data.rank || 0) - (a.data.rank || 0));
|
||||||
|
|
||||||
// Total xp spent
|
// Total xp spent in curriculum & total
|
||||||
sheetData.data.advancementsOthersTotalXp = sheetData.data.advancementsOthers.reduce(
|
sheetData.data.advancementsOthersTotalXp = sheetData.data.advancementsOthers.reduce(
|
||||||
(acc, item) => acc + (item.data.xp_used || 0),
|
(acc, item) => acc + parseInt(item.data.xp_used_total || item.data.xp_used || 0),
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
|
|
||||||
// Update the total spent
|
// Update the total spent
|
||||||
sheetData.data.data.xp_spent =
|
sheetData.data.data.xp_spent += sheetData.data.advancementsOthersTotalXp;
|
||||||
parseInt(sheetData.data.data.xp_spent) + sheetData.data.advancementsOthersTotalXp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -331,4 +331,34 @@ export class HelpersL5r5e {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute the Xp cost for cursus and total
|
||||||
|
* @param {ItemL5r5e|ItemL5r5e[]} itemsList Item Data
|
||||||
|
* @return {{xp_used_total: number, xp_used: number}}
|
||||||
|
*/
|
||||||
|
static getItemsXpCost(itemsList) {
|
||||||
|
let xp_used = 0;
|
||||||
|
let xp_used_total = 0;
|
||||||
|
|
||||||
|
if (!Array.isArray(itemsList)) {
|
||||||
|
itemsList = [itemsList];
|
||||||
|
}
|
||||||
|
|
||||||
|
itemsList.forEach((item) => {
|
||||||
|
let xp = parseInt(item.data.xp_used_total || item.data.xp_used || 0);
|
||||||
|
|
||||||
|
// Full price
|
||||||
|
xp_used_total += xp;
|
||||||
|
|
||||||
|
// if not in curriculum, xp spent /2 for this item
|
||||||
|
if (!item.data.in_curriculum && xp > 0) {
|
||||||
|
xp = Math.ceil(xp / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Halved or full
|
||||||
|
xp_used += xp;
|
||||||
|
});
|
||||||
|
return { xp_used, xp_used_total };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,11 +24,10 @@ export class TitleSheetL5r5e extends ItemSheetL5r5e {
|
|||||||
// Prepare OwnedItems
|
// Prepare OwnedItems
|
||||||
sheetData.data.embedItemsList = this._prepareEmbedItems(sheetData.data.data.items);
|
sheetData.data.embedItemsList = this._prepareEmbedItems(sheetData.data.data.items);
|
||||||
|
|
||||||
// Automatically compute the xp cost
|
// Automatically compute the total xp cost (full price) and XP in title (cursus, some halved prices)
|
||||||
sheetData.data.data.xp_used = sheetData.data.embedItemsList.reduce(
|
const { xp_used_total, xp_used } = game.l5r5e.HelpersL5r5e.getItemsXpCost(sheetData.data.embedItemsList);
|
||||||
(acc, item) => acc + (+item.data.xp_used || 0),
|
sheetData.data.data.xp_used_total = xp_used_total;
|
||||||
0
|
sheetData.data.data.xp_used = xp_used;
|
||||||
);
|
|
||||||
|
|
||||||
return sheetData;
|
return sheetData;
|
||||||
}
|
}
|
||||||
@@ -91,10 +90,11 @@ export class TitleSheetL5r5e extends ItemSheetL5r5e {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// *** Items : add, edit, delete ***
|
// *** Sub-Items management ***
|
||||||
html.find(".item-add").on("click", this._addSubItem.bind(this));
|
html.find(".item-add").on("click", this._addSubItem.bind(this));
|
||||||
html.find(`.item-edit`).on("click", this._editSubItem.bind(this));
|
html.find(`.item-edit`).on("click", this._editSubItem.bind(this));
|
||||||
html.find(`.item-delete`).on("click", this._deleteSubItem.bind(this));
|
html.find(`.item-delete`).on("click", this._deleteSubItem.bind(this));
|
||||||
|
html.find(`.item-curriculum`).on("click", this._switchSubItemCurriculum.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -104,6 +104,9 @@ export class TitleSheetL5r5e extends ItemSheetL5r5e {
|
|||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
async _addSubItem(event) {
|
async _addSubItem(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
// Show Dialog
|
// Show Dialog
|
||||||
const selectedType = await game.l5r5e.HelpersL5r5e.showSubItemDialog(["advancement", "technique"]);
|
const selectedType = await game.l5r5e.HelpersL5r5e.showSubItemDialog(["advancement", "technique"]);
|
||||||
if (!selectedType) {
|
if (!selectedType) {
|
||||||
@@ -125,4 +128,25 @@ export class TitleSheetL5r5e extends ItemSheetL5r5e {
|
|||||||
item.sheet.render(true);
|
item.sheet.render(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Toogle the curriculum for this embed item
|
||||||
|
* @param {Event} event
|
||||||
|
* @return {Promise<void>}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
async _switchSubItemCurriculum(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
const itemId = $(event.currentTarget).data("item-id");
|
||||||
|
const item = this.document.getEmbedItem(itemId);
|
||||||
|
if (!item) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Switch the state and update
|
||||||
|
item.data.data.in_curriculum = !item.data.data.in_curriculum;
|
||||||
|
return this.document.updateEmbedItem(item);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -216,7 +216,8 @@
|
|||||||
},
|
},
|
||||||
"title": {
|
"title": {
|
||||||
"templates": ["basics", "advancement"],
|
"templates": ["basics", "advancement"],
|
||||||
"advancements": []
|
"advancements": [],
|
||||||
|
"xp_used_total": 0
|
||||||
},
|
},
|
||||||
"bond": {
|
"bond": {
|
||||||
"templates": ["basics", "advancement"],
|
"templates": ["basics", "advancement"],
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
<tr class="flexrow row advancement">
|
<tr class="flexrow row advancement">
|
||||||
|
{{#if show_curriculum_toggle}}<td class="curriculum" name="curriculum">{{#if advancement.data.in_curriculum}}<i class="fas fa-graduation-cap"></i> {{/if}}</td>{{/if}}
|
||||||
<td class="name" name="advancement.name"><img src="{{advancement.img}}" title="{{advancement.name}}"> {{advancement.name}}{{#if advancement.data.bond_type}} ({{advancement.data.bond_type}}){{/if}}</td>
|
<td class="name" name="advancement.name"><img src="{{advancement.img}}" title="{{advancement.name}}"> {{advancement.name}}{{#if advancement.data.bond_type}} ({{advancement.data.bond_type}}){{/if}}</td>
|
||||||
<td class="xp" name="advancement.xp">{{advancement.data.xp_used}}</td>
|
<td class="xp" name="advancement.xp">{{#if advancement.data.xp_used_total}}{{advancement.data.xp_used_total}}{{else}}{{advancement.data.xp_used}}{{/if}}</td>
|
||||||
<td class="rank" name="advancement.rank">{{advancement.data.rank}}</td>
|
<td class="rank" name="advancement.rank">{{advancement.data.rank}}</td>
|
||||||
{{#if editable}}
|
{{#if editable}}
|
||||||
<td class="actions">
|
<td class="actions">
|
||||||
<ul>
|
<ul>
|
||||||
|
{{#if show_curriculum_toggle}}<li data-item-id="{{advancement._id}}" class="item-control item-curriculum" title="{{localize 'l5r5e.advancements.curriculum'}}"><i class="fas fa-graduation-cap"></i></li>{{/if}}
|
||||||
<li data-item-id="{{advancement._id}}" class="item-control item-edit" title="{{localize 'l5r5e.global.edit'}}"><i class="fas fa-edit"></i></li>
|
<li data-item-id="{{advancement._id}}" class="item-control item-edit" title="{{localize 'l5r5e.global.edit'}}"><i class="fas fa-edit"></i></li>
|
||||||
<li data-item-id="{{advancement._id}}" class="item-control item-delete" title="{{localize 'Delete'}}"><i class="fas fa-trash"></i></li>
|
<li data-item-id="{{advancement._id}}" class="item-control item-delete" title="{{localize 'Delete'}}"><i class="fas fa-trash"></i></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -53,7 +53,8 @@
|
|||||||
{{/ifCond}}
|
{{/ifCond}}
|
||||||
</th>
|
</th>
|
||||||
<th class="">
|
<th class="">
|
||||||
{{localize 'l5r5e.advancements.total_xp_rank'}} : {{rankObject.spent}}{{#if rankObject.goal}} / {{rankObject.goal}}{{/if}}
|
{{localize 'l5r5e.advancements.total_xp_curriculum'}} : {{rankObject.spent.curriculum}}{{#if rankObject.goal}} / {{rankObject.goal}}{{/if}}
|
||||||
|
<br>{{localize 'l5r5e.advancements.total_xp_spent'}} : {{rankObject.spent.total}}
|
||||||
</th>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
{{/ifCond}}
|
{{/ifCond}}
|
||||||
@@ -77,13 +78,13 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody class="flex">
|
<tbody class="flex">
|
||||||
{{#each data.advancementsOthers as |advancement advancementId|}}
|
{{#each data.advancementsOthers as |advancement advancementId|}}
|
||||||
{{> 'systems/l5r5e/templates/actors/character/advancement-others.html' advancement=advancement editable=../options.editable}}
|
{{> 'systems/l5r5e/templates/actors/character/advancement-others.html' advancement=advancement show_curriculum_toggle=false editable=../options.editable}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</tbody>
|
</tbody>
|
||||||
<tfoot class="flex">
|
<tfoot class="flex">
|
||||||
<tr>
|
<tr>
|
||||||
<th>
|
<th>
|
||||||
{{localize 'l5r5e.advancements.total_xp_rank'}} : {{data.advancementsOthersTotalXp}}
|
{{localize 'l5r5e.advancements.total_xp_spent'}} : {{data.advancementsOthersTotalXp}}
|
||||||
</th>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
</tfoot>
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
<form class="{{cssClass}}" autocomplete="off">
|
<form class="{{cssClass}}" autocomplete="off">
|
||||||
|
<input type="hidden" name="data.xp_used" value="{{data.data.xp_used}}" data-dtype="Number">
|
||||||
|
<input type="hidden" name="data.xp_used_total" value="{{data.data.xp_used_total}}" data-dtype="Number">
|
||||||
<header class="sheet-header">
|
<header class="sheet-header">
|
||||||
<img class="profile-img" src="{{data.img}}" data-edit="img" title="{{data.name}}"/>
|
<img class="profile-img" src="{{data.img}}" data-edit="img" title="{{data.name}}"/>
|
||||||
<h1 class="charname"><input name="name" type="text" value="{{data.name}}" placeholder="Name"/></h1>
|
<h1 class="charname"><input name="name" type="text" value="{{data.name}}" placeholder="Name"/></h1>
|
||||||
@@ -16,10 +18,6 @@
|
|||||||
{{localize 'l5r5e.advancements.cost'}}
|
{{localize 'l5r5e.advancements.cost'}}
|
||||||
<input class="select-on-focus" type="number" name="data.xp_cost" value="{{data.data.xp_cost}}" data-dtype="Number" min="0" placeholder="0"/>
|
<input class="select-on-focus" type="number" name="data.xp_cost" value="{{data.data.xp_cost}}" data-dtype="Number" min="0" placeholder="0"/>
|
||||||
</label>
|
</label>
|
||||||
<label class="attribute">
|
|
||||||
{{localize 'l5r5e.advancements.spent'}}
|
|
||||||
<input class="select-on-focus" type="number" name="data.xp_used" value="{{data.data.xp_used}}" data-dtype="Number" min="0" placeholder="0" readonly/>
|
|
||||||
</label>
|
|
||||||
<label class="attribute">
|
<label class="attribute">
|
||||||
{{localize 'l5r5e.rank'}}
|
{{localize 'l5r5e.rank'}}
|
||||||
<input class="select-on-focus" type="number" name="data.rank" value="{{data.data.rank}}" data-dtype="Number" min="0" placeholder="0"/>
|
<input class="select-on-focus" type="number" name="data.rank" value="{{data.data.rank}}" data-dtype="Number" min="0" placeholder="0"/>
|
||||||
@@ -38,6 +36,7 @@
|
|||||||
<table>
|
<table>
|
||||||
<thead class="flex">
|
<thead class="flex">
|
||||||
<tr class="flexrow row">
|
<tr class="flexrow row">
|
||||||
|
<th class="curriculum"></th>
|
||||||
<th class="name">{{localize 'l5r5e.name'}}</th>
|
<th class="name">{{localize 'l5r5e.name'}}</th>
|
||||||
<th class="xp">{{localize 'l5r5e.advancements.spent'}}</th>
|
<th class="xp">{{localize 'l5r5e.advancements.spent'}}</th>
|
||||||
<th class="rank">{{localize 'l5r5e.rank'}}</th>
|
<th class="rank">{{localize 'l5r5e.rank'}}</th>
|
||||||
@@ -48,9 +47,17 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody class="flex">
|
<tbody class="flex">
|
||||||
{{#each data.embedItemsList as |advancement|}}
|
{{#each data.embedItemsList as |advancement|}}
|
||||||
{{> 'systems/l5r5e/templates/actors/character/advancement-others.html' advancement=advancement editable=../options.editable}}
|
{{> 'systems/l5r5e/templates/actors/character/advancement-others.html' advancement=advancement show_curriculum_toggle=true editable=../options.editable}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
<tfoot>
|
||||||
|
<tr>
|
||||||
|
<th class="" colspan="5">{{localize 'l5r5e.advancements.total_xp_curriculum'}} : {{data.data.xp_used}} / {{data.data.xp_cost}}</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th class="" colspan="5">{{localize 'l5r5e.advancements.total_xp_spent'}} : {{data.data.xp_used_total}}</th>
|
||||||
|
</tr>
|
||||||
|
</tfoot>
|
||||||
</table>
|
</table>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</article>
|
</article>
|
||||||
|
|||||||
Reference in New Issue
Block a user