Ranking: Display players gear

This commit is contained in:
kittentm 2026-03-22 16:25:49 +01:00
commit bd7c49a65d
No known key found for this signature in database
GPG key ID: AC43DFDBC1F44A91
2 changed files with 79 additions and 6 deletions

View file

@ -1,4 +1,4 @@
window.loadHeader(function(headerContainer) { window.loadHeader(async function(headerContainer) {
const rankButton = headerContainer.querySelector('.menu-item.rank'); const rankButton = headerContainer.querySelector('.menu-item.rank');
if (rankButton) { if (rankButton) {
rankButton.classList.add('active'); rankButton.classList.add('active');
@ -110,13 +110,33 @@ window.loadHeader(function(headerContainer) {
}; };
let cachedLeaderboardData = null; let cachedLeaderboardData = null;
let mappingCache = null;
const renderRankings = (mode) => { const renderRankings = async (mode) => {
const container = document.getElementById('ranking-cards-container'); const container = document.getElementById('ranking-cards-container');
if (!container || !cachedLeaderboardData) return; if (!container || !cachedLeaderboardData) return;
container.innerHTML = ''; container.innerHTML = '';
if (!mappingCache) {
const fetchJson = url => fetch(url).then(r => r.ok ? r.json() : []);
mappingCache = await Promise.all([
fetchJson('/assets/mapping/clothing.json'),
fetchJson('/assets/mapping/headgear.json'),
fetchJson('/assets/mapping/shoes.json'),
fetchJson('/assets/mapping/weapons.json')
]);
}
const [clothing, headgear, shoes, weapons] = mappingCache;
const getImg = (list, id, folder) => {
const fallback = "/assets/weapons/NotFound^w.png";
if (id === undefined || id === null) return fallback;
const item = list.find(i => String(i.id) === String(id));
if (item && item.image) return `../assets/${folder}/${item.image}`;
return fallback;
};
const modeMap = { 'regular': 0, 'gachi': 1, 'fes': 2 }; const modeMap = { 'regular': 0, 'gachi': 1, 'fes': 2 };
const apiModeKey = `mode_${modeMap[mode] || 0}`; const apiModeKey = `mode_${modeMap[mode] || 0}`;
const players = cachedLeaderboardData[apiModeKey] || []; const players = cachedLeaderboardData[apiModeKey] || [];
@ -130,6 +150,11 @@ window.loadHeader(function(headerContainer) {
? `<img src="/assets/en/svg/ui/34b4b97a4411.svg" class="rank-power-icon">` ? `<img src="/assets/en/svg/ui/34b4b97a4411.svg" class="rank-power-icon">`
: ''; : '';
const weaponImg = getImg(weapons, player.weapon, 'weapons');
const headImg = getImg(headgear, player.headgear, 'headgear');
const clothesImg = getImg(clothing, player.clothes, 'clothing');
const shoesImg = getImg(shoes, player.shoes, 'shoes');
const card = document.createElement('div'); const card = document.createElement('div');
card.className = `rank-card-container`; card.className = `rank-card-container`;
card.innerHTML = ` card.innerHTML = `
@ -142,10 +167,22 @@ window.loadHeader(function(headerContainer) {
</div> </div>
<div class="rank-power-value">${displayScore}</div> <div class="rank-power-value">${displayScore}</div>
<div class="rank-gear-row"> <div class="rank-gear-row">
<img src="/assets/en/ui/gearbigbg.png" class="gear-main"> <div class="gear-wrapper main">
<img src="/assets/en/ui/gearsmallbg.png" class="gear-sub"> <img src="/assets/en/ui/gearbigbg.png" class="gear-bg">
<img src="/assets/en/ui/gearsmallbg.png" class="gear-sub"> <img src="${weaponImg}" class="gear-icon" onerror='this.src="/assets/weapons/NotFound^w.png"'>
<img src="/assets/en/ui/gearsmallbg.png" class="gear-sub"> </div>
<div class="gear-wrapper sub">
<img src="/assets/en/ui/gearsmallbg.png" class="gear-bg">
<img src="${headImg}" class="gear-icon" onerror='this.src="/assets/weapons/NotFound^w.png"'>
</div>
<div class="gear-wrapper sub">
<img src="/assets/en/ui/gearsmallbg.png" class="gear-bg">
<img src="${clothesImg}" class="gear-icon" onerror='this.src="/assets/weapons/NotFound^w.png"'>
</div>
<div class="gear-wrapper sub">
<img src="/assets/en/ui/gearsmallbg.png" class="gear-bg">
<img src="${shoesImg}" class="gear-icon" onerror='this.src="/assets/weapons/NotFound^w.png"'>
</div>
</div> </div>
`; `;
container.appendChild(card); container.appendChild(card);

View file

@ -270,10 +270,46 @@ body {
left: 510px; left: 510px;
top: 95px; top: 95px;
display: flex; display: flex;
align-items: flex-end;
gap: 12px; gap: 12px;
z-index: 3; z-index: 3;
} }
.gear-wrapper {
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.gear-wrapper.main {
width: 130px;
height: 112px;
}
.gear-wrapper.sub {
width: 84px;
height: 73px;
}
.gear-bg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1;
object-fit: contain;
}
.gear-icon {
position: relative;
z-index: 2;
width: 85%;
height: 85%;
object-fit: contain;
}
.gear-main { width: 130px; height: 112px; } .gear-main { width: 130px; height: 112px; }
.gear-sub { width: 84px; height: 73px; } .gear-sub { width: 84px; height: 73px; }