Skip to content

Rust Generator

El generador de sobres es un binario independiente escrito en Rust. Su responsabilidad es única: dado un pool de cartas y una semilla, sortear las cartas del sobre aplicando los pesos de rareza y devolver el resultado por stdout como JSON.


Crates

Crate Uso
serde + serde_json Parsear el pool de entrada y generar el JSON de salida
rand RNG base — traits y distribuciones
rand_chacha Implementación de ChaCha8Rng con semilla fija
assert_json_diff Comparar JSONs en tests de forma legible

Interfaz

Java llama al binario vía ProcessBuilder pasando el input por stdin como JSON. El pool llega por stdin y no por argumentos de línea de comandos para evitar límites de longitud del sistema cuando el pool es grande.

Input (stdin):

{
  "seed": 8472918374,
  "slots": [
    { "rarity": "COMMON",   "count": 3 },
    { "rarity": "UNCOMMON", "count": 1 },
    { "rarity": "RARE",     "count": 1 }
  ],
  "pool": [
    { "id": "uuid-1", "rarity": "COMMON",   "stat_hp_base": 50, "stat_hp_range": 10, "stat_atk_base": 40, "stat_atk_range": 8,  "stat_def_base": 45, "stat_def_range": 5,  "stat_spd_base": 60, "stat_spd_range": 12 },
    { "id": "uuid-2", "rarity": "UNCOMMON", "stat_hp_base": 65, "stat_hp_range": 12, "stat_atk_base": 55, "stat_atk_range": 10, "stat_def_base": 50, "stat_def_range": 8,  "stat_spd_base": 70, "stat_spd_range": 10 },
    { "id": "uuid-3", "rarity": "RARE",     "stat_hp_base": 80, "stat_hp_range": 15, "stat_atk_base": 70, "stat_atk_range": 12, "stat_def_base": 65, "stat_def_range": 10, "stat_spd_base": 85, "stat_spd_range": 8  }
  ]
}

Output (stdout):

{
  "seed": 8472918374,
  "cards": [
    { "base_card_id": "uuid-1", "rarity": "COMMON",   "stat_hp": 54, "stat_atk": 43, "stat_def": 47, "stat_spd": 66 },
    { "base_card_id": "uuid-1", "rarity": "COMMON",   "stat_hp": 52, "stat_atk": 41, "stat_def": 45, "stat_spd": 68 },
    { "base_card_id": "uuid-1", "rarity": "COMMON",   "stat_hp": 55, "stat_atk": 44, "stat_def": 49, "stat_spd": 63 },
    { "base_card_id": "uuid-2", "rarity": "UNCOMMON", "stat_hp": 71, "stat_atk": 59, "stat_def": 55, "stat_spd": 76 },
    { "base_card_id": "uuid-3", "rarity": "RARE",     "stat_hp": 88, "stat_atk": 74, "stat_def": 69, "stat_spd": 89 }
  ]
}


Lógica de generación

  1. Inicializar ChaCha8Rng con el seed recibido
  2. Para cada slot del sobre:
    1. Filtrar el pool por la rareza del slot
    2. Elegir una carta aleatoria del pool filtrado
    3. Para cada stat: sortear entre stat_base y stat_base + stat_range
  3. Devolver las cartas generadas por stdout