/
kochkatech
/
CorpGame
Обзор
Документация
Войти
/
kochkatech
/
CorpGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
1
CI/CD
Аналитика
master
frontend/src/lib/formatEvent.tsx
110 строк
4 KB
kochkareal
chore: добавлен .gitattributes, нормализованы переносы строк (LF везде, кроме .bat/.cmd)
06 авг 2026, 15:18
06 авг 2026, 15:18
c25ef1b
Код
Авторство
О чём код?
import { ReactNode } from 'react'; import { EventLogEntry, GameConfig } from '../types'; import { Emoji } from '../components/ui/Emoji'; /** Свой цвет каждого ресурса — совпадает с палитрой значков на дашборде */ const RES_COLOR: Record<string, string> = { wood: '#c08a52', grain: '#e8b83a', iron: '#c0c8d4', oil: '#7f8bbf', uranium: '#7ee23a', diamonds: '#59dced', }; /** Единый рендер записи ленты — используется и в игровом окне, и на публичном дашборде. */ export function formatEvent(e: EventLogEntry, config: GameConfig): ReactNode { const resName = (key: string) => { const def = config.resources.find((r) => r.key === key); return ( <span className="inline-flex items-center gap-1"> <Emoji name={key} fallback={def?.icon ?? key} label={def?.label} className="h-4 w-4" /> <span style={{ color: RES_COLOR[key] ?? '#e7ebff' }} className="font-semibold"> {def?.label ?? key} </span> </span> ); }; const actor = e.actorTeam?.name ?? '—'; const target = e.targetTeam?.name; const p = (e.payload ?? {}) as Record<string, any>; switch (e.type) { case 'branch:collect': return ( <> <b>{actor}</b> <span className="font-semibold text-green-400">добыла</span> {resName(p.resource)} </> ); case 'branch:open': return ( <> <b>{actor}</b> <span className="font-semibold text-green-400">открыла</span> филиал в городе « {p.cityName ?? p.cityKey}» </> ); case 'branch:upgrade': return ( <> <b>{actor}</b> улучшила филиал «{p.cityName ?? p.cityKey}» до уровня {p.newLevel} </> ); case 'interaction:transfer': return ( <> <b>{actor}</b> <span className="font-semibold text-yellow-400">передала</span> {resName(p.resource)} {p.amount} для <b>{target}</b> </> ); case 'interaction:sanction': return p.effect === 'downgrade' ? ( <> <b>{actor}</b> наложила санкции на <b>{target}</b> — понижен уровень филиала «{p.cityKey}» </> ) : ( <> <b>{actor}</b> наложила санкции на <b>{target}</b> — замедлена добыча филиала «{p.cityKey}» {p.durationSec ? ` на ${p.durationSec}с` : ''} </> ); case 'theft:success': return ( <> <b>{actor}</b> <span className="font-semibold text-red-400">украла</span> у <b>{target}</b>{' '} {resName(p.resource)} </> ); case 'theft:caught': return ( <> <b>{actor}</b> <span className="font-semibold text-red-400">пыталась украсть</span> у <b>{target}</b>, но её поймали за руку </> ); case 'bank:exchange': return ( <> <b>{actor}</b> обменяла в банке {resName(p.from)}×{p.rate} → {resName(p.to)}×1 </> ); case 'admin:grant': return ( <> Администратор {p.amount > 0 ? 'начислил' : 'списал'} команде <b>{target}</b> {resName(p.resource)}× {Math.abs(p.amount ?? 0)} </> ); case 'admin:effect': return ( <> Администратор применил временный эффект добычи к <b>{target}</b> (×{p.multiplier}, {p.durationSec}с) </> ); default: return ( <> <b>{actor}</b> {e.type} {target && <b>{target}</b>} </> ); } }