update battle log format (#1303)
This commit is contained in:
@@ -339,6 +339,8 @@
|
||||
.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-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 {
|
||||
@@ -729,15 +731,55 @@
|
||||
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)
|
||||
// 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
|
||||
const m = line.match(/^([+-])(\[[^\]]*\])\s+(.+)$/);
|
||||
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 rest = m[3];
|
||||
// Split on action words
|
||||
@@ -748,7 +790,7 @@
|
||||
const attacker = actionMatch[1];
|
||||
const action = actionMatch[2];
|
||||
const actionExtra = actionMatch[3] || '';
|
||||
const victim = actionMatch[4];
|
||||
const victim = addVictimSquadron(actionMatch[4], playerSquadrons);
|
||||
const actionText = actionExtra ? `${action} (${actionExtra})` : action;
|
||||
return `<span class="bl-time">${escapeHtml(m[1] + time)}</span> `
|
||||
+ `<span class="${winCls}">${escapeHtml(attacker)}</span> `
|
||||
@@ -967,7 +1009,7 @@
|
||||
const chatBody = document.getElementById('chatLogBody');
|
||||
if (replay.chat_log && replay.chat_log.length > 0) {
|
||||
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>`;
|
||||
}).join('');
|
||||
} else {
|
||||
@@ -977,8 +1019,9 @@
|
||||
// Battle log
|
||||
const battleBody = document.getElementById('battleLogBody');
|
||||
if (replay.battle_log && replay.battle_log.length > 0) {
|
||||
const playerSquadrons = buildReplayPlayerSquadronMap(replay);
|
||||
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('');
|
||||
} else {
|
||||
battleBody.innerHTML = `<div class="log-entry" style="color: rgba(255,255,255,0.3);">${__t('games.noBattleLog')}</div>`;
|
||||
|
||||
Reference in New Issue
Block a user