forked from spacebar/SplatNet
Ranking: Display players gear
This commit is contained in:
parent
b5c9be6b87
commit
bd7c49a65d
2 changed files with 79 additions and 6 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue