1 import { EquippedItemDetails } from "shared/equipped";
2 import { EquipmentSlot } from "shared/inventory";
3 import { expToLevel, maxHp, Player } from "../../shared/player";
5 function generateProgressBar(current: number, max: number, color: string, displayPercent: boolean = true): string {
8 percent = Math.floor((current / max) * 100);
10 const display = `${displayPercent? `${percent}% - `: ''}`;
11 return `<div class="progress-bar" style="background: linear-gradient(to right, ${color}, ${color} ${percent}%, transparent ${percent}%, transparent)" title="${display}${current}/${max}">${display}${current}/${max}</div>`;
14 function calcAp(inventoryItem: EquippedItemDetails[]): string {
15 const ap: Record<any | EquipmentSlot, {currentAp: number, maxAp: number}> = {};
16 inventoryItem.forEach(item => {
17 if(item.is_equipped && item.type === 'ARMOUR') {
18 ap[item.equipment_slot] = {
19 currentAp: item.currentAp,
27 <img src="/assets/img/helm.png" class="icon">
28 ${generateProgressBar(ap.HEAD?.currentAp || 0, ap.HEAD?.maxAp || 0, '#7be67b')}
31 <img src="/assets/img/arms.png" class="icon">
32 ${generateProgressBar(ap.ARMS?.currentAp || 0, ap.ARMS?.maxAp || 0, '#7be67b')}
35 <img src="/assets/img/chest.png" class="icon">
36 ${generateProgressBar(ap.CHEST?.currentAp || 0, ap.CHEST?.maxAp || 0, '#7be67b')}
39 <img src="/assets/img/legs.png" class="icon">
40 ${generateProgressBar(ap.LEGS?.currentAp || 0, ap.LEGS?.maxAp || 0, '#7be67b')}
45 function progressBar(current: number, max: number, id: string, color: string) {
48 percent = Math.floor((current / max) * 100);
51 return `<div class="progress-bar" id="${id}" style="background: linear-gradient(to right, ${color}, ${color} ${percent}%, transparent ${percent}%, transparent)"
52 title="${percent}% - ${current}/${max}">${current}/${max} - ${percent}</div>`;
55 export function renderPlayerBar(player: Player, inventory: EquippedItemDetails[]): string {
57 <div id="stat-bars" hx-swap-oob="true">
58 <div id="player-section">
59 <div id="username">${player.username}, level ${player.level} ${player.profession}</div>
60 <div class="gold">${player.gold.toLocaleString()}</div>
62 <div id="ap-bar">${calcAp(inventory)}</div>
63 ${progressBar(player.hp, maxHp(player.constitution, player.level), 'hp-bar', '#ff7070')}
64 ${progressBar(player.exp, expToLevel(player.level + 1), 'exp-bar', '#5997f9')}