LIVEon Twitch:KrimsonTempest(15)
← Back to blog

SOTA Log Parser v0.0.4 - ¡Listo para descargar!

Traducido automáticamente del inglés. Ver original

By admin · 7/31/2026

Lo que los registros ya sabían

Un recorrido por sotalogparser, y por las respuestas equivocadas que lo moldearon.

Shroud of the Avatar lo anota todo. Cada golpe, cada captura, cada obra maestra fallida, cada palabra que alguien dijo cerca de ti, con marca de tiempo, en texto plano, en una carpeta que ya posees. Un jugador de dos años tiene unos pocos millones de líneas acumuladas.

Casi nadie las lee, porque un registro de chat no es un archivo — es la materia prima para uno. Esta es una aplicación que hace la lectura: una aplicación de escritorio multiplataforma que analiza esa carpeta en un índice consultable y genera informes de trece maneras.

Las reglas se derivaron contra un corpus real de 3.84 millones de líneas y reconocen el 99.91% de ellas. Ese corpus es la razón por la que existen las partes interesantes de esta publicación. Cada decisión no obvia a continuación fue primero una respuesta plausible, y el corpus es lo que demostró que estaba equivocada.


La forma de la cosa

Tres capas, estrictamente unidireccionales.

SotaLogParser.Core

Análisis, descubrimiento, indexación, informes. Sin dependencia de interfaz de usuario.

SotaLogParser.App

Vistas y modelos de vista de Avalonia.

SotaLogParser.Desktop

Solo punto de entrada.

.NET 10, Avalonia 12, MVVM. Un solo código base produce compilaciones autónomas de un solo archivo para seis tiempos de ejecución: Windows, macOS y Linux, x64 y arm64 cada uno. Todo lo que vale la pena probar vive en Core, por eso hay 522 de ellos y ninguno requiere una ventana.

El pipeline

LogLineReader divide [marca de tiempo] mensaje y pliega líneas de continuación. ChatLogParser ejecuta una lista ordenada de reglas, la primera coincidencia gana. Lo que nada reclama se convierte en un UnrecognizedEvent.

Esa última parte es una regla, no un respaldo. Nunca descartes una línea. El cubo de no reconocidos es el único mecanismo por el cual una brecha en el conjunto de reglas es visible en absoluto — descartar silenciosamente lo que no coincide ocultaría exactamente la información necesaria para corregirlo. La aplicación muestra el porcentaje de cobertura y te permite filtrar un registro hasta solo las líneas no reclamadas, que es cómo el 99.91% llegó a ser el 99.91%.

El índice

Un archivo de registro obtiene un LogSummary. Todo a través de todo el corpus pasa por un índice SQLite: analizar, adjuntar contexto de escena, escribir filas de hechos, una transacción por archivo, releyendo solo archivos cuyo tamaño o tiempo de modificación cambió. 3.84M de líneas se indexan en unos veinte segundos en aproximadamente 19 MB.

El índice es un caché desechable y nunca una fuente de verdad. Los cambios de esquema o analizador aumentan una versión, y el archivo se elimina y reconstruye en lugar de migrarse. Nada en él no puede regenerarse a partir de los registros, así que nada en él vale el riesgo de un error de migración.

Dos cosas al respecto que tomaron un corpus para aprender.

El analizador no tiene estado por línea, así que solo una línea de cambio de zona sabe dónde ocurrió algo. Un rastreador fija la última escena entrando y se reinicia en un inicio de sesión. Aproximadamente una cuarta parte de los eventos reales ocurren antes de cualquier línea Entering — aterrizan en una escena (desconocida), que es un cubo real que los informes deben mostrar, no una brecha para filtrar.

El combate tiene una dirección. Una cuarta parte de las líneas de ataque en el corpus son mobs golpeando al jugador, y sus habilidades se ven exactamente como las del jugador. Sin dividir por dirección, "tus habilidades" lista habilidades que el jugador nunca ha usado.


Trece informes

El carril los agrupa. Cada uno se carga perezosamente en la primera apertura y se recarga cuando cambia el filtro de fecha, escena o personaje; todo se exporta a CSV.

Resumen y Navegador de registros

Lo que cubre el índice, y cada línea de un solo registro como lo vio el analizador. El navegador existe para la regla de cobertura anterior: filtra a No reconocidos y estás mirando los puntos ciegos restantes del analizador, en orden.

Combate — Habilidades vs mobs

Cómo se desempeña cada habilidad contra cada objetivo, y dónde un emparejamiento supera lo que predice el resto de los datos. 65 habilidades cruzando 282 objetivos es una tabla de dos vías, y la celda interesante es la que supera tanto su fila como su columna. Tres elecciones, cada una de las cuales fue incorrecta primero:

  • Pulido mediano, no medias. Con medias, una celda excepcional eleva su propia fila de habilidad y su columna de objetivo, así que cada vecino se lee como resistente. Un hallazgo real, seis inventados.

  • Sin ponderar. Ponderar la mediana permite que cualquier celda que contenga más de la mitad de las observaciones de su fila defina su propia línea base — que es precisamente el emparejamiento muy cultivado que más quieres medir.

  • Una puerta de dispersión además de una puerta de muestra. Una habilidad usada contra solo dos objetivos no tiene línea base independiente, así que la brecha entre sus dos celdas se lee como una interacción enorme. Contra el corpus real, esta sola puerta es la diferencia entre un hallazgo defendible y ocho artefactos.

Combate — Lo que te golpea

La pregunta espejo, y el informe más nuevo: qué criaturas te atacan, con qué, por cuánto, y con qué frecuencia tus defensas lo detienen. Enfáticamente no es el informe anterior con la flecha invertida — reutilizar la maquinaria saliente habría sido incorrecto de cuatro maneras, cada una de las cuales produce un número plausible en lugar de un fallo visible.

Más de la mitad del fuego entrante aterriza en la mascota.

intentos

dirigidos al jugador

51,138

dirigidos a la mascota

64,248

Y se comportan de manera nada parecida: el 52% de los golpes dirigidos al jugador conectan sin causar nada, contra el 0.5% de los golpes dirigidos a una mascota. Agrupados, el perfil defensivo no pertenece a ninguno. Las mascotas se excluyen — y su parte se informa, porque "esto cubre el 44% de lo que te lanzaron" es algo que se le debe al lector.

La cifra obvia de mitigación omite la mayoría de la mitigación. La fórmula del informe saliente cuenta esquivados, bloqueos, paradas y golpes de refilón, y llega al 18% entrante. Pero el 52% de los ataques entrantes son conectados, sin causar nada — excluidos por esa fórmula. La cifra honesta es 66.2%. Mientras tanto, los bloqueos y resistencias están ausentes de las líneas entrantes por completo — cero de cada uno en 3.84M de líneas — así que esas columnas se omiten en lugar de mostrarse como ceros estructurales, porque una columna que siempre es cero se lee como "nunca has bloqueado nada".

Un esquivado nunca nombra lo que se esquivó. Todos los 7,120 esquivados entrantes y todos los 17,474 salientes están en el cubo sin nombre sea lo que sea que los provocó. Así que cada tasa por habilidad divide por los ataques que nombraron una habilidad, y la tasa de esquivado vive en el resumen por criatura donde es verdadera.

Y la clasificación es por daño por golpe, porque los tres ordenamientos plausibles apenas coinciden:

intentos

por golpe

por impacto

atraviesa

Cocodrilo Masivo, básico

4,310

2.1

58

4%

Razorback (T18), básico

217

23.4

461.5

5%

Vigorem Cavas (T14), Shadow Blast

309

247.9

247.9

100%

Clasifica por frecuencia y el informe se abre en un cocodrilo haciendo dos de daño. Clasifica por daño por impacto y se abre en un evento que ocurre una vez de cada veinte. Solo por golpe pliega la tasa de conexión y responde cuánto me va a costar esto.

Combate — Récords

Mejores marcas personales: el crítico más grande por habilidad, el golpe más duro recibido, cada uno trazable hasta la línea de la que provino. Este es el único informe que debe deshacer un resumen del que depende el resto de la aplicación. El daño de la mascota se acredita al dueño, lo cual es correcto para totales e incorrecto para un récord:

jugador

mascota

crítico más grande

1,843 (Chain Lightning)

6,735 (Wyvern Sting)

golpe más duro recibido

1,206

2,628

Más golpes aterrizan en la mascota que en el jugador — 64,245 contra 44,329 — así que "el golpe más duro que recibiste" es el moretón de otra persona a menos que lo verifiques. Las mejores marcas son por personaje y nunca se agrupan, los empates van al más temprano, y el daño en el tiempo se excluye: el más grande de esos en el corpus es 13,555, que supera a cada ataque, y plegarlo en silencio responde una pregunta diferente.

Mundo — Actividad de escena

A dónde fue el tiempo, y para qué era bueno cada lugar. Tres cosas que tiene que hacer bien:

  • Una tasa necesita un denominador en el que puedas confiar. Tres minutos en Arlia recolectaron una recompensa de 10,000 XP — 206,897 por hora, segundo lugar por delante de un lugar cultivado durante ochenta horas. La cifra por escena aún se muestra, junto a los minutos de los que provino, pero las clasificaciones aplican un mínimo de 30 minutos y dicen cuántas escenas eso excluyó.

  • Las muertes y las muertes son las mismas líneas leídas desde extremos opuestos. 281 líneas de muerte son 246 muertes, 22 muertes, 15 transeúntes y 2 auto-muertes. Contar filas informa una quinta parte más de muertes de las que se hicieron y oculta cada muerte.

  • El botín de cadáveres es combate; la cosecha es recolección. Tanglemire registra 743 ataques, 1,305 cosechas y ningún botín de cadáveres en absoluto. Un cubo de botín combinado lo etiqueta por el total que gana, así que un lugar de pesca con lobos sale como una zona de combate.

Mundo — Botín y Pesca

De dónde vinieron los botines y qué produce realmente cada lugar; cada captura pivotada por dónde pescaste, por el agua de la que vino, y por especie.

Artesanía — Recetas

Rates excepcionales por receta, cuánto se puede empujar una obra maestra, y cuánto costó. Los intervalos son el intervalo de puntuación de Wilson, no la aproximación normal — que pone el límite superior por encima de 1 en siete éxitos de ocho y colapsa a un punto en cero de doce. Tres más:

  • Un intento es una artesanía. Las dos líneas de finalización son alternativas, nunca ambas. El corpus delata el error de inmediato: Dark Red Dye registra 73,231 ordinarios y 73,433 excepcionales, así que tratar lo excepcional como un subconjunto de intentos produce una tasa de éxito por encima del 100%.

  • Un fallo de obra maestra nombra el objeto un paso por debajo de donde se hizo el intento. Tabulando por el número impreso inventa una curva suave de la nada.

  • La significancia y el tamaño del efecto son cantidades separadas. El intervalo decide si una receta realmente difiere de la tasa general; la tasa observada decide si difiere lo suficiente como para mencionarla. Confundirlos marcó una de tres recetas de comida agrupadas cerca del 45% y dejó a sus dos vecinas sin marcar.

Más — Progresión

Experiencia ganada y habilidades entrenadas. Las rebanadas tranquilas se mantienen — una serie construida solo a partir de días en que algo sucedió dibuja un mes como una racha ininterrumpida, exactamente lo contrario de lo que el lector abrió para descubrir.

Y los pasos no son niveles. El juego no anuncia cada nivel: Tailoring corre 44, 48, 51, 54, así que 85 anuncios cubren 117 niveles. El informe muestra pasos y el rango observado, y marca filas donde pasaron más niveles de los anunciados. "Niveles ganados" simplemente no está en el registro, y el informe lo dice en lugar de adivinar.

La trampa relacionada, en todo el corpus: las lecturas de experiencia son totales acumulados, y hay cuatro diferentes por grupo — ganada de por vida, el grupo del personaje, el grupo compartido, y su suma, escritos juntos como un bloque. Las lecturas suman 1.57 billones contra 187 millones realmente otorgados. Los premios se seleccionan positivamente por tipo, nunca como "cualquier cosa que no sea una lectura", porque esa frase admite silenciosamente cada tipo de lectura añadido más tarde.

Más — Conversaciones

El flujo de chat plano enhebrado de vuelta en intercambios. No hay ningún marcador de conversación en el registro en absoluto, así que una racha se divide dondequiera que la conversación se detuvo durante diez minutos. Dos reglas ganan su lugar: una racha sin nadie más que el jugador no es una conversación (de lo contrario, una sesión pasada anunciando en Traders llena el informe con "intercambios" unilaterales), y un mensaje sin marca de tiempo mantiene su posición en el archivo (ordenar nulos al frente abre una brecha del ancho de toda la conversación).

"Yo" se resuelve por fila contra el propio personaje del registro — un corpus con seis personajes tiene seis respuestas a quién soy yo.

Más — Economía

Mayormente notable por lo que se niega a calcular. El registro no tiene precios ni líneas de compra, así que las unidades vendidas son conocibles y los ingresos no lo son. La única cifra de oro en cualquier lugar es Recogiste N de oro., que no tiene nada que ver con tu vendedor. El informe lo dice, porque un número de oro impreso junto a una tabla de ventas se leerá como ingresos.

Lo que sí saca a la superficie es la división de pedidos permanentes — pedido cumplido contra navegado — que es lo único en los datos en lo que un vendedor puede actuar, y que salió claramente dividido en el corpus: cada materia prima 100% pedidos, cada bien refinado 100% navegado.

Más — Intercambios

Intercambios de jugador a jugador plegados de vuelta juntos. Un intercambio es una racha de líneas — abierto, cosas puestas y retiradas, cerrado — y ninguna línea individual dice qué cambió de manos. Cuatro cosas:

  • El oro es un total acumulado, no un cambio. La línea establece la nueva cifra. Un intercambio real en el corpus lleva el oro a 99,000 y de vuelta a 0 antes de completarse; sumar las líneas informa noventa y nueve mil de oro que nunca se movió.

  • Los dos lados se registran asimétricamente. El juego registra al socio añadiendo y quitando objetos, pero solo al jugador añadiendo — nunca retirando. Así que el lado del jugador es "lo que se ofreció" y puede exagerar; el lado del socio es exacto. El informe dice cuál es cuál.

  • La mayoría de los "intercambios" son contigo mismo. 64 de 106 intercambios completados son entre los propios alts del jugador, y donde ambos registros de alts están presentes, el mismo intercambio se almacena dos veces, una desde cada lado. Marcado y filtrable.

  • El nombre del socio a veces es mutilado por el juegoZealoty,,1]Zealoty. Eso está en el registro, no es algo que haga el analizador. La reparación coincide solo con esa forma duplicada exacta, porque los nombres reales contienen comas.


El sitio complementario

La aplicación puede opcionalmente iniciar sesión en un sitio web complementario y publicar cuatro conjuntos de datos: mejores marcas personales, capturas de pesca, celdas de habilidad contra objetivo, y habilidades de monstruos.

Los últimos dos son diferentes de los primeros dos de una manera que debe respetarse. Son totales acumulados, así que una re-publicación reemplaza en lugar de acumular — lo que significa que publicar siempre debe estar sin filtrar por fecha y escena, porque bajo semántica de reemplazo una rebanada filtrada no envía cifras más débiles, elimina las más completas. Y un personaje sobre el límite de celdas del servidor se omite entero en lugar de truncarse, por la misma razón.

Lo que sube son las estadísticas suficientes — conteo, Σln(1+daño), Σln(1+daño)² — en lugar del resultado ajustado, porque el pulido mediano no se agrupa entre jugadores y las sumas sí. Son aditivas, que es lo que hace posible el agrupamiento comunitario exacto y el dejar-uno-fuera en tiempo constante. (El 1 + es de carga: el inverso es exp(x) − 1, y leerlos de vuelta con exp simple está menos de un porcentaje de descuento a unos pocos cientos de daño y un tercio de descuento a tres. Plausible en todas partes y equivocado en todas partes. Es cómo se envió la primera implementación del sitio.)

Una cosa que el corpus enseñó aquí también. Una habilidad es en gran parte una propiedad de su criatura — 22 de 74 habilidades pertenecen a exactamente una, y 169 de 272 criaturas tienen dos o menos. Así que no hay modelo de dos vías para ajustar; lo que lo reemplaza compara una habilidad contra sí misma solo donde tres o más criaturas la usan, dejando-uno-fuera, así que la criatura que tiene la mayoría de las observaciones de una habilidad no puede definir su propia línea base e informarse a sí misma como ordinaria. Earth Elemental tiene 2,955 de los 3,637 golpes de Earthquake y sale a 0.08×; un grupo auto-inclusivo habría leído alrededor de 1.0 y no habría dicho nada.

La cuenta es opcional y sigue siendo opcional. Restaurar una sesión lee un archivo y no hace ninguna solicitud. El primer paquete sale de la máquina cuando haces clic en Iniciar sesión o Publicar, nunca antes. Ningún informe toma una dependencia de estar conectado, y los controles de publicación están ocultos cuando se cierra la sesión en lugar de mostrarse deshabilitados.


Privacidad

Los registros de chat contienen mensajes de otros jugadores, y ese hecho restringe el código en lugar de mencionarse en una política.

El índice almacena texto de mensaje crudo — eso es el informe de conversaciones. Vive en tu directorio de datos de la aplicación, fuera del repositorio, y nada de él se sube nunca. Ninguna carga futura debería cambiar eso sin preguntar al usuario en tantas palabras.

Lo que la publicación sí envía son nombres de personajes, nombres de habilidades y criaturas, cifras, escenas y tiempos. Uno de esos merece cuidado: el registro nunca dice si un atacante era una criatura u otro jugador, así que un nombre de atacante puede ser el de una persona real. Es por eso que la publicación muestra las filas reales una vez por conjunto de datos antes de la primera subida en lugar de solo contarlas. Subir es hacia afuera y no se puede deshacer desde aquí.

Los registros reales están en git-ignore; los accesorios de prueba están redactados a mano.


Dónde está

Funcionando de principio a fin. Trece informes, sin marcadores de posición en el carril, 522 pruebas, seis objetivos de lanzamiento. El analizador tiene el 99.91% del corpus y el 0.09% restante es visible en la aplicación en lugar de barrido.

Si hay un hilo que corre a través de todo, es que el corpus tenía razón y el razonamiento estaba equivocado, una y otra vez. Cada encabezado anterior que comienza con "tres cosas" es una lista de números que parecían correctos hasta que alguien los verificó contra tres millones de líneas de lo que realmente sucedió. Ese es todo el método: verifica el patrón contra el corpus en lugar de razonar sobre lo que el juego probablemente escribe.

Downloads