mingpan 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +53 -7
  2. package/dist/core/bazi/types.d.ts +0 -1
  3. package/dist/core/bazi/types.d.ts.map +1 -1
  4. package/dist/index.js +398 -164
  5. package/dist/index.js.map +1 -1
  6. package/dist/output/daliurenTextRenderer.d.ts +23 -0
  7. package/dist/output/daliurenTextRenderer.d.ts.map +1 -0
  8. package/dist/output/daliurenTextRenderer.js +109 -0
  9. package/dist/output/daliurenTextRenderer.js.map +1 -0
  10. package/dist/output/liuyaoTextRenderer.d.ts +12 -0
  11. package/dist/output/liuyaoTextRenderer.d.ts.map +1 -0
  12. package/dist/output/liuyaoTextRenderer.js +148 -0
  13. package/dist/output/liuyaoTextRenderer.js.map +1 -0
  14. package/dist/output/meihuaTextRenderer.d.ts +12 -0
  15. package/dist/output/meihuaTextRenderer.d.ts.map +1 -0
  16. package/dist/output/meihuaTextRenderer.js +53 -0
  17. package/dist/output/meihuaTextRenderer.js.map +1 -0
  18. package/dist/services/bazi/types.d.ts +0 -2
  19. package/dist/services/bazi/types.d.ts.map +1 -1
  20. package/dist/services/bazi/types.js.map +1 -1
  21. package/dist/services/daliuren/DaliurenService.d.ts +24 -0
  22. package/dist/services/daliuren/DaliurenService.d.ts.map +1 -0
  23. package/dist/services/daliuren/DaliurenService.js +67 -0
  24. package/dist/services/daliuren/DaliurenService.js.map +1 -0
  25. package/dist/services/daliuren/calculators/SanChuanCalculator.d.ts +87 -0
  26. package/dist/services/daliuren/calculators/SanChuanCalculator.d.ts.map +1 -0
  27. package/dist/services/daliuren/calculators/SanChuanCalculator.js +443 -0
  28. package/dist/services/daliuren/calculators/SanChuanCalculator.js.map +1 -0
  29. package/dist/services/daliuren/calculators/ShenShaCalculator.d.ts +33 -0
  30. package/dist/services/daliuren/calculators/ShenShaCalculator.d.ts.map +1 -0
  31. package/dist/services/daliuren/calculators/ShenShaCalculator.js +92 -0
  32. package/dist/services/daliuren/calculators/ShenShaCalculator.js.map +1 -0
  33. package/dist/services/daliuren/calculators/SiKeCalculator.d.ts +35 -0
  34. package/dist/services/daliuren/calculators/SiKeCalculator.d.ts.map +1 -0
  35. package/dist/services/daliuren/calculators/SiKeCalculator.js +121 -0
  36. package/dist/services/daliuren/calculators/SiKeCalculator.js.map +1 -0
  37. package/dist/services/daliuren/calculators/TianDiPanCalculator.d.ts +41 -0
  38. package/dist/services/daliuren/calculators/TianDiPanCalculator.d.ts.map +1 -0
  39. package/dist/services/daliuren/calculators/TianDiPanCalculator.js +138 -0
  40. package/dist/services/daliuren/calculators/TianDiPanCalculator.js.map +1 -0
  41. package/dist/services/daliuren/data/constants.d.ts +62 -0
  42. package/dist/services/daliuren/data/constants.d.ts.map +1 -0
  43. package/dist/services/daliuren/data/constants.js +240 -0
  44. package/dist/services/daliuren/data/constants.js.map +1 -0
  45. package/dist/services/daliuren/index.d.ts +11 -0
  46. package/dist/services/daliuren/index.d.ts.map +1 -0
  47. package/dist/services/daliuren/index.js +33 -0
  48. package/dist/services/daliuren/index.js.map +1 -0
  49. package/dist/services/daliuren/types.d.ts +152 -0
  50. package/dist/services/daliuren/types.d.ts.map +1 -0
  51. package/dist/services/daliuren/types.js +17 -0
  52. package/dist/services/daliuren/types.js.map +1 -0
  53. package/dist/services/liuyao/LiuyaoService.d.ts +37 -0
  54. package/dist/services/liuyao/LiuyaoService.d.ts.map +1 -0
  55. package/dist/services/liuyao/LiuyaoService.js +214 -0
  56. package/dist/services/liuyao/LiuyaoService.js.map +1 -0
  57. package/dist/services/liuyao/calculators/FushenCalculator.d.ts +40 -0
  58. package/dist/services/liuyao/calculators/FushenCalculator.d.ts.map +1 -0
  59. package/dist/services/liuyao/calculators/FushenCalculator.js +124 -0
  60. package/dist/services/liuyao/calculators/FushenCalculator.js.map +1 -0
  61. package/dist/services/liuyao/calculators/JintuishenCalculator.d.ts +37 -0
  62. package/dist/services/liuyao/calculators/JintuishenCalculator.d.ts.map +1 -0
  63. package/dist/services/liuyao/calculators/JintuishenCalculator.js +86 -0
  64. package/dist/services/liuyao/calculators/JintuishenCalculator.js.map +1 -0
  65. package/dist/services/liuyao/calculators/LiuqinCalculator.d.ts +24 -0
  66. package/dist/services/liuyao/calculators/LiuqinCalculator.d.ts.map +1 -0
  67. package/dist/services/liuyao/calculators/LiuqinCalculator.js +75 -0
  68. package/dist/services/liuyao/calculators/LiuqinCalculator.js.map +1 -0
  69. package/dist/services/liuyao/calculators/LiushenCalculator.d.ts +29 -0
  70. package/dist/services/liuyao/calculators/LiushenCalculator.d.ts.map +1 -0
  71. package/dist/services/liuyao/calculators/LiushenCalculator.js +58 -0
  72. package/dist/services/liuyao/calculators/LiushenCalculator.js.map +1 -0
  73. package/dist/services/liuyao/calculators/NajiaCalculator.d.ts +55 -0
  74. package/dist/services/liuyao/calculators/NajiaCalculator.d.ts.map +1 -0
  75. package/dist/services/liuyao/calculators/NajiaCalculator.js +87 -0
  76. package/dist/services/liuyao/calculators/NajiaCalculator.js.map +1 -0
  77. package/dist/services/liuyao/calculators/WangshuaiCalculator.d.ts +43 -0
  78. package/dist/services/liuyao/calculators/WangshuaiCalculator.d.ts.map +1 -0
  79. package/dist/services/liuyao/calculators/WangshuaiCalculator.js +100 -0
  80. package/dist/services/liuyao/calculators/WangshuaiCalculator.js.map +1 -0
  81. package/dist/services/liuyao/calculators/XunkongCalculator.d.ts +30 -0
  82. package/dist/services/liuyao/calculators/XunkongCalculator.d.ts.map +1 -0
  83. package/dist/services/liuyao/calculators/XunkongCalculator.js +58 -0
  84. package/dist/services/liuyao/calculators/XunkongCalculator.js.map +1 -0
  85. package/dist/services/liuyao/data/guagong.d.ts +94 -0
  86. package/dist/services/liuyao/data/guagong.d.ts.map +1 -0
  87. package/dist/services/liuyao/data/guagong.js +317 -0
  88. package/dist/services/liuyao/data/guagong.js.map +1 -0
  89. package/dist/services/liuyao/index.d.ts +13 -0
  90. package/dist/services/liuyao/index.d.ts.map +1 -0
  91. package/dist/services/liuyao/index.js +29 -0
  92. package/dist/services/liuyao/index.js.map +1 -0
  93. package/dist/services/liuyao/types.d.ts +154 -0
  94. package/dist/services/liuyao/types.d.ts.map +1 -0
  95. package/dist/services/liuyao/types.js +11 -0
  96. package/dist/services/liuyao/types.js.map +1 -0
  97. package/dist/services/meihua/MeihuaService.d.ts +32 -0
  98. package/dist/services/meihua/MeihuaService.d.ts.map +1 -0
  99. package/dist/services/meihua/MeihuaService.js +176 -0
  100. package/dist/services/meihua/MeihuaService.js.map +1 -0
  101. package/dist/services/meihua/calculators/BianguaCalculator.d.ts +21 -0
  102. package/dist/services/meihua/calculators/BianguaCalculator.d.ts.map +1 -0
  103. package/dist/services/meihua/calculators/BianguaCalculator.js +46 -0
  104. package/dist/services/meihua/calculators/BianguaCalculator.js.map +1 -0
  105. package/dist/services/meihua/calculators/HuguaCalculator.d.ts +22 -0
  106. package/dist/services/meihua/calculators/HuguaCalculator.d.ts.map +1 -0
  107. package/dist/services/meihua/calculators/HuguaCalculator.js +46 -0
  108. package/dist/services/meihua/calculators/HuguaCalculator.js.map +1 -0
  109. package/dist/services/meihua/calculators/QiguaCalculator.d.ts +40 -0
  110. package/dist/services/meihua/calculators/QiguaCalculator.d.ts.map +1 -0
  111. package/dist/services/meihua/calculators/QiguaCalculator.js +105 -0
  112. package/dist/services/meihua/calculators/QiguaCalculator.js.map +1 -0
  113. package/dist/services/meihua/calculators/TiyongCalculator.d.ts +34 -0
  114. package/dist/services/meihua/calculators/TiyongCalculator.d.ts.map +1 -0
  115. package/dist/services/meihua/calculators/TiyongCalculator.js +105 -0
  116. package/dist/services/meihua/calculators/TiyongCalculator.js.map +1 -0
  117. package/dist/services/meihua/data/bagua.d.ts +19 -0
  118. package/dist/services/meihua/data/bagua.d.ts.map +1 -0
  119. package/dist/services/meihua/data/bagua.js +81 -0
  120. package/dist/services/meihua/data/bagua.js.map +1 -0
  121. package/dist/services/meihua/index.d.ts +11 -0
  122. package/dist/services/meihua/index.d.ts.map +1 -0
  123. package/dist/services/meihua/index.js +27 -0
  124. package/dist/services/meihua/index.js.map +1 -0
  125. package/dist/services/meihua/types.d.ts +95 -0
  126. package/dist/services/meihua/types.d.ts.map +1 -0
  127. package/dist/services/meihua/types.js +6 -0
  128. package/dist/services/meihua/types.js.map +1 -0
  129. package/dist/shared/types.d.ts +0 -1
  130. package/dist/shared/types.d.ts.map +1 -1
  131. package/dist/utils/timeNormalization.d.ts +48 -0
  132. package/dist/utils/timeNormalization.d.ts.map +1 -0
  133. package/dist/utils/timeNormalization.js +69 -0
  134. package/dist/utils/timeNormalization.js.map +1 -0
  135. package/package.json +1 -1
@@ -0,0 +1,443 @@
1
+ "use strict";
2
+ /**
3
+ * 三傳計算器
4
+ *
5
+ * 三傳是大六壬的核心,由四課通過九宗門推演:
6
+ *
7
+ * 九宗門(取初傳的方法):
8
+ * 1. 賊尅:有一個下賊上或上尅下,取之為初傳
9
+ * 2. 比用:有多個賊尅,取與日干陰陽相同者
10
+ * 3. 涉害:比用不能決,看涉害深淺
11
+ * 4. 遙尅:四課無賊尅,看遙尅
12
+ * 5. 昴星:無賊尅無遙尅,陽日取酉上神,陰日取從魁(酉)
13
+ * 6. 別責:昴星不能用,陽日取日干合神,陰日取日支三合
14
+ * 7. 八專:日干支同位,特殊處理
15
+ * 8. 伏吟:月將與時辰相同
16
+ * 9. 返吟:天地盤對沖
17
+ *
18
+ * 中傳、末傳:初傳的天盤地支為中傳,中傳的天盤地支為末傳
19
+ *
20
+ * 特殊情況:
21
+ * - 返吟八專(絕嗣):日干支同位 + 四課全是下賊上
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.SanChuanCalculator = void 0;
25
+ const SiKeCalculator_1 = require("./SiKeCalculator");
26
+ const constants_1 = require("../data/constants");
27
+ class SanChuanCalculator {
28
+ /**
29
+ * 計算三傳
30
+ */
31
+ static calculate(siKe, tianDiPan, dayGanZhi, hourZhi) {
32
+ const { diToTian, diToJiang, yueJiang } = tianDiPan;
33
+ const dayGan = dayGanZhi[0];
34
+ const dayZhi = dayGanZhi[1];
35
+ // 分析四課關係
36
+ const stats = SiKeCalculator_1.SiKeCalculator.analyzeRelations(siKe);
37
+ // 判斷特殊情況
38
+ const isFuYin = yueJiang === hourZhi; // 伏吟
39
+ const isFanYin = this.checkFanYin(tianDiPan); // 返吟
40
+ const isBaZhuan = constants_1.BA_ZHUAN_DAYS.includes(dayGanZhi); // 八專
41
+ const isGanZhiSamePos = constants_1.GAN_ZHI_SAME_POSITION.includes(dayGanZhi);
42
+ // 確定初傳和格局
43
+ let chuChuanZhi;
44
+ let geJu;
45
+ let geJuDetail;
46
+ // 特殊情況:返吟八專(絕嗣)
47
+ // 日干支同位 + 四課全是下賊上 -> 返吟·絕嗣
48
+ const isFanYinBaZhuan = isGanZhiSamePos && stats.xiaZeiShang === 4;
49
+ // 九宗門判斷
50
+ if (isFanYin || isFanYinBaZhuan) {
51
+ // 返吟課(包括返吟八專)
52
+ const result = this.handleFanYin(siKe, tianDiPan, dayGan, dayZhi, stats, isFanYinBaZhuan);
53
+ chuChuanZhi = result.chuChuan;
54
+ geJu = '返吟';
55
+ geJuDetail = result.detail;
56
+ }
57
+ else if (isFuYin) {
58
+ // 伏吟課
59
+ const result = this.handleFuYin(siKe, tianDiPan, dayGan, dayZhi, stats);
60
+ chuChuanZhi = result.chuChuan;
61
+ geJu = '伏吟';
62
+ geJuDetail = result.detail;
63
+ }
64
+ else if (isBaZhuan && stats.shangKeXia === 0 && stats.xiaZeiShang === 0) {
65
+ // 八專課
66
+ const result = this.handleBaZhuan(siKe, tianDiPan, dayGan, dayZhi);
67
+ chuChuanZhi = result.chuChuan;
68
+ geJu = '八專';
69
+ geJuDetail = result.detail;
70
+ }
71
+ else if (stats.xiaZeiShang === 1 && stats.shangKeXia === 0) {
72
+ // 賊尅(重審):只有一個下賊上
73
+ const ke = siKe.list.find(k => k.relation === '下賊上');
74
+ chuChuanZhi = ke.shangShen;
75
+ geJu = '賊尅';
76
+ geJuDetail = '重審';
77
+ }
78
+ else if (stats.shangKeXia === 1 && stats.xiaZeiShang === 0) {
79
+ // 賊尅(元首):只有一個上尅下
80
+ const ke = siKe.list.find(k => k.relation === '上尅下');
81
+ chuChuanZhi = ke.shangShen;
82
+ geJu = '賊尅';
83
+ geJuDetail = '元首';
84
+ }
85
+ else if (stats.xiaZeiShang >= 1) {
86
+ // 有下賊上,優先取下賊上
87
+ const result = this.handleMultipleZeiKe(siKe, tianDiPan, dayGan, dayZhi, '下賊上');
88
+ chuChuanZhi = result.chuChuan;
89
+ geJu = result.geJu;
90
+ geJuDetail = result.detail;
91
+ }
92
+ else if (stats.shangKeXia >= 2) {
93
+ // 多個上尅下
94
+ const result = this.handleMultipleZeiKe(siKe, tianDiPan, dayGan, dayZhi, '上尅下');
95
+ chuChuanZhi = result.chuChuan;
96
+ geJu = result.geJu;
97
+ geJuDetail = result.detail;
98
+ }
99
+ else if (stats.shangKeXia === 0 && stats.xiaZeiShang === 0) {
100
+ // 無賊尅,嘗試遙尅、昴星、別責
101
+ const result = this.handleNoZeiKe(siKe, tianDiPan, dayGan, dayZhi);
102
+ chuChuanZhi = result.chuChuan;
103
+ geJu = result.geJu;
104
+ geJuDetail = result.detail;
105
+ }
106
+ else {
107
+ // 默認取第一課上神
108
+ chuChuanZhi = siKe.list[0].shangShen;
109
+ geJu = '賊尅';
110
+ geJuDetail = '元首';
111
+ }
112
+ // 計算中傳、末傳
113
+ let zhongChuanZhi;
114
+ let moChuanZhi;
115
+ if (isFanYin) {
116
+ // 返吟課:中傳以初沖,末傳用中沖
117
+ zhongChuanZhi = constants_1.ZHI_CHONG[chuChuanZhi];
118
+ moChuanZhi = constants_1.ZHI_CHONG[zhongChuanZhi];
119
+ }
120
+ else {
121
+ // 普通課:用天盤推演
122
+ zhongChuanZhi = diToTian[chuChuanZhi];
123
+ moChuanZhi = diToTian[zhongChuanZhi];
124
+ }
125
+ // 構建三傳信息
126
+ const chuChuan = this.buildChuanInfo('初傳', chuChuanZhi, diToJiang, dayGan, dayGanZhi);
127
+ const zhongChuan = this.buildChuanInfo('中傳', zhongChuanZhi, diToJiang, dayGan, dayGanZhi);
128
+ const moChuan = this.buildChuanInfo('末傳', moChuanZhi, diToJiang, dayGan, dayGanZhi);
129
+ return {
130
+ chuChuan,
131
+ zhongChuan,
132
+ moChuan,
133
+ geJu,
134
+ geJuDetail,
135
+ };
136
+ }
137
+ /**
138
+ * 構建傳信息
139
+ */
140
+ static buildChuanInfo(position, diZhi, diToJiang, dayGan, dayGanZhi) {
141
+ // 計算六親
142
+ const dayWuXing = constants_1.GAN_WUXING[dayGan];
143
+ const chuanWuXing = constants_1.ZHI_WUXING[diZhi];
144
+ const relationKey = dayWuXing + chuanWuXing;
145
+ const relation = constants_1.WUXING_RELATION[relationKey] || '比和';
146
+ const liuQin = constants_1.LIUQIN_MAP[relation] || '兄弟';
147
+ // 計算旬空
148
+ const xunKong = this.getXunKong(dayGanZhi, diZhi);
149
+ return {
150
+ position,
151
+ diZhi,
152
+ tianJiang: diToJiang[diZhi],
153
+ liuQin,
154
+ xunKong,
155
+ };
156
+ }
157
+ /**
158
+ * 獲取旬空
159
+ */
160
+ static getXunKong(dayGanZhi, diZhi) {
161
+ // 找到日干支所在的旬
162
+ const dayIndex = constants_1.JIA_ZI_60.indexOf(dayGanZhi);
163
+ const xunStart = Math.floor(dayIndex / 10) * 10;
164
+ const xunHead = constants_1.JIA_ZI_60[xunStart];
165
+ const kongPair = constants_1.XUN_KONG[xunHead];
166
+ if (kongPair && kongPair.includes(diZhi)) {
167
+ return constants_1.TIAN_GAN[constants_1.DI_ZHI.indexOf(diZhi) % 10] || diZhi;
168
+ }
169
+ return null;
170
+ }
171
+ /**
172
+ * 檢查是否返吟
173
+ */
174
+ static checkFanYin(tianDiPan) {
175
+ // 天地盤對沖:每個地支上的天盤地支都是其對沖
176
+ let chongCount = 0;
177
+ for (let i = 0; i < 12; i++) {
178
+ const diZhi = constants_1.DI_ZHI[i];
179
+ const tianZhi = tianDiPan.diToTian[diZhi];
180
+ if (constants_1.ZHI_CHONG[diZhi] === tianZhi) {
181
+ chongCount++;
182
+ }
183
+ }
184
+ return chongCount >= 6; // 至少一半對沖
185
+ }
186
+ /**
187
+ * 處理多個賊尅
188
+ */
189
+ static handleMultipleZeiKe(siKe, tianDiPan, dayGan, dayZhi, targetRelation) {
190
+ const matchingKe = siKe.list.filter(k => k.relation === targetRelation);
191
+ if (matchingKe.length === 1) {
192
+ return {
193
+ chuChuan: matchingKe[0].shangShen,
194
+ geJu: '賊尅',
195
+ detail: targetRelation === '下賊上' ? '重審' : '元首',
196
+ };
197
+ }
198
+ // 比用:取與日干陰陽相同者
199
+ const dayGanYinYang = this.getYinYang(dayGan);
200
+ const sameYinYangKe = matchingKe.filter(k => this.getYinYang(k.shangShen) === dayGanYinYang);
201
+ if (sameYinYangKe.length === 1) {
202
+ return {
203
+ chuChuan: sameYinYangKe[0].shangShen,
204
+ geJu: '比用',
205
+ detail: '知一',
206
+ };
207
+ }
208
+ // 涉害:看涉害深淺
209
+ // 從上神的地盤位置數到上神本身,計算經過的尅數
210
+ const candidates = sameYinYangKe.length > 0 ? sameYinYangKe : matchingKe;
211
+ const sheHaiResults = candidates.map(ke => {
212
+ const depth = this.calculateSheHaiDepth(ke.shangShen, ke.xiaShen, tianDiPan);
213
+ return { ke, depth };
214
+ });
215
+ // 取涉害最深者
216
+ sheHaiResults.sort((a, b) => b.depth - a.depth);
217
+ // 確定細分格局
218
+ let detail = '涉害';
219
+ if (sheHaiResults.length >= 2 && sheHaiResults[0].depth === sheHaiResults[1].depth) {
220
+ // 涉害相同,取先見者(課序靠前)
221
+ detail = '察微';
222
+ }
223
+ else {
224
+ detail = '見機';
225
+ }
226
+ return {
227
+ chuChuan: sheHaiResults[0].ke.shangShen,
228
+ geJu: '涉害',
229
+ detail,
230
+ };
231
+ }
232
+ /**
233
+ * 計算涉害深度
234
+ * 從上神的地盤位置開始,逆數到上神本身,計算經過的尅數
235
+ *
236
+ * 涉害深淺算法:
237
+ * 1. 找到上神在地盤的位置(即上神本身的地支)
238
+ * 2. 從該位置逆時針數到上神,計算途中被上神所尅的地支數量
239
+ */
240
+ static calculateSheHaiDepth(shangShen, xiaShen, tianDiPan) {
241
+ // 上神的五行
242
+ const shangWuXing = constants_1.ZHI_WUXING[shangShen];
243
+ // 從上神的地盤位置(即上神本身)開始,逆數到上神在天盤的位置
244
+ // 實際上是從 xiaShen(下神,即上神所臨的地盤位置)逆數到 shangShen
245
+ const startIndex = constants_1.DI_ZHI.indexOf(xiaShen);
246
+ const endIndex = constants_1.DI_ZHI.indexOf(shangShen);
247
+ let count = 0;
248
+ let currentIndex = startIndex;
249
+ // 逆時針數(從地盤位置數到上神)
250
+ while (currentIndex !== endIndex) {
251
+ const currentZhi = constants_1.DI_ZHI[currentIndex];
252
+ const currentWuXing = constants_1.ZHI_WUXING[currentZhi];
253
+ // 檢查上神是否尅當前地支
254
+ const relationKey = shangWuXing + currentWuXing;
255
+ if (constants_1.WUXING_RELATION[relationKey] === '尅') {
256
+ count++;
257
+ }
258
+ // 逆時針移動
259
+ currentIndex = (currentIndex - 1 + 12) % 12;
260
+ }
261
+ return count;
262
+ }
263
+ /**
264
+ * 處理無賊尅情況
265
+ */
266
+ static handleNoZeiKe(siKe, tianDiPan, dayGan, dayZhi) {
267
+ const dayGanYinYang = this.getYinYang(dayGan);
268
+ // 遙尅:四課上神與日干有尅的關係
269
+ const dayWuXing = constants_1.GAN_WUXING[dayGan];
270
+ for (const ke of siKe.list) {
271
+ const keWuXing = constants_1.ZHI_WUXING[ke.shangShen];
272
+ const relation = constants_1.WUXING_RELATION[keWuXing + dayWuXing];
273
+ if (relation === '尅') {
274
+ return {
275
+ chuChuan: ke.shangShen,
276
+ geJu: '遙尅',
277
+ detail: '蒿矢',
278
+ };
279
+ }
280
+ if (relation === '被尅') {
281
+ return {
282
+ chuChuan: ke.shangShen,
283
+ geJu: '遙尅',
284
+ detail: '彈射',
285
+ };
286
+ }
287
+ }
288
+ // 昴星:陽日取酉上神,陰日取從魁
289
+ if (dayGanYinYang === '陽') {
290
+ return {
291
+ chuChuan: tianDiPan.diToTian['酉'],
292
+ geJu: '昴星',
293
+ detail: '虎視',
294
+ };
295
+ }
296
+ else {
297
+ return {
298
+ chuChuan: tianDiPan.diToTian['酉'],
299
+ geJu: '昴星',
300
+ detail: '冬蛇掩目',
301
+ };
302
+ }
303
+ }
304
+ /**
305
+ * 處理返吟
306
+ *
307
+ * 返吟課取三傳規則:
308
+ * 1. 有賊尅用賊尅,中傳以初沖,末傳用中沖
309
+ * 2. 無賊尅,取驛馬為初傳,支上神為中傳,干上神為末傳
310
+ *
311
+ * 返吟八專(絕嗣):
312
+ * - 日干支同位 + 四課全是下賊上
313
+ * - 取驛馬為初傳
314
+ */
315
+ static handleFanYin(siKe, tianDiPan, dayGan, dayZhi, stats, isFanYinBaZhuan = false) {
316
+ // 返吟八專(絕嗣):直接取驛馬
317
+ if (isFanYinBaZhuan) {
318
+ const yiMa = this.getYiMa(dayZhi);
319
+ return {
320
+ chuChuan: yiMa,
321
+ detail: '絕嗣',
322
+ };
323
+ }
324
+ // 有賊尅(下賊上)用賊尅
325
+ if (stats.xiaZeiShang > 0) {
326
+ const matchingKe = siKe.list.filter(k => k.relation === '下賊上');
327
+ if (matchingKe.length === 1) {
328
+ return {
329
+ chuChuan: matchingKe[0].shangShen,
330
+ detail: '無依',
331
+ };
332
+ }
333
+ // 多個下賊上,取與日干陰陽相同者
334
+ const dayGanYinYang = this.getYinYang(dayGan);
335
+ const sameYinYangKe = matchingKe.filter(k => this.getYinYang(k.shangShen) === dayGanYinYang);
336
+ if (sameYinYangKe.length >= 1) {
337
+ return {
338
+ chuChuan: sameYinYangKe[0].shangShen,
339
+ detail: '無依',
340
+ };
341
+ }
342
+ return {
343
+ chuChuan: matchingKe[0].shangShen,
344
+ detail: '無依',
345
+ };
346
+ }
347
+ // 有上尅下用上尅下
348
+ if (stats.shangKeXia > 0) {
349
+ const matchingKe = siKe.list.filter(k => k.relation === '上尅下');
350
+ if (matchingKe.length === 1) {
351
+ return {
352
+ chuChuan: matchingKe[0].shangShen,
353
+ detail: '無依',
354
+ };
355
+ }
356
+ // 多個上尅下,取與日干陰陽相同者
357
+ const dayGanYinYang = this.getYinYang(dayGan);
358
+ const sameYinYangKe = matchingKe.filter(k => this.getYinYang(k.shangShen) === dayGanYinYang);
359
+ if (sameYinYangKe.length >= 1) {
360
+ return {
361
+ chuChuan: sameYinYangKe[0].shangShen,
362
+ detail: '無依',
363
+ };
364
+ }
365
+ return {
366
+ chuChuan: matchingKe[0].shangShen,
367
+ detail: '無依',
368
+ };
369
+ }
370
+ // 無賊尅,取驛馬為初傳
371
+ // 驛馬:寅午戌馬在申,申子辰馬在寅,巳酉丑馬在亥,亥卯未馬在巳
372
+ const yiMa = this.getYiMa(dayZhi);
373
+ return {
374
+ chuChuan: yiMa,
375
+ detail: '無親',
376
+ };
377
+ }
378
+ /**
379
+ * 獲取驛馬
380
+ * 寅午戌馬在申,申子辰馬在寅,巳酉丑馬在亥,亥卯未馬在巳
381
+ */
382
+ static getYiMa(dayZhi) {
383
+ const yiMaMap = {
384
+ '寅': '申', '午': '申', '戌': '申',
385
+ '申': '寅', '子': '寅', '辰': '寅',
386
+ '巳': '亥', '酉': '亥', '丑': '亥',
387
+ '亥': '巳', '卯': '巳', '未': '巳',
388
+ };
389
+ return yiMaMap[dayZhi];
390
+ }
391
+ /**
392
+ * 處理伏吟
393
+ */
394
+ static handleFuYin(siKe, tianDiPan, dayGan, dayZhi, stats) {
395
+ const dayGanYinYang = this.getYinYang(dayGan);
396
+ const dayGanJiGong = constants_1.GAN_JI_GONG[dayGan];
397
+ // 伏吟課:陽日取日干寄宮刑神,陰日取日支刑神
398
+ if (dayGanYinYang === '陽') {
399
+ return {
400
+ chuChuan: dayGanJiGong,
401
+ detail: '自任',
402
+ };
403
+ }
404
+ else {
405
+ return {
406
+ chuChuan: dayZhi,
407
+ detail: '杜傳',
408
+ };
409
+ }
410
+ }
411
+ /**
412
+ * 處理八專
413
+ */
414
+ static handleBaZhuan(siKe, tianDiPan, dayGan, dayZhi) {
415
+ const dayGanYinYang = this.getYinYang(dayGan);
416
+ // 八專課:陽日順數兩位,陰日逆數兩位
417
+ const dayZhiIndex = constants_1.DI_ZHI.indexOf(dayZhi);
418
+ let targetIndex;
419
+ if (dayGanYinYang === '陽') {
420
+ targetIndex = (dayZhiIndex + 2) % 12;
421
+ }
422
+ else {
423
+ targetIndex = (dayZhiIndex - 2 + 12) % 12;
424
+ }
425
+ return {
426
+ chuChuan: constants_1.DI_ZHI[targetIndex],
427
+ detail: '帷簿',
428
+ };
429
+ }
430
+ /**
431
+ * 獲取陰陽
432
+ */
433
+ static getYinYang(ganOrZhi) {
434
+ const yangGan = ['甲', '丙', '戊', '庚', '壬'];
435
+ const yangZhi = ['子', '寅', '辰', '午', '申', '戌'];
436
+ if (yangGan.includes(ganOrZhi) || yangZhi.includes(ganOrZhi)) {
437
+ return '陽';
438
+ }
439
+ return '陰';
440
+ }
441
+ }
442
+ exports.SanChuanCalculator = SanChuanCalculator;
443
+ //# sourceMappingURL=SanChuanCalculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SanChuanCalculator.js","sourceRoot":"","sources":["../../../../src/services/daliuren/calculators/SanChuanCalculator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * 神煞計算器
3
+ *
4
+ * 計算大六壬中的各種神煞
5
+ */
6
+ import type { ShenSha } from '../types';
7
+ export declare class ShenShaCalculator {
8
+ /**
9
+ * 計算神煞
10
+ */
11
+ static calculate(dayGanZhi: string): ShenSha;
12
+ /**
13
+ * 日馬
14
+ */
15
+ private static getRiMa;
16
+ /**
17
+ * 月馬
18
+ */
19
+ private static getYueMa;
20
+ /**
21
+ * 丁馬(根據旬首)
22
+ */
23
+ private static getDingMa;
24
+ /**
25
+ * 華蓋
26
+ */
27
+ private static getHuaGai;
28
+ /**
29
+ * 閃電
30
+ */
31
+ private static getShanDian;
32
+ }
33
+ //# sourceMappingURL=ShenShaCalculator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShenShaCalculator.d.ts","sourceRoot":"","sources":["../../../../src/services/daliuren/calculators/ShenShaCalculator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAS,OAAO,EAAE,MAAM,UAAU,CAAC;AAG/C,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAY5C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,OAAO;IAItB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ;IAoBvB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAkBxB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IASxB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;CAQ3B"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ /**
3
+ * 神煞計算器
4
+ *
5
+ * 計算大六壬中的各種神煞
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ShenShaCalculator = void 0;
9
+ const constants_1 = require("../data/constants");
10
+ class ShenShaCalculator {
11
+ /**
12
+ * 計算神煞
13
+ */
14
+ static calculate(dayGanZhi) {
15
+ const dayZhi = dayGanZhi[1];
16
+ return {
17
+ riMa: this.getRiMa(dayZhi),
18
+ yueMa: this.getYueMa(dayZhi),
19
+ dingMa: this.getDingMa(dayGanZhi),
20
+ huaGai: this.getHuaGai(dayZhi),
21
+ shanDian: this.getShanDian(dayZhi),
22
+ };
23
+ }
24
+ /**
25
+ * 日馬
26
+ */
27
+ static getRiMa(dayZhi) {
28
+ return constants_1.RI_MA[dayZhi];
29
+ }
30
+ /**
31
+ * 月馬
32
+ */
33
+ static getYueMa(dayZhi) {
34
+ // 根據日支所屬三合局確定月馬
35
+ const sanHeMap = {
36
+ '寅申': ['寅', '申'],
37
+ '卯酉': ['卯', '酉'],
38
+ '辰戌': ['辰', '戌'],
39
+ '巳亥': ['巳', '亥'],
40
+ '午子': ['午', '子'],
41
+ '丑未': ['丑', '未'],
42
+ };
43
+ for (const [key, zhis] of Object.entries(sanHeMap)) {
44
+ if (zhis.includes(dayZhi)) {
45
+ return constants_1.YUE_MA_MAP[key];
46
+ }
47
+ }
48
+ return '寅'; // 默認
49
+ }
50
+ /**
51
+ * 丁馬(根據旬首)
52
+ */
53
+ static getDingMa(dayGanZhi) {
54
+ // 找到日干支所在的旬
55
+ const dayIndex = constants_1.JIA_ZI_60.indexOf(dayGanZhi);
56
+ const xunStart = Math.floor(dayIndex / 10) * 10;
57
+ // 丁馬對應表
58
+ const dingMaMap = {
59
+ 0: '卯', // 甲子旬
60
+ 10: '丑', // 甲戌旬
61
+ 20: '亥', // 甲申旬
62
+ 30: '酉', // 甲午旬
63
+ 40: '未', // 甲辰旬
64
+ 50: '巳', // 甲寅旬
65
+ };
66
+ return dingMaMap[xunStart] || '卯';
67
+ }
68
+ /**
69
+ * 華蓋
70
+ */
71
+ static getHuaGai(dayZhi) {
72
+ const huaGaiMap = {
73
+ '子': '戌', '丑': '丑', '寅': '戌', '卯': '未',
74
+ '辰': '戌', '巳': '丑', '午': '戌', '未': '未',
75
+ '申': '戌', '酉': '丑', '戌': '戌', '亥': '未',
76
+ };
77
+ return huaGaiMap[dayZhi];
78
+ }
79
+ /**
80
+ * 閃電
81
+ */
82
+ static getShanDian(dayZhi) {
83
+ const shanDianMap = {
84
+ '子': '辰', '丑': '辰', '寅': '未', '卯': '未',
85
+ '辰': '戌', '巳': '戌', '午': '丑', '未': '丑',
86
+ '申': '寅', '酉': '寅', '戌': '卯', '亥': '卯',
87
+ };
88
+ return shanDianMap[dayZhi];
89
+ }
90
+ }
91
+ exports.ShenShaCalculator = ShenShaCalculator;
92
+ //# sourceMappingURL=ShenShaCalculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShenShaCalculator.js","sourceRoot":"","sources":["../../../../src/services/daliuren/calculators/ShenShaCalculator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 四課計算器
3
+ *
4
+ * 四課由日干支推演:
5
+ * - 一課:日干上神(日干寄宮的天盤地支)加日干
6
+ * - 二課:一課上神的天盤地支加一課上神
7
+ * - 三課:日支上神(日支的天盤地支)加日支
8
+ * - 四課:三課上神的天盤地支加三課上神
9
+ */
10
+ import type { DiZhi, TianGan, SiKeInfo, TianDiPan } from '../types';
11
+ export declare class SiKeCalculator {
12
+ /**
13
+ * 計算四課
14
+ */
15
+ static calculate(dayGan: TianGan, dayZhi: DiZhi, tianDiPan: TianDiPan): SiKeInfo;
16
+ /**
17
+ * 構建單個課
18
+ */
19
+ private static buildSiKe;
20
+ /**
21
+ * 計算上下神關係
22
+ */
23
+ private static calculateRelation;
24
+ /**
25
+ * 分析四課關係統計
26
+ */
27
+ static analyzeRelations(siKe: SiKeInfo): {
28
+ shangKeXia: number;
29
+ xiaZeiShang: number;
30
+ biHe: number;
31
+ shangShengXia: number;
32
+ xiaShengShang: number;
33
+ };
34
+ }
35
+ //# sourceMappingURL=SiKeCalculator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SiKeCalculator.d.ts","sourceRoot":"","sources":["../../../../src/services/daliuren/calculators/SiKeCalculator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAwB,QAAQ,EAAE,SAAS,EAAU,MAAM,UAAU,CAAC;AAQlG,qBAAa,cAAc;IACzB;;OAEG;IACH,MAAM,CAAC,SAAS,CACd,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,KAAK,EACb,SAAS,EAAE,SAAS,GACnB,QAAQ;IA8BX;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAkBxB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAmChC;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG;QACvC,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB;CA+BF"}