"""Parser do itemBase.lod -- registros de tamanho variavel.

Layout confirmado em 23/08:
    [0:4]   versao 20101118
    [4:8]   contagem (19806)
    registro: 156 bytes numericos (comeca pelo id) + 13 strings (u32 LE de tamanho + bytes)

Este modulo devolve os 156 bytes CRUS junto com as strings, pra que o
identificador de campos (campos_item.py) possa trabalhar em cima.
"""
import os
import struct
import sys

sys.path.insert(0, r"D:\RoshEmulator\server")
import lod_crypto

BASE = r"C:\Games\Karos\ResUnpak\Interface\IE_Lod"
NUM = 156
N_STR = 13


def abrir(nome, pular_zero=False):
    for suf in ("_pt", "_en", ""):
        cam = os.path.join(BASE, nome + ".lod" + suf)
        if os.path.exists(cam):
            return lod_crypto.decrypt_lod_stream(open(cam, "rb").read(), pular_zero=pular_zero)
    raise SystemExit("nao achei " + nome)


def registros():
    d = abrir("itemBase")
    versao, total = struct.unpack_from("<II", d, 0)
    assert versao == 20101118, versao
    pos = 8
    for _ in range(total):
        num = d[pos:pos + NUM]
        pos += NUM
        strs = []
        for _ in range(N_STR):
            (t,) = struct.unpack_from("<I", d, pos)
            pos += 4
            strs.append(d[pos:pos + t].rstrip(b"\x00").decode("latin-1", "replace"))
            pos += t
        yield num, strs


if __name__ == "__main__":
    n = 0
    for num, strs in registros():
        n += 1
        if n <= 3:
            print(struct.unpack_from("<I", num, 0)[0], strs[0], "|", strs[1], "|", strs[3])
    print("total lido:", n)


ATTR_FIXO = 116  # 12 bytes de cabecalho + 13 doubles


def atributos():
    """itemAttr.lod -- uma entrada por (item, nivel de refino).

    entrada: id u32, refino u32, estrela u32, 13 doubles, 2 strings (u32 len + bytes)
             doubles: [0] dano/def min  [1] dano/def max  [4] ?fixo 0.9129  [5] ?fixo 10.0
    """
    d = abrir("itemAttr")
    versao, total = struct.unpack_from("<II", d, 0)
    assert versao == 20101118, versao
    pos = 8
    for _ in range(total):
        item_id, refino, estrela = struct.unpack_from("<III", d, pos)
        vals = struct.unpack_from("<13d", d, pos + 12)
        pos += ATTR_FIXO
        strs = []
        for _ in range(2):
            (t,) = struct.unpack_from("<I", d, pos)
            pos += 4
            strs.append(d[pos:pos + t].rstrip(b"\x00").decode("latin-1", "replace"))
            pos += t
        yield item_id, refino, estrela, vals, strs
