{
 "_doc": "Beast Constellation / กลุ่มดาวอสูร (docs/research/DRAKITE_RESEARCH.md Option B, owner approved 2026-09-30). A layer ON TOP of classic card compounding: register a card copy in the album (consumes 1), socket registered cards into 6 star dials (6 sockets each, unlock by Base Lv), light resonance pips with the source monster's element / race, link neighbours of the same element, raise stars with duplicates or Card Dust. Mythic tier = hero crests (the old Soul Crest idea) in each dial's centre. Rules: scripts/server/constellation.gd. Balance: tools/balance/dial_sim.py (python tools/balance/sim.py --dial). The whole layer is capped at br_cap of Battle Rating; race / size % from it at race_size_cap.",
 "name": "Beast Constellation",
 "name_th": "กลุ่มดาวอสูร",
 "br_cap": 0.1,
 "race_size_cap": 20,
 "key_caps": {
  "_doc": "Per-key sanity caps (applied before the BR cap): ATK / MATK / HIT / FLEE / Max HP from the layer <= that share of the character's own value without it; each stat <= stat x its own value (at least stat_min). Keeps the layer a breadth bonus, not a build.",
  "batk": 0.07,
  "matk": 0.07,
  "hit": 0.06,
  "flee": 0.03,
  "max_hp": 0.2,
  "stat": 0.08,
  "stat_min": 1
 },
 "link_pct": 1,
 "link_cap": 5,
 "star_max": 5,
 "star_cost": [
  1,
  1,
  2,
  2,
  3
 ],
 "star_mult": 0.2,
 "awaken_share": 0.5,
 "awaken_keys": [
  "stats",
  "batk",
  "hit",
  "flee",
  "crit",
  "max_hp",
  "def",
  "mdef",
  "max_hp_rate",
  "perfect_dodge",
  "hp_recov_rate",
  "long_atk_rate",
  "aspd_rate",
  "add_race",
  "add_size",
  "add_ele",
  "sub_race",
  "sub_ele"
 ],
 "dust": {
  "_doc": "Card Dust / ผงการ์ด: salvage a spare card, +1 per Bestiary Well pull; pays for a star when a copy is missing (3x the salvage value per copy).",
  "salvage": 10,
  "salvage_high_lv": 100,
  "salvage_high_mult": 2,
  "per_copy": 30,
  "per_pull": 1,
  "empty_pool": {
   "common": 5,
   "rare": 10,
   "epic": 25
  }
 },
 "register_shards": {
  "base": 2,
  "per_lv": 0.04,
  "max": 10
 },
 "hunt": {
  "_doc": "Hunt Log: kill goals per album entry (that card's monster); each goal reached adds pct to its echo block.",
  "goals": [
   100,
   500,
   2000
  ],
  "pct": 5
 },
 "echo": {
  "_doc": "Echo block of a socketed card: E = base + source_lv / per_lv points, split by the card's slot family (key: value per point), x (1 + star_mult x stars) x (1 + hunt goals x hunt.pct %).",
  "base": 4.0,
  "per_lv": 12.0,
  "loc": {
   "weapon": {
    "batk": 0.18,
    "matk": 0.18,
    "hit": 0.05
   },
   "armor": {
    "max_hp": 4.0
   },
   "garment": {
    "max_hp": 2.5,
    "mdef": 0.03,
    "flee": 0.03
   },
   "shoes": {
    "max_hp": 2.0,
    "agi": 0.02,
    "flee": 0.02
   },
   "accessory": {
    "dex": 0.02,
    "luk": 0.02,
    "hit": 0.04,
    "crit_res": 0.15
   },
   "head": {
    "max_hp": 2.5,
    "batk": 0.09,
    "matk": 0.09
   }
  }
 },
 "rarity": {
  "_doc": "Bestiary Well tier of a card by its source monster level (MVP cards are Epic); Mythic = hero crests.",
  "common_max": 50,
  "rare_max": 100
 },
 "well": {
  "name": "Bestiary Well",
  "name_th": "บ่อดาวอสูร",
  "open": true,
  "cost1": 10,
  "cost10": 100,
  "epic_pity": 10,
  "mythic_pity": 70,
  "featured_share": 50.0,
  "wish_share": 50.0,
  "featured": "kaen"
 },
 "elements": {
  "neutral": {
   "name": "Neutral",
   "name_th": "ไร้ธาตุ",
   "color": "#d8ccb0"
  },
  "water": {
   "name": "Water",
   "name_th": "น้ำ",
   "color": "#4aa8ff"
  },
  "earth": {
   "name": "Earth",
   "name_th": "ดิน",
   "color": "#c89a58"
  },
  "fire": {
   "name": "Fire",
   "name_th": "ไฟ",
   "color": "#ff6a3a"
  },
  "wind": {
   "name": "Wind",
   "name_th": "ลม",
   "color": "#6fe0a0"
  },
  "poison": {
   "name": "Poison",
   "name_th": "พิษ",
   "color": "#b46ae8"
  },
  "holy": {
   "name": "Holy",
   "name_th": "ศักดิ์สิทธิ์",
   "color": "#ffe68a"
  },
  "shadow": {
   "name": "Shadow",
   "name_th": "มืด",
   "color": "#8a6ad0"
  },
  "ghost": {
   "name": "Ghost",
   "name_th": "วิญญาณ",
   "color": "#b8d0ff"
  },
  "undead": {
   "name": "Undead",
   "name_th": "อมตะ",
   "color": "#9aa888"
  }
 },
 "races": {
  "formless": {
   "name": "Formless",
   "name_th": "ไร้รูปร่าง",
   "color": "#a8b4c8"
  },
  "undead": {
   "name": "Undead",
   "name_th": "ซากศพ",
   "color": "#9aa888"
  },
  "brute": {
   "name": "Brute",
   "name_th": "สัตว์ป่า",
   "color": "#d89a5a"
  },
  "plant": {
   "name": "Plant",
   "name_th": "พืช",
   "color": "#7ccf6a"
  },
  "insect": {
   "name": "Insect",
   "name_th": "แมลง",
   "color": "#c8c050"
  },
  "fish": {
   "name": "Fish",
   "name_th": "สัตว์น้ำ",
   "color": "#5ac8e8"
  },
  "demon": {
   "name": "Demon",
   "name_th": "ปีศาจ",
   "color": "#d05a8a"
  },
  "demihuman": {
   "name": "Demi-Human",
   "name_th": "มนุษย์",
   "color": "#f0c8a0"
  },
  "angel": {
   "name": "Angel",
   "name_th": "เทวดา",
   "color": "#fff0b0"
  },
  "dragon": {
   "name": "Dragon",
   "name_th": "มังกร",
   "color": "#e8a040"
  }
 },
 "dials": [
  {
   "id": "stag",
   "name": "Verdant Stag",
   "name_th": "กวางพฤกษา",
   "lv": 20,
   "el": "earth",
   "color": "#7ccf6a",
   "pips": [
    "e:earth",
    "e:earth",
    "e:water",
    "r:plant",
    "r:plant",
    "r:brute"
   ],
   "res": [
    {
     "max_hp": 100
    },
    {
     "max_hp": 250,
     "vit": 1
    }
   ]
  },
  {
   "id": "fox",
   "name": "Ember Fox",
   "name_th": "จิ้งจอกอัคคี",
   "lv": 45,
   "el": "fire",
   "color": "#ff7a3a",
   "pips": [
    "e:fire",
    "e:fire",
    "e:wind",
    "r:brute",
    "r:brute",
    "r:demon"
   ],
   "res": [
    {
     "batk": 4,
     "matk": 4
    },
    {
     "batk": 9,
     "matk": 9,
     "max_hp": 150
    }
   ]
  },
  {
   "id": "owl",
   "name": "Moon Owl",
   "name_th": "นกฮูกจันทรา",
   "lv": 70,
   "el": "shadow",
   "color": "#9a7ae8",
   "pips": [
    "e:shadow",
    "e:shadow",
    "e:undead",
    "r:demihuman",
    "r:demihuman",
    "r:formless"
   ],
   "res": [
    {
     "flee": 1
    },
    {
     "flee": 3,
     "crit_res": 6
    }
   ]
  },
  {
   "id": "serpent",
   "name": "Tide Serpent",
   "name_th": "อสรพิษวารี",
   "lv": 100,
   "el": "water",
   "color": "#4aa8ff",
   "pips": [
    "e:water",
    "e:water",
    "e:water",
    "r:fish",
    "r:fish",
    "r:formless"
   ],
   "res": [
    {
     "mdef": 2,
     "hp_recov_rate": 5
    },
    {
     "max_hp": 500,
     "mdef": 4,
     "hp_recov_rate": 10
    }
   ]
  },
  {
   "id": "roc",
   "name": "Storm Roc",
   "name_th": "ปักษาอัสนี",
   "lv": 130,
   "el": "wind",
   "color": "#6fe0c8",
   "pips": [
    "e:wind",
    "e:wind",
    "e:earth",
    "r:dragon",
    "r:insect",
    "r:plant"
   ],
   "res": [
    {
     "hit": 3
    },
    {
     "hit": 6,
     "max_hp": 400
    }
   ]
  },
  {
   "id": "drake",
   "name": "Ashen Drake",
   "name_th": "มังกรเถ้าถ่าน",
   "lv": 160,
   "el": "fire",
   "color": "#ffb347",
   "pips": [
    "e:fire",
    "e:fire",
    "e:undead",
    "e:undead",
    "r:dragon",
    "r:demon"
   ],
   "res": [
    {
     "batk": 8,
     "matk": 8
    },
    {
     "batk": 16,
     "matk": 16,
     "crit_dmg": 6
    }
   ]
  }
 ],
 "milestones": [
  {
   "n": 5,
   "bonus": {
    "max_hp": 40
   }
  },
  {
   "n": 10,
   "bonus": {
    "max_hp": 80
   }
  },
  {
   "n": 20,
   "bonus": {
    "batk": 3,
    "matk": 3
   }
  },
  {
   "n": 40,
   "bonus": {
    "max_hp_rate": 1
   }
  },
  {
   "n": 80,
   "bonus": {
    "max_hp_rate": 1,
    "crit_res": 5
   }
  },
  {
   "n": 120,
   "bonus": {
    "batk": 5,
    "matk": 5,
    "max_hp_rate": 1
   }
  },
  {
   "n": 160,
   "bonus": {
    "batk": 5,
    "matk": 5,
    "max_hp_rate": 1,
    "crit_res": 5
   }
  }
 ],
 "crest_theme_mult": 1.25,
 "crest_dupe_shards": 50,
 "crests": {
  "_doc": "Hero crests (Mythic tier, the Soul Crest idea merged in): one sits in a dial's centre medallion; x crest_theme_mult when its element is the dial's theme element. Art hook: game/assets/ui/constellation/crest_<id>.png (painted art later; a drawn placeholder until then).",
  "sylwen": {
   "name": "Sylwen, Warden of the Green",
   "name_th": "ซิลเวน ผู้พิทักษ์พงไพร",
   "el": "earth",
   "color": "#7ccf6a",
   "bonus": {
    "vit": 3,
    "max_hp": 450,
    "def": 1
   },
   "lore": "A ranger who talks to stags and never loses a trail.",
   "lore_th": "พรานผู้คุยกับกวางได้ และไม่เคยหลงรอย"
  },
  "kaen": {
   "name": "Kaen, Ember Duelist",
   "name_th": "เคน นักดาบเปลวเพลิง",
   "el": "fire",
   "color": "#ff7a3a",
   "bonus": {
    "str": 3,
    "batk": 12
   },
   "lore": "Fights with a blade that remembers every spark.",
   "lore_th": "ต่อสู้ด้วยดาบที่จดจำทุกประกายไฟ"
  },
  "noctis": {
   "name": "Noctis, Moonlit Seer",
   "name_th": "น็อกทิส ผู้หยั่งรู้แสงจันทร์",
   "el": "shadow",
   "color": "#9a7ae8",
   "bonus": {
    "int": 3,
    "matk": 12,
    "mdef": 3
   },
   "lore": "Reads the night sky like an open book.",
   "lore_th": "อ่านท้องฟ้ายามราตรีได้ดั่งหนังสือที่เปิดไว้"
  },
  "marisol": {
   "name": "Marisol, Tide Priestess",
   "name_th": "มาริโซล นักบวชแห่งกระแสน้ำ",
   "el": "water",
   "color": "#4aa8ff",
   "bonus": {
    "int": 2,
    "max_hp": 400,
    "mdef": 3,
    "hp_recov_rate": 10
   },
   "lore": "Her hymns calm storms and wake sleeping reefs.",
   "lore_th": "บทเพลงของนางสงบพายุ และปลุกแนวปะการังที่หลับใหล"
  },
  "aerin": {
   "name": "Aerin, Storm Ranger",
   "name_th": "แอริน พรานแห่งพายุ",
   "el": "wind",
   "color": "#6fe0c8",
   "bonus": {
    "dex": 2,
    "hit": 6,
    "max_hp": 300
   },
   "lore": "Her arrows ride the wind before it blows.",
   "lore_th": "ลูกธนูของนางขี่ลมไปก่อนที่ลมจะพัด"
  },
  "vargr": {
   "name": "Vargr, Cinder Knight",
   "name_th": "วาร์เกอร์ อัศวินเถ้าถ่าน",
   "el": "undead",
   "color": "#ffb347",
   "bonus": {
    "str": 2,
    "vit": 2,
    "batk": 10,
    "crit_dmg": 5
   },
   "lore": "Rose from the ashes and swore to guard the living.",
   "lore_th": "ฟื้นจากกองเถ้า แล้วสาบานว่าจะปกป้องผู้ที่ยังมีชีวิต"
  }
 },
 "src_override": {
  "_doc": "Cards that no monster drops (quest rewards): their source for the echo block / pips.",
  "bone_miner_card": {
   "mon": "",
   "lv": 12,
   "element": "undead",
   "race": "undead",
   "size": "medium"
  },
  "thorn_frog_card": {
   "mon": "",
   "lv": 8,
   "element": "water",
   "race": "fish",
   "size": "small"
  }
 },
 "stat_names": {
  "str": [
   "STR",
   "STR"
  ],
  "agi": [
   "AGI",
   "AGI"
  ],
  "vit": [
   "VIT",
   "VIT"
  ],
  "int": [
   "INT",
   "INT"
  ],
  "dex": [
   "DEX",
   "DEX"
  ],
  "luk": [
   "LUK",
   "LUK"
  ],
  "batk": [
   "ATK",
   "ATK"
  ],
  "matk": [
   "MATK",
   "MATK"
  ],
  "hit": [
   "HIT",
   "HIT"
  ],
  "flee": [
   "FLEE",
   "FLEE"
  ],
  "crit": [
   "CRIT",
   "คริ"
  ],
  "max_hp": [
   "Max HP",
   "HP สูงสุด"
  ],
  "def": [
   "DEF",
   "DEF"
  ],
  "mdef": [
   "MDEF",
   "MDEF"
  ],
  "max_hp_rate": [
   "Max HP %",
   "HP สูงสุด %"
  ],
  "perfect_dodge": [
   "Perfect Dodge",
   "หลบสมบูรณ์"
  ],
  "hp_recov_rate": [
   "HP Regen %",
   "ฟื้น HP %"
  ],
  "long_atk_rate": [
   "Ranged dmg %",
   "ดาเมจระยะไกล %"
  ],
  "aspd_rate": [
   "ASPD %",
   "ASPD %"
  ],
  "crit_dmg": [
   "CRIT DMG",
   "คริดาเมจ"
  ],
  "crit_res": [
   "CRIT RES",
   "ต้านคริ"
  ]
 }
}
