# Estrutura da pasta Data -- proposta

Escrito em 25/08/2026, depois de analisar a pasta `Data` do servidor de Mu Online (IGCN),
1219 arquivos / 43 MB, que o usuario indicou como referencia de organizacao.

O objetivo aqui e copiar a ESTRUTURA, nao o formato. Segue tudo em `.ini`.


## Por que continuar em .ini

O Mu usa os dois formatos, e a divisao dele nao e por gosto -- e por tipo de dado:

    .ini   configuracao chapada          Common.ini, AntiHack.ini, CalcCharacter.ini
    .xml   tabelas e listas com aninhamento   MonsterList.xml, ExpSystem.xml, ItemList.xml

O que o XML compra e ANINHAMENTO: uma loja com abas que contem itens, uma missao com varias
condicoes e varias recompensas, tudo em um arquivo so. Nos hoje resolvemos isso partindo em
dois arquivos e cruzando por id -- Quest.ini + QuestReward.ini, Task.ini + TaskReward.ini.

Ainda assim a recomendacao e FICAR NO .ini, por tres motivos concretos:

1. Ja temos 23 MB escritos e um leitor pronto (`data_files.py`) com carga preguicosa, indice
   em memoria, indice composto e recarga a quente. Trocar o formato joga isso fora para
   comprar aninhamento em dois casos.
2. O `Item.ini` tem 13 MB. Um `ElementTree` desse arquivo monta a arvore inteira na memoria
   antes de devolver a primeira linha; o leitor de .ini devolve dicionarios direto. Com 100
   jogadores o que importa e o custo de carga, e ele piora.
3. O ganho do XML e menor do que parece, porque a maior parte das nossas tabelas e chapada
   mesmo (Item, Skill, Npc, Map). O aninhamento so ajudaria em Quest e Task.

Se um dia o aninhamento virar problema de verdade, o caminho barato e permitir uma coluna
com lista (`recompensas = 12:1;15:3`), nao trocar o formato de tudo.


## O que vale copiar do Mu

### 1. Subpastas por sistema, raiz so com o global

A raiz deles tem 50 arquivos; o resto esta em 16 subpastas. A nossa raiz tem 26 arquivos e
duas pastas, e vai crescer -- correio, calendario, premio e loja ainda nao entraram.

### 2. Faixa em vez de uma linha por elemento

O `ExpSystem.xml` nao lista 1400 niveis. Ele lista FAIXAS:

    <Range MinLevel="1"    MaxLevel="100"  NormalExp="10.0" />
    <Range MinLevel="1401" MaxLevel="MAX"  MajesticExp="5.0" />

Duas coisas boas: o arquivo nao cresce com o teto de nivel, e existe o sentinela `MAX` pra
faixa aberta. O nosso `Level.ini` tem uma linha por nivel e para no 100 -- do 101 ao 200 nao
ha dado nenhum e o servidor cai na formula em silencio.

Atencao a um detalhe que eles documentam e que e facil errar: a ORDEM IMPORTA. O comentario
no arquivo diz que vale a primeira faixa que casar. Se copiarmos faixas, isso precisa estar
escrito no arquivo, nao so no codigo.

### 3. Formula como DADO, escolhida por id

O `FormulaData.xml` guarda dez curvas de EXP como texto:

    <Formula ID="0" Data="(9+%d)*%d*%d*10" />

e o `Common.ini` diz qual delas usar. A formula nao esta compilada no servidor.

Isso corrige um problema que nos temos AGORA: a nossa `exp_para_subir` existe em dois
lugares. Esta descrita em `Data/Formula.ini` como expressao, e esta escrita de novo, em
Python, em `entity_sim.py:816`. Sao duas fontes de verdade para o mesmo numero -- exatamente
o defeito que ja tinha aparecido entre `db.exp_para_subir` e a tabela interna do
`entity_sim`, e que foi corrigido hoje mais cedo. O `Formula.ini` hoje e so documentacao:
mudar a expressao la nao muda nada no jogo.

### 4. Um arquivo de descricao por sistema

Cada pasta grande deles tem um `### Nome System Description ###.txt` explicando cada campo,
faixa valida e o significado de cada valor especial. Nos colocamos isso em comentario no topo
do arquivo, o que funciona enquanto o arquivo e pequeno -- num de 13 MB, ninguem le o topo.

### 5. Cabecalho igual em todo arquivo

Todo arquivo deles abre com o mesmo bloco de identificacao. Barato de fazer e ajuda a
reconhecer arquivo solto fora de lugar.

### 6. Nome de arquivo com id e nome legivel

    NPC(243)_Eo_the_Craftsman.xml

Da pra achar a loja do NPC 243 sem abrir nada. Serve pras nossas lojas e missoes quando
forem divididas por arquivo.

### 7. Aviso sobre a fragilidade do proprio leitor

O `MonsterList.xml` traz em maiuscula: "STRICTLY NO COMMENTS INSIDE TAGS". O parser deles
quebra com isso. O nosso tem uma regra igualmente pouco obvia -- comentario no fim da linha
so vale depois de DOIS espacos antes do ponto-e-virgula, porque 28 valores legitimos contem
`;` no meio. Isso precisa estar escrito onde o editor ve.


## Arvore proposta

    server/Data/
        Common.ini              config global (teto de nivel, versao, portas)
        Formula.ini             formulas por id -- passa a ser LIDO, nao so documentado
        Rule.ini
        Common/                 recarga a quente (ja existe)
            Rate.ini
            ExpModifier.ini
            Mail.ini
        Character/
            Class.ini
            ClassEvolution.ini
            ClassStartItem.ini
            Level.ini           passa pra faixa + sentinela MAX
            LevelColor.ini
            ExpPenalty.ini
            StartPoint.ini
            ReservedName.ini
        Items/
            ItemList.ini        dividido -- hoje e um Item.ini de 13 MB
            ItemOption.ini      8,9 MB, mesmo caso
            Fleta.ini
        Monsters/
            MonsterList.ini     hoje Mob.ini, com 498 bytes: praticamente vazio
            MonsterSpawn.ini    hoje NpcSpawn.ini, esvaziado a pedido
        Npcs/
            NpcList.ini         hoje Npc.ini
        Quests/
            QuestList.ini
            QuestReward.ini
        Tasks/
            TaskList.ini
            TaskReward.ini
            Attendance.ini
        Skills/
            SkillList.ini
        Maps/
            MapList.ini
        Protocol/
            Opcode.ini
            SocialAction.ini

`Item.ini` e `ItemOption.ini` sozinhos sao 22 dos 23 MB da pasta. Enquanto forem dois
arquivos unicos, qualquer edicao manual e desconfortavel e qualquer erro de sintaxe derruba
a tabela inteira. O Mu divide a pasta `Items/` em 141 arquivos.


## Ordem sugerida, do mais barato pro mais caro

1. Cabecalho padrao e o aviso da regra de comentario. Nao mexe em codigo.
2. `Formula.ini` virar fonte de verdade da `exp_para_subir`, apagando a copia do
   `entity_sim.py`. Resolve uma duplicacao real que existe hoje.
3. `Level.ini` em faixa, com sentinela `MAX`, cobrindo ate o teto de verdade.
4. Mover os arquivos pras subpastas. Mexe nos caminhos do `data_files.py`; e um passo so,
   mas precisa de teste ponta a ponta -- e o tipo de mudanca que ja quebrou procedure antes.
5. Dividir `Item.ini` e `ItemOption.ini`.

Nada disso foi executado. E proposta.
