dsh-metaphysics 0.21.0 → 0.34.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 +534 -385
- package/README.md +309 -279
- package/client.js +2190 -69
- package/engine/bazi.js +33 -2
- package/engine/classics.js +264 -0
- package/engine/geo.js +1 -1
- package/engine/index.js +146 -7
- package/engine/interpret-knowledge.js +402 -277
- package/engine/interpret-plain.js +87 -5
- package/engine/interpret.js +131 -7
- package/engine/liuyao.js +702 -237
- package/engine/mbti.js +417 -0
- package/engine/name.js +189 -19
- package/engine/qimen-interpret.js +37 -2
- package/engine/qimen.js +128 -1
- package/engine/ziwei.js +79 -0
- package/index.js +21 -16
- package/locale/en.json +1 -1
- package/locale/zh.json +1 -1
- package/package.json +5 -3
- package//345/221/275/347/220/206/346/216/222/347/233/230.html +17691 -0
|
@@ -19,6 +19,68 @@ const STRENGTH_PLAIN = {
|
|
|
19
19
|
身弱: '底子偏薄,先修恢复力再谈冲刺,硬撑的性价比最低',
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
+
// 卦体关系 → 生活化一句话(六冲六合讲聚散,伏吟讲原地,反吟讲反复)
|
|
23
|
+
const PLAIN_BODY = {
|
|
24
|
+
六冲卦: '这一卦是「六冲」,事情起落快,急事反而好办,拖久了的人事容易散。',
|
|
25
|
+
六合卦: '这一卦是「六合」,容易谈成,也容易黏住不放。',
|
|
26
|
+
变六冲: '往下走会散,收尾别拖。',
|
|
27
|
+
变六合: '往下走会合,事情倾向于延续下去。',
|
|
28
|
+
内卦伏吟: '事情卡在原地打转,想动但动不了。',
|
|
29
|
+
外卦伏吟: '外面那层没变,看起来在动,其实格局照旧。',
|
|
30
|
+
内卦反吟: '反复在自己这一头,改了又改回来。',
|
|
31
|
+
外卦反吟: '外面反复,对方或环境会来回拉扯。',
|
|
32
|
+
化进神: '有一爻在往上走,顺着这股劲推比往回拉顺。',
|
|
33
|
+
化退神: '有一爻在往后退,别按原来的势头硬推。',
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* 用神 → 一句白话。
|
|
38
|
+
* 只说「用神落在哪、有没有动、要不要往深处找」,不替人断成败。
|
|
39
|
+
*/
|
|
40
|
+
function usePlainOf(ug) {
|
|
41
|
+
if (!ug || !ug.liuqin) return '';
|
|
42
|
+
if (ug.found.length) {
|
|
43
|
+
const pos = ug.found.map((f) => `第${f.position}爻`).join('、');
|
|
44
|
+
const moving = ug.found.some((f) => f.moving);
|
|
45
|
+
const who = ug.byShi ? '代表你自己' : `就是「${ug.liuqin}」这一类事`;
|
|
46
|
+
return `你问的这件事,在卦里对应${pos}${who}——${moving ? '这一爻还在动,说明事情正在推进' : '这一爻没动,先按现状看'}。`;
|
|
47
|
+
}
|
|
48
|
+
if (ug.fushen.length) {
|
|
49
|
+
const f = ug.fushen[0];
|
|
50
|
+
return `你问的这件事,卦面上没有直接露出来,得往深处找:它藏在第${f.position}爻下面(伏神),与上面的关系是「${f.relation || '—'}」,要借力才出得来。`;
|
|
51
|
+
}
|
|
52
|
+
return '';
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* 用神旺衰 → 一句白话。
|
|
57
|
+
*/
|
|
58
|
+
function useStrengthPlain(st) {
|
|
59
|
+
if (!st || !st.lines || !st.lines.length) return '';
|
|
60
|
+
const dead = st.lines.filter((l) => /死|囚/.test(l.monthState) || l.monthChong);
|
|
61
|
+
const live = st.lines.filter((l) => /旺|相/.test(l.monthState));
|
|
62
|
+
const when = st.month && st.month.branch ? `眼下这阵子(${st.month.branch}月)` : '起卦这段日子';
|
|
63
|
+
if (dead.length && !live.length) return `${when}对这件事不太帮忙,气有点被压着——先别急着硬推,等风向转。`;
|
|
64
|
+
if (live.length && !dead.length) return `${when}对这件事是帮着的,气正在往上走,能推就趁现在。`;
|
|
65
|
+
return `${when}对这件事有帮有压,一半的力要自己挣——结果更看你怎么走。`;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* 六爻卦体 → 一句白话。
|
|
70
|
+
* 标签可能带爻位(「化进神 5」),所以按前缀匹配;
|
|
71
|
+
* 主句取标签顺序里第一个能说的,化进/化退作为补充句跟在后面(它们只说某一爻,不覆盖全局)。
|
|
72
|
+
*/
|
|
73
|
+
function bodyPlainOf(labels) {
|
|
74
|
+
const keyOf = (l) => Object.keys(PLAIN_BODY).find((k) => l === k || l.startsWith(`${k} `)) || '';
|
|
75
|
+
const primary = labels.find((l) => keyOf(l));
|
|
76
|
+
const main = primary ? PLAIN_BODY[keyOf(primary)] : '';
|
|
77
|
+
const extra = labels
|
|
78
|
+
.filter((l) => l !== primary && /^化[进退]神 /.test(l))
|
|
79
|
+
.map((l) => PLAIN_BODY[keyOf(l)])
|
|
80
|
+
.filter(Boolean);
|
|
81
|
+
return main + extra.join('');
|
|
82
|
+
}
|
|
83
|
+
|
|
22
84
|
// 询问方向 → 该往哪一节看
|
|
23
85
|
const DIR_SECTION = {
|
|
24
86
|
wealth: '「工作与职业选择」与「时间窗」',
|
|
@@ -64,22 +126,31 @@ export function buildAnswer(r, ask, ctx = {}) {
|
|
|
64
126
|
const body = r.body || {};
|
|
65
127
|
const bureau = r.bureau || {};
|
|
66
128
|
const md = r.lifeMaster || '';
|
|
129
|
+
const ji = r.flyChains && r.flyChains.忌;
|
|
130
|
+
const plainFly = ji && ji.steps.length
|
|
131
|
+
? `还有一条线值得留意:${ji.path.map((p) => p.replace(/宫$/, '')).join(' → ')}——这几件事在你身上是连着转的,一件卡住,容易牵动下一件。`
|
|
132
|
+
: '';
|
|
67
133
|
return [
|
|
68
134
|
head + `先说结论:你的命宫落${s(soul.branch, '—')}宫` +
|
|
69
135
|
`${bureau.name ? `、${bureau.name}` : ''}${md ? `,命主${md}` : ''}` +
|
|
70
136
|
`${body.lands ? `,身宫落在「${body.lands}」——这张盘的重心在这件事上` : ''}。`,
|
|
137
|
+
plainFly,
|
|
71
138
|
`具体到你问的这件事,重点看${where}。`,
|
|
72
|
-
].join('');
|
|
139
|
+
].filter(Boolean).join('');
|
|
73
140
|
}
|
|
74
141
|
|
|
75
142
|
if (r.system === 'liuyao') {
|
|
76
143
|
const ben = r.ben || {};
|
|
77
144
|
const moving = (r.cast && r.cast.movingPositions) || [];
|
|
78
145
|
const bian = r.bian || {};
|
|
146
|
+
const labels = (r.body && Array.isArray(r.body.labels)) ? r.body.labels : [];
|
|
147
|
+
// 六冲六合伏吟反吟里挑最贴近当下局面的一句,避免四句叠着说
|
|
148
|
+
const plainBody = bodyPlainOf(labels);
|
|
79
149
|
return [
|
|
80
150
|
head + `先说结论:本卦是${s(ben.name, '—')}` +
|
|
81
151
|
`${ben.palace ? `(${ben.palace})` : ''}` +
|
|
82
|
-
`${moving.length ? `,第 ${moving.join('、')} 爻动,变为${s(bian.name, '—')}` : ',六爻安静没有动爻'}
|
|
152
|
+
`${moving.length ? `,第 ${moving.join('、')} 爻动,变为${s(bian.name, '—')}` : ',六爻安静没有动爻'}。` +
|
|
153
|
+
`${plainBody}${usePlainOf(r.useGod)}${useStrengthPlain(r.useGodStrength)}`,
|
|
83
154
|
'断卦的落点在「世爻」(代表你)和「动爻」(事情的推动点),下面「看盘顺序」就按这个次序展开。',
|
|
84
155
|
].join('');
|
|
85
156
|
}
|
|
@@ -104,14 +175,25 @@ export function buildPlain(r, ask, ctx = {}) {
|
|
|
104
175
|
if (r.system === 'ziwei') {
|
|
105
176
|
const soul = r.soul || {};
|
|
106
177
|
const body = r.body || {};
|
|
107
|
-
|
|
108
|
-
|
|
178
|
+
const ji = r.flyChains && r.flyChains.忌;
|
|
179
|
+
// 只挑忌这一条白话:它最能说「你反复在哪几件事上使劲」
|
|
180
|
+
const plainFly = ji && ji.steps.length
|
|
181
|
+
? `另外有一条线值得留意:${ji.path.map((p) => p.replace(/宫$/, '')).join(' → ')}——这几件事在你身上是连着转的,一件事卡住,容易牵动下一件。`
|
|
182
|
+
: '';
|
|
183
|
+
return [
|
|
184
|
+
`紫微看的是「你与环境怎么互动」。命宫落${s(soul.branch, '—')}宫,说明你做事的第一反应是从这个宫位的气质出发` +
|
|
185
|
+
`${body.lands ? `;身宫在「${body.lands}」,意味着真正让你上心的,是${body.lands}这件事` : ''}。`,
|
|
186
|
+
plainFly,
|
|
187
|
+
].filter(Boolean).join('');
|
|
109
188
|
}
|
|
110
189
|
if (r.system === 'liuyao') {
|
|
111
190
|
const ben = r.ben || {};
|
|
112
191
|
const moving = (r.cast && r.cast.movingPositions) || [];
|
|
192
|
+
const labels = (r.body && Array.isArray(r.body.labels)) ? r.body.labels : [];
|
|
193
|
+
const plainBody = bodyPlainOf(labels);
|
|
113
194
|
return `${s(ben.name, '这一卦')}讲的是一个「${moving.length ? '正在动、还会变' : '暂时不动、先看清'}」的局面——` +
|
|
114
|
-
`${moving.length ? '有动爻,说明事情还有转圜空间,不是死局。' : '六爻安静,说明当下更该观察而不是硬推。'}
|
|
195
|
+
`${moving.length ? '有动爻,说明事情还有转圜空间,不是死局。' : '六爻安静,说明当下更该观察而不是硬推。'}` +
|
|
196
|
+
`${plainBody}${usePlainOf(r.useGod)}${useStrengthPlain(r.useGodStrength)}`;
|
|
115
197
|
}
|
|
116
198
|
return '';
|
|
117
199
|
}
|
package/engine/interpret.js
CHANGED
|
@@ -13,6 +13,8 @@ import {
|
|
|
13
13
|
} from './interpret-data.js';
|
|
14
14
|
// 生年四化要按年干反查四颗星,四化表只在紫微引擎里定义了一份,这里直接复用,避免两处维护打架
|
|
15
15
|
import { MUTAGEN } from './ziwei.js';
|
|
16
|
+
// 卦体关系的文案与面板 chip 共用同一份标签,避免两处措辞走散
|
|
17
|
+
import { bodyLabels, yongshenOf } from './liuyao.js';
|
|
16
18
|
|
|
17
19
|
// ── 固定五维度 ────────────────────────────────────────────
|
|
18
20
|
export const DIMENSIONS = [
|
|
@@ -334,7 +336,10 @@ function baziInterpret(r) {
|
|
|
334
336
|
const why = (lk.reasons || []).slice(0, 2).join(',');
|
|
335
337
|
return `${l.year} ${l.ganzhi}·${l.stemTenGod || ''}·${lk.tier || '平'}${why ? `(${why})` : ''}`;
|
|
336
338
|
}).join(';');
|
|
337
|
-
|
|
339
|
+
const jiaoLine = r.dayun && r.dayun.jiao && r.dayun.jiao.at
|
|
340
|
+
? `起运交运时刻 ${r.dayun.jiao.at}(${r.dayun.jiao.frame};三日折一年,距${r.dayun.jiao.from.name} ${r.dayun.jiao.spanDays} 天)。每步大运在同月同日同时刻换,逐年日期见下方大运表「交运」列。\n`
|
|
341
|
+
: '';
|
|
342
|
+
return `${jiaoLine}当前大运:${pick(cur, 'ganzhi', '—')}(${curSpan})。后续两步:${nextTwo}。\n近五年流年:${years || '—'}。\n读法:大运管"这十年的大环境",流年管"今年的具体天气";两者打架时,以能否动到用神为准。`;
|
|
338
343
|
})(),
|
|
339
344
|
},
|
|
340
345
|
{
|
|
@@ -383,6 +388,10 @@ function baziInterpret(r) {
|
|
|
383
388
|
key: 'geju', label: '格局依据',
|
|
384
389
|
text: (Array.isArray(frame.geju) ? frame.geju : []).map((g) => `${g.name}(${g.kind}):${g.evidence}`).join(';') || '未取到格局',
|
|
385
390
|
},
|
|
391
|
+
...(Array.isArray(r.classics) && r.classics.length ? [{
|
|
392
|
+
key: 'classics', label: '古籍原文',
|
|
393
|
+
text: r.classics.map((e) => `《${CLASSIC_BOOKS[e.book].name}·${e.chapter}》「${e.quote}」——${e.plain}`).join('\n'),
|
|
394
|
+
}] : []),
|
|
386
395
|
{
|
|
387
396
|
key: 'quant', label: '量化口径',
|
|
388
397
|
text: `本报告的量化只到「档位」:事业看十神权重(${topName} ${top[0]?.[1] ?? '—'})、财富看财星权重(${groups['财'] ?? 0})、感情看配偶星权重(${spouseKey} ${groups[spouseKey] ?? 0});大运/流年用「大吉 / 吉 / 平 / 忌」四档。不换算金额、不给健康诊断——那需要地域、家庭、行业与体检数据,命盘本身推不出来。`,
|
|
@@ -405,8 +414,8 @@ function baziInterpret(r) {
|
|
|
405
414
|
// 三张表:大运 / 流年 / 触发事件。都是「把已有字段摊平」,不新增算法。
|
|
406
415
|
const tables = [
|
|
407
416
|
{
|
|
408
|
-
key: 'dayun', title: '大运表', columns: ['大运', '年龄', '十神', '档位', '理由'],
|
|
409
|
-
rows: list.map((d) => [d.ganzhi, `${d.startAge}–${d.startAge + 9}`, d.stemTenGod || '', d.luck?.tier || '平', (d.luck?.reasons || []).join(',')]),
|
|
417
|
+
key: 'dayun', title: '大运表', columns: ['大运', '年龄', '交运', '十神', '档位', '理由'],
|
|
418
|
+
rows: list.map((d) => [d.ganzhi, `${d.startAge}–${d.startAge + 9}`, d.fromDate || '—', d.stemTenGod || '', d.luck?.tier || '平', (d.luck?.reasons || []).join(',')]),
|
|
410
419
|
},
|
|
411
420
|
{
|
|
412
421
|
key: 'liunian', title: '流年表(近十年)', columns: ['年份', '干支', '十神', '档位', '与原局'],
|
|
@@ -639,7 +648,7 @@ function ziweiInterpret(r) {
|
|
|
639
648
|
},
|
|
640
649
|
{
|
|
641
650
|
key: 'limits', label: '未纳入',
|
|
642
|
-
text: '
|
|
651
|
+
text: '本盘没有计算:小限与大限的加权、流日流时的具体事项定位、双星组合的强弱细分,以及「三方四正一起飞」的复合飞化(这里只跟单一支化逐宫串连)。四化表取中州派常用口径,其他流派(如飞星派)结论会不同;这些不改变盘面事实,只影响轻重,所以只作方向参考。',
|
|
643
652
|
},
|
|
644
653
|
];
|
|
645
654
|
if (natalSihua.length) {
|
|
@@ -657,6 +666,39 @@ function ziweiInterpret(r) {
|
|
|
657
666
|
});
|
|
658
667
|
}
|
|
659
668
|
|
|
669
|
+
// 飞星四化:宫干定星、星定落宫,跟着同一支化一路串到成环
|
|
670
|
+
{
|
|
671
|
+
const fc = r.flyChains;
|
|
672
|
+
const word = (p) => `${p}${String(p).endsWith('宫') ? '' : '宫'}`;
|
|
673
|
+
if (fc) {
|
|
674
|
+
const chainOf = (t) => {
|
|
675
|
+
const ch = fc[t];
|
|
676
|
+
if (!ch || !ch.steps.length) return `${t}:命宫这一干不化${t}星`;
|
|
677
|
+
const hops = ch.steps
|
|
678
|
+
.map((s) => `${word(s.from)}(${s.fromStem})化${t}${s.star}→${word(s.to)}(${s.toBranch})`)
|
|
679
|
+
.join(';');
|
|
680
|
+
return `${t}:${hops}${ch.closed ? `,绕回${word(ch.path[ch.path.length - 1])}成环` : ''}`;
|
|
681
|
+
};
|
|
682
|
+
const selfs = (r.fly || []).flatMap((p) => (p.flies || [])
|
|
683
|
+
.filter((f) => f.self)
|
|
684
|
+
.map((f) => `${word(p.palace)}(${p.stem})化${f.type}${f.star}落回本宫`));
|
|
685
|
+
const ji = fc.忌;
|
|
686
|
+
const jiRead = ji && ji.steps.length
|
|
687
|
+
? `忌这一条最值得盯:${word(ji.from)}化忌入${word(ji.steps[0].to)},${word(ji.steps[0].to)}的宫干再化忌往下一宫去,${ji.closed ? `最后绕回${word(ji.path[ji.path.length - 1])}` : '走到没有可落的星就停下'}——` +
|
|
688
|
+
`这条线就是你反复着力的那一圈,` +
|
|
689
|
+
`${ji.closed ? '环越短越容易在同一组宫位上打转(传统说「忌出不去」)' : '没成环表示这条力还有落点没走完'}。`
|
|
690
|
+
: '命宫这一干化忌未上盘,忌线不成立。';
|
|
691
|
+
sections.push({
|
|
692
|
+
key: 'fly', label: '四化飞星',
|
|
693
|
+
text: `生年四化说的是「一出场就带着什么」,飞星四化说的是「这一宫自己会去找谁」:宫干定出四颗化星,星落到哪一宫,这一宫的力就往哪边使。` +
|
|
694
|
+
`从命宫出发,四条线各串一遍——${chainOf('禄')};${chainOf('权')};${chainOf('科')};${chainOf('忌')}。` +
|
|
695
|
+
`${jiRead}` +
|
|
696
|
+
`另外,四化落回本宫的是自化:${selfs.length ? selfs.join('、') + '——自己化出去又回到自己,常表现为「说得多、落得少」或一阵一阵的劲头' : '本盘没有自化'}。` +
|
|
697
|
+
`这一层只描方向与牵引,不断吉凶:同样是化忌入某宫,落在生年忌上还是落在生年禄上,味道完全不同,得并着生年四化看。`,
|
|
698
|
+
});
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
|
|
660
702
|
// 流月/流日/流时:流年只回答「今年」,再往下才是「这个月」「这两天」
|
|
661
703
|
if (r.flow) {
|
|
662
704
|
const f = r.flow;
|
|
@@ -767,7 +809,7 @@ const LIUQIN_USE = {
|
|
|
767
809
|
兄弟: '同事、同行、竞争者,多与破财相关',
|
|
768
810
|
};
|
|
769
811
|
|
|
770
|
-
function liuyaoInterpret(r) {
|
|
812
|
+
function liuyaoInterpret(r, ask) {
|
|
771
813
|
const ben = isObj(r.ben) ? r.ben : {};
|
|
772
814
|
const bian = isObj(r.bian) ? r.bian : {};
|
|
773
815
|
const lines = Array.isArray(ben.lines) ? ben.lines : [];
|
|
@@ -784,6 +826,9 @@ function liuyaoInterpret(r) {
|
|
|
784
826
|
const movingLiuqin = moving?.liuqin || '';
|
|
785
827
|
const movingLiushen = moving?.liushen || '';
|
|
786
828
|
const dayGZ = pick(r.dayGanZhi, 'name', '');
|
|
829
|
+
// 卦体关系(六冲/六合/伏吟/反吟):由纳甲地支推导,见 engine/liuyao.js bodyRelations
|
|
830
|
+
const bd = isObj(r.body) ? r.body : {};
|
|
831
|
+
const bodyLabelList = (bd && Array.isArray(bd.labels)) ? bd.labels : bodyLabels(bd);
|
|
787
832
|
// 取象依据:卦象类的"依据"就是卦面本身,提炼成一行便于核对
|
|
788
833
|
const cnt = (k) => lines.filter((l) => l.liuqin === k).length;
|
|
789
834
|
const lineEv = (l) => (l ? `${l.position}爻${l.liuqin}${l.liushen ? '·' + l.liushen : ''}${l.moving ? '(动)' : ''}` : '—');
|
|
@@ -807,9 +852,86 @@ function liuyaoInterpret(r) {
|
|
|
807
852
|
`⑥ 看变卦:${bian.name ? `变出「${bian.name}」,是事情后续的走向` : '本卦无变,以静卦论'}。以上每一步都能在下方「依据」里对上号。`,
|
|
808
853
|
].join('\n'),
|
|
809
854
|
});
|
|
855
|
+
// 卦体关系:六冲/六合讲"聚散",伏吟讲"原地",反吟讲"反复"——只描述动势,吉凶仍归用神
|
|
856
|
+
if (bodyLabelList.length) {
|
|
857
|
+
const sideOf = (o) => [o && o.inner ? '内卦' : '', o && o.outer ? '外卦' : ''].filter(Boolean).join('、');
|
|
858
|
+
const fanYinSides = sideOf(bd.fanYin || {});
|
|
859
|
+
const fanYinBy = ['inner', 'outer'].map((k) => bd.fanYin && bd.fanYin[k] && bd.fanYin[k].by).filter(Boolean).flat();
|
|
860
|
+
const bodyText = [];
|
|
861
|
+
if (bd.ben && bd.ben.chong) bodyText.push('本卦是六冲卦:六爻地支正好配成子午、寅申、辰戌三组对冲,传统读作「散」——事情起落快、成得急也散得急,急事与近病反而喜欢这股冲开的力量,拖了很久的人事则不容易凝聚。');
|
|
862
|
+
if (bd.ben && bd.ben.he) bodyText.push('本卦是六合卦:六爻地支两两相合(子丑、寅亥、卯戌、辰酉、巳申、午未),传统读作「成」——容易谈拢,也容易拖住不放。');
|
|
863
|
+
if (bd.bian && bd.bian.chong) bodyText.push('变卦也是六冲:往后走偏「散」,收尾容易一拍两散,也可能是速战速决。');
|
|
864
|
+
else if (bd.bian && bd.bian.he) bodyText.push('变卦是六合:往后走偏「合」,收尾倾向于合拢、或者就这么延续下去。');
|
|
865
|
+
if (sideOf(bd.fuYin || {})) bodyText.push(`${sideOf(bd.fuYin || {})}伏吟:卦变了,纳甲地支却没变(六十四卦里只有乾与震共用子寅辰/午申戌,所以卦伏吟只会出在乾↔震互换)——传统说「伏吟主呻吟」,人想动、事情在原地打转,宜先看清楚再迈步。`);
|
|
866
|
+
if (fanYinSides) bodyText.push(`${fanYinSides}反吟:变卦与本卦相冲,来源有两种——${fanYinBy.includes('chong') ? '地支三爻全冲' : ''}${fanYinBy.includes('chong') && fanYinBy.includes('pair') ? ',或' : ''}${fanYinBy.includes('pair') ? '本卦之宫与变卦之宫在后天八卦上正对(乾巽、坎离、艮坤、震兑)' : ''}。传统说「反吟主反复」,去而复来、方案改来改去。`);
|
|
867
|
+
if (bd.yaoFanYin && bd.yaoFanYin.length) bodyText.push(`动爻反吟(第${bd.yaoFanYin.join('、')}爻):变出的地支回头冲本爻,变化点本身在反复——动了又翻回来,等于绕一圈回到原处。`);
|
|
868
|
+
if (bd.yaoFuYin && bd.yaoFuYin.length) bodyText.push(`动爻伏吟(第${bd.yaoFuYin.join('、')}爻):变出的地支与本爻同支,动了等于没动,想推的事会卡在同一道坎上。`);
|
|
869
|
+
const jinYao = (bd.jinTui || []).filter((x) => x.type === '进');
|
|
870
|
+
const tuiYao = (bd.jinTui || []).filter((x) => x.type === '退');
|
|
871
|
+
if (jinYao.length) bodyText.push(`化进神(第${jinYao.map((x) => x.position).join('、')}爻:${jinYao.map((x) => `${x.from}→${x.to}`).join('、')}):变出的地支与本爻同五行、且顺着往前一步,传统读作「进」——这一爻代表的人或事有后劲,往前走比退回去顺。`);
|
|
872
|
+
if (tuiYao.length) bodyText.push(`化退神(第${tuiYao.map((x) => x.position).join('、')}爻:${tuiYao.map((x) => `${x.from}→${x.to}`).join('、')}):变出的地支与本爻同五行、却倒着退一步,传统读作「退」——这一爻代表的人或事渐渐退气,别按原来的势头去推。`);
|
|
873
|
+
bodyText.push('这些标签只说明卦体的动势,不直接定吉凶:同一支六冲,近病问的是速愈、久病问的是凶险;同一爻化进,也得看用神旺不旺、有没有月建日辰托着。');
|
|
874
|
+
sections.push({ key: 'body', label: '卦体关系', text: bodyText.join('\n') });
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
// 用神与卦体联动:卦体只说动势,落到用神身上才有指向
|
|
878
|
+
const ug = yongshenOf(r, {
|
|
879
|
+
direction: (ask && ask.direction) || (r.useGod && r.useGod.direction) || 'general',
|
|
880
|
+
gender: (r.useGod && r.useGod.gender) || 'male',
|
|
881
|
+
});
|
|
882
|
+
if (ug && ug.liuqin) {
|
|
883
|
+
const useText = [];
|
|
884
|
+
useText.push(`所问方向取${ug.byShi ? '世爻' : ug.liuqin}为用神(${ug.ask})${ug.direction === 'love' ? `;感情按${ug.gender === 'female' ? '女命看官鬼' : '男命看妻财'}取,性别未给时按男命算` : ''}。`);
|
|
885
|
+
if (ug.found.length) {
|
|
886
|
+
useText.push(`用神在卦上:${ug.found.map((f) => `${f.position}爻${f.ganzhi}${f.element}${f.liuqin}${f.liushen ? `·${f.liushen}` : ''}${f.shi ? '(持世)' : ''}${f.ying ? '(临应)' : ''}${f.moving ? '(发动)' : ''}${f.kong ? '(旬空)' : ''}`).join('、')}${ug.side ? `,落在${ug.side}` : ''}。`);
|
|
887
|
+
if (ug.found.length > 1) useText.push('用神两现:传统取动者、取持世者、取旬空待填者,各派权重不同;这里只把几处都列出来,不替你选哪一爻当主用。');
|
|
888
|
+
} else if (ug.fushen.length) {
|
|
889
|
+
useText.push(`用神不上卦:本卦六爻里没有${ug.liuqin},按「用神不上卦则于本宫首卦内寻之」,到${String(pick(ben, 'palace', '')).replace(/宫$/, '')}宫首卦取伏神——${ug.fushen.map((f) => `${f.position}爻${f.ganzhi}${f.element},伏于飞神${f.fei ? `${f.fei.liuqin}${f.fei.ganzhi}${f.fei.element}` : '—'}之下`).join(';')}。`);
|
|
890
|
+
if (ug.relationSay.length) useText.push(`飞伏生克:${ug.relationSay.join(';')}。伏神要得出才算有力,藏在忌神之下且被克,则虽有如无。`);
|
|
891
|
+
} else {
|
|
892
|
+
useText.push(`用神不上卦,且本宫首卦里也没找到${ug.liuqin},这一问在卦面上没有直接对应物,只能借日月或改日再占。`);
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
// 卦体落在用神身上的读法:同一支卦体,落到用神与落到忌神是两个意思
|
|
896
|
+
const link = [];
|
|
897
|
+
if (bd.ben && bd.ben.chong) link.push('用神在六冲卦里:六冲主散,急事与近病借这股冲开的力量,缓事、久拖的人事则不容易凝聚');
|
|
898
|
+
if (bd.ben && bd.ben.he) link.push('用神在六合卦里:六合主成,容易谈拢,也容易黏住不放');
|
|
899
|
+
if (bd.bian && bd.bian.chong) link.push('用神逢变六冲:往后走向偏散,收尾容易一拍两散,也可能是速战速决');
|
|
900
|
+
else if (bd.bian && bd.bian.he) link.push('用神逢变六合:往后走向偏合,倾向于合拢或就这么延续');
|
|
901
|
+
for (const side of ['inner', 'outer']) {
|
|
902
|
+
const nm = side === 'inner' ? '内卦' : '外卦';
|
|
903
|
+
if (bd.fuYin && bd.fuYin[side]) link.push(`用神在${nm}伏吟:动而地支未变,想推的事卡在原地`);
|
|
904
|
+
if (bd.fanYin && bd.fanYin[side]) link.push(`用神在${nm}反吟:变卦与本卦相冲,用神这一头去而复来、定了又改`);
|
|
905
|
+
}
|
|
906
|
+
const jinYong = (bd.jinTui || []).filter((x) => x.type === '进' && ug.found.some((f) => f.position === x.position));
|
|
907
|
+
const tuiYong = (bd.jinTui || []).filter((x) => x.type === '退' && ug.found.some((f) => f.position === x.position));
|
|
908
|
+
if (jinYong.length) link.push(`用神化进神(${jinYong.map((x) => `${x.from}→${x.to}`).join('、')}):这一爻有后劲,顺着推比退回去顺`);
|
|
909
|
+
if (tuiYong.length) link.push(`用神化退神(${tuiYong.map((x) => `${x.from}→${x.to}`).join('、')}):这一爻渐渐退气,别按原来的势头硬推`);
|
|
910
|
+
if (ug.found.some((f) => f.kong)) link.push('用神旬空:事情先悬着,传统说空要出空、填实才算落地');
|
|
911
|
+
if (ug.found.some((f) => (bd.yaoFanYin || []).includes(f.position))) link.push('用神这一爻动而反吟:变化点本身在反复,动了又翻回来');
|
|
912
|
+
if (ug.found.some((f) => (bd.yaoFuYin || []).includes(f.position))) link.push('用神这一爻动而伏吟:动了等于没动,容易卡在同一道坎上');
|
|
913
|
+
if (link.length) useText.push(`与卦体对起来看:${link.join(';')}。`);
|
|
914
|
+
// 旺衰:月建与日辰都从外部推得,只报状态,不折成分数
|
|
915
|
+
const strength = r.useGodStrength;
|
|
916
|
+
if (strength && strength.lines && strength.lines.length) {
|
|
917
|
+
const head = strength.month && strength.month.branch
|
|
918
|
+
? `月建 ${strength.month.branch}(${strength.month.element})`
|
|
919
|
+
: '没有月建(未给起卦时间),只按日辰看';
|
|
920
|
+
const body = strength.lines.map((l) => {
|
|
921
|
+
const chong = l.monthChong ? ',遭月建冲(月破)'
|
|
922
|
+
: l.dayChong ? (l.kong ? ',日辰冲空' : l.moving ? ',逢日辰冲' : ',日辰冲而暗动') : '';
|
|
923
|
+
return `${l.position}爻${l.branch}${l.element}:月建${l.monthState}(${l.monthSay}),${l.dayRelation}(${l.daySay})${chong}`;
|
|
924
|
+
});
|
|
925
|
+
useText.push(`时令对用神:${head},日辰 ${strength.day ? `${strength.day.branch}(${strength.day.element})` : '—'}。${body.join(';')}。`);
|
|
926
|
+
useText.push('月建看这一段时令站在哪一边,日辰看当天那股力量是扶还是克;两处同时看,只报状态,不折成分数。');
|
|
927
|
+
}
|
|
928
|
+
useText.push('这一层只把用神、卦体与时令对起来,应期与成败还要看动爻变化与月建日辰的进退节奏,所以这里不折成分数、不断成败。');
|
|
929
|
+
sections.push({ key: 'yongshen', label: '用神落位与卦体', text: useText.join('\n') });
|
|
930
|
+
}
|
|
931
|
+
|
|
810
932
|
sections.push({
|
|
811
933
|
key: 'limits', label: '未纳入',
|
|
812
|
-
text: '
|
|
934
|
+
text: '本卦没有计算:全卦逐爻的月建旺衰(现在只算到用神那几爻)、化进化退叠上月建日辰之后的实际力重、用神两现时该取哪一爻的权重、伏神出伏的应期。这些会改变"旺不旺"的判断,所以这里只给取象与方向。',
|
|
813
935
|
});
|
|
814
936
|
|
|
815
937
|
const dimensions = [
|
|
@@ -823,6 +945,7 @@ function liuyaoInterpret(r) {
|
|
|
823
945
|
moving ? `动爻 ${lineEv(moving)}` : '无动爻',
|
|
824
946
|
`日辰 ${dayGZ || '—'}`,
|
|
825
947
|
`卦宫 ${pick(ben, 'palace', '—')}·${palaceEl || '—'}`,
|
|
948
|
+
bodyLabelList.length ? `卦体 ${bodyLabelList.join('、')}` : '卦体 无六冲六合伏吟反吟',
|
|
826
949
|
),
|
|
827
950
|
},
|
|
828
951
|
{
|
|
@@ -1234,6 +1357,7 @@ const BUILDERS = {
|
|
|
1234
1357
|
import { interpretQimen } from './qimen-interpret.js';
|
|
1235
1358
|
import { buildAnswer, buildPlain, buildGlossary, buildFollowups, dimensionPlain } from './interpret-plain.js';
|
|
1236
1359
|
import { knowledgeFor, caveatsFor, STATUS_LABEL } from './interpret-knowledge.js';
|
|
1360
|
+
import { CLASSIC_BOOKS } from './classics.js';
|
|
1237
1361
|
|
|
1238
1362
|
/**
|
|
1239
1363
|
* 给任意体系的解析结果补上「白话四层」:直答 / 说人话 / 每维一句话 / 追问建议。
|
|
@@ -1337,7 +1461,7 @@ export function interpret(r, opts) {
|
|
|
1337
1461
|
if (!fn) return null;
|
|
1338
1462
|
let body;
|
|
1339
1463
|
try {
|
|
1340
|
-
body = fn(r);
|
|
1464
|
+
body = fn(r, ask);
|
|
1341
1465
|
} catch (e) {
|
|
1342
1466
|
return {
|
|
1343
1467
|
moduleType: MODULE_TYPE[r.system] || 'natal',
|