|
|
{% extends "base.html" %} {% set active_page = "shares_calc" %}
{% block title %}Spoil Shares Calculator{% endblock %} {% block content %} <div class="uk-flex uk-flex-center uk-margin-bottom uk-margin-top"> <h1 class="uk-text-center"><strong>Legends of Palisma</strong>Spoil Shares Calculator</h1> </div>
<div class="uk-grid-divider" uk-grid> <div class="uk-width-1-3"> <h3>Session Info</h3> <form class="uk-form-horizontal uk-margin-large" autocomplete=off> <div class="uk-margin"> <label class="uk-form-label" for="player_count">Number of players</label> <div class="uk-form-controls"> <select name="player_count" id="player_count" class="uk-select"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> </select> </div> </div>
<div class="uk-margin"> <label class="uk-form-label" for="hench_count">Number of henchmen</label> <div class="uk-form-controls"> <input class="uk-input" id="hench_count" name="hench_count" type="number" value="0"> </div> </div>
<div class="uk-margin"> <label class="uk-form-label" for="gp_recovered">GP value recovered</label> <div class="uk-form-controls"> <input class="uk-input" id="gp_recovered" name="gp_recovered" type="number" value="0"> </div> </div>
<div class="uk-margin"> <label class="uk-form-label" for="xp_earned">XP earned from monsters</label> <div class="uk-form-controls"> <input class="uk-input" id="xp_earned" name="xp_earned" type="number" value="0"> </div> </div> <button type="button" id="share_calc_button" class="uk-button uk-button-primary">Calculate</button> </form> </div> <div class="uk-width-1-3"> <h4>Henchmen XP Shares</h4> <table id="hench_shares" class="uk-table"> <thead> <tr> <th>Bonus XP Rate</th> <th>Share Per-Henchman</th> </tr> </thead> <tbody></tbody> </table> </div> <div class="uk-width-1-3"> <h4>Player XP Shares</h4> <table id="player_shares" class="uk-table"> <thead> <tr> <th>Bonus XP Rate</th> <th>Share Per-Player</th> </tr> </thead> <tbody></tbody> </table>
<h4>Player GP Share</h4> <span id="pc_gp_share"></span>
<div id="share_button_container" class="uk-margin-large-top uk-hidden"> <button type="button" class="uk-button uk-button-secondary uk-button-small" id="export_button" title="Will copy a chat message to be pasted into Roll20.">Share</button> <button type="button" class="uk-button uk-button-default uk-button-small" id="clear_button">Reset</button> </div> </div> </div> <textarea id="export-data" class="uk-textarea uk-hidden"></textarea> {% endblock %}
{% block head %} <style> </style> {% endblock %}
{% block scripts %} <script type="text/javascript"> var lastCalculatedShares = null;
window.addEventListener('DOMContentLoaded', () => { var calc = document.querySelector('button#share_calc_button'); calc.addEventListener("click", calculateShares);
var share = document.querySelector('button#export_button'); share.addEventListener("click", clipboardShare);
var clear = document.querySelector('button#clear_button'); clear.addEventListener("click", resetPage); });
function calculateShares() { document.querySelector('div#share_button_container').classList.remove('uk-hidden');
var player_shares = document.querySelector('table#player_shares > tbody'); var hench_shares = document.querySelector('table#hench_shares > tbody'); var pc_gp_share = document.querySelector('span#pc_gp_share');
player_shares.innerHTML = ''; hench_shares.innerHTML = ''; pc_gp_share.innerText = '';
var player_count = parseInt(document.querySelector('select#player_count').value); var hench_count = parseInt(document.querySelector('input#hench_count').value); var gp = parseInt(document.querySelector('input#gp_recovered').value); var xp = parseInt(document.querySelector('input#xp_earned').value);
lastCalculatedShares = {pc: player_count, hc: hench_count, gp: gp, xp: xp};
let total_xp = gp + xp; let pc_base_xp_share = total_xp / (player_count + hench_count / 2.0);
for(let i = 0; i < 5; i ++) { // Build player rows const row = document.createElement("tr"); const c1 = document.createElement("td"); const c2 = document.createElement("td");
c1.appendChild(document.createTextNode(`@ ${5 * i}%`)); c2.appendChild(document.createTextNode(`${Math.floor(pc_base_xp_share * (1 + 0.05 * i))} xp`));
row.appendChild(c1); row.appendChild(c2);
player_shares.appendChild(row);
// Build hench rows const hrow = document.createElement("tr"); const hc1 = document.createElement("td"); const hc2 = document.createElement("td");
hc1.appendChild(document.createTextNode(`@ ${5 * i}%`)); hc2.appendChild(document.createTextNode(`${Math.floor(pc_base_xp_share * (1 + 0.05 * i) / 2.0)} xp`));
hrow.appendChild(hc1); hrow.appendChild(hc2);
hench_shares.appendChild(hrow); }
var pc_gp_share = document.querySelector('span#pc_gp_share'); let gpshare = Math.floor(gp / (player_count + hench_count / 6.0)) pc_gp_share.appendChild(document.createTextNode(`${gpshare} gold per player.`)); }
function clipboardShare() { if(!lastCalculatedShares) { return; }
var btn = document.querySelector('button#export_button'); btn.classList.remove('uk-animation-shake'); var lcs = lastCalculatedShares; var [player_count, hench_count, gp, xp] = [lcs.pc, lcs.hc, lcs.gp, lcs.xp];
let total_xp = gp + xp; let pc_base_xp_share = total_xp / (player_count + hench_count / 2.0);
var [ps, hs] = [{}, {}]; for(let i = 0; i < 5; i ++) { // Build player rows ps[`@ ${5 * i}%`] = `${Math.floor(pc_base_xp_share * (1 + 0.05 * i))} xp`;
// Build hench rows hs[`@ ${5 * i}%`] = `${Math.floor(pc_base_xp_share * (1 + 0.05 * i) / 2.0)} xp`; }
let gpshare = Math.floor(gp / (player_count + hench_count / 6.0))
{% raw %} let response = '&{template:acks}{{name=Spoil Shares}}'; response += `{{**Player Gold Share** = [[${gpshare}]]}}`; response += '{{**Player XP Share**=\n' for(const [k, v] of Object.entries(ps)) { response += `${k} bonus: *${v}*\n`; } response += '}}';
response += '{{**Henchmen XP Share**=\n' for(const [k, v] of Object.entries(hs)) { response += `${k} bonus: *${v}*\n`; } response += `}}{{desc=${player_count} players, ${hench_count} henchmen sharing ${gp} gold XP and ${xp} monster XP.}}`; {% endraw %}
let export_data = document.querySelector('#export-data'); export_data.value = response; export_data.classList.remove('uk-hidden');
export_data.select(); document.execCommand("copy");
export_data.classList.add('uk-hidden');
btn.classList.add('uk-animation-shake'); }
function resetPage() { document.querySelector('div#share_button_container').classList.add('uk-hidden'); document.querySelector('table#player_shares > tbody').innerHTML = ''; document.querySelector('table#hench_shares > tbody').innerHTML = ''; document.querySelector('span#pc_gp_share').innerText = '';
document.querySelector('select#player_count').value = 1; document.querySelector('input#hench_count').value = 0;
document.querySelector('input#gp_recovered').value = 0; document.querySelector('input#xp_earned').value = 0; } </script> {% endblock %}
|