ENH: Creation summary

master
U~man 2020-07-21 20:57:16 +02:00
parent 2f3c91d72c
commit 642c368f38
3 changed files with 68 additions and 12 deletions

View File

@ -252,7 +252,6 @@
"OSE.messages.InflictsDamage": "Inflicts damage!",
"OSE.messages.applyDamage": "Apply Damage",
"OSE.messages.applyHealing": "Apply Healing",
"OSE.messages.creationFinished": "Character {name} creation finished",
"OSE.colors.green": "Green",
"OSE.colors.red": "Red",

View File

@ -5,7 +5,7 @@ export class OseCharacterCreator extends FormApplication {
static get defaultOptions() {
const options = super.defaultOptions;
options.classes = ["ose", "dialog", "creator"],
options.id = 'character-creator';
options.id = 'character-creator';
options.template =
'systems/ose/templates/actors/dialogs/character-creation.html';
options.width = 235;
@ -41,6 +41,11 @@ export class OseCharacterCreator extends FormApplication {
con: 0,
gold: 0
}
data.stats = {
sum: 0,
avg: 0,
std: 0
}
return data;
}
@ -56,20 +61,27 @@ export class OseCharacterCreator extends FormApplication {
})
let n = values.length;
let sum = values.reduce((a,b) => a+b);
let sum = values.reduce((a, b) => a + b);
let mean = parseFloat(sum) / n;
let std = Math.sqrt(values.map(x => Math.pow(x-mean,2)).reduce((a,b) => a+b)/n);
let std = Math.sqrt(values.map(x => Math.pow(x - mean, 2)).reduce((a, b) => a + b) / n);
let stats = list.siblings('.roll-stats');
stats.find('.sum').text(sum);
stats.find('.avg').text(Math.round(10 * sum / n) / 10);
stats.find('.std').text(Math.round(100 * std) / 100);
if (n >= 6) {
$(ev.currentTarget).closest('form').find('button[type="submit"]').removeAttr('disabled');
}
this.object.data.stats = {
sum: sum,
avg: Math.round(10 * sum / n) / 10,
std: Math.round(100 * std) / 100
}
}
rollScore(score, options={}) {
rollScore(score, options = {}) {
// Increase counter
this.object.data.counters[score]++;
@ -90,16 +102,32 @@ export class OseCharacterCreator extends FormApplication {
data: data,
skipDialog: true,
speaker: ChatMessage.getSpeaker({ actor: this }),
flavor: game.i18n.format('OSE.dialog.generateScore', {score: label, count: this.object.data.counters[score]}),
title: game.i18n.format('OSE.dialog.generateScore', {score: label, count: this.object.data.counters[score]}),
flavor: game.i18n.format('OSE.dialog.generateScore', { score: label, count: this.object.data.counters[score] }),
title: game.i18n.format('OSE.dialog.generateScore', { score: label, count: this.object.data.counters[score] }),
});
}
async close() {
super.close();
// Gather scores
let scores = {};
$(this.form.children).find(".score-roll").each((_, d) => {
let gr = $(d).closest('.form-group');
let val = gr.find(".score-value").val();
scores[gr.data("score")] = val;
})
const gold = $(this.form.children).find('.gold-value').val();
const speaker = ChatMessage.getSpeaker({ actor: this });
const templateData = {
config: CONFIG.OSE,
scores: scores,
title: game.i18n.localize("OSE.dialog.generator"),
stats: this.object.data.stats,
gold: gold
}
const content = await renderTemplate("/systems/ose/templates/chat/roll-creation.html", templateData)
ChatMessage.create({
content: game.i18n.format("OSE.messages.creationFinished", {name: this.object.name}),
content: content,
speaker,
});
}
@ -110,14 +138,14 @@ export class OseCharacterCreator extends FormApplication {
html.find('a.score-roll').click((ev) => {
let el = ev.currentTarget.parentElement.parentElement;
let score = el.dataset.score;
this.rollScore(score, {event: ev}).then(r => {
this.rollScore(score, { event: ev }).then(r => {
$(el).find('input').val(r.total).trigger('change');
});
});
html.find('a.gold-roll').click((ev) => {
let el = ev.currentTarget.parentElement.parentElement.parentElement;
this.rollScore("gold", {event: ev}).then(r => {
this.rollScore("gold", { event: ev }).then(r => {
$(el).find('.gold-value').val(r.total * 10);
});
});
@ -127,8 +155,8 @@ export class OseCharacterCreator extends FormApplication {
})
}
async _onSubmit(event, {updateData=null, preventClose=false, preventRender=false}={}) {
super._onSubmit(event, {updateData: updateData, preventClose: preventClose, preventRender: preventRender});
async _onSubmit(event, { updateData = null, preventClose = false, preventRender = false } = {}) {
super._onSubmit(event, { updateData: updateData, preventClose: preventClose, preventRender: preventRender });
// Generate gold
let gold = event.target.elements.namedItem('gold').value;
const itemData = {

View File

@ -0,0 +1,29 @@
<section class="ose chat-message">
<div class="ose chat-block">
<div class="flexrow chat-header">
<div class="chat-title"><h2>{{title}}</h2></div>
<div class="chat-img" style="background-image:url('{{data.img}}')"></div>
</div>
<div class="flexrow">
<ol class="flex2">
{{#each scores as |score id|}}
<li class="flexrow">
<div style="text-align:right;">
{{lookup ../config.scores id}}
</div>
<div style="text-align:center;">
{{score}}
</div>
</li>
{{/each}}
</ol>
<div style="margin: 0.5em 0">
<div>Sum: {{stats.sum}}</div>
<div>Avg: {{stats.avg}}</div>
<div>σ: {{stats.std}}</div>
<hr>
<div>Gold: {{gold}}</div>
</div>
</div>
</div>
</section>