dsh-metaphysics 0.65.0 → 0.66.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 +23 -0
- package/client.chart.js +133 -133
- package/client.js +1 -1
- package/client.name.js +47 -47
- package/engine/bazi.js +9 -1
- package/engine/shensha.js +211 -23
- package/package.json +3 -2
- package//345/221/275/347/220/206/346/216/222/347/233/230.html +223 -27
|
@@ -362,7 +362,7 @@ h3::after{content:"";flex:1;height:1px;background:linear-gradient(90deg,var(--li
|
|
|
362
362
|
<div class="wrap">
|
|
363
363
|
<header>
|
|
364
364
|
<div class="brand-row">
|
|
365
|
-
<div class="brand"><span class="seal" aria-hidden="true">命</span><span class="brand-txt">命理排盘<span class="ver">v0.
|
|
365
|
+
<div class="brand"><span class="seal" aria-hidden="true">命</span><span class="brand-txt">命理排盘<span class="ver">v0.66.0</span><small>八字 · 紫微 · 六爻 · 梅花 · 六壬 · 奇门 · 合盘 · 塔罗 全部在本机计算</small></span></div>
|
|
366
366
|
<div class="view-switch">
|
|
367
367
|
<span class="hint">熟练了可以换回平铺</span>
|
|
368
368
|
<span class="seg" role="group" aria-label="首屏样式">
|
|
@@ -653,7 +653,7 @@ h3::after{content:"";flex:1;height:1px;background:linear-gradient(90deg,var(--li
|
|
|
653
653
|
<h3>对拍:把典籍当期望值</h3>
|
|
654
654
|
<ul><li>六爻:京房八宫卦序与世应,64 卦全表;旬空六旬表</li><li>六壬:日干寄宫、中气换将;紫微:纳音定五行局、紫微天府相照</li><li>卦例:《增删卜易》9 条 +《卜筮正宗》128 条(93 成对 + 35 静卦),核本变卦 / 动爻数 / 卦宫 / 缺爻 / 旬空</li><li>奇门:20 个时辰 × 9 宫,核四柱 / 局数 / 值符 / 值使 / 星门神 / 天盘干</li></ul>
|
|
655
655
|
<h3>工程验证</h3>
|
|
656
|
-
<ul><li>测试:
|
|
656
|
+
<ul><li>测试:167 个测试文件 / 9074 条断言;七道闸(回归 · 断言基线 · 测试可失败自检 · HTML 注入面 · 工程约定 · 产物宿主形态 · 随机扫射)</li><li>可复现:seed / asOf 显式;同一输入同一输出</li><li>口径:晚子时、真太阳时、奇门三流派、闰月归月都可切换,并有字段级差异对照</li></ul>
|
|
657
657
|
|
|
658
658
|
<h3>已知边界(不猜)</h3>
|
|
659
659
|
<ul><li>六爻应期(具体哪天应验)不做;卦例只录动爻个数,不录爻位</li><li>财富/健康只给结构判断与档位,不给金额区间、不作诊断</li><li>紫微飞星已做「单一支化逐宫追到成环」与「三方四正 16 条按落宫归堆」,但都未叠大限流年四化、不折吉凶;八字交运日已能算到日/时,但未与第三方排盘案例批量对拍</li></ul>
|
|
@@ -2752,7 +2752,10 @@ const YUEDE_HE = { 丙: '辛', 壬: '丁', 甲: '己', 庚: '乙' };
|
|
|
2752
2752
|
const FUXING = {
|
|
2753
2753
|
甲: ['寅', '子'], 丙: ['寅', '子'],
|
|
2754
2754
|
乙: ['卯', '丑'], 癸: ['卯', '丑'],
|
|
2755
|
-
|
|
2755
|
+
// 丁取亥:本表所引《甲丙相邀入虎乡歌》原文作「戊猴己未丁宜亥」。
|
|
2756
|
+
// 旧表写丁酉,与自家所引歌诀对不上——酉是「丁酉」这个干支的干,不是亥的形讹,
|
|
2757
|
+
// 属后世把干支名误当查法所致。改从歌诀,并保留旧说于 rule 文本备查。
|
|
2758
|
+
丁: ['亥'], 戊: ['申'], 己: ['未'], 庚: ['午'], 辛: ['巳'], 壬: ['辰'],
|
|
2756
2759
|
};
|
|
2757
2760
|
// 天官贵人(通行表,流派有异)
|
|
2758
2761
|
const TIANGUAN = { 甲: ['未'], 乙: ['辰'], 丙: ['巳'], 丁: ['酉'], 戊: ['戌'], 己: ['卯'], 庚: ['亥'], 辛: ['申'], 壬: ['午'], 癸: ['寅'] };
|
|
@@ -2787,10 +2790,16 @@ const WANGSHEN = { 寅午戌: ['巳'], 申子辰: ['亥'], 巳酉丑: ['申'],
|
|
|
2787
2790
|
const JINYU = { 甲: ['辰'], 乙: ['巳'], 丙: ['未'], 丁: ['申'], 戊: ['未'], 己: ['申'], 庚: ['戌'], 辛: ['亥'], 壬: ['丑'], 癸: ['寅'] };
|
|
2788
2791
|
// 禄神
|
|
2789
2792
|
const LUSHEN = { 甲: ['寅'], 乙: ['卯'], 丙: ['巳'], 丁: ['午'], 戊: ['巳'], 己: ['午'], 庚: ['申'], 辛: ['酉'], 壬: ['亥'], 癸: ['子'] };
|
|
2790
|
-
//
|
|
2791
|
-
|
|
2792
|
-
//
|
|
2793
|
-
|
|
2793
|
+
// 羊刃(DeepSeek 派):帝旺本位,阴阳干都取「禄后一位」——即阳干帝旺、阴干亦帝旺。
|
|
2794
|
+
// 阳干:甲卯 丙午 戊午 庚酉 壬子(十二长生帝旺位,历代无争议)。
|
|
2795
|
+
// 阴干:乙寅 丁巳 己巳 辛申 癸亥(阴干逆行长生,帝旺在其长生进位,非禄前)。
|
|
2796
|
+
// 旧表把阴干取成禄前一位(乙辰 丁未 己未 辛戌 癸丑),那一位其实是阴干的「衰」;
|
|
2797
|
+
// 说「乙刃在辰」是宋以后禄命家把阳干式硬套到阴干的结果,与十二长生自相矛盾。
|
|
2798
|
+
const YANGREN = { 甲: ['卯'], 乙: ['寅'], 丙: ['午'], 丁: ['巳'], 戊: ['午'], 己: ['巳'], 庚: ['酉'], 辛: ['申'], 壬: ['子'], 癸: ['亥'] };
|
|
2799
|
+
// 羊刃六冲(由 YANGREN 逐干取对冲,勿手写,免两表再度走散)
|
|
2800
|
+
const FEIREN = Object.fromEntries(
|
|
2801
|
+
Object.entries(YANGREN).map(([stem, arr]) => [stem, arr.map((b) => BRANCHES[(BRANCHES.indexOf(b) + 6) % 12])]),
|
|
2802
|
+
);
|
|
2794
2803
|
// 流霞(通行表)
|
|
2795
2804
|
const LIUXIA = { 甲: ['酉'], 乙: ['戌'], 丙: ['未'], 丁: ['申'], 戊: ['巳'], 己: ['午'], 庚: ['辰'], 辛: ['卯'], 壬: ['亥'], 癸: ['寅'] };
|
|
2796
2805
|
|
|
@@ -2807,11 +2816,40 @@ const TIAN_SHE = { 春: '戊寅', 夏: '甲午', 秋: '戊申', 冬: '甲子' };
|
|
|
2807
2816
|
const SIFEI = { 春: ['庚申', '辛酉'], 夏: ['壬子', '癸亥'], 秋: ['甲寅', '乙卯'], 冬: ['丙午', '丁巳'] };
|
|
2808
2817
|
// 童子煞:春秋生见寅子,冬夏生见卯未辰
|
|
2809
2818
|
const TONGZI = { 春: ['寅', '子'], 秋: ['寅', '子'], 夏: ['卯', '未', '辰'], 冬: ['卯', '未', '辰'] };
|
|
2819
|
+
// 童子煞(纳音法,与季节法并行):金木命见午卯、水火命见酉戌、土命见辰巳
|
|
2820
|
+
// 口诀作「金木马卯合,水火鸡犬多,土命逢辰巳」——马=午、鸡=酉、犬=戌。
|
|
2821
|
+
// 旧实现只做季节法,把纳音法写作「流派多歧,仅作参考」,等于漏了一半查法。
|
|
2822
|
+
const TONGZI_NAYIN = { 金: ['午', '卯'], 木: ['午', '卯'], 水: ['酉', '戌'], 火: ['酉', '戌'], 土: ['辰', '巳'] };
|
|
2810
2823
|
// 三奇贵人(须依序相连)
|
|
2811
2824
|
const SANQI = ['甲戊庚', '乙丙丁', '壬癸辛'];
|
|
2812
2825
|
// 金神:时柱见之
|
|
2813
2826
|
const JINSHEN = ['乙丑', '己巳', '癸酉'];
|
|
2814
2827
|
|
|
2828
|
+
// ── 问真神煞大全补缺批(0.66):口径全部按《问真神煞大全》55 章实读钉死 ──
|
|
2829
|
+
|
|
2830
|
+
// 天德合:天德之干五合/支六合(寅月天德丁→壬合…)
|
|
2831
|
+
const TIANDE_HE = { 寅: '壬', 卯: '巳', 辰: '丁', 巳: '丙', 午: '寅', 未: '己', 申: '戊', 酉: '亥', 戌: '辛', 亥: '庚', 子: '申', 丑: '乙' };
|
|
2832
|
+
// 血刃:按月支查支
|
|
2833
|
+
const XUEYREN = { 寅: '丑', 卯: '未', 辰: '寅', 巳: '申', 午: '卯', 未: '酉', 申: '辰', 酉: '戌', 戌: '巳', 亥: '亥', 子: '午', 丑: '子' };
|
|
2834
|
+
// 红艳煞:日干查支
|
|
2835
|
+
const HONGYAN = { 甲: ['午'], 乙: ['午'], 丙: ['寅'], 丁: ['未'], 戊: ['辰'], 己: ['辰'], 庚: ['戌'], 辛: ['酉'], 壬: ['子'], 癸: ['申'] };
|
|
2836
|
+
// 孤鸾煞:日柱
|
|
2837
|
+
const GUALUAN = ['甲寅', '乙巳', '丙午', '丁巳', '戊午', '戊申', '辛亥', '壬子'];
|
|
2838
|
+
// 十灵日:日柱
|
|
2839
|
+
const SHILING = ['甲辰', '乙亥', '丙辰', '丁酉', '戊午', '庚戌', '庚寅', '辛亥', '壬寅', '癸未'];
|
|
2840
|
+
// 八专:日柱
|
|
2841
|
+
const BAZHUAN = ['甲寅', '乙卯', '丁未', '戊戌', '己未', '庚申', '辛酉', '癸丑'];
|
|
2842
|
+
// 九丑:日柱
|
|
2843
|
+
const JIUCHOU = ['丁酉', '戊子', '戊午', '己卯', '己酉', '辛卯', '辛酉', '壬子', '壬午'];
|
|
2844
|
+
// 天转:寅卯辰月乙卯、巳午未月丙午、申酉戌月辛酉、亥子丑月壬子(日柱)
|
|
2845
|
+
const TIANZH = { 春: '乙卯', 夏: '丙午', 秋: '辛酉', 冬: '壬子' };
|
|
2846
|
+
// 地转:春辛卯、夏戊午、秋癸酉、冬丙子(日柱)
|
|
2847
|
+
const DIZH = { 春: '辛卯', 夏: '戊午', 秋: '癸酉', 冬: '丙子' };
|
|
2848
|
+
// 学堂(纳音长生查法,问真采用第一种):年纳音五行 → 支
|
|
2849
|
+
const XUETANG = { 金: '巳', 木: '亥', 水: '申', 土: '申', 火: '寅' };
|
|
2850
|
+
// 词馆(纳音临官查法):年纳音五行 → 支
|
|
2851
|
+
const CIGUAN = { 金: '申', 木: '寅', 水: '亥', 土: '亥', 火: '巳' };
|
|
2852
|
+
|
|
2815
2853
|
// ── 规则工厂 ────────────────────────────────────────────────────
|
|
2816
2854
|
|
|
2817
2855
|
/** 天干查支:天乙、太极、文昌、福星、天官、国印、天厨、禄神、羊刃、飞刃、金舆、流霞 */
|
|
@@ -2884,8 +2922,16 @@ const RULES = [
|
|
|
2884
2922
|
const he = k && YUEDE[k] ? YUEDE_HE[YUEDE[k]] : null;
|
|
2885
2923
|
return he ? [S(he)] : [];
|
|
2886
2924
|
}),
|
|
2925
|
+
byMonth('天德合', '贵人', 'good',
|
|
2926
|
+
'天德之合:寅月丁德→壬合、卯月申→巳、辰月壬→丁、巳月辛→丙、午月亥→寅、未月甲→己、申月癸→戊、酉月寅→亥、戌月丙→辛、亥月乙→庚、子月巳→申、丑月庚→乙(月支查干或支;无天德时天德合同样起作用)',
|
|
2927
|
+
(ctx) => {
|
|
2928
|
+
const ch = TIANDE_HE[ctx.pillars.month.branch];
|
|
2929
|
+
if (!ch) return [];
|
|
2930
|
+
return STEMS_LIST.includes(ch) ? [S(ch)] : [T(ch)];
|
|
2931
|
+
}),
|
|
2887
2932
|
byStem('福星贵人', '贵人', 'good',
|
|
2888
|
-
'
|
|
2933
|
+
'甲丙见寅子,乙癸见卯丑,戊见申、己见未、丁见亥、庚见午、辛见巳、壬见辰(年干、日干查四支)。'
|
|
2934
|
+
+ '出自《甲丙相邀入虎乡歌》「戊猴己未丁宜亥」;旧本有作丁见酉者,与歌诀不合,本插件从歌诀',
|
|
2889
2935
|
FUXING, ['year', 'day']),
|
|
2890
2936
|
byStem('天官贵人', '贵人', 'good',
|
|
2891
2937
|
'甲未、乙辰、丙巳、丁酉、戊戌、己卯、庚亥、辛申、壬午、癸寅(年干、日干查四支;此表流派有异)',
|
|
@@ -2946,26 +2992,61 @@ const RULES = [
|
|
|
2946
2992
|
byStem('金舆', '婚姻', 'good',
|
|
2947
2993
|
'禄前二位:甲龙乙蛇丙戊羊、丁己申宫庚犬乡、辛猪壬牛癸虎位(日干查四支)',
|
|
2948
2994
|
JINYU, ['day']),
|
|
2995
|
+
byStem('红艳煞', '婚姻', 'neutral',
|
|
2996
|
+
'甲乙午、丙寅、丁未、戊己辰、庚戌、辛酉、壬子、癸申(日干查四支)',
|
|
2997
|
+
HONGYAN, ['day']),
|
|
2998
|
+
byPillarGz('孤鸾煞', '婚姻', 'bad',
|
|
2999
|
+
'日柱甲寅、乙巳、丙午、丁巳、戊午、戊申、辛亥、壬子(日柱见之;又名呻吟煞)',
|
|
3000
|
+
GUALUAN),
|
|
3001
|
+
// 勾绞煞:桃花六冲之位,阳男阴女命前三辰为勾、后三辰为绞;阴男阳女反之
|
|
3002
|
+
byRefBranch('勾绞煞', '婚姻', 'bad',
|
|
3003
|
+
'桃花六冲之位:子见卯酉、丑见辰戌、寅见巳亥……(年支查余三支;阳男阴女命前三辰为勾后三为绞,阴男阳女反之)',
|
|
3004
|
+
(ctx) => {
|
|
3005
|
+
const idx = BRANCHES.indexOf(ctx.pillars.year.branch);
|
|
3006
|
+
const qian = BRANCHES[(idx + 3) % 12];
|
|
3007
|
+
const hou = BRANCHES[(idx + 9) % 12];
|
|
3008
|
+
const gouxian = ctx.gender === 'male'
|
|
3009
|
+
? ((idx % 2) === 0) // 阳男:命前为勾
|
|
3010
|
+
: ((idx % 2) === 1); // 阴女:命前为勾
|
|
3011
|
+
return gouxian
|
|
3012
|
+
? [{ kind: 'branch', ch: qian, label: '勾' }, { kind: 'branch', ch: hou, label: '绞' }]
|
|
3013
|
+
: [{ kind: 'branch', ch: hou, label: '勾' }, { kind: 'branch', ch: qian, label: '绞' }];
|
|
3014
|
+
}),
|
|
3015
|
+
// 元辰:阳男阴女年支后一辰冲位、阴男阳女前一辰冲位(问真:阳男阴女子年未…阴男阳女子年巳…)
|
|
3016
|
+
byRefBranch('元辰', '凶煞', 'bad',
|
|
3017
|
+
'阳男阴女:子见未、丑见申、寅见酉……(年支次一位的对冲);阴男阳女:子见巳、丑见午……(年支退一位的对冲)(年支查余三支;又名毛头星、大耗)',
|
|
3018
|
+
(ctx) => {
|
|
3019
|
+
const idx = BRANCHES.indexOf(ctx.pillars.year.branch);
|
|
3020
|
+
const yangNan = ctx.gender === 'male'
|
|
3021
|
+
? ((idx % 2) === 0)
|
|
3022
|
+
: ((idx % 2) === 1);
|
|
3023
|
+
const base = yangNan ? (idx + 1) % 12 : (idx + 11) % 12;
|
|
3024
|
+
return [T(BRANCHES[(base + 6) % 12])];
|
|
3025
|
+
}),
|
|
2949
3026
|
|
|
2950
3027
|
// 性情
|
|
2951
3028
|
byTrio('华盖', '性情', 'neutral',
|
|
2952
3029
|
'寅午戌见戌、申子辰见辰、巳酉丑见丑、亥卯未见未(年支、日支双查)',
|
|
2953
3030
|
HUAGAI),
|
|
2954
3031
|
byStem('羊刃', '性情', 'bad',
|
|
2955
|
-
'
|
|
3032
|
+
'帝旺之位:甲卯、乙寅、丙午、丁巳、戊午、己巳、庚酉、辛申、壬子、癸亥(日干查四支)。'
|
|
3033
|
+
+ '旧本把阴干记作禄前一位(乙辰、丁未、己未、辛戌、癸丑),那一位实为阴干之「衰」,与十二长生自相矛盾,本插件不取',
|
|
2956
3034
|
YANGREN, ['day']),
|
|
2957
3035
|
byStem('飞刃', '性情', 'bad',
|
|
2958
|
-
'
|
|
3036
|
+
'羊刃六冲(由羊刃位逐干对冲推得,不另立表):甲酉、乙申、丙子、丁亥、戊子、己亥、庚卯、辛寅、壬午、癸巳(日干查四支)',
|
|
2959
3037
|
FEIREN, ['day']),
|
|
2960
3038
|
byPillarGz('魁罡', '性情', 'neutral',
|
|
2961
3039
|
'日柱庚辰、庚戌、壬辰、戊戌(日柱见之)',
|
|
2962
3040
|
KUIGANG),
|
|
2963
3041
|
byMonth('童子煞', '性情', 'neutral',
|
|
2964
|
-
'
|
|
3042
|
+
'两法并行:①季节法——春秋生见寅子,冬夏生见卯未辰(查日支、时支);'
|
|
3043
|
+
+ '②纳音法——金木命见午卯,水火命见酉戌,土命见辰巳(年柱纳音查日支、时支)。任一中即算',
|
|
2965
3044
|
(ctx) => {
|
|
3045
|
+
const set = new Set();
|
|
2966
3046
|
const season = SEASON[ctx.pillars.month.branch];
|
|
2967
|
-
const
|
|
2968
|
-
|
|
3047
|
+
for (const b of (season && TONGZI[season]) || []) set.add(b);
|
|
3048
|
+
for (const b of TONGZI_NAYIN[ctx.nayinElement] || []) set.add(b);
|
|
3049
|
+
return [...set].map(T);
|
|
2969
3050
|
}, ['day', 'hour']),
|
|
2970
3051
|
byPillarGz('六秀日', '性情', 'good',
|
|
2971
3052
|
'日柱丙午、丁未、戊子、戊午、己丑、己未(日柱见之)',
|
|
@@ -2976,6 +3057,15 @@ const RULES = [
|
|
|
2976
3057
|
byPillarGz('日贵', '性情', 'good',
|
|
2977
3058
|
'日柱丁酉、丁亥、癸巳、癸卯(日柱见之)',
|
|
2978
3059
|
RIGUI),
|
|
3060
|
+
byPillarGz('十灵日', '性情', 'good',
|
|
3061
|
+
'日柱甲辰、乙亥、丙辰、丁酉、戊午、庚戌、庚寅、辛亥、壬寅、癸未(日柱见之;「男带十灵好文章,女带十灵好衣裳」)',
|
|
3062
|
+
SHILING),
|
|
3063
|
+
byPillarGz('八专', '性情', 'neutral',
|
|
3064
|
+
'日柱甲寅、乙卯、丁未、戊戌、己未、庚申、辛酉、癸丑(日柱见之;干支同气坐禄或冠带)',
|
|
3065
|
+
BAZHUAN),
|
|
3066
|
+
byPillarGz('九丑', '性情', 'neutral',
|
|
3067
|
+
'日柱丁酉、戊子、戊午、己卯、己酉、辛卯、辛酉、壬子、壬午(日柱见之;「丑」指名声风评非容貌)',
|
|
3068
|
+
JIUCHOU),
|
|
2979
3069
|
|
|
2980
3070
|
// 事业
|
|
2981
3071
|
byStem('禄神', '事业', 'good',
|
|
@@ -3000,10 +3090,19 @@ const RULES = [
|
|
|
3000
3090
|
WANGSHEN),
|
|
3001
3091
|
{
|
|
3002
3092
|
name: '空亡', cat: '凶煞', luck: 'bad',
|
|
3003
|
-
|
|
3093
|
+
// 日柱旬空为古法正传;年柱旬空另有一派(以年柱所在旬的空亡查余三支),
|
|
3094
|
+
// 两派所据都是「本旬无支可用」,逻辑同构,故并列而不取此舍彼。
|
|
3095
|
+
rule: '以日柱所在旬的空亡反查各柱地支(日柱旬空,主法);另有年柱旬空一派,一并标出',
|
|
3004
3096
|
refs: ['day'], refKind: 'branch', viaLabel: '日柱旬空',
|
|
3005
3097
|
targets: (ctx) => (ctx.kongwang || []).map(T),
|
|
3006
3098
|
},
|
|
3099
|
+
{
|
|
3100
|
+
name: '年空', cat: '凶煞', luck: 'bad',
|
|
3101
|
+
rule: '以年柱所在旬的空亡反查其余三支(年柱旬空;古法多取日柱旬空,此派并存,命中单独标注)',
|
|
3102
|
+
refs: ['year'], refKind: 'branch', viaLabel: '年柱旬空',
|
|
3103
|
+
slots: ['month', 'day', 'hour'],
|
|
3104
|
+
targets: (ctx) => (ctx.yearKongwang || []).map(T),
|
|
3105
|
+
},
|
|
3007
3106
|
byPillarGz('十恶大败', '凶煞', 'bad',
|
|
3008
3107
|
'日柱甲辰、乙巳、丙申、丁亥、戊戌、己丑、庚辰、辛巳、壬申、癸亥(日柱见之)',
|
|
3009
3108
|
SHIE_DABAI),
|
|
@@ -3020,6 +3119,30 @@ const RULES = [
|
|
|
3020
3119
|
byStem('流霞', '凶煞', 'bad',
|
|
3021
3120
|
'甲酉、乙戌、丙未、丁申、戊巳、己午、庚辰、辛卯、壬亥、癸寅(日干查四支;通行表)',
|
|
3022
3121
|
LIUXIA, ['day']),
|
|
3122
|
+
byMonth('血刃', '凶煞', 'bad',
|
|
3123
|
+
'寅月丑、卯月未、辰月寅、巳月申、午月卯、未月酉、申月辰、酉月戌、戌月巳、亥月亥、子月午、丑月子(月支查四支)',
|
|
3124
|
+
(ctx) => {
|
|
3125
|
+
const ch = XUEYREN[ctx.pillars.month.branch];
|
|
3126
|
+
return ch ? [T(ch)] : [];
|
|
3127
|
+
}),
|
|
3128
|
+
byRefBranch('丧门', '凶煞', 'bad',
|
|
3129
|
+
'年支前两位:子见寅、丑见卯……(年支查余三支)',
|
|
3130
|
+
(ctx) => {
|
|
3131
|
+
const idx = BRANCHES.indexOf(ctx.pillars.year.branch);
|
|
3132
|
+
return [T(BRANCHES[(idx + 2) % 12])];
|
|
3133
|
+
}),
|
|
3134
|
+
byRefBranch('吊客', '凶煞', 'bad',
|
|
3135
|
+
'年支后两位:子见戌、丑见亥……(年支查余三支)',
|
|
3136
|
+
(ctx) => {
|
|
3137
|
+
const idx = BRANCHES.indexOf(ctx.pillars.year.branch);
|
|
3138
|
+
return [T(BRANCHES[(idx + 10) % 12])];
|
|
3139
|
+
}),
|
|
3140
|
+
byRefBranch('披麻', '凶煞', 'bad',
|
|
3141
|
+
'年支后三位:子见酉、丑见戌……(年支查余三支)',
|
|
3142
|
+
(ctx) => {
|
|
3143
|
+
const idx = BRANCHES.indexOf(ctx.pillars.year.branch);
|
|
3144
|
+
return [T(BRANCHES[(idx + 9) % 12])];
|
|
3145
|
+
}),
|
|
3023
3146
|
|
|
3024
3147
|
// 格局
|
|
3025
3148
|
byMonth('天赦日', '格局', 'good',
|
|
@@ -3032,15 +3155,55 @@ const RULES = [
|
|
|
3032
3155
|
byPillarGz('金神', '格局', 'neutral',
|
|
3033
3156
|
'时柱乙丑、己巳、癸酉(时柱见之;严格成格另需日主身旺,此仅记星)',
|
|
3034
3157
|
JINSHEN, 'hour'),
|
|
3158
|
+
// 拱禄:五日五时,日时同干、虚拱禄支(癸亥日癸丑时拱子、癸丑日癸亥时拱子、丁巳日丁未时拱午、己未日己巳时拱午、戊辰日戊午时拱巳)
|
|
3159
|
+
{
|
|
3160
|
+
name: '拱禄', cat: '格局', luck: 'good',
|
|
3161
|
+
rule: '日时同干而禄位虚拱:癸亥日癸丑时、癸丑日癸亥时(拱子),丁巳日丁未时、己未日己巳时(拱午),戊辰日戊午时(拱巳);只宜虚拱,忌填实空亡',
|
|
3162
|
+
custom: (ctx) => {
|
|
3163
|
+
const GONG = { '癸亥|癸丑': '子', '癸丑|癸亥': '子', '丁巳|丁未': '午', '己未|己巳': '午', '戊辰|戊午': '巳' };
|
|
3164
|
+
const k = `${ctx.pillars.day.ganzhi}|${ctx.pillars.hour.ganzhi}`;
|
|
3165
|
+
return GONG[k] ? [{ pillars: ['day', 'hour'], via: '日时', target: GONG[k] }] : [];
|
|
3166
|
+
},
|
|
3167
|
+
},
|
|
3168
|
+
// 天转 / 地转:以月支定季节查日柱(五行旺极之日,盛极而衰)
|
|
3169
|
+
byMonth('天转', '凶煞', 'bad',
|
|
3170
|
+
'春乙卯、夏丙午、秋辛酉、冬壬子(月支定季节查日柱;「春兔夏马天地转,秋鸡冬鼠便为殃」)',
|
|
3171
|
+
(ctx) => {
|
|
3172
|
+
const season = SEASON[ctx.pillars.month.branch];
|
|
3173
|
+
const gz = ctx.pillars.day.ganzhi;
|
|
3174
|
+
return season && TIANZH[season] === gz ? [GZ(gz)] : [];
|
|
3175
|
+
}, ['day']),
|
|
3176
|
+
byMonth('地转', '凶煞', 'bad',
|
|
3177
|
+
'春辛卯、夏戊午、秋癸酉、冬丙子(月支定季节查日柱)',
|
|
3178
|
+
(ctx) => {
|
|
3179
|
+
const season = SEASON[ctx.pillars.month.branch];
|
|
3180
|
+
const gz = ctx.pillars.day.ganzhi;
|
|
3181
|
+
return season && DIZH[season] === gz ? [GZ(gz)] : [];
|
|
3182
|
+
}, ['day']),
|
|
3183
|
+
// 学堂 / 词馆:年柱纳音五行的长生 / 临官之支(问真采用禄命法第一种;正学堂另需干支同见,此仅记支)
|
|
3184
|
+
{
|
|
3185
|
+
name: '学堂', cat: '文星', luck: 'good',
|
|
3186
|
+
rule: '年纳音五行之长生:金见巳、木见亥、水见申、土见申、火见寅(年纳音查月日时支;学堂为纳音长生,主人聪明文才出众)',
|
|
3187
|
+
refs: ['year'], refKind: 'branch', viaLabel: '年纳音', slots: ['month', 'day', 'hour'],
|
|
3188
|
+
targets: (ctx) => [T(XUETANG[ctx.nayinElement] || '')].filter((t) => t.ch),
|
|
3189
|
+
},
|
|
3190
|
+
{
|
|
3191
|
+
name: '词馆', cat: '文星', luck: 'good',
|
|
3192
|
+
rule: '年纳音五行之临官:金见申、木见寅、水见亥、土见亥、火见巳(年纳音查月日时支;词馆为纳音临官,主文章学识)',
|
|
3193
|
+
refs: ['year'], refKind: 'branch', viaLabel: '年纳音', slots: ['month', 'day', 'hour'],
|
|
3194
|
+
targets: (ctx) => [T(CIGUAN[ctx.nayinElement] || '')].filter((t) => t.ch),
|
|
3195
|
+
},
|
|
3035
3196
|
{
|
|
3036
3197
|
name: '天罗', cat: '凶煞', luck: 'bad',
|
|
3037
|
-
rule: '
|
|
3038
|
-
|
|
3198
|
+
rule: '戌亥为天罗。法一以年支/日支查余三支:戌见亥、亥见戌即算,不要求四支俱全;'
|
|
3199
|
+
+ '法二以年柱纳音查日支:火命见戌或亥。两法任一成立即命中(男忌天罗)',
|
|
3200
|
+
custom: (ctx) => luowangPair(ctx, '戌', '亥', '天罗', ['火']),
|
|
3039
3201
|
},
|
|
3040
3202
|
{
|
|
3041
3203
|
name: '地网', cat: '凶煞', luck: 'bad',
|
|
3042
|
-
rule: '
|
|
3043
|
-
|
|
3204
|
+
rule: '辰巳为地网。法一以年支/日支查余三支:辰见巳、巳见辰即算,不要求四支俱全;'
|
|
3205
|
+
+ '法二以年柱纳音查日支:水命、土命见辰或巳。两法任一成立即命中(女忌地网)',
|
|
3206
|
+
custom: (ctx) => luowangPair(ctx, '辰', '巳', '地网', ['水', '土']),
|
|
3044
3207
|
},
|
|
3045
3208
|
{
|
|
3046
3209
|
name: '三奇贵人', cat: '格局', luck: 'good',
|
|
@@ -3056,11 +3219,29 @@ const RULES = [
|
|
|
3056
3219
|
},
|
|
3057
3220
|
];
|
|
3058
3221
|
|
|
3059
|
-
/**
|
|
3060
|
-
|
|
3061
|
-
|
|
3062
|
-
|
|
3063
|
-
|
|
3222
|
+
/**
|
|
3223
|
+
* 天罗地网:两法并行,任一成立即命中。
|
|
3224
|
+
* 法一(主):以年支/日支查余三支——戌见亥、亥见戌为天罗;辰见巳、巳见辰为地网。只需两支成对,
|
|
3225
|
+
* 不要求四支俱全(旧实现要求「戌亥俱全」,四支里必须同时出现戌与亥,漏掉大半)。
|
|
3226
|
+
* 法二(辅):以年柱纳音查日支——火命见戌或亥为天罗,水命、土命见辰或巳为地网,金木二命无。
|
|
3227
|
+
* 命中时把「起查柱」与「应柱」都标出来,否则只看天罗在亥那一柱,读盘时找不到起因。
|
|
3228
|
+
*/
|
|
3229
|
+
function luowangPair(ctx, a, b, label, nayinEls) {
|
|
3230
|
+
const out = [];
|
|
3231
|
+
// 法一:以年/日支查余三支(只需两支成对)
|
|
3232
|
+
for (const ref of ['year', 'day']) {
|
|
3233
|
+
const rb = ctx.pillars[ref].branch;
|
|
3234
|
+
const want = rb === a ? b : rb === b ? a : null;
|
|
3235
|
+
if (!want) continue;
|
|
3236
|
+
const hits = PILLAR_KEYS.filter((k) => k !== ref && ctx.pillars[k].branch === want);
|
|
3237
|
+
for (const k of hits) out.push({ pillars: [ref, k], via: BRANCH_VIA[ref], target: want });
|
|
3238
|
+
}
|
|
3239
|
+
// 法二:以年纳音查日支
|
|
3240
|
+
if (nayinEls.includes(ctx.nayinElement) && (ctx.pillars.day.branch === a || ctx.pillars.day.branch === b)) {
|
|
3241
|
+
out.push({ pillars: ['day'], via: `年纳音${ctx.nayinElement}`, target: ctx.pillars.day.branch });
|
|
3242
|
+
}
|
|
3243
|
+
void label;
|
|
3244
|
+
return out;
|
|
3064
3245
|
}
|
|
3065
3246
|
|
|
3066
3247
|
// ── 执行 ────────────────────────────────────────────────────────
|
|
@@ -3092,12 +3273,19 @@ function runRule(r, ctx) {
|
|
|
3092
3273
|
* 计算八字神煞
|
|
3093
3274
|
* @param {object} pillars { year, month, day, hour },每柱需有 stem/branch/ganzhi
|
|
3094
3275
|
* @param {string[]} kongwang 日柱旬空的两个地支
|
|
3276
|
+
* @param {object} [opts] { gender?: 'male'|'female', yearNayinElement?: string }
|
|
3277
|
+
* gender 供勾绞煞 / 元辰辨阴阳男女;yearNayinElement 供学堂 / 词馆(年柱纳音五行)
|
|
3095
3278
|
* @returns {{ detail: object, groups: array, names: string[], count: number }}
|
|
3096
3279
|
* detail[key] = [{ name, cat, luck, via, target, rule }]
|
|
3097
3280
|
* groups = [{ cat, items: [{ name, luck, pillars, via, target, rule }] }]
|
|
3098
3281
|
*/
|
|
3099
|
-
function computeBaziShensha(pillars, kongwang = []) {
|
|
3100
|
-
const ctx = {
|
|
3282
|
+
function computeBaziShensha(pillars, kongwang = [], opts = {}) {
|
|
3283
|
+
const ctx = {
|
|
3284
|
+
pillars, kongwang,
|
|
3285
|
+
gender: opts.gender,
|
|
3286
|
+
nayinElement: opts.yearNayinElement,
|
|
3287
|
+
yearKongwang: opts.yearKongwang || [],
|
|
3288
|
+
};
|
|
3101
3289
|
const items = [];
|
|
3102
3290
|
for (const r of RULES) {
|
|
3103
3291
|
const hits = runRule(r, ctx);
|
|
@@ -6677,7 +6865,15 @@ function buildBazi(input) {
|
|
|
6677
6865
|
const monthBranch = pillars.month.branch;
|
|
6678
6866
|
|
|
6679
6867
|
// 神煞:表驱动、双查法(年干/日干、年支/日支、月支、日柱、时柱),详见 engine/shensha.js
|
|
6680
|
-
|
|
6868
|
+
// gender 供勾绞煞/元辰辨阴阳男女;年柱纳音五行供学堂/词馆
|
|
6869
|
+
const shensha = computeBaziShensha(pillars, kongwang, {
|
|
6870
|
+
gender,
|
|
6871
|
+
// nayin() 返回的是纳音名(字符串),不是对象——取五行须走 nayinOf()。
|
|
6872
|
+
// 这里长期写成 nayin(yearIdx).element 恒为 undefined,导致学堂/词馆(纳音长生/临官)
|
|
6873
|
+
// 与童子煞纳音法在真实排盘里从未命中过;单测因为直接喂了 yearNayinElement 而没暴露。
|
|
6874
|
+
yearNayinElement: nayinOf(yearIdx).element,
|
|
6875
|
+
yearKongwang: xunKongOf(pillars.year.ganzhi),
|
|
6876
|
+
});
|
|
6681
6877
|
|
|
6682
6878
|
for (const key of ['year', 'month', 'day', 'hour']) {
|
|
6683
6879
|
const pl = pillars[key];
|
|
@@ -29467,7 +29663,7 @@ return { interpret, DIRECTIONS, DIRECTION_DEFAULT, BRIGHTNESS, flowOf, parseDate
|
|
|
29467
29663
|
})();
|
|
29468
29664
|
|
|
29469
29665
|
window.Engine = __mods.index;
|
|
29470
|
-
window.__MP_VER = "0.
|
|
29666
|
+
window.__MP_VER = "0.66.0";
|
|
29471
29667
|
</script>
|
|
29472
29668
|
<script>
|
|
29473
29669
|
// 两个 UI 共用的表单规则:宿主面板(src/app.js)与独立页(src/web-ui.js)。
|