add a matrix dump endpoint, and a page to display all the matrices

This commit is contained in:
Greg Gauthier 2024-06-30 10:42:25 +01:00
parent 2d4ce38a20
commit ae251bf830
3 changed files with 124 additions and 3 deletions

View File

@ -4,14 +4,18 @@ from flask import Flask
from flask_cors import CORS from flask_cors import CORS
from flask_restx import Api, Resource from flask_restx import Api, Resource
from app.functions.role_physical_attack import roll_physical_attack from .functions.roll_dices import roll_dices
from .functions.role_physical_attack import roll_physical_attack
from .functions.roll_mental_attack import roll_mental_attack
from .functions.build_character_sheet import build_character_sheet from .functions.build_character_sheet import build_character_sheet
from .functions.roll_ability_scores import roll_ability_scores from .functions.roll_ability_scores import roll_ability_scores
from .functions.roll_ability_check import roll_ability_check from .functions.roll_ability_check import roll_ability_check
from .functions.roll_dices import roll_dices
from .functions.roll_encounter import roll_encounter from .functions.roll_encounter import roll_encounter
from .functions.roll_mental_attack import roll_mental_attack
from .functions.roll_mutations import roll_mutations from .functions.roll_mutations import roll_mutations
from .tables.physattack import AttackerWeaponClassMatrix, AttackerHitDiceMatrix
from .tables.mentattack import MentalAttackMatrix
from .models.models import dice_model, ability_model, hp_model, character_model, encounter_model, ma_model, \ from .models.models import dice_model, ability_model, hp_model, character_model, encounter_model, ma_model, \
mutation_model, check_model, pa_model mutation_model, check_model, pa_model
from .schemas.schemas import DiceSchema, CharacterSchema, EncounterSchema, MentalAttackSchema, AbilitySchema, \ from .schemas.schemas import DiceSchema, CharacterSchema, EncounterSchema, MentalAttackSchema, AbilitySchema, \
@ -215,5 +219,19 @@ class GenerateCharacter(Resource):
return build_character_sheet(chartype), 200 return build_character_sheet(chartype), 200
@api.route('/matrices/dump', methods=['GET'])
class DumpMatrices(Resource):
def get(self):
awc_table = AttackerWeaponClassMatrix().get_matrix().to_json(orient='index')
ahd_table = AttackerHitDiceMatrix().get_matrix().to_json(orient='index')
mat_table = MentalAttackMatrix().get_matrix().to_json(orient='index')
return {
"Weapon Attack Table": awc_table,
"Non-Weapon Attack Table": ahd_table,
"Mental Attack Table": mat_table
}, 200
if __name__ == '__main__': if __name__ == '__main__':
app.run() app.run()

98
web/display_tables.html Normal file
View File

@ -0,0 +1,98 @@
<!DOCTYPE html>
<html>
<head>
<title>Table View</title>
<style>
table {
border-collapse: collapse;
width: 100%;
}
th, td {
text-align: left;
padding: 8px;
}
tr:nth-child(even){background-color: #f2f2f2}
</style>
</head>
<body>
<table id="yield-table">
<thead></thead>
<tbody></tbody>
</table>
<script>
function createTable(data) {
const table = document.createElement('table');
// Get all row and column indexes
const colIndexes = Object.keys(data[Object.keys(data)[0]]);
const rowIndexes = Object.keys(data);
const thead = document.createElement('thead');
const hRow = document.createElement('tr');
// Empty cell in the top-left corner
hRow.appendChild(document.createElement('th'));
colIndexes.forEach(colIndex => {
const cell = document.createElement('th');
cell.textContent = colIndex;
hRow.appendChild(cell);
});
thead.appendChild(hRow);
table.appendChild(thead);
const tbody = document.createElement('tbody');
rowIndexes.forEach(rowIndex => {
const tRow = document.createElement('tr');
const rowHeader = document.createElement('th');
rowHeader.textContent = rowIndex;
tRow.appendChild(rowHeader);
colIndexes.forEach(colIndex => {
const cell = document.createElement('td');
cell.textContent = data[rowIndex][colIndex];
tRow.appendChild(cell);
});
tbody.appendChild(tRow);
});
table.appendChild(tbody);
return table;
}
function parseAndRenderData(data) {
for (const [tableName, tableData] of Object.entries(data)) {
// Parse JSON into object
const parsedData = JSON.parse(tableData);
const tableTitle = document.createElement('H2');
tableTitle.innerHTML = tableName;
document.body.appendChild(tableTitle);
// Create table and header
const table = createTable(parsedData);
// Append table to the body of the HTML
document.body.appendChild(table);
}
}
document.addEventListener('DOMContentLoaded', function () {
fetch('https://gammaworld.gmgauthier.com/matrices/dump')
.then(response => response.json())
.then(data => {
parseAndRenderData(data)
});
});
</script>
</body>
</html>

View File

@ -21,6 +21,7 @@
<button id="physicalattack">Physical Attack!</button> <button id="physicalattack">Physical Attack!</button>
<button id="mentalattack">Mental Attack!</button> <button id="mentalattack">Mental Attack!</button>
<button id="chargen">Characters</button> <button id="chargen">Characters</button>
<button id="tables">Show Tables</button>
</div> </div>
<hr/> <hr/>
@ -30,6 +31,10 @@
document.addEventListener('DOMContentLoaded', function () { document.addEventListener('DOMContentLoaded', function () {
loadContent("intro.html"); loadContent("intro.html");
document.getElementById("tables").addEventListener("click", function () {
loadContent("display_tables.html?t=" + new Date().getTime());
});
document.getElementById("dieroller").addEventListener("click", function () { document.getElementById("dieroller").addEventListener("click", function () {
loadContent("rolldice.html?t=" + new Date().getTime()); loadContent("rolldice.html?t=" + new Date().getTime());
}); });