dsh-metaphysics 0.63.0 → 0.65.0
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.
- package/CHANGELOG.md +123 -0
- package/client.almanac.js +10 -10
- package/client.chart.js +137 -137
- package/client.chenggu.js +39 -39
- package/client.convert.js +38 -38
- package/client.daliuren.js +43 -43
- package/client.fengshui.js +13 -13
- package/client.js +475 -344
- package/client.liuyao.js +19 -19
- package/client.mbti.js +3 -3
- package/client.name.js +14 -14
- package/client.numerology.js +33 -33
- package/client.qimen.js +17 -17
- package/client.star.js +40 -40
- package/client.tarot.js +39 -39
- package/client.xiaoliuren.js +3 -3
- package/client.zeri.js +22 -22
- package/engine/diff.js +20 -0
- package/engine/index.js +6 -4
- package/engine/interpret.js +4 -3
- package/engine/ziwei.js +268 -23
- package/index.js +34 -2
- package/package.json +1 -1
- package//345/221/275/347/220/206/346/216/222/347/233/230.html +582 -56
package/engine/diff.js
CHANGED
|
@@ -338,9 +338,29 @@ export const CALIBER_SWITCHES = {
|
|
|
338
338
|
ziweiSchoolSwitch('shenzhuSchool', '身主:子午皆火星 / 子铃午火', '身主', 'common', 'verse', {
|
|
339
339
|
common: '子午皆火星', verse: '子铃午火(安身主诀逐字)',
|
|
340
340
|
}),
|
|
341
|
+
ziweiSchoolSwitch('mingzhuSchool', '命主取法:命宫地支 / 生年年支', '命主取法', 'soul-branch', 'year-branch', {
|
|
342
|
+
'soul-branch': '命宫地支(通行本)', 'year-branch': '生年年支(中州派)',
|
|
343
|
+
}),
|
|
341
344
|
ziweiSchoolSwitch('zuoyaoSchool', '杂曜:49 颗简盘 / 61 颗全表', '杂曜全表', 'minimal', 'full', {
|
|
342
345
|
minimal: '49 颗(简盘)', full: '61 颗(加十二颗杂曜)',
|
|
343
346
|
}),
|
|
347
|
+
ziweiSchoolSwitch('liunianSihua', '流年四化取干:流年天干 / 流年命宫宫干', '流年四化取干', 'year-stem', 'life-palace-stem', {
|
|
348
|
+
'year-stem': '流年天干', 'life-palace-stem': '流年命宫宫干',
|
|
349
|
+
}),
|
|
350
|
+
// 十干四化变体有十一档,口径卡只拿「甲干廉破曲阳」当对照样本:
|
|
351
|
+
// 甲年换成文曲化科、太阳化忌这一档,与本插件默认的武曲化科最近、最能看出整表在动。
|
|
352
|
+
ziweiSchoolSwitch('sihuaVariant', '十干四化:通行表 / 变体整表替换', '十干四化变体', 'default', '廉破曲阳', {
|
|
353
|
+
default: '各干通行表', 廉破曲阳: '甲干 廉破曲阳',
|
|
354
|
+
贪阴阳机: '戊干 贪阴阳机', 阳武同阴: '庚干 阳武同阴', 阳武府同: '庚干 阳武府同',
|
|
355
|
+
阳武府相: '庚干 阳武府相', 阳武同相: '庚干 阳武同相', 巨阳武昌: '辛干 巨阳武昌',
|
|
356
|
+
梁紫府武: '壬干 梁紫府武', 梁紫相武: '壬干 梁紫相武', 破巨阳贪: '癸干 破巨阳贪',
|
|
357
|
+
}),
|
|
358
|
+
ziweiSchoolSwitch('jieluSchool', '截路空亡:照常 / 不排(中州派)', '截路空亡', 'off', 'zhongzhou', {
|
|
359
|
+
off: '照常(截空/副截/旬空/副旬)', zhongzhou: '不排(中州派)',
|
|
360
|
+
}),
|
|
361
|
+
ziweiSchoolSwitch('suipoSchool', '岁前十二神:照常 / 大耗改岁破(中州派)', '岁前十二神', 'off', 'zhongzhou', {
|
|
362
|
+
off: '照常(大耗)', zhongzhou: '大耗改岁破',
|
|
363
|
+
}),
|
|
344
364
|
],
|
|
345
365
|
qimen: [
|
|
346
366
|
{
|
package/engine/index.js
CHANGED
|
@@ -78,7 +78,8 @@ function requireGender(value, who = '') {
|
|
|
78
78
|
const ZIWEI_SCHOOL_KEYS = [
|
|
79
79
|
'brightnessSchool', 'gengYearSihua', 'tianmaSchool', 'tiankongSchool', 'jiekongSchool',
|
|
80
80
|
'kuiyueSchool', 'tianshiTianshang', 'changshengSchool', 'lateZishi', 'shenzhuSchool',
|
|
81
|
-
'zuoyaoSchool',
|
|
81
|
+
'mingzhuSchool', 'zuoyaoSchool', 'liunianSihua', 'sihuaVariant',
|
|
82
|
+
'jieluSchool', 'suipoSchool',
|
|
82
83
|
];
|
|
83
84
|
|
|
84
85
|
/** 紫微流派参数原样透传;非法值交给引擎按默认口径回退 */
|
|
@@ -211,8 +212,9 @@ function ziweiText(r) {
|
|
|
211
212
|
const labels = {
|
|
212
213
|
brightnessSchool: '亮度', gengYearSihua: '庚干四化', tianmaSchool: '天马', tiankongSchool: '天空',
|
|
213
214
|
jiekongSchool: '截空', kuiyueSchool: '魁钺', tianshiTianshang: '天伤天使',
|
|
214
|
-
changshengSchool: '长生', lateZishi: '晚子时', shenzhuSchool: '身主',
|
|
215
|
-
zuoyaoSchool: '杂曜全表',
|
|
215
|
+
changshengSchool: '长生', lateZishi: '晚子时', shenzhuSchool: '身主', mingzhuSchool: '命主取法',
|
|
216
|
+
zuoyaoSchool: '杂曜全表', liunianSihua: '流年四化取干', sihuaVariant: '十干四化变体',
|
|
217
|
+
jieluSchool: '截路空亡', suipoSchool: '岁前十二神',
|
|
216
218
|
};
|
|
217
219
|
const diff = Object.entries(labels)
|
|
218
220
|
.filter(([key]) => r.schools[key] && r.schools[key] !== ZIWEI_SCHOOL_DEFAULTS[key])
|
|
@@ -267,7 +269,7 @@ function ziweiText(r) {
|
|
|
267
269
|
`【农历】${lunarText}(月首 ${r.lunar.monthStart}) 时支:${r.hourBranch} 年干支:${r.yearGanzhi}`,
|
|
268
270
|
`【时刻】${r.solarTime ? `${r.solarTime.civilText} → 真太阳时 ${r.solarTime.trueSolarText}${r.input.geo ? '(' + r.input.geo.note + ')' : ''}` : ''}`,
|
|
269
271
|
`【命宫】${r.soul.branch}(${r.soul.ganzhi}·${r.soul.nayin}) 【身宫】${r.body.branch}(落${r.body.lands}) 【五行局】${r.bureau.name}`,
|
|
270
|
-
`【紫微】${r.ziwei} 【天府】${r.tianfu} 【命主】${r.lifeMaster} 【身主】${r.bodyMaster}${r.bodyMasterNote ? `(${r.bodyMasterSchool === 'common' ? '子午皆火星' : '子铃午火'})` : ''}`,
|
|
272
|
+
`【紫微】${r.ziwei} 【天府】${r.tianfu} 【命主】${r.lifeMaster} 【身主】${r.bodyMaster}${r.bodyMasterNote ? `(${r.bodyMasterSchool === 'common' ? '子午皆火星' : '子铃午火'})` : ''}${r.lifeMasterNote ? `(${r.lifeMasterNote})` : ''}`,
|
|
271
273
|
`【大限】${r.daxian.rule},${r.daxian.startAge}岁起 【小限】${r.xiaoxianRule.direction}`,
|
|
272
274
|
schoolLine,
|
|
273
275
|
`【昌曲】文昌${r.changqu.wenchang.branch}(${r.changqu.wenchang.palace}${r.changqu.wenchang.mutagen ? '·化' + r.changqu.wenchang.mutagen : ''}) 文曲${r.changqu.wenqu.branch}(${r.changqu.wenqu.palace}${r.changqu.wenqu.mutagen ? '·化' + r.changqu.wenqu.mutagen : ''})`,
|
package/engine/interpret.js
CHANGED
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
LIUREN_JIANG, TAROT_ELEMENT_FOCUS, DISCLAIMER,
|
|
13
13
|
} from './interpret-data.js';
|
|
14
14
|
// 生年四化要按年干反查四颗星,四化表只在紫微引擎里定义了一份,这里直接复用,避免两处维护打架
|
|
15
|
-
import {
|
|
15
|
+
import { natalSihuaTableOf } from './ziwei.js';
|
|
16
16
|
// 紫微的词库单列一处:宫位取象、主星细节、双星、煞星辅星、四化措辞、庙旺语气、格局读法
|
|
17
17
|
import {
|
|
18
18
|
palaceFieldOf, starExtraOf, starPairOf, brightRead, huaInLine,
|
|
@@ -666,9 +666,10 @@ function zwNatalSihua(r) {
|
|
|
666
666
|
}
|
|
667
667
|
|
|
668
668
|
// 年干四化表:用来补齐「盘上没有落点」的那几颗,以及保证输出顺序
|
|
669
|
+
// 该盘若选了十干四化变体,这张表也要跟着换,否则文案里的四化与盘面标的不是同一张
|
|
669
670
|
const ganzhi = pick(r, 'yearGanzhi', '');
|
|
670
671
|
const yearStem = typeof ganzhi === 'string' ? ganzhi.slice(0, 1) : '';
|
|
671
|
-
const table =
|
|
672
|
+
const table = natalSihuaTableOf(yearStem, r?.schools);
|
|
672
673
|
const starOfType = {};
|
|
673
674
|
for (const [star, type] of Object.entries(table)) starOfType[type] = star;
|
|
674
675
|
|
|
@@ -870,7 +871,7 @@ function ziweiInterpret(r) {
|
|
|
870
871
|
soulPair ? `${soulPair.gist};要留意的是${soulPair.watch}。` : '',
|
|
871
872
|
bodyLands ? `身宫寄在${bodyLands}——${bodyField ? `${bodyField.field}是后天更容易使上劲的地方` : '这是后天着力点'},中年以后会越来越明显。` : '',
|
|
872
873
|
`五行局为${pick(r.bureau, 'name', '—')},${pick(r.daxian, 'startAge', '—')}岁起运:局定的是节奏(几步起、十年一换),不是好坏。`,
|
|
873
|
-
`命主${pick(r, 'lifeMaster', '—')}、身主${pick(r, 'bodyMaster', '—')}
|
|
874
|
+
`命主${pick(r, 'lifeMaster', '—')}、身主${pick(r, 'bodyMaster', '—')}:传统把这两颗当作整张盘的定调星,命主看底色,身主看后半程的着力点。${r.lifeMasterNote ? '(本盘' + r.lifeMasterNote + '。)' : ''}`,
|
|
874
875
|
].filter(Boolean).join('\n');
|
|
875
876
|
|
|
876
877
|
// ── 逐宫分析:十二宫各一行清单 + 一句读法 ────────────────────
|
package/engine/ziwei.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// 紫微斗数安星:命身宫 → 五行局 → 紫微/天府 → 十四主星 → 诸辅煞杂曜 → 十二宫 → 四化 → 大限小限流年 → 格局
|
|
2
|
-
import { STEMS, BRANCHES, ganzhiName, sexagenaryIndex, jdToParts, partsToJd, formatJd } from './calendar.js';
|
|
2
|
+
import { STEMS, BRANCHES, ganzhiName, sexagenaryIndex, jdToParts, partsToJd, formatJd, dayGanzhiIndex } from './calendar.js';
|
|
3
3
|
import { solarToLunar } from './lunar.js';
|
|
4
4
|
import { applyTrueSolar } from './bazi.js';
|
|
5
5
|
import { applyDst } from './dst.js';
|
|
@@ -95,7 +95,17 @@ export const ZIWEI_SCHOOL_DEFAULTS = Object.freeze({
|
|
|
95
95
|
changshengSchool: 'yin-yang-shun-ni',
|
|
96
96
|
lateZishi: 'current-day',
|
|
97
97
|
shenzhuSchool: 'common',
|
|
98
|
+
mingzhuSchool: 'soul-branch',
|
|
98
99
|
zuoyaoSchool: 'minimal',
|
|
100
|
+
liunianSihua: 'year-stem',
|
|
101
|
+
sihuaVariant: 'default',
|
|
102
|
+
// 中州派成组差异:off 全部用通行本(默认,默认盘逐字节不变);zhongzhou 表示
|
|
103
|
+
// 「跟随 tianshiTianshang 的 zhongzhou 档」—— 那把开关切到中州派时,这一组跟着生效;
|
|
104
|
+
// 单独选 off/zhongzhou 而不动 tianshiTianshang 也可。
|
|
105
|
+
// jieluSchool 截路空亡:zhongzhou 不排(截空、副截、旬空、副旬整组不出)
|
|
106
|
+
// suipoSchool 岁前十二神:zhongzhou 把「大耗」改记作「岁破」(宫位不变,只换名字)
|
|
107
|
+
jieluSchool: 'off',
|
|
108
|
+
suipoSchool: 'off',
|
|
99
109
|
});
|
|
100
110
|
|
|
101
111
|
export const ZIWEI_SCHOOL_OPTIONS = Object.freeze({
|
|
@@ -109,7 +119,23 @@ export const ZIWEI_SCHOOL_OPTIONS = Object.freeze({
|
|
|
109
119
|
changshengSchool: ['yin-yang-shun-ni', 'shui-tu', 'huo-tu'],
|
|
110
120
|
lateZishi: ['current-day', 'next-day', 'all-current', 'day-cur-time-next'],
|
|
111
121
|
shenzhuSchool: ['common', 'verse'],
|
|
122
|
+
// 命主取法:两派共用同一张十二支→命主星的表(贪狼子、巨门丑亥、禄存寅戌、文曲卯酉、
|
|
123
|
+
// 廉贞辰申、武曲巳未、破军午),分歧只在「拿哪个地支去查」——
|
|
124
|
+
// soul-branch(默认,通行本 /《紫微斗数全书》卷二「安命主」):按命宫地支
|
|
125
|
+
// year-branch(中州派,王亭之整理):按生年年支
|
|
126
|
+
// 实测命宫地支与生年年支重合的只占约 8%,两派约九成的人的命主不同。
|
|
127
|
+
mingzhuSchool: ['soul-branch', 'year-branch'],
|
|
112
128
|
zuoyaoSchool: ['minimal', 'full'],
|
|
129
|
+
liunianSihua: ['year-stem', 'life-palace-stem'],
|
|
130
|
+
// 十干四化变体:default 表示各干用本插件原有通行表;其余按文墨变体名整表替换。
|
|
131
|
+
// 只列与 default 不同的那一档(default 之外全是「换掉某一干」的显式选择)。
|
|
132
|
+
sihuaVariant: ['default', '廉破曲阳', '贪阴阳机', '阳武同阴', '阳武府同', '阳武府相',
|
|
133
|
+
'阳武同相', '巨阳武昌', '梁紫府武', '梁紫相武', '破巨阳贪'],
|
|
134
|
+
// 中州派成组差异(两档各自独立,可单独开):
|
|
135
|
+
// jieluSchool off 截路空亡照常 / zhongzhou 整组不排(截空、副截、旬空、副旬都不出)
|
|
136
|
+
// suipoSchool off 岁前十二神照常 / zhongzhou 把「大耗」改记作「岁破」
|
|
137
|
+
jieluSchool: ['off', 'zhongzhou'],
|
|
138
|
+
suipoSchool: ['off', 'zhongzhou'],
|
|
113
139
|
});
|
|
114
140
|
|
|
115
141
|
export function ziweiSchoolsOf(input = {}) {
|
|
@@ -221,11 +247,67 @@ const GENG_MUTAGEN = {
|
|
|
221
247
|
GYWTX: { 太阳: '禄', 武曲: '权', 天同: '科', 天相: '忌' },
|
|
222
248
|
};
|
|
223
249
|
|
|
250
|
+
// 十干四化变体全表(文墨天机「十干四化」,2026-11 从 WMTJ-Pro64-2.5.26 的 App.swf 常量表挖出)。
|
|
251
|
+
// 变体名一律取文墨原文四字,按「禄 权 科 忌」的顺序念,所以名字本身就是这张表:
|
|
252
|
+
// 「廉破曲阳」= 廉贞化禄、破军化权、文曲化科、太阳化忌。
|
|
253
|
+
// 每干第一个是与本插件原有默认表完全一致的那一档,乙丙丁己四干文墨没有变体。
|
|
254
|
+
// 这张表和 gengYearSihua 不是一回事:gengYearSihua 只换生年四化里庚年那一支,
|
|
255
|
+
// sihuaVariant 换的是整张十干四化表(生年、宫干自化、大限宫干、飞星、流年一起走)。
|
|
256
|
+
export const SIHUA_VARIANTS = Object.freeze({
|
|
257
|
+
廉破武阳: { stem: '甲', table: MUTAGEN.甲 },
|
|
258
|
+
廉破曲阳: { stem: '甲', table: Object.freeze({ 廉贞: '禄', 破军: '权', 文曲: '科', 太阳: '忌' }) },
|
|
259
|
+
贪阴右机: { stem: '戊', table: MUTAGEN.戊 },
|
|
260
|
+
贪阴阳机: { stem: '戊', table: Object.freeze({ 贪狼: '禄', 太阴: '权', 太阳: '科', 天机: '忌' }) },
|
|
261
|
+
阳武阴同: { stem: '庚', table: GENG_MUTAGEN.GYWYT },
|
|
262
|
+
阳武同阴: { stem: '庚', table: GENG_MUTAGEN.GYWTY },
|
|
263
|
+
阳武府同: { stem: '庚', table: GENG_MUTAGEN.GYWFT },
|
|
264
|
+
阳武府相: { stem: '庚', table: GENG_MUTAGEN.GYWFX },
|
|
265
|
+
阳武同相: { stem: '庚', table: GENG_MUTAGEN.GYWTX },
|
|
266
|
+
巨阳曲昌: { stem: '辛', table: MUTAGEN.辛 },
|
|
267
|
+
巨阳武昌: { stem: '辛', table: Object.freeze({ 巨门: '禄', 太阳: '权', 武曲: '科', 文昌: '忌' }) },
|
|
268
|
+
梁紫辅武: { stem: '壬', table: MUTAGEN.壬 },
|
|
269
|
+
梁紫府武: { stem: '壬', table: Object.freeze({ 天梁: '禄', 紫微: '权', 天府: '科', 武曲: '忌' }) },
|
|
270
|
+
梁紫相武: { stem: '壬', table: Object.freeze({ 天梁: '禄', 紫微: '权', 天相: '科', 武曲: '忌' }) },
|
|
271
|
+
破巨阴贪: { stem: '癸', table: MUTAGEN.癸 },
|
|
272
|
+
破巨阳贪: { stem: '癸', table: Object.freeze({ 破军: '禄', 巨门: '权', 太阳: '科', 贪狼: '忌' }) },
|
|
273
|
+
});
|
|
274
|
+
|
|
224
275
|
function mutagenOf(stem, schools) {
|
|
225
276
|
if (stem === '庚') return GENG_MUTAGEN[schools.gengYearSihua] || MUTAGEN.庚;
|
|
226
277
|
return MUTAGEN[stem] ?? {};
|
|
227
278
|
}
|
|
228
279
|
|
|
280
|
+
/**
|
|
281
|
+
* 取某一干的四化表(宫干自化、大限宫干、飞星、流年都用这张)。
|
|
282
|
+
* 只认 `sihuaVariant`——`gengYearSihua` 按既有约定只管生年四化那一支,
|
|
283
|
+
* 不能让它顺带改掉宫干自化(那是另一套断法,混了就是两派口径串味)。
|
|
284
|
+
* 变体名所属天干对不上这一干时不生效,直接落回该干通行表,不会把甲的表套到乙上。
|
|
285
|
+
* @param {string} stem 天干
|
|
286
|
+
* @param {object} [schools] 流派开关
|
|
287
|
+
* @returns {Record<string,string>} 星名 → 禄/权/科/忌
|
|
288
|
+
*/
|
|
289
|
+
export function sihuaTableOf(stem, schools) {
|
|
290
|
+
const variant = schools && schools.sihuaVariant;
|
|
291
|
+
if (variant && variant !== 'default') {
|
|
292
|
+
const v = SIHUA_VARIANTS[variant];
|
|
293
|
+
if (v && v.stem === stem) return v.table;
|
|
294
|
+
}
|
|
295
|
+
return MUTAGEN[stem] ?? {};
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* 生年四化专用的取表:先看 `sihuaVariant`,没命中该干再让 `gengYearSihua` 生效。
|
|
300
|
+
* 两项同时指向庚干时以 `sihuaVariant` 为准——它说的是「整张表长这样」,比单点覆盖更明确。
|
|
301
|
+
* @param {string} stem 年干
|
|
302
|
+
* @param {object} [schools] 流派开关
|
|
303
|
+
* @returns {Record<string,string>} 星名 → 禄/权/科/忌
|
|
304
|
+
*/
|
|
305
|
+
export function natalSihuaTableOf(stem, schools) {
|
|
306
|
+
const table = sihuaTableOf(stem, schools);
|
|
307
|
+
if (table === MUTAGEN[stem]) return mutagenOf(stem, schools || {});
|
|
308
|
+
return table;
|
|
309
|
+
}
|
|
310
|
+
|
|
229
311
|
// 安魁钺三派:差异集中在庚辛壬癸年(「网络派」与 qs1 同表,不单列)
|
|
230
312
|
export const KUI_YUE_SCHOOLS = {
|
|
231
313
|
qs2: {
|
|
@@ -256,7 +338,7 @@ export const KUI_YUE = {
|
|
|
256
338
|
};
|
|
257
339
|
KUI_YUE_SCHOOLS.qs1 = KUI_YUE;
|
|
258
340
|
|
|
259
|
-
/**
|
|
341
|
+
/** 命主:按地支查表。两派共用这张表,分歧在拿哪个地支 —— 见 mingzhuSchool。 */
|
|
260
342
|
export const MING_ZHU = {
|
|
261
343
|
子: '贪狼', 丑: '巨门', 寅: '禄存', 卯: '文曲', 辰: '廉贞', 巳: '武曲',
|
|
262
344
|
午: '破军', 未: '武曲', 申: '廉贞', 酉: '文曲', 戌: '禄存', 亥: '巨门',
|
|
@@ -516,7 +598,11 @@ export function buildZiwei(input) {
|
|
|
516
598
|
if (schools.tiankongSchool !== 'off') {
|
|
517
599
|
put(schools.tiankongSchool === 'shun-jia-shi' ? yb + hb : yb + 1, '天空', '杂曜');
|
|
518
600
|
}
|
|
519
|
-
|
|
601
|
+
// 截路空亡:zhongzhou(中州派)整组不排——截空、副截、旬空、副旬都不出。
|
|
602
|
+
// 依据《中州派紫微斗数》:截路空亡不入中州派体系;通行本才排。
|
|
603
|
+
// 这一组只影响杂曜清单,不动宫盘、主星、十二宫位置。
|
|
604
|
+
const skipJielu = schools.jieluSchool === 'zhongzhou';
|
|
605
|
+
if (schools.jiekongSchool !== 'off' && !skipJielu) {
|
|
520
606
|
const jk = JIEKONG[schools.jiekongSchool][yearStem];
|
|
521
607
|
if (Array.isArray(jk)) {
|
|
522
608
|
put(jk[0], '截空', '杂曜');
|
|
@@ -564,7 +650,7 @@ export function buildZiwei(input) {
|
|
|
564
650
|
}
|
|
565
651
|
|
|
566
652
|
// 生年四化(庚干按所选变体)
|
|
567
|
-
const mutagenMap =
|
|
653
|
+
const mutagenMap = natalSihuaTableOf(yearStem, schools);
|
|
568
654
|
for (const list of starsByBranch) {
|
|
569
655
|
for (const star of list) {
|
|
570
656
|
if (mutagenMap[star.name]) star.mutagen = mutagenMap[star.name];
|
|
@@ -583,13 +669,17 @@ export function buildZiwei(input) {
|
|
|
583
669
|
const csStart = schools.changshengSchool === 'huo-tu' && bureau.number === 5
|
|
584
670
|
? 2
|
|
585
671
|
: CHANGSHENG_START[bureau.number];
|
|
672
|
+
// 岁前十二神:中州派把「大耗」改记作「岁破」(宫位不变,只换名字)。
|
|
673
|
+
const renameDahao = schools.suipoSchool === 'zhongzhou';
|
|
586
674
|
const shenshaAt = (branch) => {
|
|
587
675
|
const d = forward ? 1 : -1;
|
|
676
|
+
let suiqi = SUIQI_NAMES[fix(branch - yb)];
|
|
677
|
+
if (renameDahao && suiqi === '大耗') suiqi = '岁破';
|
|
588
678
|
return {
|
|
589
679
|
changsheng: CHANGSHENG_NAMES[fix(d * (branch - csStart))],
|
|
590
680
|
boshi: BOSHI_NAMES[fix(d * (branch - lucun))],
|
|
591
681
|
jiangqian: JIANGQIAN_NAMES[fix(branch - JIANGXING[triad])],
|
|
592
|
-
suiqi
|
|
682
|
+
suiqi,
|
|
593
683
|
};
|
|
594
684
|
};
|
|
595
685
|
|
|
@@ -600,7 +690,7 @@ export function buildZiwei(input) {
|
|
|
600
690
|
const stepIndex = forward ? fix(branch - soulIndex) : fix(soulIndex - branch);
|
|
601
691
|
const dxStart = startAge + stepIndex * 10;
|
|
602
692
|
const gz = STEMS[stem] + BRANCHES[branch];
|
|
603
|
-
const pal =
|
|
693
|
+
const pal = sihuaTableOf(STEMS[stem], schools);
|
|
604
694
|
const selfHua = starsByBranch[branch]
|
|
605
695
|
.filter((s) => pal[s.name])
|
|
606
696
|
.map((s) => ({ star: s.name, type: pal[s.name] }));
|
|
@@ -618,7 +708,7 @@ export function buildZiwei(input) {
|
|
|
618
708
|
start: dxStart,
|
|
619
709
|
end: dxStart + 9,
|
|
620
710
|
stem: STEMS[stem],
|
|
621
|
-
mutagen: Object.entries(
|
|
711
|
+
mutagen: Object.entries(sihuaTableOf(STEMS[stem], schools)).map(([s, k]) => `${s}化${k}`),
|
|
622
712
|
},
|
|
623
713
|
xiaoxian: { age: xiaoxianAge(branch, triad, gender) },
|
|
624
714
|
sanfang: [branch, branch + 4, branch + 8, branch + 6]
|
|
@@ -626,6 +716,10 @@ export function buildZiwei(input) {
|
|
|
626
716
|
});
|
|
627
717
|
}
|
|
628
718
|
|
|
719
|
+
// 来因宫(iztro 口径):生年天干与宫干相同的宫,子丑两宫除外(这两支五虎遁永不排甲己…的生年干)。
|
|
720
|
+
// 之所以叫「来因」:此宫是今生命局展开的起点,主「因何而来」,看一个人的先天因缘与执念方向。
|
|
721
|
+
const laiyin = palaces.find((p) => p.stem === yearStem && p.branch !== '子' && p.branch !== '丑') || null;
|
|
722
|
+
|
|
629
723
|
// 昌曲专论:与丑未的关系、是否入命三方、吸收面的清杂
|
|
630
724
|
const changqu = (() => {
|
|
631
725
|
const set = new Set([wenchang, wenqu]);
|
|
@@ -682,10 +776,21 @@ export function buildZiwei(input) {
|
|
|
682
776
|
const xxAge = ((age - 1) % 12) + 1;
|
|
683
777
|
const xxPalace = palaces.find((p) => p.xiaoxian.age === xxAge);
|
|
684
778
|
const dxPalace = palaces.find((p) => age >= p.daxian.start && age <= p.daxian.end);
|
|
779
|
+
// 流年四化取干:默认按流年天干;liunianSihua: life-palace-stem 改按该年命宫
|
|
780
|
+
// 的宫干(文墨设置树里的「依据流年命宫天干」)。这两干各依不同的表:年干随年份走,
|
|
781
|
+
// 命宫宫干由五虎遁从出生年干起,所以实测十二年会换掉十二次,不是只差个别年。
|
|
782
|
+
// 取哪一干必须随盘回显,否则用户看不出四颗化星是被哪张表定的。
|
|
783
|
+
const lnStemOf = (() => {
|
|
784
|
+
if (schools.liunianSihua !== 'life-palace-stem') return gz.stem;
|
|
785
|
+
const lp = palaces.find((p) => p.branch === gz.branch);
|
|
786
|
+
return lp ? lp.stem : gz.stem;
|
|
787
|
+
})();
|
|
685
788
|
liunian.push({
|
|
686
789
|
year: y,
|
|
687
790
|
ganzhi: gz.name,
|
|
688
791
|
age,
|
|
792
|
+
sihuaStem: lnStemOf,
|
|
793
|
+
sihuaStemFrom: schools.liunianSihua === 'life-palace-stem' ? '流年命宫天干' : '流年天干',
|
|
689
794
|
lifePalace: { branch: gz.branch, palace: palaceNames[b] },
|
|
690
795
|
doujun: BRANCHES[fix(b - (lunarMonth - 1) + hb)],
|
|
691
796
|
sanfang: [fix(b), fix(b + 4), fix(b + 8), fix(b + 6)].map((x) => palaceNames[x]),
|
|
@@ -694,7 +799,20 @@ export function buildZiwei(input) {
|
|
|
694
799
|
liutuo: BRANCHES[fix(lu - 1)],
|
|
695
800
|
liukui: BRANCHES[kuiyueTable[gz.stem][0]],
|
|
696
801
|
liuyue: BRANCHES[kuiyueTable[gz.stem][1]],
|
|
697
|
-
|
|
802
|
+
// 流曜补全(流昌曲按流年干、流马按流年支三合、流鸾流喜按流年支、年解按流年支)
|
|
803
|
+
...(() => {
|
|
804
|
+
const s = horoscopeStarsByBranch(gz, true);
|
|
805
|
+
const out = {};
|
|
806
|
+
for (const [name, br] of Object.entries(s)) {
|
|
807
|
+
if (name === '流禄' || name === '流羊' || name === '流陀' || name === '流魁' || name === '流钺') continue;
|
|
808
|
+
out[name] = br;
|
|
809
|
+
}
|
|
810
|
+
return out;
|
|
811
|
+
})(),
|
|
812
|
+
mutagen: Object.entries(sihuaTableOf(lnStemOf, schools)).map(([s, k]) => `${s}化${k}`),
|
|
813
|
+
// 流年十二神:岁前/将前随流年支重安(iztro getYearly12 口径)
|
|
814
|
+
lnSuiqi: suiqiByBranch(gz.branch, schools.suipoSchool),
|
|
815
|
+
lnJiangqian: jiangqianByBranch(gz.branch),
|
|
698
816
|
daxian: dxPalace
|
|
699
817
|
? { palace: dxPalace.palace, start: dxPalace.daxian.start, end: dxPalace.daxian.end }
|
|
700
818
|
: null,
|
|
@@ -739,6 +857,30 @@ export function buildZiwei(input) {
|
|
|
739
857
|
},
|
|
740
858
|
hourBranch,
|
|
741
859
|
yearGanzhi: yearGanzhi.name,
|
|
860
|
+
...((() => {
|
|
861
|
+
// 非节气四柱(紫微斗数口径,文墨「显示非节气四柱」开关的数据源):
|
|
862
|
+
// 紫微按农历排盘,年柱以正月初一换岁(lunarYear 已是此口径)、月柱按农历月配五虎遁;
|
|
863
|
+
// 日柱、时柱与节气版完全一致(日时不受节气影响)。与八字(节气)四柱只在立春前后的
|
|
864
|
+
// 出生者上年/月两柱有差异,正好给用户对照。
|
|
865
|
+
const yIdx = (((lunarRaw.lunarYear - 4) % 60) + 60) % 60;
|
|
866
|
+
const nYinStem = ((STEMS.indexOf(yearGanzhi.stem) % 5) * 2 + 2) % 10;
|
|
867
|
+
const mBranchIdx = 2 + (lunarMonth - 1) >= 12 ? 2 + (lunarMonth - 1) - 12 : 2 + (lunarMonth - 1); // 正月建寅
|
|
868
|
+
const mStemIdx = (nYinStem + lunarMonth - 1) % 10;
|
|
869
|
+
const nJd = partsToJd({ year, month, day, hour: 12 });
|
|
870
|
+
const dIdx = dayGanzhiIndex(Math.floor(nJd + 0.5));
|
|
871
|
+
const dStemIdx = dIdx % 10;
|
|
872
|
+
const ziStem = ((dStemIdx % 5) * 2) % 10;
|
|
873
|
+
const hIdx = sexagenaryIndex((ziStem + hb) % 10, hb);
|
|
874
|
+
return {
|
|
875
|
+
nonJieqi: {
|
|
876
|
+
year: ganzhiName(yIdx).name,
|
|
877
|
+
month: ganzhiName(sexagenaryIndex(mStemIdx, mBranchIdx)).name,
|
|
878
|
+
day: ganzhiName(dIdx).name,
|
|
879
|
+
hour: ganzhiName(hIdx).name,
|
|
880
|
+
note: '非节气(农历)口径:年以正月初一、月以朔为界;与八字节气四柱仅立春前后出生者有差',
|
|
881
|
+
},
|
|
882
|
+
};
|
|
883
|
+
})()),
|
|
742
884
|
soul: {
|
|
743
885
|
palace: '命宫',
|
|
744
886
|
branch: BRANCHES[soulIndex],
|
|
@@ -747,7 +889,20 @@ export function buildZiwei(input) {
|
|
|
747
889
|
nayin: soulNayin.name,
|
|
748
890
|
},
|
|
749
891
|
body: { palace: '身宫', branch: BRANCHES[bodyIndex], lands: palaceNames[bodyIndex] },
|
|
750
|
-
lifeMaster: MING_ZHU[BRANCHES[soulIndex]],
|
|
892
|
+
lifeMaster: MING_ZHU[schools.mingzhuSchool === 'year-branch' ? BRANCHES[yb] : BRANCHES[soulIndex]],
|
|
893
|
+
lifeMasterSchool: schools.mingzhuSchool,
|
|
894
|
+
...((() => {
|
|
895
|
+
// 两派取的地支不同时,把另一派的结果一并回显——不然用户切档后只看到命主变了一个字,
|
|
896
|
+
// 无从判断是取法变了还是排盘出了问题。
|
|
897
|
+
const bySoul = MING_ZHU[BRANCHES[soulIndex]];
|
|
898
|
+
const byYear = MING_ZHU[BRANCHES[yb]];
|
|
899
|
+
if (bySoul === byYear) return {};
|
|
900
|
+
return {
|
|
901
|
+
lifeMasterNote: schools.mingzhuSchool === 'year-branch'
|
|
902
|
+
? `中州派按生年年支${BRANCHES[yb]}取${byYear};通行本按命宫地支${BRANCHES[soulIndex]}取${bySoul}`
|
|
903
|
+
: `通行本按命宫地支${BRANCHES[soulIndex]}取${bySoul};中州派按生年年支${BRANCHES[yb]}取${byYear}`,
|
|
904
|
+
};
|
|
905
|
+
})()),
|
|
751
906
|
bodyMaster: SHEN_ZHU[schools.shenzhuSchool][BRANCHES[yb]],
|
|
752
907
|
bodyMasterSchool: schools.shenzhuSchool,
|
|
753
908
|
...((yb === 0 || yb === 6) ? {
|
|
@@ -763,6 +918,8 @@ export function buildZiwei(input) {
|
|
|
763
918
|
ziwei: BRANCHES[ziwei],
|
|
764
919
|
tianfu: BRANCHES[tianfu],
|
|
765
920
|
changqu,
|
|
921
|
+
// 来因宫:{branch, palace, ganzhi} 或 null(理论上不 null,防御性保留)
|
|
922
|
+
laiyin: laiyin ? { branch: laiyin.branch, palace: laiyin.palace, ganzhi: laiyin.ganzhi } : null,
|
|
766
923
|
// 杂曜全表的这一层只写「这一盘怎么定宫」:面板、独立页与「复制提问」共用。
|
|
767
924
|
// 默认(minimal)时 placed 为空,但 skipped 照旧给出,说明为什么少了两颗。
|
|
768
925
|
zuoyao: {
|
|
@@ -794,15 +951,15 @@ export function buildZiwei(input) {
|
|
|
794
951
|
rules: {
|
|
795
952
|
ziweiPlacement: '借数法:局数除日数取商,商数自寅宫顺行,借数奇逆偶顺',
|
|
796
953
|
mutagen: '生年四化用中州派常用表;庚干可按流派切换(默认阳武阴同,另有同科阴忌、府科、府科相忌、同科相忌)',
|
|
797
|
-
schools: `流派开关:亮度 ${schools.brightnessSchool}、庚干四化 ${schools.gengYearSihua}、天马 ${schools.tianmaSchool}、天空 ${schools.tiankongSchool}、截空 ${schools.jiekongSchool}、魁钺 ${schools.kuiyueSchool}、天伤天使 ${schools.tianshiTianshang}、长生 ${schools.changshengSchool}、晚子时 ${schools.lateZishi}、身主 ${schools.shenzhuSchool}(common 子午皆火星 / verse
|
|
954
|
+
schools: `流派开关:亮度 ${schools.brightnessSchool}、庚干四化 ${schools.gengYearSihua}、天马 ${schools.tianmaSchool}、天空 ${schools.tiankongSchool}、截空 ${schools.jiekongSchool}、魁钺 ${schools.kuiyueSchool}、天伤天使 ${schools.tianshiTianshang}、长生 ${schools.changshengSchool}、晚子时 ${schools.lateZishi}、身主 ${schools.shenzhuSchool}(common 子午皆火星 / verse 子铃午火)、命主 ${schools.mingzhuSchool}(soul-branch 按命宫地支 / year-branch 按生年年支)、杂曜 ${schools.zuoyaoSchool}(minimal 49 颗 / full 61 颗)、流年四化取干 ${schools.liunianSihua}(year-stem 按流年天干 / life-palace-stem 按流年命宫宫干)、十干四化 ${schools.sihuaVariant}(default 各干通行表,其余为文墨变体整表替换)、截路空亡 ${schools.jieluSchool}(off 照常排 / zhongzhou 整组不排)、岁前十二神 ${schools.suipoSchool}(off 照常 / zhongzhou 大耗改岁破);庚干四化只作用于生年四化,sihuaVariant 换的是宫干自化、大限宫干、飞星与流年共用的那张表`,
|
|
798
955
|
zuoyao: schools.zuoyaoSchool === 'full'
|
|
799
956
|
? `全表十二颗已安:生月 解神、天巫、天月、阴煞;生年干 天官、天福、天厨;生年支 蜚廉、天德、年解;命宫+生年支 天才、身宫+生年支 天寿。蜚廉与博士十二神的飞廉同名异星,年解与月解(解神)分列,天德与岁前十二神的天德同名异宫。`
|
|
800
957
|
: `本盘按 49 颗的通行简盘安星,未排全表杂曜。开 zuoyaoSchool: "full" 追加十二颗:解神、天巫、天月、阴煞(生月)、天官、天福、天厨(生年干)、蜚廉、天德、年解(生年支)、天才(命宫+生年支)、天寿(身宫+生年支),每颗都带安星诀。`,
|
|
801
958
|
leapMonth: '闰月默认按日切分(1–15 归本月、16 起归次月,主流排盘口径);可传 leapMonth: next(整月归次月)或 prev(整月归本月),leapAsNext: true 等同 next',
|
|
802
959
|
auxStars: '火铃按年支三合起点顺数至生时;羊陀夹禄存;魁钺按年干;地空亥起子时逆行、地劫顺行;三台八座随辅弼;恩光天贵随昌曲退一位;台辅封诰按时支',
|
|
803
960
|
shensha: '长生、博士随大限顺逆;将前、岁前恒顺行;天伤恒在交友、天使恒在疾厄',
|
|
804
|
-
masters: '
|
|
805
|
-
liunian: '流年命宫取该年地支宫;三方四正为本宫与 +4/+8/+6
|
|
961
|
+
masters: '命主按 mingzhuSchool 取地支再查表(soul-branch 命宫地支 / year-branch 生年年支),身主按生年地支;两派共用同一张十二支命主表,只换查表用的地支',
|
|
962
|
+
liunian: '流年命宫取该年地支宫;三方四正为本宫与 +4/+8/+6;并给该年所属大限与小限;四化取干按 liunianSihua 口径,sihuaStem 回显实际用的那一干',
|
|
806
963
|
flyComposite: '三方四正取本宫、对宫与两个三合宫共四宫,四宫宫干各化禄权科忌共 16 条,按落宫归堆标会聚(双忌会、禄忌同宫、三化会、自化);只描会照,不折吉凶',
|
|
807
964
|
changqu: '昌曲落宫只由时支决定,故与丑未的关系(夹/三合/同宫/无关)是结构性结论;absorb 的「清/杂」是启发式标记,依据昌曲化忌与会煞,不是断语',
|
|
808
965
|
},
|
|
@@ -1079,6 +1236,34 @@ export const PATTERN_TONE = {
|
|
|
1079
1236
|
刑囚夹印: 'bad', 泛水桃花: 'bad',
|
|
1080
1237
|
};
|
|
1081
1238
|
|
|
1239
|
+
// ── 限流十二神(iztro 口径):随流年干支重安的只有岁前/将前两组 ──
|
|
1240
|
+
// 长生十二神、博士十二神只在本命排盘算一次,horoscope scope 不重算(iztro
|
|
1241
|
+
// FunctionalAstrolabe._getHoroscopeBySolarDate 里 yearlyDecStar=getYearly12(solarDate)
|
|
1242
|
+
// 只重出 suiqian12/jiangqian12,长生与博士留在本命宫位上)。
|
|
1243
|
+
// 岁前:流年支起岁建,顺数 SUIQI_NAMES;将前:寅午戌起午、申子辰起子、巳酉丑起酉、亥卯未起卯。
|
|
1244
|
+
export function suiqiByBranch(branch, suipoSchool) {
|
|
1245
|
+
const b = BRANCHES.indexOf(branch);
|
|
1246
|
+
if (b < 0) return {};
|
|
1247
|
+
const out = {};
|
|
1248
|
+
for (let i = 0; i < 12; i++) {
|
|
1249
|
+
let name = SUIQI_NAMES[i];
|
|
1250
|
+
if (suipoSchool === 'zhongzhou' && name === '大耗') name = '岁破';
|
|
1251
|
+
out[name] = BRANCHES[fix(b + i)];
|
|
1252
|
+
}
|
|
1253
|
+
return out;
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
export function jiangqianByBranch(branch) {
|
|
1257
|
+
const b = BRANCHES.indexOf(branch);
|
|
1258
|
+
if (b < 0) return {};
|
|
1259
|
+
const triad = ['寅午戌', '申子辰', '巳酉丑', '亥卯未'].find((t) => t.includes(branch));
|
|
1260
|
+
if (!triad) return {};
|
|
1261
|
+
const start = JIANGXING[triad];
|
|
1262
|
+
const out = {};
|
|
1263
|
+
for (let i = 0; i < 12; i++) out[JIANGQIAN_NAMES[i]] = BRANCHES[fix(start + i)];
|
|
1264
|
+
return out;
|
|
1265
|
+
}
|
|
1266
|
+
|
|
1082
1267
|
// ── 大限一览:宫干四化落宫、三方主星 ──────────────────────────
|
|
1083
1268
|
|
|
1084
1269
|
export function daxianList(chart) {
|
|
@@ -1101,7 +1286,12 @@ export function daxianList(chart) {
|
|
|
1101
1286
|
selfHua: p.selfHua,
|
|
1102
1287
|
sanfang: p.sanfang,
|
|
1103
1288
|
mainStars: mainOf(p.sanfang),
|
|
1104
|
-
|
|
1289
|
+
// 运曜:按大限宫干支安 10 颗(魁钺昌曲禄羊陀马鸾喜),映射 星名→地支
|
|
1290
|
+
yunStars: horoscopeStarsByBranch(p.ganzhi, false),
|
|
1291
|
+
// 限流十二神:随大限宫支重安的岁前/将前两组(长生、博士不随限流变)
|
|
1292
|
+
yunSuiqi: suiqiByBranch(p.branch, chart.schools.suipoSchool),
|
|
1293
|
+
yunJiangqian: jiangqianByBranch(p.branch),
|
|
1294
|
+
mutagenHits: Object.entries(sihuaTableOf(p.stem, chart.schools)).map(([star, type]) => {
|
|
1105
1295
|
const b = starBranchOf(chart, star);
|
|
1106
1296
|
return { star, type, branch: b >= 0 ? BRANCHES[b] : null, palace: b >= 0 ? chart.palaces.find((x) => x.branch === BRANCHES[b])?.palace ?? null : null };
|
|
1107
1297
|
}),
|
|
@@ -1118,9 +1308,10 @@ export function daxianList(chart) {
|
|
|
1118
1308
|
export const FLY_TYPES = ['禄', '权', '科', '忌'];
|
|
1119
1309
|
|
|
1120
1310
|
// 某天干下某一化的星曜;表里没有就返回 null(不会凭印象补)
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1311
|
+
// 第三参 schools 选填:给了就按该盘的十干四化变体取表,不给沿用通行表(旧调用零漂移)
|
|
1312
|
+
export function flyStarOf(stem, type, schools) {
|
|
1313
|
+
const map = sihuaTableOf(stem, schools || {});
|
|
1314
|
+
if (!map || !Object.keys(map).length) return null;
|
|
1124
1315
|
for (const [star, t] of Object.entries(map)) if (t === type) return star;
|
|
1125
1316
|
return null;
|
|
1126
1317
|
}
|
|
@@ -1133,7 +1324,7 @@ export function flyStars(chart) {
|
|
|
1133
1324
|
branch: p.branch,
|
|
1134
1325
|
stem: p.stem,
|
|
1135
1326
|
flies: FLY_TYPES.map((type) => {
|
|
1136
|
-
const star = flyStarOf(p.stem, type);
|
|
1327
|
+
const star = flyStarOf(p.stem, type, chart.schools);
|
|
1137
1328
|
const b = star ? starBranchOf(chart, star) : -1;
|
|
1138
1329
|
const target = b >= 0 ? palaces.find((x) => x.branch === BRANCHES[b]) : null;
|
|
1139
1330
|
return {
|
|
@@ -1159,7 +1350,7 @@ export function flyChain(chart, { from = '命宫', type = '忌', maxSteps = 12 }
|
|
|
1159
1350
|
let cur = start;
|
|
1160
1351
|
let ended = 'max';
|
|
1161
1352
|
for (let i = 0; i < Math.max(1, maxSteps); i++) {
|
|
1162
|
-
const star = flyStarOf(cur.stem, type);
|
|
1353
|
+
const star = flyStarOf(cur.stem, type, chart.schools);
|
|
1163
1354
|
if (!star) { ended = 'no-star'; break; }
|
|
1164
1355
|
const b = starBranchOf(chart, star);
|
|
1165
1356
|
if (b < 0) { ended = 'off-chart'; break; }
|
|
@@ -1209,7 +1400,7 @@ export function flyComposite(chart, { from = '命宫' } = {}) {
|
|
|
1209
1400
|
branch: p.branch,
|
|
1210
1401
|
stem: p.stem,
|
|
1211
1402
|
flies: FLY_TYPES.map((type) => {
|
|
1212
|
-
const star = flyStarOf(p.stem, type);
|
|
1403
|
+
const star = flyStarOf(p.stem, type, chart.schools);
|
|
1213
1404
|
const b = star ? starBranchOf(chart, star) : -1;
|
|
1214
1405
|
const target = b >= 0 ? palaces.find((x) => x.branch === BRANCHES[b]) : null;
|
|
1215
1406
|
return {
|
|
@@ -1282,12 +1473,66 @@ export function flyComposite(chart, { from = '命宫' } = {}) {
|
|
|
1282
1473
|
};
|
|
1283
1474
|
}
|
|
1284
1475
|
|
|
1285
|
-
// ──
|
|
1476
|
+
// ── 限流星曜(运曜/流曜)────────────────────────────────────
|
|
1477
|
+
// 口径依据 iztro star/horoscopeStar.ts + star/location.ts(本命同表换干支重算):
|
|
1478
|
+
// · 魁钺、昌曲、禄羊陀 按运限天干;天马按运限地支三合;红鸾天喜按运限地支(卯起逆数)。
|
|
1479
|
+
// · 流年另加「年解」:戌上起子,逆数至流年地支。
|
|
1480
|
+
// 与本命安星的差异只有两点:昌曲在本命按时支(戌起逆数/辰起顺数),限流按天干
|
|
1481
|
+
//(甲昌巳曲酉、乙昌午曲申、丙戊昌申曲午、丁己昌酉曲巳、庚昌亥曲卯、辛昌子曲寅、壬昌寅曲辰、癸昌卯曲巳);
|
|
1482
|
+
// 火铃不随限流重安(iztro 同样只安这 10+1 颗)。
|
|
1483
|
+
const LIU_CHANGQU = {
|
|
1484
|
+
甲: [5, 9], 乙: [6, 8], 丙: [8, 6], 戊: [8, 6], 丁: [9, 5], 己: [9, 5],
|
|
1485
|
+
庚: [11, 3], 辛: [0, 2], 壬: [2, 4], 癸: [3, 5],
|
|
1486
|
+
};
|
|
1487
|
+
|
|
1488
|
+
const NIANJIE_OF = { 子: 10, 丑: 9, 寅: 8, 卯: 7, 辰: 6, 巳: 5, 午: 4, 未: 3, 申: 2, 酉: 1, 戌: 0, 亥: 11 };
|
|
1489
|
+
|
|
1490
|
+
/** 前缀:大限叫运X、流年叫流X(iztro 同款命名) */
|
|
1491
|
+
const HS_PREFIX = (yearly) => (yearly ? '流' : '运');
|
|
1492
|
+
|
|
1493
|
+
/** 按一组干支安限流星曜,返回 12 宫(按地支序)各宫的星名数组。yearly=true 时前缀用「流」并加年解。 */
|
|
1494
|
+
export function horoscopeStarsOf(gz, yearly = false) {
|
|
1495
|
+
const stem = gz.stem ?? String(gz).replace(/[子丑寅卯辰巳午未申酉戌亥]$/, '');
|
|
1496
|
+
const branch = gz.branch ?? String(gz).slice(-1);
|
|
1497
|
+
const sb = BRANCHES.indexOf(branch);
|
|
1498
|
+
const pre = HS_PREFIX(yearly);
|
|
1499
|
+
const lu = LUCUN[stem];
|
|
1500
|
+
const [kui, yue] = KUI_YUE[stem];
|
|
1501
|
+
const [chang, qu] = LIU_CHANGQU[stem];
|
|
1502
|
+
const ma = TIANMA[triadOf(sb)];
|
|
1503
|
+
const luang = fix(3 - sb);
|
|
1504
|
+
const byBranch = Array.from({ length: 12 }, () => []);
|
|
1505
|
+
const add = (idx, name) => byBranch[fix(idx)].push(name);
|
|
1506
|
+
add(kui, `${pre}魁`);
|
|
1507
|
+
add(yue, `${pre}钺`);
|
|
1508
|
+
add(chang, `${pre}昌`);
|
|
1509
|
+
add(qu, `${pre}曲`);
|
|
1510
|
+
add(lu, `${pre}禄`);
|
|
1511
|
+
add(lu + 1, `${pre}羊`);
|
|
1512
|
+
add(lu - 1, `${pre}陀`);
|
|
1513
|
+
add(ma, `${pre}马`);
|
|
1514
|
+
add(luang, `${pre}鸾`);
|
|
1515
|
+
add(luang + 6, `${pre}喜`);
|
|
1516
|
+
if (yearly) add(NIANJIE_OF[branch], '年解');
|
|
1517
|
+
return byBranch;
|
|
1518
|
+
}
|
|
1519
|
+
|
|
1520
|
+
/** 把 12 宫的星名数组转成 {星名: 地支}(供 daxianList/liunian 挂字段) */
|
|
1521
|
+
export function horoscopeStarsByBranch(gz, yearly = false) {
|
|
1522
|
+
const byBranch = horoscopeStarsOf(gz, yearly);
|
|
1523
|
+
const out = {};
|
|
1524
|
+
byBranch.forEach((stars, i) => {
|
|
1525
|
+
for (const name of stars) out[name] = BRANCHES[i];
|
|
1526
|
+
});
|
|
1527
|
+
return out;
|
|
1528
|
+
}
|
|
1529
|
+
|
|
1530
|
+
|
|
1286
1531
|
|
|
1287
1532
|
export function enrichLiunian(chart) {
|
|
1288
1533
|
for (const ln of chart.liunian) {
|
|
1289
|
-
const stem = ln.ganzhi[0];
|
|
1290
|
-
ln.mutagenHits = Object.entries(
|
|
1534
|
+
const stem = ln.sihuaStem || ln.ganzhi[0];
|
|
1535
|
+
ln.mutagenHits = Object.entries(sihuaTableOf(stem, chart.schools)).map(([star, type]) => {
|
|
1291
1536
|
const b = starBranchOf(chart, star);
|
|
1292
1537
|
return {
|
|
1293
1538
|
star,
|
|
@@ -1349,7 +1594,7 @@ export function flowOf(chart, asOf) {
|
|
|
1349
1594
|
const p = chart.palaces.find((x) => x.branch === br);
|
|
1350
1595
|
const stem = p ? p.stem : null;
|
|
1351
1596
|
const mutagenHits = stem
|
|
1352
|
-
? Object.entries(
|
|
1597
|
+
? Object.entries(sihuaTableOf(stem, chart.schools)).map(([star, type]) => {
|
|
1353
1598
|
const b = starBranchOf(chart, star);
|
|
1354
1599
|
return {
|
|
1355
1600
|
star,
|