|
@ -1,94 +1,204 @@ |
|
|
{% extends "base.html" %} |
|
|
{% extends "base.html" %} |
|
|
|
|
|
{% set active_page = "npcparty" %} |
|
|
|
|
|
|
|
|
{% block title %}NPC Party Generation{% endblock %} |
|
|
{% block title %}NPC Party Generation{% endblock %} |
|
|
{% block content %} |
|
|
{% block content %} |
|
|
<div> |
|
|
|
|
|
<label for="base_level">Base level of party to generate: </label> |
|
|
|
|
|
<input type="number" name="base_level" id="base_level" default="1"> |
|
|
|
|
|
|
|
|
<div class="uk-flex uk-flex-center uk-margin-bottom uk-margin-top"> |
|
|
|
|
|
<h1>Adventurer Conqueror King NPC Party Generator</h1> |
|
|
</div> |
|
|
</div> |
|
|
<div> |
|
|
|
|
|
<button onclick="generateParty();">Generate</button> |
|
|
|
|
|
|
|
|
<div class="uk-flex uk-flex-bottom uk-flex-center uk-margin-large-bottom"> |
|
|
|
|
|
<div> |
|
|
|
|
|
<label for="base_level">Base level of party to generate: </label> |
|
|
|
|
|
<input type="number" name="base_level" id="base_level" class="uk-input" value="{{ base_level if base_level else 1 }}" > |
|
|
|
|
|
</div> |
|
|
|
|
|
<div class="uk-margin-left"> |
|
|
|
|
|
<button class="uk-button uk-button-primary" onclick="generateParty();">Generate</button> |
|
|
|
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<br> |
|
|
|
|
|
|
|
|
<hr class="uk-divider-icon"> |
|
|
|
|
|
|
|
|
{% if party %} |
|
|
{% if party %} |
|
|
<h3>NPC Party of Size {{ party | length }}</h3> |
|
|
|
|
|
|
|
|
<div class="uk-flex uk-flex-between uk-margin-large-top"> |
|
|
|
|
|
<h3 class="uk-display-inline-block">NPC Party of Size {{ party | length }} </h3> |
|
|
|
|
|
<div class="uk-text-right uk-display-inline-block"> |
|
|
|
|
|
<a class="uk-button uk-button-small uk-button-secondary uk-border-rounded" onclick="showExportModal();">Roll20 Export</a> |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="uk-grid-medium uk-grid-match" uk-grid> |
|
|
|
|
|
|
|
|
<div class="uk-grid-medium uk-grid-match uk-flex-center" uk-grid> |
|
|
{% for npc in party %} |
|
|
{% for npc in party %} |
|
|
<div class="acks-npc-card"> |
|
|
<div class="acks-npc-card"> |
|
|
<div class="uk-card uk-card-body uk-card-default"> |
|
|
|
|
|
<h4 class="uk-card-title">{{ npc.guild }}</h4> |
|
|
|
|
|
<div class="uk-card-badge uk-label">Level {{ npc.level }}</div> |
|
|
|
|
|
|
|
|
<div class="uk-card uk-card-body uk-card-default uk-box-shadow-hover-large"> |
|
|
|
|
|
<h4 class="uk-card-title uk-margin-small-top">{{ npc.name }}</h4> |
|
|
|
|
|
<div class="uk-card-badge uk-label uk-label-primary">{{ npc.guild.name }}</div> |
|
|
<div class="uk-flex uk-flex-around uk-text-center uk-margin-bottom"> |
|
|
<div class="uk-flex uk-flex-around uk-text-center uk-margin-bottom"> |
|
|
<div> |
|
|
<div> |
|
|
|
|
|
<div class="uk-text-bold">Level</div> |
|
|
|
|
|
<div>{{ npc.level }}</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div> |
|
|
|
|
|
<div class="uk-text-bold">HP</div> |
|
|
<div>{{ npc.hp }}</div> |
|
|
<div>{{ npc.hp }}</div> |
|
|
<div>HP</div> |
|
|
|
|
|
</div> |
|
|
</div> |
|
|
<div> |
|
|
<div> |
|
|
<div>{{ npc.armour[2] }}</div> |
|
|
|
|
|
<div>AC</div> |
|
|
|
|
|
|
|
|
<div class="uk-text-bold">AC</div> |
|
|
|
|
|
<div>{{ npc.armour.ac_mod }}</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
<div class="uk-flex uk-flex-around stat-block"> |
|
|
<div class="uk-flex uk-flex-around stat-block"> |
|
|
<div> |
|
|
<div> |
|
|
<div>{{ npc.str }}</div> |
|
|
|
|
|
<div>Str</div> |
|
|
|
|
|
|
|
|
<div title="{{ npc.str_mod }}">{{ npc.str }}</div> |
|
|
|
|
|
<div title="{{ npc.str_mod }}">Str</div> |
|
|
</div> |
|
|
</div> |
|
|
<div> |
|
|
<div> |
|
|
<div>{{ npc.int }}</div> |
|
|
|
|
|
<div>Int</div> |
|
|
|
|
|
|
|
|
<div title="{{ npc.int_mod }}">{{ npc.int }}</div> |
|
|
|
|
|
<div title="{{ npc.int_mod }}">Int</div> |
|
|
</div> |
|
|
</div> |
|
|
<div> |
|
|
<div> |
|
|
<div>{{ npc.wis }}</div> |
|
|
|
|
|
<div>Wis</div> |
|
|
|
|
|
|
|
|
<div title="{{ npc.wis_mod }}">{{ npc.wis }}</div> |
|
|
|
|
|
<div title="{{ npc.wis_mod }}">Wis</div> |
|
|
</div> |
|
|
</div> |
|
|
<div> |
|
|
<div> |
|
|
<div>{{ npc.dex }}</div> |
|
|
|
|
|
<div>Dex</div> |
|
|
|
|
|
|
|
|
<div title="{{ npc.dex_mod }}">{{ npc.dex }}</div> |
|
|
|
|
|
<div title="{{ npc.dex_mod }}">Dex</div> |
|
|
</div> |
|
|
</div> |
|
|
<div> |
|
|
<div> |
|
|
<div>{{ npc.con }}</div> |
|
|
|
|
|
<div>Con</div> |
|
|
|
|
|
|
|
|
<div title="{{ npc.con_mod }}">{{ npc.con }}</div> |
|
|
|
|
|
<div title="{{ npc.con_mod }}">Con</div> |
|
|
</div> |
|
|
</div> |
|
|
<div> |
|
|
<div> |
|
|
<div>{{ npc.chr }}</div> |
|
|
|
|
|
<div>Chr</div> |
|
|
|
|
|
|
|
|
<div title="{{ npc.chr_mod }}">{{ npc.chr }}</div> |
|
|
|
|
|
<div title="{{ npc.chr_mod }}">Chr</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
<table class="uk-table uk-table-hover uk-table-small item-table"> |
|
|
|
|
|
<thead> |
|
|
|
|
|
<tr> <th>Name</th><th>Worth</th><th>Thr</th><th>Dmg</th> </tr> |
|
|
|
|
|
</thead> |
|
|
|
|
|
<tbody> |
|
|
|
|
|
<tr> |
|
|
|
|
|
<td>{{ npc.melee[0] }}</td> |
|
|
|
|
|
<td>{{ npc.melee[1] }}gp</td> |
|
|
|
|
|
<td>0</td> |
|
|
|
|
|
<td>{{ npc.melee[2] }}</td> |
|
|
|
|
|
</tr> |
|
|
|
|
|
{% if npc.ranged %} |
|
|
|
|
|
<tr> |
|
|
|
|
|
<td>{{ npc.ranged[0] }}</td> |
|
|
|
|
|
<td>{{ npc.ranged[1] }}gp</td> |
|
|
|
|
|
<td>0</td> |
|
|
|
|
|
<td>{{ npc.ranged[2] }}</td> |
|
|
|
|
|
</tr> |
|
|
|
|
|
{% endif %} |
|
|
|
|
|
<tr> |
|
|
|
|
|
<td>{{ npc.armour[0] }}</td> |
|
|
|
|
|
<td>{{ npc.armour[1] }}gp</td> |
|
|
|
|
|
<td></td> |
|
|
|
|
|
<td></td> |
|
|
|
|
|
</tr> |
|
|
|
|
|
</tbody> |
|
|
|
|
|
</table> |
|
|
|
|
|
|
|
|
<hr class="uk-divider-small uk-text-center"> |
|
|
|
|
|
<div class="uk-flex uk-flex-around uk-text-center uk-margin-bottom save-block uk-margin-top"> |
|
|
|
|
|
<div> |
|
|
|
|
|
<div title="Petrification & Paralysis">{{ npc.save_pp }}</div> |
|
|
|
|
|
<div title="Petrification & Paralysis">P & P</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div> |
|
|
|
|
|
<div title="Poison & Death">{{ npc.save_pd }}</div> |
|
|
|
|
|
<div title="Poison & Death">P & D</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div> |
|
|
|
|
|
<div title="Blast & Breath">{{ npc.save_bb }}</div> |
|
|
|
|
|
<div title="Blast & Breath">B & B</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div> |
|
|
|
|
|
<div title="Staffs & Wands">{{ npc.save_sw }}</div> |
|
|
|
|
|
<div title="Staffs & Wands">S & W</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div> |
|
|
|
|
|
<div title="Spells">{{ npc.save_sp }}</div> |
|
|
|
|
|
<div title="Spells">Spells</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
<ul uk-tab> |
|
|
|
|
|
<li class="uk-active"><a href="">Equipment</a></li> |
|
|
|
|
|
<li {% if not npc.spellcaster %}class="uk-disabled"{% endif %}><a href="">Spells</a></li> |
|
|
|
|
|
</ul> |
|
|
|
|
|
<ul class="uk-switcher uk-margin"> |
|
|
|
|
|
<li> |
|
|
|
|
|
<table class="uk-table uk-table-hover uk-table-small item-table"> |
|
|
|
|
|
<thead> |
|
|
|
|
|
<tr> <th>Name</th><th>Worth</th><th>Thr</th><th>Dmg</th> </tr> |
|
|
|
|
|
</thead> |
|
|
|
|
|
<tbody> |
|
|
|
|
|
<tr> |
|
|
|
|
|
<td>{{ npc.melee.name }}</td> |
|
|
|
|
|
<td>{{ npc.melee.gp_value }}gp</td> |
|
|
|
|
|
<td>{{ npc.attack_throw }}</td> |
|
|
|
|
|
<td>{{ npc.melee.damage_die }}</td> |
|
|
|
|
|
</tr> |
|
|
|
|
|
{% if npc.ranged %} |
|
|
|
|
|
<tr> |
|
|
|
|
|
<td>{{ npc.ranged.name }}</td> |
|
|
|
|
|
<td>{{ npc.ranged.gp_value }}gp</td> |
|
|
|
|
|
<td>{{ npc.attack_throw }}</td> |
|
|
|
|
|
<td>{{ npc.ranged.damage_die }}</td> |
|
|
|
|
|
</tr> |
|
|
|
|
|
{% endif %} |
|
|
|
|
|
<tr> |
|
|
|
|
|
<td>{{ npc.armour.name }}</td> |
|
|
|
|
|
<td>{{ npc.armour.gp_value }}gp</td> |
|
|
|
|
|
<td></td> |
|
|
|
|
|
<td></td> |
|
|
|
|
|
</tr> |
|
|
|
|
|
</tbody> |
|
|
|
|
|
</table> |
|
|
|
|
|
</li> |
|
|
|
|
|
<li> |
|
|
|
|
|
<table class="uk-table uk-table-hover uk-table-small item-table"> |
|
|
|
|
|
<thead> |
|
|
|
|
|
<tr> <th>Name</th><th>Worth</th><th>Thr</th><th>Dmg</th> </tr> |
|
|
|
|
|
</thead> |
|
|
|
|
|
<tbody> |
|
|
|
|
|
<tr> |
|
|
|
|
|
<td>{{ npc.melee.name }}</td> |
|
|
|
|
|
<td>{{ npc.melee.gp_value }}gp</td> |
|
|
|
|
|
<td>{{ npc.attack_throw }}</td> |
|
|
|
|
|
<td>{{ npc.melee.damage_die }}</td> |
|
|
|
|
|
</tr> |
|
|
|
|
|
{% if npc.ranged %} |
|
|
|
|
|
<tr> |
|
|
|
|
|
<td>{{ npc.ranged.name }}</td> |
|
|
|
|
|
<td>{{ npc.ranged.gp_value }}gp</td> |
|
|
|
|
|
<td>{{ npc.attack_throw }}</td> |
|
|
|
|
|
<td>{{ npc.ranged.damage_die }}</td> |
|
|
|
|
|
</tr> |
|
|
|
|
|
{% endif %} |
|
|
|
|
|
<tr> |
|
|
|
|
|
<td>{{ npc.armour.name }}</td> |
|
|
|
|
|
<td>{{ npc.armour.gp_value }}gp</td> |
|
|
|
|
|
<td></td> |
|
|
|
|
|
<td></td> |
|
|
|
|
|
</tr> |
|
|
|
|
|
</tbody> |
|
|
|
|
|
</table> |
|
|
|
|
|
</li> |
|
|
|
|
|
</ul> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
{% endfor %} |
|
|
{% endfor %} |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
{% endif %} |
|
|
{% endif %} |
|
|
|
|
|
|
|
|
|
|
|
<div id="party-export-modal" uk-modal> |
|
|
|
|
|
<div class="uk-modal-dialog uk-margin-auto-vertical"> |
|
|
|
|
|
<button class="uk-modal-close-default" type="button" uk-close></button> |
|
|
|
|
|
<div class="uk-modal-header"> |
|
|
|
|
|
<h2 class="uk-modal-title">Roll20 Export</h2> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div class="uk-modal-body"> |
|
|
|
|
|
<div class="uk-margin"> |
|
|
|
|
|
<h5>Characters to Export:</h5> |
|
|
|
|
|
<div id="pe_selects" class="uk-grid-small uk-grid uk-child-width-auto"> |
|
|
|
|
|
{% if party %} |
|
|
|
|
|
{% for npc in party %} |
|
|
|
|
|
<label><input class="uk-checkbox" type="checkbox" name="ch{{ loop.index }}" onchange="prepareSelectiveExport();" checked> {{ npc.name }}</label> |
|
|
|
|
|
{% endfor %} |
|
|
|
|
|
{% endif %} |
|
|
|
|
|
</div> |
|
|
|
|
|
<div class="uk-margin uk-align-right"> |
|
|
|
|
|
<div class="uk-button-group"> |
|
|
|
|
|
<button id="pe_none" class="uk-button uk-button-small uk-button-default" onclick="partyExportToggle();">None</button> |
|
|
|
|
|
<button id="pe_all" class="uk-button uk-button-small uk-button-secondary" onclick="partyExportToggle();">All</button> |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
<textarea id="party-export-show" class="uk-textarea uk-text-small" rows="10"></textarea> |
|
|
|
|
|
<textarea id="party-export-data" class="uk-textarea uk-hidden"></textarea> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div class="uk-modal-footer uk-text-right"> |
|
|
|
|
|
<button class="uk-button uk-button-default uk-modal-close" type="button">Cancel</button> |
|
|
|
|
|
<button class="uk-button uk-button-primary" type="button" onclick="exportParty();">Copy</button> |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
<br> |
|
|
<br> |
|
|
|
|
|
|
|
|
<style> |
|
|
<style> |
|
@ -109,14 +219,78 @@ div.stat-block > div > div:last-child { |
|
|
font-size: 12px; |
|
|
font-size: 12px; |
|
|
color: #888; |
|
|
color: #888; |
|
|
} |
|
|
} |
|
|
|
|
|
div.save-block > div > div:first-child { |
|
|
|
|
|
font-weight: bold; |
|
|
|
|
|
color: purple; |
|
|
|
|
|
} |
|
|
|
|
|
div.save-block > div > div:last-child { |
|
|
|
|
|
font-weight: bold; |
|
|
|
|
|
font-size: 12px; |
|
|
|
|
|
color: #888; |
|
|
|
|
|
} |
|
|
div.acks-npc-card { |
|
|
div.acks-npc-card { |
|
|
width: 370px; |
|
|
|
|
|
|
|
|
width: 400px; |
|
|
} |
|
|
} |
|
|
</style> |
|
|
</style> |
|
|
<script type="text/javascript"> |
|
|
<script type="text/javascript"> |
|
|
|
|
|
var party = []; |
|
|
|
|
|
|
|
|
function generateParty() { |
|
|
function generateParty() { |
|
|
let bl = document.querySelector('#base_level').value; |
|
|
let bl = document.querySelector('#base_level').value; |
|
|
window.location = "/npc/party/" + bl.toString(); |
|
|
window.location = "/npc/party/" + bl.toString(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function showExportModal() { |
|
|
|
|
|
{% if party %} |
|
|
|
|
|
{% for npc in party %} |
|
|
|
|
|
party.push(JSON.parse('{{ npc.roll20_format | tojson }}')); |
|
|
|
|
|
{% endfor %} |
|
|
|
|
|
{% endif %} |
|
|
|
|
|
|
|
|
|
|
|
for(let cb of document.querySelectorAll('#pe_selects > label > input')) { |
|
|
|
|
|
cb.checked = true; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
prepareSelectiveExport(); |
|
|
|
|
|
UIkit.modal(document.querySelector('#party-export-modal')).show(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function prepareSelectiveExport() { |
|
|
|
|
|
var selected_party = []; |
|
|
|
|
|
var checkboxes = document.querySelectorAll('#pe_selects > label > input'); |
|
|
|
|
|
for(let [i, cb] of checkboxes.entries()) { |
|
|
|
|
|
if(cb.checked) { |
|
|
|
|
|
selected_party.push(party[i]); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
document.querySelector('#party-export-data').value = "!acksimport " + JSON.stringify(selected_party); |
|
|
|
|
|
document.querySelector('#party-export-show').value = JSON.stringify(selected_party, undefined, 2); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function exportParty() { |
|
|
|
|
|
let party_data = document.querySelector('#party-export-data') |
|
|
|
|
|
party_data.classList.remove('uk-hidden'); |
|
|
|
|
|
|
|
|
|
|
|
party_data.select(); |
|
|
|
|
|
document.execCommand("copy"); |
|
|
|
|
|
|
|
|
|
|
|
party_data.classList.add('uk-hidden'); |
|
|
|
|
|
UIkit.modal(document.querySelector('#party-export-modal')).hide(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function partyExportToggle() { |
|
|
|
|
|
var checkboxes = document.querySelectorAll('#pe_selects > label > input'); |
|
|
|
|
|
for(let cb of checkboxes) { |
|
|
|
|
|
if(event.target.id === "pe_none") { |
|
|
|
|
|
cb.checked = false; |
|
|
|
|
|
} |
|
|
|
|
|
if(event.target.id === "pe_all") { |
|
|
|
|
|
cb.checked = true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
prepareSelectiveExport(); |
|
|
|
|
|
} |
|
|
</script> |
|
|
</script> |
|
|
{% endblock %} |
|
|
{% endblock %} |