# Zi Wei Dou Shu: розстановка зірок

**紫微斗數** будує карту не з планет, а з дванадцяти дворців і сотні з гаком зірок, розставлених за правилами від місячної дати і стражі народження. `POST /v1/ziwei/chart` рахує це повністю.

## Ендпоінти

| Ендпоінт | Кредити | Що повертає |
|---|---:|---|
| `POST /v1/ziwei/chart` | 20 | Повна карта: дворці, зірки, стадії, межі, 四化. Потребує `time` і `gender` |
| `POST /v1/ziwei/four-transformations` | 10 | 四化 за стовбуром року, чотири школи |
| `POST /v1/ziwei/twelve-palaces` | 5 | Довідник дванадцяти дворців |
| `POST /v1/ziwei/main-stars` | 5 | Довідник чотирнадцяти головних зірок |
| `POST /v1/ziwei/palace-*` | 5 | Довідник одного дворця, дев'ять шляхів |

Довідкові маршрути несуть поле `computed: false` і коштують половину тарифу. Вони віддають ту саму таблицю будь-якій даті народження, і в цьому немає нічого поганого, поки про це написано.

<Aside type="caution" title="`/ziwei/full-chart` депрекований">
Він віддає той самий словник дворців будь-кому, а його ім'я обіцяє карту. Відповідає без змін до **2027-11-26**, несе заголовки `Deprecation`, `Sunset` і `Link` на наступника. Переходьте на `/v1/ziwei/chart`: він потребує `gender` додатково до дати і години.
</Aside>

## Приклад

```bash
curl -X POST https://api.astroway.info/v1/ziwei/chart \
  -H "X-Api-Key: $ASTROWAY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"date":"2000-08-16","time":"04:00:00","gender":"male","age":25}'
```

```json
{
  "fiveElementClass": { "key": "wood3", "chinese": "木三局", "name": "Wood 3", "value": 3 },
  "soulPalace": { "index": 4, "branch": "Wu" },
  "bodyPalace": { "index": 8, "branch": "Xu" },
  "ziwei": { "index": 4, "branch": "Wu" },
  "annualLimit": { "age": 25, "index": 8, "branch": "Xu" },
  "palaces": [
    {
      "branch": "Wu",
      "pillar": "Ren-Wu",
      "palace": "destiny",
      "isSoul": true,
      "majorStars": [{ "chinese": "紫微", "name": "Purple Star", "pinyin": "Zi Wei", "kind": "major" }],
      "lifeStage": { "chinese": "死", "name": "Death", "localised": "Смерть" },
      "boshi": "伏兵",
      "decade": { "index": 0, "fromAge": 3, "toAge": 12 }
    }
  ]
}
```

Масив `palaces` несе всі дванадцять у тому самому вигляді, від 寅 до 丑.

## Що саме рахується

| Крок | Правило |
|---|---|
| 命宮 і 身宮 | Від дворця місяця назад по стражах для Життя, вперед для Тіла |
| Стовбури дворців | 五虎遁 від стовбура року |
| 五行局 | Зі стовпа дворця Життя; збігається з 納音 на всіх шістдесяти парах |
| 紫微 | Ділення дня на число 局 з позикою: чётна позика вперед, непарна назад |
| 紫微系 (6) | Зміщення −1, −3, −4, −5, −8 від 紫微 |
| 天府系 (8) | 天府 це дзеркало 紫微 навколо осі 寅-申, далі +1..+6 і **+10** для 破軍 |
| 六吉 і 六煞 | Від місяця, стражі і стовбура року, кожна зі своєю формулою |
| Тридцять одна мала зірка | Від гілки року, стовбура року, місяця, дня і стражі |
| 長生十二神 | Від 五行局, вперед для 陽男陰女 і назад інакше |
| 博士十二神 | Від 祿存, той самий напрям |
| 將前 і 歲前 十二神 | Від трійки гілки року і від самої гілки, обидва завжди вперед |
| 大限 | Від 命宮, старт у віці числа 局, крок десять років |
| 小限 | Читає стать і **не читає** інь-ян, на відміну від десятирічних |
| 四化 | За стовбуром року, позначені прямо на зірках |

## Чотири перемикачі школи

Вони в тілі запиту, а не в нашому коді, бо кожен з них зсуває карту цілком для тих народжень, яких торкається.

| Параметр | За замовчуванням | Друге значення |
|---|---|---|
| `yearDivide` | `lunar`: рік починається першим днем першого місячного місяця | `lichun`: межа з BaZi |
| `fixLeap` | `true`: високосний місяць ділиться п'ятнадцятим числом | `false`: увесь високосний рахується попереднім |
| `dayDivide` | `forward`: 23:00 належить наступному дню | `current`: дата лишається, страж позначається як 晚子時 |
| `tianmaSchool` | `year`: 天馬 від гілки року (中州派) | `month`: 天馬 від місячного місяця |
| `school` | `zhongzhou`: 四化 за корпусом 王亭之 | `quanji`, `quanshu`, `beipai` |

<Aside type="caution" title="Година народження обов'язкова">
Дворець Життя ставиться від стражі, а від нього залежить 五行局 і кожна зірка. Карта без години була б не частковою відповіддю, а дванадцятьма дворцями впевненої нісенітниці, тому запит без `time` відхиляється з 400. Це відрізняється від BaZi, де без години просто немає годинного стовпа.
</Aside>

<Aside type="note" title="Рік тут не починається з Lichun">
Це не вибір школи. 斗數 суто місячна система і на сонячні терміни не переходить, на відміну від 子平. `yearDivide=lichun` існує тільки для звірки з калькулятором, який притягнув межу з BaZi.
</Aside>

## Як це перевірено

Пришпилено до трьох опублікованих карт, а не до однієї бібліотеки, і це навмисно. Майже вся відкрита екосистема Zi Wei походить від одного проєкту: два порти плюс щонайменше один проєкт, який заявляє іншу лінію, а всередині кличе його і розбирає вивід. Тому збіг з кількома проєктами це збіг з одним.

- Дві карти відтворені повністю: усі чотирнадцять головних зірок, 五行局, дворці Життя і Тіла.
- Дванадцять стадій перевірені на третьому фікстурному векторі того ж джерела, де опубліковано очікувані дванадцять, а не на цих двох. Початки десятиліть звірені з числом 五行局, тобто з правилом, з якого виводяться, а не зі сторонньою публікацією.
- Третя карта взята з китайського навчального тексту без стосунку до тієї екосистеми і пришпилює зміщення зірок і порядок дворців самостійно.
- Мнемоніка 安紫微星 「六五四三二／酉午亥辰丑」 і опублікований пробіг 火六局 по днях 1-15 перевіряються прямо: це константи традиції, а не чиясь реалізація.

<Aside type="tip" title="Що робити, коли ваш калькулятор дає інше">
Перевіряйте не арифметику, а чотири перемикачі: межу року, високосний місяць, межу доби о 23:00 і таблицю 四化. Майже завжди розходження там.
</Aside>

## Один поширений переказ, який неправильний

火星 і 鈴星 розставляються **вперед від трійки гілки року і не читають стать** у жодній перевіреній передачі. Правило 陽男陰女順 / 陰男陽女逆, яке до них іноді приписують, належить дванадцяти стадіям 長生十二神 і десятирічним межам. Обидві теми стоять на одній сторінці в найчастіше копійованому джерелі, і, схоже, звідти й пішла плутанина.

## Мови

Назви дворців і дванадцяти стадій перекладені на 21 мову: додайте `?lang=`, і в кожному дворці з'явиться `palaceLocalised`, а в стадії поле `localised`. Назви зірок лишаються ієрогліфами з англійським перекладом поруч: усталених імен у них немає.
