---
name: rosh-emulador-karos
description: "Emulador de servidor Karos/Rosh em D:\\RoshEmulator — como rodar, onde ficam as coisas, e o que o client NÃO tem"
metadata: 
  node_type: memory
  type: project
  originSessionId: 3cda60cc-4b3c-4cc6-9aac-a6bf2b08e5af
  modified: 2026-08-24T10:37:58.996Z
---

Projeto paralelo ao Cabal: servidor privado do Karos Online, escrito em Python, em
`D:\RoshEmulator`. Client oficial em `C:\Games\Karos`. Banco SQL Server `Rosh` por
`Trusted_Connection` (sem senha em arquivo).

Três servidores, iniciados à mão de `D:\RoshEmulator\server`, world na porta 20299:
`login_server.py`, `channel_server.py`, `world_server.py`. O stdout vai para
`server\log\world_stdout.log`, que é **sobrescrito a cada reinício** — não concluir "não
houve tal evento" só porque o log atual não mostra.

**Não reinicie o world para trocar código.** Fechar o socket derruba o client e o jogador
tem de fazer login outra vez; pior, o hook de captura morre junto com o `AMo.exe` e só
grava RECV se for injetado ANTES do jogo abrir. Em vez disso:

    type nul > D:\RoshEmulator\server\recarregar.flag
ecarregar.flag

Um vigia recarrega `entity_sim` e as tabelas de `Data/` sem tocar nas conexões (`mundo` e
`world_server` não são recarregados, é essa divisão que segura o jogador). Cada recarga
reconstrói as entidades, então os mobs voltam à âncora — salto visível, sem mais efeito.
Reinício de processo só serve para mudança no próprio `world_server.py`.

O que o client guarda: 105 tabelas `.lod` cifradas em
`ResUnpak\Interface\IE_Lod` (itens, npcs, skills, mapas, textos), lidas por
`server\lod_crypto.py`. `patch_lod_file` re-cifra preservando tabela e chave — sai
byte-diferente do original mas com plaintext idêntico, o que é esperado.

O que o client **não** guarda, e por isso só sai medindo no oficial: spawn de monstro,
HP/dano/EXP de monstro, e onde cada mob fica. O `npcInfo.lod` é só catálogo (nome,
modelo, escala) — os dois últimos dígitos do id do npc são o NÍVEL.

Dá para ter os dois clients abertos ao mesmo tempo, um no oficial e outro no nosso: o
`ServerList.ten` só é lido no arranque, então basta trocá-lo depois de o primeiro já estar
em jogo (`ServerList.ten.emulador` e `ServerList.ten.orig_backup` guardam os dois). Para
gravar só o segundo, use `tools\hook\injector_novo.exe`, que ignora os `AMo.exe` já
abertos e espera um inédito. É a forma mais barata de comparar comportamento — foi assim
que se achou que o estado 1 do byte [7] é perseguição.

Conta de teste `iago` / criar contas com `tools\criar_conta.py` (AUTO_REGISTRAR está
desligado). Nome do jogo já trocado de Karos para Axion no client (logo, título da janela
e 48 textos). Ver [[medir-nao-adivinhar]] e [[rosh-estado-artifact]].
