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 .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>`;
|
||||||
|
|||||||
Reference in New Issue
Block a user