add better graphics for skills page

This commit is contained in:
smthbh 2025-04-17 17:59:03 -04:00
parent ebf57b42a3
commit 624163748e
3 changed files with 247 additions and 16 deletions

View file

@ -74,6 +74,7 @@ interface IArenaTeam {
interface ISkills { interface ISkills {
id: number; id: number;
categoryId: number
skill: string; skill: string;
value: number; value: number;
max: number ; max: number ;
@ -285,12 +286,24 @@ export class CharacterController {
// Could not find character // Could not find character
return next(404); return next(404);
} }
const skills = await this.getSkills(realm.name, charData.guid);
const professions = skills.filter((skill) => skill.categoryId === 11);
const secondarySkills = skills.filter((skill) => skill.categoryId === 9);
const weaponSkills = skills.filter((skill) => skill.categoryId === 6);
const classSkills = skills.filter((skill) => skill.categoryId === 7);
const armorSkills = skills.filter((skill) => skill.categoryId === 8);
const languages = skills.filter((skill) => skill.categoryId === 10);
res.render("character-skills.hbs", { res.render("character-skills.hbs", {
title: `Armory - ${charData.name} - Skills`, title: `Armory - ${charData.name} - Skills`,
...this.makeSharedDataObject(realm, charData), ...this.makeSharedDataObject(realm, charData),
data: { data: {
skills: await this.getSkills(realm.name, charData.guid), skills: skills,
professions: professions,
secondarySkills: secondarySkills,
weaponSkills: weaponSkills,
classSkills: classSkills,
armorSkills: armorSkills,
languages: languages,
}, },
}); });
} }
@ -1017,10 +1030,11 @@ export class CharacterController {
timeout: this.armory.config.dbQueryTimeout, timeout: this.armory.config.dbQueryTimeout,
}); });
const skills: { id: number, skill: string; value: number; max: number }[] = []; const skills: { id: number, categoryId: number, skill: string; value: number; max: number }[] = [];
for (const row of rows as RowDataPacket[]) { for (const row of rows as RowDataPacket[]) {
skills.push({ skills.push({
id: row.skill, id: row.skill,
categoryId: this.skillById[row.skill].categoryId,
skill: this.skillById[row.skill].name, skill: this.skillById[row.skill].name,
value: row.value, value: row.value,
max: row.max, max: row.max,

View file

@ -1,4 +1,4 @@
<link rel="stylesheet" type="text/css" href="{{websiteRoot}}/css/character-talents.css"> <link rel="stylesheet" type="text/css" href="{{websiteRoot}}/css/character-skills.css">
{{> icons }} {{> icons }}
<script type="application/javascript"> <script type="application/javascript">
const aowow_tooltips = { "renamelinks": true, }; const aowow_tooltips = { "renamelinks": true, };
@ -6,24 +6,121 @@
{{> character-header }} {{> character-header }}
<div class="skills-table"> <div class="skills-table" style="margin-bottom: 20px;">
<h2 class="is-size-4">Character Skills</h2> <h2 class="is-size-4">Professions</h2>
<table class="table is-striped is-hoverable is-fullwidth"> <table class="table is-striped is-hoverable is-quarter-desktop">
<thead> <thead>
<tr> <tr>
{{!-- <th>Skill ID</th> --}} <th>Name</th>
<th>Skill Name</th> {{!-- <th>Level</th> --}}
<th>Skill Value</th> {{!-- <th>Max</th> --}}
<th>Max Value</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{{#each data.skills}} {{#each data.professions}}
<tr> <tr>
{{!-- <td>{{this.id}}</td> --}} <!-- Skill ID: {{this.id}} -->
<td>{{this.skill}}</td> <td>
<td>{{this.value}}</td> <div class="progress-bar-container">
<td>{{this.max}}</td> <div class="progress-bar" style="width: {{multiply (divide this.value this.max) 100}}%;"></div>
<span class="progress-text"><span class="gold-text">{{this.skill}}</span>&nbsp;&nbsp;&nbsp;&nbsp;{{this.value}}/{{this.max}}</span>
</div>
</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
<div class="skills-table" style="margin-bottom: 20px;">
<h2 class="is-size-4">Secondary Skills</h2>
<table class="table is-striped is-hoverable is-quarter-desktop">
<tbody>
{{#each data.secondarySkills}}
<tr>
<!-- Skill ID: {{this.id}} -->
<td>
<div class="progress-bar-container">
<div class="progress-bar" style="width: {{multiply (divide this.value this.max) 100}}%;"></div>
<span class="progress-text"><span class="gold-text">{{this.skill}}</span>&nbsp;&nbsp;&nbsp;&nbsp;{{this.value}}/{{this.max}}</span>
</div>
</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
<div class="skills-table" style="margin-bottom: 20px;">
<h2 class="is-size-4">Weapon Skills</h2>
<table class="table is-striped is-hoverable is-quarter-desktop">
<tbody>
{{#each data.weaponSkills}}
<tr>
<!-- Skill ID: {{this.id}} -->
<td>
<div class="progress-bar-container">
<div class="progress-bar" style="width: {{multiply (divide this.value this.max) 100}}%;"></div>
<span class="progress-text"><span class="gold-text">{{this.skill}}</span>&nbsp;&nbsp;&nbsp;&nbsp;{{this.value}}/{{this.max}}</span>
</div>
</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
<div class="skills-table" style="margin-bottom: 20px;">
<h2 class="is-size-4">Class Skills</h2>
<table class="table is-striped is-hoverable is-quarter-desktop">
<tbody>
{{#each data.classSkills}}
<tr>
<!-- Skill ID: {{this.id}} -->
<td>
<div class="progress-bar-container">
<div class="progress-bar" style="width: {{multiply (divide this.value this.max) 100}}%;"></div>
<span class="progress-text"><span class="gold-text">{{this.skill}}</span>&nbsp;&nbsp;&nbsp;&nbsp;{{this.value}}/{{this.max}}</span>
</div>
</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
<div class="skills-table" style="margin-bottom: 20px;">
<h2 class="is-size-4">Armor Proficiencies</h2>
<table class="table is-striped is-hoverable is-quarter-desktop">
<tbody>
{{#each data.armorSkills}}
<tr>
<!-- Skill ID: {{this.id}} -->
<td>
<div class="progress-bar-container">
<div class="progress-bar" style="width: {{multiply (divide this.value this.max) 100}}%;"></div>
<span class="progress-text"><span class="gold-text">{{this.skill}}</span>&nbsp;&nbsp;&nbsp;&nbsp;{{this.value}}/{{this.max}}</span>
</div>
</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
<div class="skills-table" style="margin-bottom: 20px;">
<h2 class="is-size-4">Languages</h2>
<table class="table is-striped is-hoverable is-quarter-desktop">
<tbody>
{{#each data.languages}}
<tr>
<!-- Skill ID: {{this.id}} -->
<td>
<div class="progress-bar-container">
<div class="progress-bar" style="width: {{multiply (divide this.value this.max) 100}}%;"></div>
<span class="progress-text"><span class="gold-text">{{this.skill}}</span>&nbsp;&nbsp;&nbsp;&nbsp;{{this.value}}/{{this.max}}</span>
</div>
</td>
</tr> </tr>
{{/each}} {{/each}}
</tbody> </tbody>

View file

@ -0,0 +1,120 @@
#talent-template,
#talent-tree-template {
display: none;
}
.iconmedium.empty .icon-border {
background-position: 0px 0px;
}
.iconmedium.empty .icon {
filter: grayscale(100%);
opacity: 0.7;
}
.iconmedium.notfull .icon-border {
background-position: -84px 0px;
}
.iconmedium.full .icon-border {
background-position: -42px 0px;
}
.iconmedium .icon-border {
width: 42px;
height: 42px;
position: absolute;
left: 1px;
top: 1px;
background-repeat: no-repeat;
}
.iconmedium a span {
display: none;
}
.iconmedium::after {
content: attr(rank);
background-color: black;
position: absolute;
top: 30px;
left: 30px;
font-size: 14px;
padding: 0px 2px;
z-index: 4;
}
.iconmedium.empty::after {
display: none;
}
.iconmedium.full::after,
.iconmedium.notfull::after {
border-radius: 4px;
cursor: default;
user-select: none;
pointer-events: none;
}
.iconmedium.notfull::after {
color: #30ec30;
border: 1px solid #30ec30;
}
.iconmedium.full::after {
color: #ffcf00;
border: 1px solid #ffcf00;
}
.skills-table {
width: 33%; /* Ensures all tables take up the full width of the container */
}
.skills-table table {
width: 100%; /* Ensures all tables inside .skills-table are the same width */
table-layout: fixed; /* Ensures consistent column widths */
}
.skills-table th,
.skills-table td {
width: 33.33%;
}
.progress-bar-container {
width: 100%;
background-color: #020018;
border-radius: 5px;
overflow: hidden;
height: 20px;
position: relative; /* Enables positioning of child elements */
}
.progress-bar {
height: 100%;
background-color: #000852;
position: absolute; /* Allows the bar to stay behind the text */
width: 0%;
transition: width 0.3s ease;
z-index: 1; /* Ensures the bar is behind the text */
}
.progress-text {
position: absolute; /* Positions the text over the bar */
top: 50%; /* Centers the text vertically */
left: 10px; /* Aligns the text to the left with some padding */
transform: translateY(-50%); /* Vertically centers the text */
z-index: 2; /* Ensures the text is above the bar */
color: white; /* Makes the text visible on the bar */
font-weight: bold;
font-size: 12px;
white-space: nowrap; /* Prevents text from wrapping */
}
#spec-links {
margin-bottom: 32px;
}
.gold-text {
color: #FFD700; /* Gold color */
font-weight: bold; /* Optional: Make the text bold */
}