update battle log format (#1303)

This commit is contained in:
NotSoToothless
2026-06-05 12:03:59 -07:00
committed by GitHub
parent 80a1ebde30
commit a8317575a3
+50 -7
View File
@@ -339,6 +339,8 @@
.log-entry .bl-action { color: rgba(255,255,255,0.4); } .log-entry .bl-action { color: rgba(255,255,255,0.4); }
.log-entry.chat-team { color: rgba(255, 255, 255, 0.7); } .log-entry.chat-team { color: rgba(255, 255, 255, 0.7); }
.log-entry.chat-all { color: rgba(255, 200, 100, 0.9); } .log-entry.chat-all { color: rgba(255, 200, 100, 0.9); }
.log-entry.chat-team.chat-win { color: rgb(100, 255, 100); }
.log-entry.chat-team.chat-lose { color: rgb(255, 100, 100); }
/* Loading state */ /* Loading state */
.loading-state { .loading-state {
@@ -729,15 +731,55 @@
return div.innerHTML; return div.innerHTML;
} }
function formatBattleLogLine(line) { function normalizeSquadronTag(tag) {
return String(tag || '').replace(/^\[|\]$/g, '').trim();
}
function sameSquadronTag(a, b) {
const left = normalizeSquadronTag(a).toLowerCase();
const right = normalizeSquadronTag(b).toLowerCase();
return Boolean(left && right && left === right);
}
function chatTeamClass(line, replay) {
if (!line.includes('[TEAM]')) return 'chat-all';
const m = line.match(/^\[[^\]]*\]\s+\[TEAM\]\s+\[([^\]]*)\]/);
const squadron = m ? m[1] : '';
if (sameSquadronTag(squadron, replay.winning_team_squadron)) return 'chat-team chat-win';
if (sameSquadronTag(squadron, replay.losing_team_squadron)) return 'chat-team chat-lose';
return 'chat-team';
}
function buildReplayPlayerSquadronMap(replay) {
const map = new Map();
for (const team of replay.teams || []) {
const squadron = normalizeSquadronTag(team.squadron || team.squadron_tagged);
if (!squadron) continue;
for (const player of team.players || []) {
const nick = String(player.nick || '').trim();
if (nick) map.set(nick, squadron);
}
}
return map;
}
function addVictimSquadron(victim, playerSquadrons) {
if (/^\[[^\]]+\]\s+/.test(victim)) return victim;
const nameMatch = victim.match(/^(.+?)\s+\(/);
const victimName = nameMatch ? nameMatch[1].trim() : victim.trim();
const squadron = playerSquadrons.get(victimName);
return squadron ? `[${squadron}] ${victim}` : victim;
}
function formatBattleLogLine(line, playerSquadrons = new Map()) {
// Format: +[TIME] [SQUAD] Player (Vehicle) ACTION [SQUAD] Player (Vehicle) // Format: +[TIME] [SQUAD] Player (Vehicle) ACTION [SQUAD] Player (Vehicle)
// or: -[TIME] [SQUAD] Player (Vehicle) ACTION [SQUAD] Player (Vehicle) // or: -[TIME] [SQUAD] Player (Vehicle) ACTION [SQUAD] Player (Vehicle)
const isWinnerAction = line.startsWith('+');
const winCls = isWinnerAction ? 'bl-win' : 'bl-lose';
const loseCls = isWinnerAction ? 'bl-lose' : 'bl-win';
// Parse: sign[TIME] rest // Parse: sign[TIME] rest
const m = line.match(/^([+-])(\[[^\]]*\])\s+(.+)$/); const m = line.match(/^([+-])(\[[^\]]*\])\s+(.+)$/);
if (!m) return escapeHtml(line); if (!m) return escapeHtml(line);
const isWinnerAction = m[1] === '+';
const winCls = isWinnerAction ? 'bl-win' : 'bl-lose';
const loseCls = isWinnerAction ? 'bl-lose' : 'bl-win';
const time = m[2]; const time = m[2];
const rest = m[3]; const rest = m[3];
// Split on action words // Split on action words
@@ -748,7 +790,7 @@
const attacker = actionMatch[1]; const attacker = actionMatch[1];
const action = actionMatch[2]; const action = actionMatch[2];
const actionExtra = actionMatch[3] || ''; const actionExtra = actionMatch[3] || '';
const victim = actionMatch[4]; const victim = addVictimSquadron(actionMatch[4], playerSquadrons);
const actionText = actionExtra ? `${action} (${actionExtra})` : action; const actionText = actionExtra ? `${action} (${actionExtra})` : action;
return `<span class="bl-time">${escapeHtml(m[1] + time)}</span> ` return `<span class="bl-time">${escapeHtml(m[1] + time)}</span> `
+ `<span class="${winCls}">${escapeHtml(attacker)}</span> ` + `<span class="${winCls}">${escapeHtml(attacker)}</span> `
@@ -967,7 +1009,7 @@
const chatBody = document.getElementById('chatLogBody'); const chatBody = document.getElementById('chatLogBody');
if (replay.chat_log && replay.chat_log.length > 0) { if (replay.chat_log && replay.chat_log.length > 0) {
chatBody.innerHTML = replay.chat_log.map(line => { chatBody.innerHTML = replay.chat_log.map(line => {
const cls = line.includes('[TEAM]') ? 'chat-team' : 'chat-all'; const cls = chatTeamClass(line, replay);
return `<div class="log-entry ${cls}">${escapeHtml(line)}</div>`; return `<div class="log-entry ${cls}">${escapeHtml(line)}</div>`;
}).join(''); }).join('');
} else { } else {
@@ -977,8 +1019,9 @@
// Battle log // Battle log
const battleBody = document.getElementById('battleLogBody'); const battleBody = document.getElementById('battleLogBody');
if (replay.battle_log && replay.battle_log.length > 0) { if (replay.battle_log && replay.battle_log.length > 0) {
const playerSquadrons = buildReplayPlayerSquadronMap(replay);
battleBody.innerHTML = replay.battle_log.map(line => { battleBody.innerHTML = replay.battle_log.map(line => {
return `<div class="log-entry">${formatBattleLogLine(line)}</div>`; return `<div class="log-entry">${formatBattleLogLine(line, playerSquadrons)}</div>`;
}).join(''); }).join('');
} else { } else {
battleBody.innerHTML = `<div class="log-entry" style="color: rgba(255,255,255,0.3);">${__t('games.noBattleLog')}</div>`; battleBody.innerHTML = `<div class="log-entry" style="color: rgba(255,255,255,0.3);">${__t('games.noBattleLog')}</div>`;