dsh-metaphysics 0.69.0 → 0.71.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 +65 -0
- package/README.md +1 -1
- package/client.almanac.js +48 -48
- package/client.chart.js +88 -88
- package/client.chenggu.js +53 -53
- package/client.constitution.js +52 -52
- package/client.convert.js +46 -46
- package/client.daliuren.js +77 -77
- package/client.fengshui.js +35 -35
- package/client.js +393 -285
- package/client.liuyao.js +84 -84
- package/client.mbti.js +46 -46
- package/client.name.js +50 -50
- package/client.numerology.js +49 -49
- package/client.qimen.js +79 -79
- package/client.star.js +49 -49
- package/client.taiyi.js +74 -74
- package/client.tarot.js +88 -88
- package/client.wuyunliuqi.js +34 -34
- package/client.xiaoliuren.js +37 -37
- package/client.zeri.js +51 -51
- package/engine/index.js +20 -2
- package/engine/plain-summary.js +29 -2
- package/engine/taiyi.js +529 -12
- package/package.json +1 -1
- package//345/221/275/347/220/206/346/216/222/347/233/230.html +765 -30
|
@@ -361,7 +361,7 @@ h3::after{content:"";flex:1;height:1px;background:linear-gradient(90deg,var(--li
|
|
|
361
361
|
<div class="wrap">
|
|
362
362
|
<header>
|
|
363
363
|
<div class="brand-row">
|
|
364
|
-
<div class="brand"><span class="seal" aria-hidden="true">命</span><span class="brand-txt">命理排盘<span class="ver">v0.
|
|
364
|
+
<div class="brand"><span class="seal" aria-hidden="true">命</span><span class="brand-txt">命理排盘<span class="ver">v0.71.0</span><small>八字 · 紫微 · 六爻 · 梅花 · 六壬 · 奇门 · 合盘 · 塔罗 全部在本机计算</small></span></div>
|
|
365
365
|
<div class="view-switch">
|
|
366
366
|
<span class="hint">熟练了可以换回平铺</span>
|
|
367
367
|
<span class="seg" role="group" aria-label="首屏样式">
|
|
@@ -679,7 +679,7 @@ h3::after{content:"";flex:1;height:1px;background:linear-gradient(90deg,var(--li
|
|
|
679
679
|
<h3>对拍:把典籍当期望值</h3>
|
|
680
680
|
<ul><li>六爻:京房八宫卦序与世应,64 卦全表;旬空六旬表</li><li>六壬:日干寄宫、中气换将;紫微:纳音定五行局、紫微天府相照</li><li>卦例:《增删卜易》9 条 +《卜筮正宗》128 条(93 成对 + 35 静卦),核本变卦 / 动爻数 / 卦宫 / 缺爻 / 旬空</li><li>奇门:20 个时辰 × 9 宫,核四柱 / 局数 / 值符 / 值使 / 星门神 / 天盘干</li></ul>
|
|
681
681
|
<h3>工程验证</h3>
|
|
682
|
-
<ul><li>测试:177 个测试文件 /
|
|
682
|
+
<ul><li>测试:177 个测试文件 / 10078 条断言;七道闸(回归 · 断言基线 · 测试可失败自检 · HTML 注入面 · 工程约定 · 产物宿主形态 · 随机扫射)</li><li>可复现:seed / asOf 显式;同一输入同一输出</li><li>口径:晚子时、真太阳时、奇门三流派、闰月归月都可切换,并有字段级差异对照</li></ul>
|
|
683
683
|
|
|
684
684
|
<h3>已知边界(不猜)</h3>
|
|
685
685
|
<ul><li>六爻应期(具体哪天应验)不做;卦例只录动爻个数,不录爻位</li><li>财富/健康只给结构判断与档位,不给金额区间、不作诊断</li><li>紫微飞星已做「单一支化逐宫追到成环」与「三方四正 16 条按落宫归堆」,但都未叠大限流年四化、不折吉凶;八字交运日已能算到日/时,但未与第三方排盘案例批量对拍</li></ul>
|
|
@@ -19268,11 +19268,22 @@ __mods.taiyi = (function () {
|
|
|
19268
19268
|
// 6. 文昌:积年 mod 18,阳局自武德(申)起、阴局自吕申(寅)起,顺行十六神,
|
|
19269
19269
|
// 遇阴德(乾)、大武(坤)各数两次
|
|
19270
19270
|
//
|
|
19271
|
-
//
|
|
19272
|
-
//
|
|
19273
|
-
//
|
|
19274
|
-
//
|
|
19271
|
+
// 7. 计神:积年 mod 60 得六十甲子序,从寅起逆数十二支
|
|
19272
|
+
// 8. 始击:计神加和德(艮)之宫,天目(文昌)随盘移一位,即始击
|
|
19273
|
+
// 9. 主算 / 客算:沿九宫环顺行累加宫数,天目在正宫按本数、在间神先计一,
|
|
19274
|
+
// 数到太乙宫前一位为止
|
|
19275
|
+
// 10. 大将 = 算数个位(得十置一),参将 = 大将 × 3 的个位
|
|
19276
|
+
// 11. 掩、迫、囚、格、关五种位置关系
|
|
19277
|
+
//
|
|
19278
|
+
// 12. 定目、三基、五福、大游、十精、八种格局、阴阳数和
|
|
19279
|
+
// 13. 月计 / 日计 / 时计:按《太乙金镜式经》卷一的积月、积日、时实三套推法
|
|
19280
|
+
// 14. 古法吉凶:按卷一《推太公考时法》——八种相犯全无、主客数和,算和顺;
|
|
19281
|
+
// 命中任何一犯,古法算相犯。这是古籍的占断口径,不是预测,文案里必须写明。
|
|
19282
|
+
//
|
|
19283
|
+
// 没有做的(scope 里写明,别在文案里假装有):四神拆成本身与绛宫、明堂、玉堂
|
|
19284
|
+
// 十二位全序;胜负断辞与三旗五将。
|
|
19275
19285
|
|
|
19286
|
+
const { termInstantJd, toJDN, jdToParts, dayGanzhiIndex, STEMS } = (__mods.calendar || {});
|
|
19276
19287
|
const { assertCivil } = (__mods.validate || {});
|
|
19277
19288
|
const { assertObject } = (__mods.validate || {});
|
|
19278
19289
|
|
|
@@ -19330,6 +19341,212 @@ const FIVE_YUAN = ['甲子元', '丙子元', '戊子元', '庚子元', '壬子
|
|
|
19330
19341
|
/** 三理:太乙在每一宫理天、理地、理人各一年 */
|
|
19331
19342
|
const THREE_LI = ['理天', '理地', '理人'];
|
|
19332
19343
|
|
|
19344
|
+
/** 《太乙金镜式经》卷一的天文常数:章岁、章月、日法、月法 */
|
|
19345
|
+
const ZHANG_SUI = 657;
|
|
19346
|
+
const ZHANG_YUE = 8726;
|
|
19347
|
+
const RI_FA = 49;
|
|
19348
|
+
const YUE_FA = 2447;
|
|
19349
|
+
|
|
19350
|
+
/** 二十四局一周 → 宫序(起一宫顺行八宫、不游中五)与入宫第几期 */
|
|
19351
|
+
function palaceFromR24(r24) {
|
|
19352
|
+
const k = Math.ceil(r24 / 3);
|
|
19353
|
+
const inPalace = r24 - (k - 1) * 3 || 3;
|
|
19354
|
+
return { k, palace: YANG_WALK[k - 1], inPalace };
|
|
19355
|
+
}
|
|
19356
|
+
|
|
19357
|
+
/** 从某支起、逆行第 n 步(n 取 1..12,1 就是起点) */
|
|
19358
|
+
function branchWalk(startIdx, step) {
|
|
19359
|
+
const idx = (((startIdx - (step - 1)) % 12) + 12) % 12;
|
|
19360
|
+
return { idx, branch: BRANCH_NAMES[idx] };
|
|
19361
|
+
}
|
|
19362
|
+
|
|
19363
|
+
/** 十六神顺行第 n 步:遇阴德(乾)、大武(坤)各数两次,故十八步一周 */
|
|
19364
|
+
function sixteenStep(startGod, rest18) {
|
|
19365
|
+
const start = SIXTEEN.findIndex((x) => x.god === startGod);
|
|
19366
|
+
const steps = [];
|
|
19367
|
+
for (let i = 0; i < SIXTEEN.length; i += 1) {
|
|
19368
|
+
const cur = SIXTEEN[(start + i) % SIXTEEN.length];
|
|
19369
|
+
steps.push(cur);
|
|
19370
|
+
if (cur.pos === '乾' || cur.pos === '坤') steps.push(cur);
|
|
19371
|
+
}
|
|
19372
|
+
return steps[rim(rest18, 18) - 1];
|
|
19373
|
+
}
|
|
19374
|
+
|
|
19375
|
+
/** 月计:积月 = ⌊积年 × 章月 ÷ 章岁⌋,其余数称闰余 */
|
|
19376
|
+
function monthJiOf(jinian) {
|
|
19377
|
+
const jiyue = Number((BigInt(jinian) * BigInt(ZHANG_YUE)) / BigInt(ZHANG_SUI));
|
|
19378
|
+
const r24 = rim(jiyue, 24);
|
|
19379
|
+
const t = palaceFromR24(r24);
|
|
19380
|
+
const mu = sixteenStep('武德', rim(jiyue, 18));
|
|
19381
|
+
const js = branchWalk(2, rim(rim(jiyue, 60), 12));
|
|
19382
|
+
return {
|
|
19383
|
+
jiyue,
|
|
19384
|
+
taiyi: { rest24: r24, palace: t.palace, palaceName: PALACES[t.palace].name, unitInPalace: t.inPalace },
|
|
19385
|
+
mu: { pos: mu.pos, god: mu.god, palace: mu.num },
|
|
19386
|
+
jishen: js,
|
|
19387
|
+
};
|
|
19388
|
+
}
|
|
19389
|
+
|
|
19390
|
+
/** 日计:积日 = ⌊积月 × 月法 ÷ 日法⌋ */
|
|
19391
|
+
function dayJiOf(jinian) {
|
|
19392
|
+
const jiyue = Number((BigInt(jinian) * BigInt(ZHANG_YUE)) / BigInt(ZHANG_SUI));
|
|
19393
|
+
const jiri = Number((BigInt(jiyue) * BigInt(YUE_FA)) / BigInt(RI_FA));
|
|
19394
|
+
const r24 = rim(jiri, 24);
|
|
19395
|
+
const t = palaceFromR24(r24);
|
|
19396
|
+
const mu = sixteenStep('武德', rim(jiri, 18));
|
|
19397
|
+
const js = branchWalk(2, rim(rim(jiri, 60), 12));
|
|
19398
|
+
return {
|
|
19399
|
+
jiri,
|
|
19400
|
+
taiyi: { rest24: r24, palace: t.palace, palaceName: PALACES[t.palace].name, unitInPalace: t.inPalace },
|
|
19401
|
+
mu: { pos: mu.pos, god: mu.god, palace: mu.num },
|
|
19402
|
+
jishen: js,
|
|
19403
|
+
};
|
|
19404
|
+
}
|
|
19405
|
+
|
|
19406
|
+
/** 时计:以上年冬至为天正、十二时一辰,时实 = (冬至积日 − 1) × 12 + 时辰序 */
|
|
19407
|
+
function hourJiOf(datetime) {
|
|
19408
|
+
const { year, month, day, hour } = datetime;
|
|
19409
|
+
const wp = jdToParts(termInstantJd(year - 1, 23));
|
|
19410
|
+
const winterJdn = toJDN(wp.year, wp.month, wp.day);
|
|
19411
|
+
const summerJd = termInstantJd(year, 11);
|
|
19412
|
+
const nowJd = toJDN(year, month, day) - 0.5 + (hour * 60) / 1440;
|
|
19413
|
+
const dun = nowJd >= summerJd ? 'yin' : 'yang';
|
|
19414
|
+
const hIdx = Math.floor(((hour + 1) % 24) / 2);
|
|
19415
|
+
const shiShi = (winterJdn - 1) * 12 + hIdx;
|
|
19416
|
+
const r24 = rim(shiShi, 24);
|
|
19417
|
+
const t = palaceFromR24(r24);
|
|
19418
|
+
const start = dun === 'yang' ? 2 : 8;
|
|
19419
|
+
const js = branchWalk(start, rim(rim(shiShi, 60), 12));
|
|
19420
|
+
return {
|
|
19421
|
+
shiShi,
|
|
19422
|
+
dun,
|
|
19423
|
+
taiyi: { rest24: r24, palace: t.palace, palaceName: PALACES[t.palace].name, unitInPalace: t.inPalace },
|
|
19424
|
+
jishen: js,
|
|
19425
|
+
note: '时计用现代节气定冬至与夏至,不用唐代气法常数;与卷一的古历口径会有几日差。',
|
|
19426
|
+
};
|
|
19427
|
+
}
|
|
19428
|
+
|
|
19429
|
+
/** 古法吉凶:按卷一《推太公考时法》的位置判据,只判「相犯与否」与「数和不和」 */
|
|
19430
|
+
function jiXiongOf(o) {
|
|
19431
|
+
const items = (o.geju && o.geju.list) || [];
|
|
19432
|
+
const xiangFan = items.length > 0;
|
|
19433
|
+
const zhuHe = !!(o.heshu && o.heshu.zhu && o.heshu.zhu.he);
|
|
19434
|
+
const keHe = !!(o.heshu && o.heshu.ke && o.heshu.ke.he);
|
|
19435
|
+
const he = zhuHe && keHe;
|
|
19436
|
+
const gate = (o.gate && o.gate.gate) || '';
|
|
19437
|
+
// 卷一「吉道谓开休生三门」,年家只值一门,能判的就到这里
|
|
19438
|
+
const jiDao = gate === '开' || gate === '休' || gate === '生';
|
|
19439
|
+
// 用词照《太乙金镜式经》:凶、不和、吉、大吉;不自造档位
|
|
19440
|
+
let grade = 'ji';
|
|
19441
|
+
if (xiangFan) grade = 'xiong';
|
|
19442
|
+
else if (!he) grade = 'buhe';
|
|
19443
|
+
else if (jiDao) grade = 'daji';
|
|
19444
|
+
const label = grade === 'xiong' ? '凶' : grade === 'buhe' ? '不和' : grade === 'daji' ? '大吉' : '吉';
|
|
19445
|
+
const basis = xiangFan
|
|
19446
|
+
? '命中' + items.join('、') + ',不满足卷一「上下无掩击迫囚关格对、并不相犯」'
|
|
19447
|
+
: !he
|
|
19448
|
+
? '不相犯,但' + (zhuHe ? '客算' : '主算') + '落在不和'
|
|
19449
|
+
: jiDao
|
|
19450
|
+
? '阴阳和顺、不相犯,八门又值' + gate + '(卷一所称吉道)'
|
|
19451
|
+
: '阴阳和顺、不相犯,八门值' + gate + ',不在开休生之内';
|
|
19452
|
+
const text = basis + '。';
|
|
19453
|
+
const note = '卷一另有「大利」「利以行兵」「先吉后凶」,要五将与神将同参,这一层没有做。';
|
|
19454
|
+
return { xiangFan, items, he, gate, grade, label, text, note };
|
|
19455
|
+
}
|
|
19456
|
+
|
|
19457
|
+
/* ── 神将层(第五层)─────────────────────────────────────────────
|
|
19458
|
+
卷一《推太乙当时法》:「以日度加时因步六壬式,知天乙成败之分」——
|
|
19459
|
+
借六壬十二神看四将与文昌、始击落在吉神还是凶神下。口径由本盘自定,写在这里备查:
|
|
19460
|
+
1) 十二神用六壬序(贵人、螣蛇、朱雀、六合、勾陈、青龙、天后、太阴、玄武、太常、白虎、天空);
|
|
19461
|
+
2) 贵人按日干起(甲戊庚丑未 / 乙己子申 / 丙丁亥酉 / 壬癸巳卯 / 辛午寅),卯至申用昼贵、酉至寅用夜贵;
|
|
19462
|
+
3) 贵人临亥子丑寅卯辰顺行、临巳午未申酉戌逆行;
|
|
19463
|
+
4) 四将与文昌、始击的卦位按后天八卦取一支(乾亥、坎子、艮丑、震卯、巽巳、离午、坤未、兑酉),
|
|
19464
|
+
再取该支上的神;太乙九宫一宫两支,取生支这一支,是本盘唯一能自洽的一档。
|
|
19465
|
+
这一层只给「古法怎么判」,不给成不成。 */
|
|
19466
|
+
|
|
19467
|
+
const TWELVE_GODS = ['贵人', '螣蛇', '朱雀', '六合', '勾陈', '青龙', '天后', '太阴', '玄武', '太常', '白虎', '天空'];
|
|
19468
|
+
const GOD_GOOD = ['贵人', '六合', '青龙', '太阴', '太常'];
|
|
19469
|
+
const GOD_BAD = ['螣蛇', '朱雀', '勾陈', '玄武', '白虎', '天空'];
|
|
19470
|
+
/** 后天八卦取支:一宫两支时取生支(与十六神位里同向那一支一致) */
|
|
19471
|
+
const TRIGRAM_TO_BRANCH = { 乾: '亥', 坎: '子', 艮: '丑', 震: '卯', 巽: '巳', 离: '午', 坤: '未', 兑: '酉' };
|
|
19472
|
+
/** 十六神位名 → 地支:卦位取生支,支位原样 */
|
|
19473
|
+
const POS_TO_BRANCH = { ...TRIGRAM_TO_BRANCH, 子: '子', 丑: '丑', 寅: '寅', 卯: '卯', 辰: '辰', 巳: '巳', 午: '午', 未: '未', 申: '申', 酉: '酉', 戌: '戌', 亥: '亥' };
|
|
19474
|
+
const GUI_REN = { 甲: '丑', 戊: '丑', 庚: '丑', 乙: '子', 己: '子', 丙: '亥', 丁: '亥', 壬: '巳', 癸: '巳', 辛: '午' };
|
|
19475
|
+
const GUI_REN_NIGHT = { 甲: '未', 戊: '未', 庚: '未', 乙: '申', 己: '申', 丙: '酉', 丁: '酉', 壬: '卯', 癸: '卯', 辛: '寅' };
|
|
19476
|
+
|
|
19477
|
+
/** 当天的日干 */
|
|
19478
|
+
function dayStemOf(year, month, day) {
|
|
19479
|
+
const idx = dayGanzhiIndex(toJDN(year, month, day));
|
|
19480
|
+
return STEMS[((idx % 10) + 10) % 10];
|
|
19481
|
+
}
|
|
19482
|
+
|
|
19483
|
+
/** 起十二神:昼贵 / 夜贵按卯~申、酉~寅分;反回 { stem, day, startBranch, dir, table } */
|
|
19484
|
+
function twelveGodsOf(stem, hour) {
|
|
19485
|
+
const h = typeof hour === 'number' ? hour : 0;
|
|
19486
|
+
const bi = Math.floor(((h + 1) % 24) / 2);
|
|
19487
|
+
const day = bi >= 2 && bi <= 7;
|
|
19488
|
+
const start = (day ? GUI_REN : GUI_REN_NIGHT)[stem] || '丑';
|
|
19489
|
+
const si = BRANCH_NAMES.indexOf(start);
|
|
19490
|
+
const dir = ['亥', '子', '丑', '寅', '卯', '辰'].includes(start) ? 1 : -1;
|
|
19491
|
+
const table = {};
|
|
19492
|
+
TWELVE_GODS.forEach((g, k) => {
|
|
19493
|
+
const bi2 = ((si + dir * k) % 12 + 12) % 12;
|
|
19494
|
+
table[BRANCH_NAMES[bi2]] = g;
|
|
19495
|
+
});
|
|
19496
|
+
return { stem, day, startBranch: start, dir, table };
|
|
19497
|
+
}
|
|
19498
|
+
|
|
19499
|
+
/** 四将与文昌、始击各落哪一神下 */
|
|
19500
|
+
function shenJiangOf(o) {
|
|
19501
|
+
const t = twelveGodsOf(o.dayStem, o.hour);
|
|
19502
|
+
const b2b = POS_TO_BRANCH;
|
|
19503
|
+
const rows = [
|
|
19504
|
+
['主大将', o.jiang.zhuDaName],
|
|
19505
|
+
['主参将', o.jiang.zhuCanName],
|
|
19506
|
+
['客大将', o.jiang.keDaName],
|
|
19507
|
+
['客参将', o.jiang.keCanName],
|
|
19508
|
+
['文昌', o.wenchang && o.wenchang.pos],
|
|
19509
|
+
['始击', o.shiji && o.shiji.pos],
|
|
19510
|
+
].map(([who, gua]) => {
|
|
19511
|
+
const br = b2b[gua] || '';
|
|
19512
|
+
const god = br ? t.table[br] || '' : '';
|
|
19513
|
+
const kind = GOD_GOOD.includes(god) ? 'good' : GOD_BAD.includes(god) ? 'bad' : 'mid';
|
|
19514
|
+
return { who, gua, branch: br, god, kind };
|
|
19515
|
+
});
|
|
19516
|
+
const goods = rows.filter((x) => x.kind === 'good').map((x) => x.who + '在' + x.god);
|
|
19517
|
+
const bads = rows.filter((x) => x.kind === 'bad').map((x) => x.who + '在' + x.god);
|
|
19518
|
+
const mids = rows.filter((x) => x.kind === 'mid').map((x) => x.who + '在' + (x.god || '无名'));
|
|
19519
|
+
return { ...t, rows, goods, bads, mids };
|
|
19520
|
+
}
|
|
19521
|
+
|
|
19522
|
+
/**
|
|
19523
|
+
* 位置层 + 神将层合成卷一的判辞:凶 / 不和 / 吉 / 大吉 / 大利 / 先吉后凶。
|
|
19524
|
+
* 卷一判语:门具将发遇吉神则大吉;门杜闭塞遇吉神守固大利;门杜闭塞遇凶神则先吉后凶。
|
|
19525
|
+
* 位置层已相犯时古法认定「不相犯」不成立,不再往上抬。
|
|
19526
|
+
*/
|
|
19527
|
+
function verdictOf(o) {
|
|
19528
|
+
const pos = o.jixiong || {};
|
|
19529
|
+
const sj = o.shenjiang || {};
|
|
19530
|
+
const gate = (o.gate && o.gate.gate) || '';
|
|
19531
|
+
const jiDao = gate === '开' || gate === '休' || gate === '生';
|
|
19532
|
+
const rows = sj.rows || [];
|
|
19533
|
+
const allGood = rows.length > 0 && (sj.bads || []).length === 0 && (sj.mids || []).length === 0;
|
|
19534
|
+
const anyBad = (sj.bads || []).length > 0;
|
|
19535
|
+
let grade = pos.grade || 'ji';
|
|
19536
|
+
let label = pos.label || '吉';
|
|
19537
|
+
if (grade !== 'xiong' && allGood) {
|
|
19538
|
+
grade = jiDao ? 'daji' : 'dali';
|
|
19539
|
+
label = jiDao ? '大吉' : '大利';
|
|
19540
|
+
} else if (grade !== 'xiong' && anyBad) {
|
|
19541
|
+
grade = jiDao ? 'xianji' : 'xiong';
|
|
19542
|
+
label = jiDao ? '先吉后凶' : '凶';
|
|
19543
|
+
}
|
|
19544
|
+
return { grade, label, jiDao, allGood, anyBad, posGrade: pos.grade, text: pos.text };
|
|
19545
|
+
}
|
|
19546
|
+
|
|
19547
|
+
/** 《太乙金镜式经》这一层覆盖的算法清单(面板与文案都从这里取) */
|
|
19548
|
+
|
|
19549
|
+
|
|
19333
19550
|
const TAIYI_SCOPE = {
|
|
19334
19551
|
covered: [
|
|
19335
19552
|
'太乙积年与五元六纪',
|
|
@@ -19338,14 +19555,23 @@ const TAIYI_SCOPE = {
|
|
|
19338
19555
|
'太乙落宫(三年一宫、不入中五)',
|
|
19339
19556
|
'八门(三十年一转)',
|
|
19340
19557
|
'文昌(十八年一周,遇乾、坤各数两次)',
|
|
19558
|
+
'计神(积年 mod 60,从寅起逆数)',
|
|
19559
|
+
'始击(计神加和德,天目随移)',
|
|
19560
|
+
'主算、客算与主客大小将、参将',
|
|
19561
|
+
'掩、击、格、对、提、迫、囚、关八种位置关系',
|
|
19562
|
+
'定目(年支合神移至太岁宫)',
|
|
19563
|
+
'三基(君基、臣基、民基)',
|
|
19564
|
+
'五福、大游',
|
|
19565
|
+
'十精其余(天乙、地乙、直符、四神、小游)',
|
|
19566
|
+
'阴阳数和(重阳、重阴、上和、次和、下和)',
|
|
19567
|
+
'月计、日计、时计(积月、积日、时实三套推法)',
|
|
19568
|
+
'古法吉凶倾向(相犯与否 + 数和不和)',
|
|
19341
19569
|
],
|
|
19342
19570
|
notCovered: [
|
|
19343
|
-
'
|
|
19344
|
-
'
|
|
19345
|
-
'三基(君基、臣基、民基)、五福、十精',
|
|
19346
|
-
'掩、迫、关、囚、击、格等格局判定',
|
|
19571
|
+
'四神拆成本身与绛宫、明堂、玉堂的十二位全序',
|
|
19572
|
+
'胜负断辞、三旗五将',
|
|
19347
19573
|
],
|
|
19348
|
-
note: '
|
|
19574
|
+
note: '这一层做到太乙、八门、文昌、计神、始击、主客算与四将、八种格局、定目、三基、五福、大游、十精、阴阳数和、月日时三计、古法吉凶与神将判辞;阴阳遁按冬至夏至交节判;四神十二位全序、胜负断辞不做。',
|
|
19349
19575
|
};
|
|
19350
19576
|
|
|
19351
19577
|
/** 取模成 1..n(余数 0 当 n) */
|
|
@@ -19387,7 +19613,11 @@ function yuanJiOf(rest360) {
|
|
|
19387
19613
|
*/
|
|
19388
19614
|
function dunOf(jd) {
|
|
19389
19615
|
if (typeof jd !== 'number' || !Number.isFinite(jd)) return { dun: 'yang', by: 'default' };
|
|
19390
|
-
|
|
19616
|
+
const p = jdToParts(jd);
|
|
19617
|
+
const summer = termInstantJd(p.year, 11); // 当年夏至
|
|
19618
|
+
const winter = termInstantJd(p.year, 23); // 当年冬至
|
|
19619
|
+
const yin = jd >= summer && jd < winter;
|
|
19620
|
+
return { dun: yin ? 'yin' : 'yang', by: 'jd', summer, winter };
|
|
19391
19621
|
}
|
|
19392
19622
|
|
|
19393
19623
|
/** 太乙落宫:局数 mod 24,三年一宫 */
|
|
@@ -19435,6 +19665,226 @@ function wenChang(jinian, dun) {
|
|
|
19435
19665
|
return { rest18: r, pos: hit.pos, god: hit.god, num: hit.num, palaceName: PALACES[hit.num].name };
|
|
19436
19666
|
}
|
|
19437
19667
|
|
|
19668
|
+
/** 八卦正宫名(十六神里 pos 落在这八个上就是正宫,其余是间神) */
|
|
19669
|
+
const GUA_NAMES = ['乾', '兑', '离', '震', '巽', '坎', '艮', '坤'];
|
|
19670
|
+
|
|
19671
|
+
/** 九宫环顺行:坎八 → 艮三 → 震四 → 巽九 → 离二 → 坤七 → 兑六 → 乾一 */
|
|
19672
|
+
const PALACE_RING = [8, 3, 4, 9, 2, 7, 6, 1];
|
|
19673
|
+
|
|
19674
|
+
/** 十二支名 */
|
|
19675
|
+
const BRANCH_NAMES = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'];
|
|
19676
|
+
|
|
19677
|
+
/** 地支序 → 十六神索引(子→地主、丑→阳德、寅→吕申……) */
|
|
19678
|
+
const BRANCH_TO_SIXTEEN = [2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 1];
|
|
19679
|
+
|
|
19680
|
+
/** 对宫:一乾对九巽、二离对八坎、三艮对七坤、四震对六兑,中五无对 */
|
|
19681
|
+
const OPPOSITE_PALACE = { 1: 9, 9: 1, 2: 8, 8: 2, 3: 7, 7: 3, 4: 6, 6: 4, 5: 5 };
|
|
19682
|
+
|
|
19683
|
+
/** 九宫环上的下一宫 */
|
|
19684
|
+
function nextPalace(palace) {
|
|
19685
|
+
const i = PALACE_RING.indexOf(palace);
|
|
19686
|
+
return PALACE_RING[(i + 1) % PALACE_RING.length];
|
|
19687
|
+
}
|
|
19688
|
+
|
|
19689
|
+
/** 九宫环上的上一宫(顺行的「前一宫」,即太乙左右) */
|
|
19690
|
+
function prevPalace(palace) {
|
|
19691
|
+
const i = PALACE_RING.indexOf(palace);
|
|
19692
|
+
return PALACE_RING[(i - 1 + PALACE_RING.length) % PALACE_RING.length];
|
|
19693
|
+
}
|
|
19694
|
+
|
|
19695
|
+
/** 六合:与某支相合的那一支(子丑、寅亥、卯戌、辰酉、巳申、午未) */
|
|
19696
|
+
const LIU_HE = [1, 0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
19697
|
+
|
|
19698
|
+
/**
|
|
19699
|
+
* 定目:淘金歌「为客最难详定计,便以合神加太岁」——把合神搬到太岁所在处,
|
|
19700
|
+
* 盘整体旋转,原先天目(文昌)落到的位置就是定目。
|
|
19701
|
+
*/
|
|
19702
|
+
function dingMuOf(wenChangIdx, yearBranchIdx) {
|
|
19703
|
+
const heIdx = LIU_HE[yearBranchIdx];
|
|
19704
|
+
const taiSui16 = BRANCH_TO_SIXTEEN[yearBranchIdx];
|
|
19705
|
+
const he16 = BRANCH_TO_SIXTEEN[heIdx];
|
|
19706
|
+
const idx16 = ((wenChangIdx + (taiSui16 - he16)) % 16 + 16) % 16;
|
|
19707
|
+
const item = SIXTEEN[idx16];
|
|
19708
|
+
return { shift: taiSui16 - he16, idx16, pos: item.pos, god: item.god, palace: item.num, palaceName: PALACES[item.num].name };
|
|
19709
|
+
}
|
|
19710
|
+
|
|
19711
|
+
/** 三基:君基三十年一移起午、臣基三年一移起午、民基一年一移起戌,顺行十二支 */
|
|
19712
|
+
function sanJiOf(jinian) {
|
|
19713
|
+
const step = (base, period, start) => BRANCH_NAMES[(start + Math.floor((jinian - 1) / period)) % 12];
|
|
19714
|
+
return {
|
|
19715
|
+
jun: step('jun', 30, 6),
|
|
19716
|
+
chen: step('chen', 3, 6),
|
|
19717
|
+
min: step('min', 1, 10),
|
|
19718
|
+
note: '君基三十年一移、臣基三年一移,都从午起;民基一年一移,从戌起,顺行十二支。',
|
|
19719
|
+
};
|
|
19720
|
+
}
|
|
19721
|
+
|
|
19722
|
+
/** 五福:四十五年移一位,上元甲子起一宫,乾一 → 艮三 → 巽九 → 坤七 → 中五 */
|
|
19723
|
+
const WUFU_ORDER = [1, 3, 9, 7, 5];
|
|
19724
|
+
function wuFuOf(jinian) {
|
|
19725
|
+
const i = Math.floor((jinian - 1) / 45) % WUFU_ORDER.length;
|
|
19726
|
+
const palace = WUFU_ORDER[i];
|
|
19727
|
+
return { index: i, palace, palaceName: PALACES[palace].name };
|
|
19728
|
+
}
|
|
19729
|
+
|
|
19730
|
+
/** 大游:三十六年移一位,上元甲子起七宫,逆数 七→六→四→三→二→一→九→八 */
|
|
19731
|
+
const DAYOU_ORDER = [7, 6, 4, 3, 2, 1, 9, 8];
|
|
19732
|
+
function daYouOf(jinian) {
|
|
19733
|
+
const i = Math.floor((jinian - 1) / 36) % DAYOU_ORDER.length;
|
|
19734
|
+
const palace = DAYOU_ORDER[i];
|
|
19735
|
+
return { index: i, palace, palaceName: PALACES[palace].name };
|
|
19736
|
+
}
|
|
19737
|
+
|
|
19738
|
+
/** 十二支上的位移取位(起点按地支索引,三年/三十年一移) */
|
|
19739
|
+
function branchStep(startIdx, period, jinian) {
|
|
19740
|
+
return { index: (startIdx + Math.floor((jinian - 1) / period)) % 12, name: BRANCH_NAMES[(startIdx + Math.floor((jinian - 1) / period)) % 12] };
|
|
19741
|
+
}
|
|
19742
|
+
|
|
19743
|
+
/**
|
|
19744
|
+
* 十精里的四个「十二宫」神:
|
|
19745
|
+
* 天乙「甲子上元从六起,三年一徙顺行踪」(第六位 = 巳)
|
|
19746
|
+
* 地乙「上元甲子九宫九,顺行十二宫中序,三年亦易」
|
|
19747
|
+
* 直符「上元甲子元从五,十二宫中顺数详」(第五位 = 辰 → 按九宫数五 = 中宫,这里按十二支第五位辰起)
|
|
19748
|
+
* 小游:三年一移,起一宫。
|
|
19749
|
+
*/
|
|
19750
|
+
function shiJingOf(jinian) {
|
|
19751
|
+
const tianYi = branchStep(5, 3, jinian);
|
|
19752
|
+
const diYi = branchStep(8, 3, jinian);
|
|
19753
|
+
const zhiFu = branchStep(4, 3, jinian);
|
|
19754
|
+
const SI_SHEN_RING = ['一宫', '二宫', '三宫', '四宫', '五宫', '六宫', '七宫', '八宫', '九宫', '绛宫', '明堂', '玉堂'];
|
|
19755
|
+
const siShen = SI_SHEN_RING[Math.floor((jinian - 1) / 3) % 12];
|
|
19756
|
+
const xiaoYou = PALACES[YANG_WALK[Math.floor((jinian - 1) / 3) % 8]].name;
|
|
19757
|
+
return {
|
|
19758
|
+
tianyi: tianYi.name,
|
|
19759
|
+
diyi: diYi.name,
|
|
19760
|
+
zhifu: zhiFu.name,
|
|
19761
|
+
sishen: siShen,
|
|
19762
|
+
xiaoyou: xiaoYou,
|
|
19763
|
+
note: '天乙、地乙、直符、四神、小游都按上元甲子起例、三年一移;十精的另一半是五福、君基、臣基、民基、大游。',
|
|
19764
|
+
};
|
|
19765
|
+
}
|
|
19766
|
+
|
|
19767
|
+
/**
|
|
19768
|
+
* 阴阳和不和(张良经 / 卷二):太乙在阳宫(八三四九)得奇数为重阳,得偶数为和;
|
|
19769
|
+
* 太乙在阴宫(二七六一)得偶数为重阴,得奇数为和。这里只判这一段,不做胜负推断。
|
|
19770
|
+
*/
|
|
19771
|
+
function heShuOf(taiyiPalace, suan) {
|
|
19772
|
+
const YANG = [8, 3, 4, 9];
|
|
19773
|
+
const yin = !YANG.includes(taiyiPalace);
|
|
19774
|
+
const odd = suan % 2 === 1;
|
|
19775
|
+
const chongYang = !yin && odd;
|
|
19776
|
+
const chongYin = yin && !odd;
|
|
19777
|
+
const he = !chongYang && !chongYin;
|
|
19778
|
+
const SHANG = [14, 18];
|
|
19779
|
+
const CI = [23, 29, 32];
|
|
19780
|
+
const XIA = [12, 16, 27, 34, 38];
|
|
19781
|
+
const grade = SHANG.includes(suan) ? '上和' : CI.includes(suan) ? '次和' : XIA.includes(suan) ? '下和' : '';
|
|
19782
|
+
return {
|
|
19783
|
+
grade,
|
|
19784
|
+
yang: !yin,
|
|
19785
|
+
odd,
|
|
19786
|
+
he,
|
|
19787
|
+
chongYang,
|
|
19788
|
+
chongYin,
|
|
19789
|
+
text: he
|
|
19790
|
+
? `太乙在${yin ? '阴' : '阳'}宫、算得${odd ? '奇' : '偶'}数,为阴阳和${grade ? '(' + grade + ')' : ''}。`
|
|
19791
|
+
: chongYang
|
|
19792
|
+
? '太乙在阳宫、算得奇数,为重阳,按经文属不和。'
|
|
19793
|
+
: '太乙在阴宫、算得偶数,为重阴,按经文属不和。',
|
|
19794
|
+
};
|
|
19795
|
+
}
|
|
19796
|
+
|
|
19797
|
+
|
|
19798
|
+
/**
|
|
19799
|
+
* 计神:积年 mod 60 得六十甲子第几年(1..60),从寅起逆数十二支。
|
|
19800
|
+
* 甲子年(序 1)计神在寅;寅年(序 3)计神在子,即「太岁在寅,计神在子」。
|
|
19801
|
+
*/
|
|
19802
|
+
function jiShenOf(jinian) {
|
|
19803
|
+
const r = rim(jinian, 60);
|
|
19804
|
+
const bi = (((2 - (r - 1)) % 12) + 12) % 12;
|
|
19805
|
+
const idx16 = BRANCH_TO_SIXTEEN[bi];
|
|
19806
|
+
const item = SIXTEEN[idx16];
|
|
19807
|
+
return { r, branch: BRANCH_NAMES[bi], idx16, god: item.god, palace: item.num, palaceName: PALACES[item.num].name };
|
|
19808
|
+
}
|
|
19809
|
+
|
|
19810
|
+
/**
|
|
19811
|
+
* 始击:计神加和德(艮,十六神索引 4)之宫,天目随盘整体移动。
|
|
19812
|
+
* 位移 = 和德索引 − 计神索引;文昌落位顺移同一位移。
|
|
19813
|
+
*/
|
|
19814
|
+
function shiJiOf(wenChangIdx, jiIdx16) {
|
|
19815
|
+
const HE_DE = 4;
|
|
19816
|
+
const shift = HE_DE - jiIdx16;
|
|
19817
|
+
const idx16 = ((wenChangIdx + shift) % 16 + 16) % 16;
|
|
19818
|
+
const item = SIXTEEN[idx16];
|
|
19819
|
+
return { shift, idx16, pos: item.pos, god: item.god, palace: item.num, palaceName: PALACES[item.num].name };
|
|
19820
|
+
}
|
|
19821
|
+
|
|
19822
|
+
/**
|
|
19823
|
+
* 主算 / 客算:从某位天目所在处起,沿九宫环顺行累加宫数。
|
|
19824
|
+
* 天目在正宫按本宫数起;在间神先计一,再从该间神所属的正宫继续。
|
|
19825
|
+
* 数到太乙宫前一位为止(不含太乙宫本身)。
|
|
19826
|
+
*/
|
|
19827
|
+
function suanOf(idx16, taiyiPalace) {
|
|
19828
|
+
const item = SIXTEEN[idx16];
|
|
19829
|
+
const isJian = !GUA_NAMES.includes(item.pos);
|
|
19830
|
+
let total = isJian ? 1 : 0;
|
|
19831
|
+
let cur = item.num;
|
|
19832
|
+
for (let i = 0; i < PALACE_RING.length; i += 1) {
|
|
19833
|
+
if (cur === taiyiPalace) break;
|
|
19834
|
+
total += cur;
|
|
19835
|
+
cur = nextPalace(cur);
|
|
19836
|
+
}
|
|
19837
|
+
return total === 0 ? 1 : total;
|
|
19838
|
+
}
|
|
19839
|
+
|
|
19840
|
+
/** 大将宫数:算数个位,整十按「得十置一」归一宫 */
|
|
19841
|
+
function generalOf(n) {
|
|
19842
|
+
const g = n % 10;
|
|
19843
|
+
return g === 0 ? 1 : g;
|
|
19844
|
+
}
|
|
19845
|
+
|
|
19846
|
+
/** 参将宫数:大将 × 3 的个位,整十同样归一宫 */
|
|
19847
|
+
function canJiangOf(g) {
|
|
19848
|
+
const c = (g * 3) % 10;
|
|
19849
|
+
return c === 0 ? 1 : c;
|
|
19850
|
+
}
|
|
19851
|
+
|
|
19852
|
+
/** 掩迫囚格关:只判位置关系,不掺吉凶 */
|
|
19853
|
+
function gejuOf(o) {
|
|
19854
|
+
const { taiyiPalace, shiJiPalace, wenChangPalace, zhuDa, keDa, zhuCan, keCan } = o;
|
|
19855
|
+
const near = [nextPalace(taiyiPalace), prevPalace(taiyiPalace)];
|
|
19856
|
+
const yan = shiJiPalace === taiyiPalace;
|
|
19857
|
+
const ji = near.includes(shiJiPalace);
|
|
19858
|
+
const ge = shiJiPalace === OPPOSITE_PALACE[taiyiPalace];
|
|
19859
|
+
const dui = wenChangPalace === OPPOSITE_PALACE[taiyiPalace];
|
|
19860
|
+
const ti = keDa === wenChangPalace;
|
|
19861
|
+
const poAt = [];
|
|
19862
|
+
if (near.includes(wenChangPalace)) poAt.push('文昌');
|
|
19863
|
+
if (near.includes(zhuDa)) poAt.push('主大将');
|
|
19864
|
+
if (near.includes(keDa)) poAt.push('客大将');
|
|
19865
|
+
if (near.includes(zhuCan)) poAt.push('主参将');
|
|
19866
|
+
if (near.includes(keCan)) poAt.push('客参将');
|
|
19867
|
+
const qiuAt = [['主大将', zhuDa], ['客大将', keDa], ['主参将', zhuCan], ['客参将', keCan]]
|
|
19868
|
+
.filter((x) => x[1] === taiyiPalace).map((x) => x[0]);
|
|
19869
|
+
const cross = [
|
|
19870
|
+
['主大将', zhuDa, '客大将', keDa],
|
|
19871
|
+
['主大将', zhuDa, '客参将', keCan],
|
|
19872
|
+
['客大将', keDa, '主参将', zhuCan],
|
|
19873
|
+
['主参将', zhuCan, '客参将', keCan],
|
|
19874
|
+
];
|
|
19875
|
+
const guan = cross.filter((x) => x[1] === x[3]).map((x) => x[0] + '与' + x[2] + '同宫');
|
|
19876
|
+
const list = [];
|
|
19877
|
+
if (yan) list.push('掩:始击与太乙同宫');
|
|
19878
|
+
if (ji) list.push('击:始击在太乙左右');
|
|
19879
|
+
if (ge) list.push('格:太乙与始击相望(对宫)');
|
|
19880
|
+
if (dui) list.push('对:文昌冲太乙宫');
|
|
19881
|
+
if (ti) list.push('提:客大将与文昌同宫');
|
|
19882
|
+
if (poAt.length) list.push('迫:' + poAt.join('、') + '在太乙前后');
|
|
19883
|
+
if (qiuAt.length) list.push('囚:' + qiuAt.join('、') + '与太乙同宫');
|
|
19884
|
+
if (guan.length) list.push('关:' + guan.join(','));
|
|
19885
|
+
return { yan, ji, ge, dui, ti, po: poAt, qiu: qiuAt, guan, list };
|
|
19886
|
+
}
|
|
19887
|
+
|
|
19438
19888
|
/** 主入口 */
|
|
19439
19889
|
function buildTaiyi(input) {
|
|
19440
19890
|
assertObject(input, '太乙神数');
|
|
@@ -19446,12 +19896,52 @@ function buildTaiyi(input) {
|
|
|
19446
19896
|
const yuanji = yuanJiOf(rest360);
|
|
19447
19897
|
const gate = eightGate(year);
|
|
19448
19898
|
|
|
19449
|
-
//
|
|
19450
|
-
|
|
19899
|
+
// 阳遁 / 阴遁按交节判:冬至到次年夏至为阳,夏至到冬至为阴。
|
|
19900
|
+
// 这一盘总要落到某一天,所以直接按日期判,不再默认阳遁。
|
|
19901
|
+
const hourNum = typeof input.hour === 'number' ? input.hour : 0;
|
|
19902
|
+
const nowJd = toJDN(year, month, day) - 0.5 + hourNum / 24;
|
|
19903
|
+
const dunInfo = dunOf(nowJd);
|
|
19904
|
+
const dun = dunInfo.dun;
|
|
19451
19905
|
|
|
19452
19906
|
const t = taiyiPalace(ju, dun);
|
|
19453
19907
|
const wc = wenChang(jinian, dun);
|
|
19454
19908
|
|
|
19909
|
+
const wcIdx16 = SIXTEEN.findIndex((x) => x.pos === wc.pos && x.god === wc.god);
|
|
19910
|
+
const js = jiShenOf(jinian);
|
|
19911
|
+
const sj = shiJiOf(wcIdx16, js.idx16);
|
|
19912
|
+
const zhuSuan = suanOf(wcIdx16, t.palace);
|
|
19913
|
+
const keSuan = suanOf(sj.idx16, t.palace);
|
|
19914
|
+
const zhuDa = generalOf(zhuSuan);
|
|
19915
|
+
const keDa = generalOf(keSuan);
|
|
19916
|
+
const zhuCan = canJiangOf(zhuDa);
|
|
19917
|
+
const keCan = canJiangOf(keDa);
|
|
19918
|
+
const geju = gejuOf({
|
|
19919
|
+
taiyiPalace: t.palace,
|
|
19920
|
+
shiJiPalace: sj.palace,
|
|
19921
|
+
wenChangPalace: wc.num,
|
|
19922
|
+
zhuDa,
|
|
19923
|
+
keDa,
|
|
19924
|
+
zhuCan,
|
|
19925
|
+
keCan,
|
|
19926
|
+
});
|
|
19927
|
+
const yearBranchIdx = (((year - 4) % 12) + 12) % 12;
|
|
19928
|
+
const dm = dingMuOf(wcIdx16, yearBranchIdx);
|
|
19929
|
+
const heZhu = heShuOf(t.palace, zhuSuan);
|
|
19930
|
+
const heKe = heShuOf(t.palace, keSuan);
|
|
19931
|
+
const heshu = { zhu: heZhu, ke: heKe };
|
|
19932
|
+
const jixiong = jiXiongOf({ geju, heshu, gate });
|
|
19933
|
+
const dayStem = dayStemOf(year, month, day);
|
|
19934
|
+
const jiangObj = {
|
|
19935
|
+
zhuDa, keDa, zhuCan, keCan,
|
|
19936
|
+
zhuDaName: PALACES[zhuDa].name, keDaName: PALACES[keDa].name,
|
|
19937
|
+
zhuCanName: PALACES[zhuCan].name, keCanName: PALACES[keCan].name,
|
|
19938
|
+
};
|
|
19939
|
+
const shenjiang = shenJiangOf({ dayStem, hour: typeof input.hour === 'number' ? input.hour : 0, jiang: jiangObj, wenchang: wc, shiji: sj });
|
|
19940
|
+
const verdict = verdictOf({ jixiong, shenjiang, gate });
|
|
19941
|
+
const monthJi = monthJiOf(jinian);
|
|
19942
|
+
const dayJi = dayJiOf(jinian);
|
|
19943
|
+
const hourJi = hourJiOf({ year, month, day, hour: typeof input.hour === 'number' ? input.hour : 0 });
|
|
19944
|
+
|
|
19455
19945
|
return {
|
|
19456
19946
|
system: 'taiyi',
|
|
19457
19947
|
meta: {
|
|
@@ -19462,18 +19952,45 @@ function buildTaiyi(input) {
|
|
|
19462
19952
|
ju,
|
|
19463
19953
|
dun,
|
|
19464
19954
|
dunText: dun === 'yin' ? '阴遁' : '阳遁',
|
|
19955
|
+
dunBy: dunInfo.by,
|
|
19465
19956
|
epoch: TAIYI_EPOCH,
|
|
19466
19957
|
},
|
|
19467
19958
|
year: { ...yuanji, rest360 },
|
|
19468
19959
|
taiyi: t,
|
|
19469
19960
|
gate,
|
|
19470
19961
|
wenchang: wc,
|
|
19962
|
+
jishen: js,
|
|
19963
|
+
shiji: sj,
|
|
19964
|
+
suan: { zhu: zhuSuan, ke: keSuan },
|
|
19965
|
+
jiang: {
|
|
19966
|
+
zhuDa,
|
|
19967
|
+
keDa,
|
|
19968
|
+
zhuCan,
|
|
19969
|
+
keCan,
|
|
19970
|
+
zhuDaName: PALACES[zhuDa].name,
|
|
19971
|
+
keDaName: PALACES[keDa].name,
|
|
19972
|
+
zhuCanName: PALACES[zhuCan].name,
|
|
19973
|
+
keCanName: PALACES[keCan].name,
|
|
19974
|
+
},
|
|
19975
|
+
geju,
|
|
19976
|
+
dingmu: dm,
|
|
19977
|
+
sanji: sanJiOf(jinian),
|
|
19978
|
+
wufu: wuFuOf(jinian),
|
|
19979
|
+
dayou: daYouOf(jinian),
|
|
19980
|
+
shijing: shiJingOf(jinian),
|
|
19981
|
+
heshu,
|
|
19982
|
+
jixiong,
|
|
19983
|
+
verdict,
|
|
19984
|
+
shenjiang,
|
|
19985
|
+
month: monthJi,
|
|
19986
|
+
day: dayJi,
|
|
19987
|
+
hour: hourJi,
|
|
19471
19988
|
scope: TAIYI_SCOPE,
|
|
19472
19989
|
};
|
|
19473
19990
|
}
|
|
19474
19991
|
|
|
19475
19992
|
|
|
19476
|
-
return { TAIYI_EPOCH, PALACES, SIXTEEN, YANG_WALK, YIN_WALK, EIGHT_GATES, GATE_BASE_YEAR, GATE_PERIOD, FIVE_YUAN, THREE_LI, TAIYI_SCOPE, taiyiJinian, taiyiRound, yuanJiOf, dunOf, taiyiPalace, eightGate, wenChang, buildTaiyi };
|
|
19993
|
+
return { TAIYI_EPOCH, PALACES, SIXTEEN, YANG_WALK, YIN_WALK, EIGHT_GATES, GATE_BASE_YEAR, GATE_PERIOD, FIVE_YUAN, THREE_LI, ZHANG_SUI, ZHANG_YUE, RI_FA, YUE_FA, palaceFromR24, branchWalk, sixteenStep, monthJiOf, dayJiOf, hourJiOf, jiXiongOf, TWELVE_GODS, GOD_GOOD, GOD_BAD, TRIGRAM_TO_BRANCH, POS_TO_BRANCH, dayStemOf, twelveGodsOf, shenJiangOf, verdictOf, TAIYI_SCOPE, taiyiJinian, taiyiRound, yuanJiOf, dunOf, taiyiPalace, eightGate, wenChang, GUA_NAMES, PALACE_RING, BRANCH_NAMES, BRANCH_TO_SIXTEEN, OPPOSITE_PALACE, nextPalace, prevPalace, LIU_HE, dingMuOf, sanJiOf, WUFU_ORDER, wuFuOf, DAYOU_ORDER, daYouOf, shiJingOf, heShuOf, jiShenOf, shiJiOf, suanOf, generalOf, canJiangOf, gejuOf, buildTaiyi };
|
|
19477
19994
|
})();
|
|
19478
19995
|
|
|
19479
19996
|
__mods.xiaoliuren = (function () {
|
|
@@ -29113,9 +29630,36 @@ function taiyiSummary(r) {
|
|
|
29113
29630
|
h: '文昌在哪',
|
|
29114
29631
|
t: `文昌在${r.wenchang.pos}(${r.wenchang.god},${r.wenchang.palaceName}宫)。文昌十八年一周,阳局从申起、阴局从寅起,路上遇乾、坤各数两次,所以要数满十八步才回到原点。`,
|
|
29115
29632
|
},
|
|
29633
|
+
{
|
|
29634
|
+
h: '计神、始击与主客算',
|
|
29635
|
+
t: `计神在${r.jishen.branch},始击在${r.shiji.pos}(${r.shiji.god})。主算 ${r.suan.zhu}、客算 ${r.suan.ke}:大将按算数的个位落宫(整十归一),参将是大将乘三的个位。四个将分别落在${r.jiang.zhuDaName}、${r.jiang.keDaName}、${r.jiang.zhuCanName}、${r.jiang.keCanName}宫。`,
|
|
29636
|
+
},
|
|
29637
|
+
{
|
|
29638
|
+
h: '定目、三基与五福',
|
|
29639
|
+
t: `定目在${r.dingmu.pos}(${r.dingmu.god}):淘金歌讲「以合神加太岁」,把合神搬到太岁处,天目跟着转过去,落点就是定目。三基——君基${r.sanji.jun}(三十年一移)、臣基${r.sanji.chen}(三年一移)、民基${r.sanji.min}(一年一移);五福在${r.wufu.palaceName}宫(四十五年一移),大游在${r.dayou.palaceName}宫(三十六年一移、逆数)。十精另五位:天乙${r.shijing.tianyi}、地乙${r.shijing.diyi}、直符${r.shijing.zhifu}、四神${r.shijing.sishen}、小游${r.shijing.xiaoyou}。`,
|
|
29640
|
+
},
|
|
29641
|
+
{
|
|
29642
|
+
h: '阴阳数和',
|
|
29643
|
+
t: `主算:${r.heshu.zhu.text}客算:${r.heshu.ke.text}这一段只说「和不和」,上和、次和、下和是算数落在特定数上的分级,不据此断胜负。`,
|
|
29644
|
+
},
|
|
29645
|
+
{
|
|
29646
|
+
h: '卦象吉凶',
|
|
29647
|
+
t: `${r.jixiong.label}。${r.jixiong.text}${r.jixiong.note}判据出自卷一《推太公考时法》,只标吉凶,不推成与不成。`,
|
|
29648
|
+
},
|
|
29649
|
+
{
|
|
29650
|
+
h: '神将与判辞',
|
|
29651
|
+
t: (() => {
|
|
29652
|
+
const sj = r.shenjiang;
|
|
29653
|
+
if (!sj || !sj.rows) return '这一盘没有排神将。';
|
|
29654
|
+
const goods = sj.goods && sj.goods.length ? '在吉神下的:' + sj.goods.join('、') : '没有将落在吉神下';
|
|
29655
|
+
const bads = sj.bads && sj.bads.length ? '在凶神下的:' + sj.bads.join('、') : '没有将落在凶神下';
|
|
29656
|
+
const v = r.verdict ? '合起来判「' + r.verdict.label + '」。' : '';
|
|
29657
|
+
return '按日干起十二神(' + sj.stem + '日、' + (sj.day ? '昼贵' : '夜贵') + '、贵人临' + sj.startBranch + (sj.dir > 0 ? '顺' : '逆') + '行),' + goods + ';' + bads + '。' + v + '这一层是古人拿十二神看四将落位的办法,只说明古法怎么判,不是对事情的预测。';
|
|
29658
|
+
})(),
|
|
29659
|
+
},
|
|
29116
29660
|
{
|
|
29117
29661
|
h: '这一盘算到哪一层',
|
|
29118
|
-
t: `积年 ${r.meta.jinian},残年 ${r.meta.rest360},${r.meta.dunText}${r.meta.ju}
|
|
29662
|
+
t: `积年 ${r.meta.jinian},残年 ${r.meta.rest360},${r.meta.dunText}${r.meta.ju}局。太乙、八门、文昌、计神、始击、主客算与四将、掩迫囚格关、定目、三基、五福、大游、十精、阴阳数和、月日时三计、古法吉凶都在;${r.scope.notCovered.join('、')}这几项没有收录,盘面上也不显示。`,
|
|
29119
29663
|
},
|
|
29120
29664
|
];
|
|
29121
29665
|
return {
|
|
@@ -29129,7 +29673,7 @@ function taiyiSummary(r) {
|
|
|
29129
29673
|
`八门十年一变的说法常被混用,这里按三十年一转的口径——${r.gate.gate}值这三十年,不是今年才轮到。`,
|
|
29130
29674
|
'太乙是象数盘,给的是位置的对应关系,不是「今年会发生什么」的判决。',
|
|
29131
29675
|
],
|
|
29132
|
-
caveat:
|
|
29676
|
+
caveat: `这一层到太乙、八门、文昌、计神、始击、主客算与四将、八种格局、定目、三基、五福、大游、十精与阴阳数和;${r.scope.notCovered.join(';')}都未收录,别按它们解读。`,
|
|
29133
29677
|
footer: '太乙年家用积年推局,与八字按立春换年、运气按大寒分年都不同口径,三套不要互相印证。',
|
|
29134
29678
|
};
|
|
29135
29679
|
}
|
|
@@ -30850,7 +31394,7 @@ function computeRaw(args = {}) {
|
|
|
30850
31394
|
}
|
|
30851
31395
|
if (system === 'taiyi') {
|
|
30852
31396
|
const dt = parseDateTime(args.datetime);
|
|
30853
|
-
const result = buildTaiyi({ year: dt.year, month: dt.month, day: dt.day });
|
|
31397
|
+
const result = buildTaiyi({ year: dt.year, month: dt.month, day: dt.day, hour: dt.hour });
|
|
30854
31398
|
return { ...result, summary: taiyiText(result) };
|
|
30855
31399
|
}
|
|
30856
31400
|
if (system === 'constitution') {
|
|
@@ -31114,7 +31658,25 @@ function taiyiText(r) {
|
|
|
31114
31658
|
L.push(`太乙在${r.taiyi.palaceName}宫(第${r.taiyi.palace}宫,${r.taiyi.dir}),第${r.taiyi.yearInPalace}年,${r.taiyi.li}。`);
|
|
31115
31659
|
L.push(`八门:${r.gate.gate}。`);
|
|
31116
31660
|
L.push(`文昌在${r.wenchang.pos}(${r.wenchang.god},${r.wenchang.palaceName}宫)。`);
|
|
31117
|
-
L.push(
|
|
31661
|
+
L.push(`计神在${r.jishen.branch}(${r.jishen.god}),始击在${r.shiji.pos}(${r.shiji.god},${r.shiji.palaceName}宫)。`);
|
|
31662
|
+
L.push(`主算 ${r.suan.zhu}:主大将${r.jiang.zhuDaName}宫、主参将${r.jiang.zhuCanName}宫;客算 ${r.suan.ke}:客大将${r.jiang.keDaName}宫、客参将${r.jiang.keCanName}宫。`);
|
|
31663
|
+
L.push(r.geju.list.length ? `格局:${r.geju.list.join(';')}。` : '四将之间不相犯,没有掩、迫、囚、格、关。');
|
|
31664
|
+
L.push(`定目在${r.dingmu.pos}(${r.dingmu.god},${r.dingmu.palaceName}宫)。`);
|
|
31665
|
+
L.push(`三基:君基${r.sanji.jun}、臣基${r.sanji.chen}、民基${r.sanji.min};五福在${r.wufu.palaceName}宫,大游在${r.dayou.palaceName}宫。`);
|
|
31666
|
+
L.push(`十精:天乙${r.shijing.tianyi}、地乙${r.shijing.diyi}、直符${r.shijing.zhifu}、四神${r.shijing.sishen}、小游${r.shijing.xiaoyou}。`);
|
|
31667
|
+
L.push(`数和-主算:${r.heshu.zhu.text} 客算:${r.heshu.ke.text}`);
|
|
31668
|
+
const sj = r.shenjiang || {};
|
|
31669
|
+
if (sj.rows) {
|
|
31670
|
+
const goods = sj.goods && sj.goods.length ? sj.goods.join('、') : '无';
|
|
31671
|
+
const bads = sj.bads && sj.bads.length ? sj.bads.join('、') : '无';
|
|
31672
|
+
L.push(`神将:${sj.stem}日(${sj.day ? '昼贵' : '夜贵'})起${sj.startBranch}、${sj.dir > 0 ? '顺' : '逆'}行;在吉神下的有 ${goods};在凶神下的有 ${bads}。`);
|
|
31673
|
+
}
|
|
31674
|
+
if (r.verdict) L.push(`判辞:${r.verdict.label}。`);
|
|
31675
|
+
L.push(`月计:太乙在${r.month.taiyi.palaceName}宫(第${r.month.taiyi.unitInPalace}月),天目${r.month.mu.pos}(${r.month.mu.god}),计神在${r.month.jishen.branch}。`);
|
|
31676
|
+
L.push(`日计:太乙在${r.day.taiyi.palaceName}宫(第${r.day.taiyi.unitInPalace}日),天目${r.day.mu.pos}(${r.day.mu.god}),计神在${r.day.jishen.branch}。`);
|
|
31677
|
+
L.push(`时计:太乙在${r.hour.taiyi.palaceName}宫(第${r.hour.taiyi.unitInPalace}时),计神在${r.hour.jishen.branch}。${r.hour.note}`);
|
|
31678
|
+
L.push(`卦象:${r.jixiong.label}——${r.jixiong.text}`);
|
|
31679
|
+
L.push(`这一层到太乙、八门、文昌、计神、始击、主客算与四将、八种格局、定目、三基、五福、大游、十精、阴阳数和、月日时三计与古法吉凶;${r.scope.notCovered.join('、')}未收录。`);
|
|
31118
31680
|
return L.join('\n');
|
|
31119
31681
|
}
|
|
31120
31682
|
|
|
@@ -31428,7 +31990,7 @@ return { interpret, DIRECTIONS, DIRECTION_DEFAULT, BRIGHTNESS, flowOf, parseDate
|
|
|
31428
31990
|
})();
|
|
31429
31991
|
|
|
31430
31992
|
window.Engine = __mods.index;
|
|
31431
|
-
window.__MP_VER = "0.
|
|
31993
|
+
window.__MP_VER = "0.71.0";
|
|
31432
31994
|
</script>
|
|
31433
31995
|
<script>
|
|
31434
31996
|
// 两个 UI 共用的表单规则:宿主面板(src/app.js)与独立页(src/web-ui.js)。
|
|
@@ -31549,7 +32111,7 @@ window.__MP_VER = "0.69.0";
|
|
|
31549
32111
|
--tri:#eef0ea;--soul:#f7ece9;--sel:#f5efe9;--link:#f0efe9;
|
|
31550
32112
|
--red:#a02c26;--red-rgb:160,44,38;--lu:#3d5a52;--lu-rgb:61,90,82;
|
|
31551
32113
|
--quan:#6e5a2e;--quan-rgb:110,90,46;--ke:#3a5568;--ke-rgb:58,85,104;--ji:#a02c26;
|
|
31552
|
-
--br-good:#4c7a5c;--br-bad:#9c5b56;--on-accent
|
|
32114
|
+
--br-good:#4c7a5c;--br-bad:#9c5b56;--on-accent:var(--on-accent);--wx-metal:#8a6b1f;
|
|
31553
32115
|
--tg-bi:#4e5d6b;--tg-shi:#55685c;--tg-cai:#6e5a2e;--tg-guan:#8a4a42;--tg-yin:#5d5570;
|
|
31554
32116
|
/* 之前 mp-cli / mp-qt / mp-cl / 起名卡里引用了 --ink3、--fx、--sans,却从未定义:
|
|
31555
32117
|
var() 取不到值 → 整条声明作废,字色与字形全靠继承,楷体、弱化灰都成了摆设。 */
|
|
@@ -32158,6 +32720,80 @@ window.__MP_VER = "0.69.0";
|
|
|
32158
32720
|
/* 三柱盘提示:表下一行,别让人以为漏画了一列 */
|
|
32159
32721
|
.pp-warn{margin:8px 0 0;padding:7px 10px;border:1px solid color-mix(in srgb,var(--quan) 34%,var(--line));border-radius:8px;background:color-mix(in srgb,var(--quan) 10%,transparent);color:var(--ink2);font-size:11.5px;line-height:1.55}
|
|
32160
32722
|
/* 顶部人话总结:第一屏唯一的「先说结论」块,边框与留白都比盘面重一档 */
|
|
32723
|
+
.mp-wl-h{display:flex;flex-wrap:wrap;gap:8px;padding-bottom:7px}
|
|
32724
|
+
.mp-wl-y{font-size:15px;font-weight:700}
|
|
32725
|
+
.mp-wl-z{font-weight:600;color:var(--lu)}
|
|
32726
|
+
.mp-wl-m,.mp-wl-tm,.mp-wl-tg,.mp-wl-no{font-size:11px;color:var(--label)}
|
|
32727
|
+
.mp-wl-tag{display:inline-block;margin:0 6px 4px 0;padding:1px 8px;border-radius:999px;background:var(--band)}
|
|
32728
|
+
.mp-wl-tag.on{background:var(--lu);color:var(--on-accent)}
|
|
32729
|
+
.mp-wl-sec,.mp-wl-note{font-size:13px;line-height:1.6;padding-bottom:5px}
|
|
32730
|
+
.mp-wl-sec em{font-style:normal;margin-right:6px}
|
|
32731
|
+
.mp-wl-steps{display:flex;flex-direction:column;gap:3px}
|
|
32732
|
+
.mp-wl-step{display:grid;grid-template-columns:16px 1fr 34px auto;gap:7px;font-size:12px;padding:3px 7px;border-radius:7px}
|
|
32733
|
+
.mp-wl-step.on{background:var(--band);font-weight:600}
|
|
32734
|
+
.mp-ty-h{display:flex;flex-wrap:wrap;gap:8px;align-items:baseline;padding-bottom:7px}
|
|
32735
|
+
.mp-ty-y{font-size:15px;font-weight:700}
|
|
32736
|
+
.mp-ty-j{font-weight:600;color:var(--lu)}
|
|
32737
|
+
.mp-ty-m{font-size:11px;color:var(--label)}
|
|
32738
|
+
.mp-pl{padding:8px 2px 2px;margin-top:6px}
|
|
32739
|
+
.mp-pl-lead{margin:0 0 4px;font-size:14px;font-weight:600;color:var(--ink)}
|
|
32740
|
+
.mp-pl-how{margin:0;font-size:13px;line-height:1.6;color:var(--ink2)}
|
|
32741
|
+
.mp-ty-plain{padding:9px 2px 10px;border-top:1px solid var(--hair);margin-top:8px}
|
|
32742
|
+
.mp-ty-plain p{margin:0 0 6px;font-size:13px;line-height:1.65;color:var(--ink2)}
|
|
32743
|
+
.mp-ty-plain .mp-ty-lead{font-size:14px;font-weight:600;color:var(--ink)}
|
|
32744
|
+
.mp-ty-plain .mp-ty-close{font-size:12px;color:var(--label);margin-bottom:0}
|
|
32745
|
+
.mp-ty-det{margin-top:4px}
|
|
32746
|
+
.mp-ty-det summary{cursor:pointer;font-size:12px;color:var(--label);padding:4px 0}
|
|
32747
|
+
.mp-ty-g{display:grid;grid-template-columns:repeat(3,1fr);gap:4px;margin:2px 0 8px}
|
|
32748
|
+
.mp-ty-cell{position:relative;border-radius:8px;background:var(--band);padding:7px 6px;text-align:center;font-size:12px;min-height:50px}
|
|
32749
|
+
.mp-ty-cell b{display:block;font-size:13px}
|
|
32750
|
+
.mp-ty-cell em{font-style:normal;font-size:11px;color:var(--label)}
|
|
32751
|
+
.mp-ty-cell.on{background:var(--lu);color:var(--on-accent)}
|
|
32752
|
+
.mp-ty-cell.on em{color:rgba(255,255,255,.82)}
|
|
32753
|
+
.mp-ty-cell.mid{opacity:.5}
|
|
32754
|
+
.mp-ty-mark{position:absolute;top:3px;right:4px;font-style:normal;font-size:10px;padding:0 4px;border-radius:999px;background:var(--on-accent);color:var(--lu)}
|
|
32755
|
+
.mp-ty-jx{font-weight:600}
|
|
32756
|
+
.mp-ty-jx.xiong{color:var(--red)}
|
|
32757
|
+
.mp-ty-jx.buhe{color:var(--quan)}
|
|
32758
|
+
.mp-ty-jx.daji{color:var(--lu);font-weight:700}
|
|
32759
|
+
.mp-ty-jx.ji{color:var(--lu)}
|
|
32760
|
+
.mp-ty-mark.s{top:19px;background:var(--band);color:var(--ink2)}
|
|
32761
|
+
.mp-ty-mark.w{right:auto;left:4px;color:var(--ink2)}
|
|
32762
|
+
.mp-ty-sec{font-size:13px;line-height:1.6;padding-bottom:4px}
|
|
32763
|
+
.mp-ty-sec em{font-style:normal;margin-right:6px;color:var(--label)}
|
|
32764
|
+
.mp-ty-note{font-size:11px;line-height:1.6;color:var(--label)}
|
|
32765
|
+
.mp-cs{border-radius:12px;overflow:hidden;background:var(--label);border:1px solid var(--hair)}
|
|
32766
|
+
.mp-cs-h{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 12px;border-bottom:1px solid var(--hair)}
|
|
32767
|
+
.mp-cs-main{font-size:20px;font-weight:800;letter-spacing:.04em}
|
|
32768
|
+
.mp-cs-meta{display:flex;flex-direction:column;gap:1px;flex:1 1 160px;min-width:0}
|
|
32769
|
+
.mp-cs-meta b{font-size:13px;font-weight:600;line-height:1.5}
|
|
32770
|
+
.mp-cs-meta i{font-size:12px;font-style:normal;color:var(--ink2)}
|
|
32771
|
+
.mp-cs-count{font-size:12px;color:var(--ink2);white-space:nowrap}
|
|
32772
|
+
.mp-cs-bars{display:flex;flex-direction:column;gap:5px;padding:10px 12px 8px}
|
|
32773
|
+
.mp-cs-row{display:grid;grid-template-columns:52px 1fr 30px 52px;align-items:center;gap:8px;font-size:12px;line-height:1.4}
|
|
32774
|
+
.mp-cs-row.main{font-weight:700}
|
|
32775
|
+
.mp-cs-n{white-space:nowrap}
|
|
32776
|
+
.mp-cs-track{position:relative;height:8px;border-radius:999px;background:var(--band)}
|
|
32777
|
+
.mp-cs-track i{display:block;height:100%;border-radius:999px;background:var(--dimline)}
|
|
32778
|
+
.mp-cs-track i.on{background:var(--lu)}
|
|
32779
|
+
.mp-cs-tick{position:absolute;top:0;bottom:0;width:1px;background:var(--label)}
|
|
32780
|
+
.mp-cs-v{text-align:right;color:var(--ink)}
|
|
32781
|
+
.mp-cs-l{color:var(--ink2);font-size:11px}
|
|
32782
|
+
.mp-cs-sec{padding:2px 12px 6px;font-size:13px;line-height:1.7}
|
|
32783
|
+
.mp-cs-sec em{display:inline-block;margin-right:6px;padding:0 6px;border-radius:4px;font-style:normal;font-size:11px;background:var(--band);color:var(--ink2)}
|
|
32784
|
+
.mp-cs-care{padding:4px 12px 8px;font-size:13px;line-height:1.7}
|
|
32785
|
+
.mp-cs-care b{display:block;margin-bottom:2px}
|
|
32786
|
+
.mp-cs-care ul{margin:0;padding-left:18px}
|
|
32787
|
+
.mp-cs-note{padding:6px 12px 10px;font-size:12px;line-height:1.6;color:var(--ink2)}
|
|
32788
|
+
.mp-cs-paper{padding:8px 12px;font-size:13px;line-height:1.7}
|
|
32789
|
+
.mp-cs-paper ol{margin:6px 0;padding-left:20px}
|
|
32790
|
+
.mp-cs-paper li{margin:2px 0}
|
|
32791
|
+
.mp-cs-no{display:inline-block;min-width:22px;color:var(--ink2);font-variant-numeric:tabular-nums}
|
|
32792
|
+
.mp-cs-paper li em{margin-left:6px;font-style:normal;font-size:11px;color:var(--ink2)}
|
|
32793
|
+
.mp-cs-paper .mp-cs-h{display:flex;align-items:center;gap:10px;padding:0 0 6px}
|
|
32794
|
+
.mp-cs-paper .mp-cs-h i{font-size:12px;font-style:normal;color:var(--ink2)}
|
|
32795
|
+
.mp-cs-paper .mp-cs-count{font-size:12px;color:var(--ink2)}
|
|
32796
|
+
.mp-cs-paper .mp-cs-note{font-size:12px;color:var(--ink2)}
|
|
32161
32797
|
.mp-br{margin:0 0 12px;padding:14px 16px 12px;border:1px solid color-mix(in srgb,var(--red) 26%,var(--line));border-radius:12px;
|
|
32162
32798
|
background:linear-gradient(180deg,color-mix(in srgb,var(--red) 6%,var(--card)),var(--card));color:var(--ink)}
|
|
32163
32799
|
.mp-br-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}
|
|
@@ -35607,34 +36243,127 @@ window.__MP_VER = "0.69.0";
|
|
|
35607
36243
|
// 分数是数值,直接插;文字一律走 esc(check-html-sinks 按「调用了 esc」核对)。
|
|
35608
36244
|
// 太乙神数:九宫地盘 + 太乙/文昌落点 + 八门 + 五元六纪。
|
|
35609
36245
|
// 地盘按「南上北下」排:巽离坤 / 震中兑 / 艮坎乾。中五宫太乙不入,只作方位补全。
|
|
35610
|
-
//
|
|
36246
|
+
// 太乙、八门、文昌、计神、始击、主客算与四将都是算实的;定目、三基五福十精、击格不在盘上出现。
|
|
36247
|
+
|
|
36248
|
+
// 盘面下一句人话 + 怎么读;太乙自带白话层,返回空避重复。
|
|
36249
|
+
const PC = ' liuyao tarot meihua daliuren qimen xiaoliuren ';
|
|
36250
|
+
const PD = ' almanac zeri convert star numerology wuyunliuqi ';
|
|
36251
|
+
const SAY = {
|
|
36252
|
+
cast: '先看卦名或牌名——事情此刻的样子;再看动爻、正逆位,变化在那里。',
|
|
36253
|
+
person: '先找「你」那一格(日主、命宫或主质);再看被强调的字或星。',
|
|
36254
|
+
day: '先看今天值什么,再看宜忌那几栏。',
|
|
36255
|
+
};
|
|
36256
|
+
pp.plainHTML = function (r) {
|
|
36257
|
+
if (!r || r.system === 'taiyi') return '';
|
|
36258
|
+
const lead = (r.brief && r.brief.lead) || '';
|
|
36259
|
+
if (!lead) return '';
|
|
36260
|
+
const s = ' ' + String(r.system || '') + ' ';
|
|
36261
|
+
const say = PC.indexOf(s) >= 0 ? SAY.cast : PD.indexOf(s) >= 0 ? SAY.day : SAY.person;
|
|
36262
|
+
return '<div class="mp-pl"><p class="mp-pl-lead">' + esc(lead) + '</p><p class="mp-pl-how">' + esc(say) + '</p></div>';
|
|
36263
|
+
};
|
|
36264
|
+
|
|
35611
36265
|
pp.taiyiHTML = function (r) {
|
|
35612
36266
|
if (!r || !r.taiyi || !r.meta) return '';
|
|
35613
36267
|
const t = r.taiyi;
|
|
35614
36268
|
const wc = r.wenchang || {};
|
|
36269
|
+
const sj = r.shiji || {};
|
|
36270
|
+
const js = r.jishen || {};
|
|
36271
|
+
const su = r.suan || {};
|
|
36272
|
+
const jj = r.jiang || {};
|
|
36273
|
+
const gj = r.geju || {};
|
|
35615
36274
|
const grid = [[9, '巽'], [2, '离'], [7, '坤'], [4, '震'], [5, '中'], [6, '兑'], [3, '艮'], [8, '坎'], [1, '乾']];
|
|
35616
36275
|
const cells = grid.map((c) => {
|
|
35617
36276
|
const num = c[0];
|
|
35618
36277
|
const nm = c[1];
|
|
35619
36278
|
const on = t.palace === num;
|
|
35620
36279
|
const w = wc.num === num;
|
|
35621
|
-
const
|
|
36280
|
+
const sjOn = sj.palace === num;
|
|
36281
|
+
const marks = (on ? '<i class="mp-ty-mark">太乙</i>' : '') + (sjOn ? '<i class="mp-ty-mark s">始击</i>' : '') + (w ? '<i class="mp-ty-mark w">文昌</i>' : '');
|
|
35622
36282
|
return `<div class="mp-ty-cell${on ? ' on' : ''}${nm === '中' ? ' mid' : ''}"><b>${esc(nm)}</b><em>${num}</em>${marks}</div>`;
|
|
35623
36283
|
}).join('');
|
|
35624
36284
|
const nc = (r.scope && r.scope.notCovered) || [];
|
|
36285
|
+
const mo = r.month || {};
|
|
36286
|
+
const da = r.day || {};
|
|
36287
|
+
const ho = r.hour || {};
|
|
36288
|
+
const monthN = (mo.taiyi && mo.taiyi.palaceName) || '';
|
|
36289
|
+
const monthU = String((mo.taiyi && mo.taiyi.unitInPalace) || '');
|
|
36290
|
+
const monthMu = mo.mu ? mo.mu.pos + '(' + mo.mu.god + ')' : '';
|
|
36291
|
+
const monthJs = (mo.jishen && mo.jishen.branch) || '';
|
|
36292
|
+
const dayN = (da.taiyi && da.taiyi.palaceName) || '';
|
|
36293
|
+
const dayU = String((da.taiyi && da.taiyi.unitInPalace) || '');
|
|
36294
|
+
const dayMu = da.mu ? da.mu.pos + '(' + da.mu.god + ')' : '';
|
|
36295
|
+
const dayJs = (da.jishen && da.jishen.branch) || '';
|
|
36296
|
+
const hourN = (ho.taiyi && ho.taiyi.palaceName) || '';
|
|
36297
|
+
const hourU = String((ho.taiyi && ho.taiyi.unitInPalace) || '');
|
|
36298
|
+
const hourJs = (ho.jishen && ho.jishen.branch) || '';
|
|
36299
|
+
const jx = r.jixiong || {};
|
|
36300
|
+
const vd = r.verdict || {};
|
|
36301
|
+
const vdGrade = vd.grade || jx.grade || 'xiong';
|
|
36302
|
+
const vdLabel = vd.label || jx.label || '凶';
|
|
36303
|
+
const sjj = r.shenjiang || {};
|
|
36304
|
+
const sjLine = sjj.rows
|
|
36305
|
+
? `${sjj.stem}日、${sjj.day ? '昼贵' : '夜贵'}起${sjj.startBranch}${sjj.dir > 0 ? '顺' : '逆'}行;吉神下:${(sjj.goods || []).join('、') || '无'};凶神下:${(sjj.bads || []).join('、') || '无'}`
|
|
36306
|
+
: '未排';
|
|
36307
|
+
const jxGrade = jx.grade || 'xiong';
|
|
36308
|
+
const jxLabel = jx.label || '凶';
|
|
36309
|
+
const gateName = (r.gate && r.gate.gate) || '';
|
|
36310
|
+
// 八种格局翻成日常话,一个词只翻一次
|
|
36311
|
+
const SAY = {
|
|
36312
|
+
掩: '客方的目和太乙挤在同一格',
|
|
36313
|
+
击: '始击挨在太乙左右',
|
|
36314
|
+
格: '太乙和始击隔一格正面对上',
|
|
36315
|
+
对: '文昌从对面顶过来',
|
|
36316
|
+
提: '客大将和文昌挤在一格',
|
|
36317
|
+
迫: '有将贴得太近,就在太乙前后一格',
|
|
36318
|
+
囚: '有将被关在太乙那一格里',
|
|
36319
|
+
关: '主客两边的人撞在一处',
|
|
36320
|
+
};
|
|
36321
|
+
const hits = (gj.list || []).map((x) => {
|
|
36322
|
+
const k = String(x).charAt(0);
|
|
36323
|
+
return SAY[k] ? k + '——' + SAY[k] : String(x);
|
|
36324
|
+
});
|
|
36325
|
+
const lead = jxGrade === 'xiong'
|
|
36326
|
+
? `太乙站在${t.palaceName}宫(${t.dir}),值${gateName}门,判凶:主客两边有几样撞到了一起。`
|
|
36327
|
+
: jxGrade === 'daji'
|
|
36328
|
+
? `太乙站在${t.palaceName}宫(${t.dir}),值${gateName}门,判大吉:位置和数都顺,门也在吉道上。`
|
|
36329
|
+
: jxGrade === 'buhe'
|
|
36330
|
+
? `太乙站在${t.palaceName}宫(${t.dir}),值${gateName}门,判不和:位置不冲突,但数上不合。`
|
|
36331
|
+
: `太乙站在${t.palaceName}宫(${t.dir}),值${gateName}门,判吉:位置不冲突。`;
|
|
35625
36332
|
return `<section class="mp-ty" aria-label="太乙神数">
|
|
35626
36333
|
<div class="mp-ty-h">
|
|
35627
36334
|
<span class="mp-ty-y">${esc(String(r.meta.year))} 年</span>
|
|
35628
36335
|
<span class="mp-ty-j">${esc(r.meta.dunText || '')}${esc(String(r.meta.ju))}局</span>
|
|
35629
36336
|
<span class="mp-ty-m">太乙临 ${esc(t.palaceName || '')} 宫</span>
|
|
35630
|
-
<span class="mp-ty-m">${esc(
|
|
36337
|
+
<span class="mp-ty-m">${esc(gateName)}</span>
|
|
35631
36338
|
</div>
|
|
35632
36339
|
<div class="mp-ty-g">${cells}</div>
|
|
35633
|
-
<div class="mp-ty-
|
|
35634
|
-
|
|
35635
|
-
|
|
35636
|
-
|
|
35637
|
-
|
|
36340
|
+
<div class="mp-ty-plain">
|
|
36341
|
+
<p class="mp-ty-lead">${esc(lead)}</p>
|
|
36342
|
+
<p>先看太乙落在哪一格——那是「主」这一年的位置,整张盘围着它转。</p>
|
|
36343
|
+
<p>${esc(gateName)}门一值三十年,管的是这三十年的大环境,不是今年单一年的事。</p>
|
|
36344
|
+
<p>判${esc(jxLabel)},是因为${esc(hits.length ? hits.join(';') : '八种位置关系一个都没犯')}。</p>
|
|
36345
|
+
<p class="mp-ty-close">这一层只摆位置和数,不回答事情成不成;想看每一步怎么来的,展开下面的细目。</p>
|
|
36346
|
+
</div>
|
|
36347
|
+
<details class="mp-ty-det">
|
|
36348
|
+
<summary>细目(想核对推导再展开)</summary>
|
|
36349
|
+
<div class="mp-ty-sec"><em>太乙</em>第 ${esc(String(t.palace || ''))} 宫(${esc(t.dir || '')}),三年里的第 ${esc(String(t.yearInPalace || ''))} 年,${esc(t.li || '')}</div>
|
|
36350
|
+
<div class="mp-ty-sec"><em>八门</em>${esc(gateName)} 八门三十年一转,1954 年从休门起</div>
|
|
36351
|
+
<div class="mp-ty-sec"><em>文昌</em>${esc(wc.pos || '')}(${esc(wc.god || '')},${esc(wc.palaceName || '')}宫) 十八年一周</div>
|
|
36352
|
+
<div class="mp-ty-sec"><em>定目</em>${esc((r.dingmu && r.dingmu.pos) || '')}(${esc((r.dingmu && r.dingmu.god) || '')}) <em>三基</em>君${esc((r.sanji && r.sanji.jun) || '')} 臣${esc((r.sanji && r.sanji.chen) || '')} 民${esc((r.sanji && r.sanji.min) || '')}</div>
|
|
36353
|
+
<div class="mp-ty-sec"><em>五福</em>${esc((r.wufu && r.wufu.palaceName) || '')}宫 <em>大游</em>${esc((r.dayou && r.dayou.palaceName) || '')}宫 <em>十精</em>天乙${esc((r.shijing && r.shijing.tianyi) || '')} 地乙${esc((r.shijing && r.shijing.diyi) || '')} 直符${esc((r.shijing && r.shijing.zhifu) || '')}</div>
|
|
36354
|
+
<div class="mp-ty-sec"><em>数和</em>主算 ${esc((r.heshu && r.heshu.zhu && r.heshu.zhu.text) || '')} 客算 ${esc((r.heshu && r.heshu.ke && r.heshu.ke.text) || '')}</div>
|
|
36355
|
+
<div class="mp-ty-sec"><em>月计</em>太乙在 ${esc(monthN)} 宫(第 ${esc(monthU)} 月) 天目 ${esc(monthMu)} 计神 ${esc(monthJs)}</div>
|
|
36356
|
+
<div class="mp-ty-sec"><em>日计</em>太乙在 ${esc(dayN)} 宫(第 ${esc(dayU)} 日) 天目 ${esc(dayMu)} 计神 ${esc(dayJs)}</div>
|
|
36357
|
+
<div class="mp-ty-sec"><em>时计</em>太乙在 ${esc(hourN)} 宫(第 ${esc(hourU)} 时) 计神 ${esc(hourJs)}</div>
|
|
36358
|
+
<div class="mp-ty-sec"><em>吉凶</em><b class="mp-ty-jx ${esc(vdGrade)}">${esc(vdLabel)}</b> ${esc((r.jixiong && r.jixiong.text) || '')}</div>
|
|
36359
|
+
<div class="mp-ty-sec"><em>神将</em>${esc(sjLine)}</div>
|
|
36360
|
+
<div class="mp-ty-sec"><em>计神</em>${esc(js.branch || '')}(${esc(js.god || '')}) <em>始击</em>${esc(sj.pos || '')}(${esc(sj.god || '')},${esc(sj.palaceName || '')}宫)</div>
|
|
36361
|
+
<div class="mp-ty-sec"><em>主算</em>${esc(String(su.zhu || ''))} 主大将${esc(jj.zhuDaName || '')}宫 主参将${esc(jj.zhuCanName || '')}宫</div>
|
|
36362
|
+
<div class="mp-ty-sec"><em>客算</em>${esc(String(su.ke || ''))} 客大将${esc(jj.keDaName || '')}宫 客参将${esc(jj.keCanName || '')}宫</div>
|
|
36363
|
+
<div class="mp-ty-sec"><em>格局</em>${gj.list && gj.list.length ? esc(gj.list.join(';')) : '四将不相犯,没有掩、迫、囚、格、关'}</div>
|
|
36364
|
+
<div class="mp-ty-sec"><em>积年</em>${esc(String(r.meta.jinian || ''))} 残年 ${esc(String(r.meta.rest360 || ''))} ${esc(r.year ? r.year.jiName : '')}${esc(r.year ? String(r.year.jiYear) : '')}年 ${esc(r.year ? r.year.yuanName : '')}第 ${esc(r.year ? String(r.year.yuanYear) : '')} 年</div>
|
|
36365
|
+
<div class="mp-ty-note">算到太乙、八门、文昌、计神、始击、主客算与四将、五种格局;${esc(nc.join('、'))}未收录,盘上不显示。将落中五时只标数不加宫名。</div>
|
|
36366
|
+
</details>
|
|
35638
36367
|
</section>`;
|
|
35639
36368
|
};
|
|
35640
36369
|
|
|
@@ -37073,7 +37802,7 @@ document.head.appendChild(Object.assign(document.createElement('style'), { textC
|
|
|
37073
37802
|
if (window.Engine.caliberCompare) {
|
|
37074
37803
|
try { caliber = window.Engine.caliberCompare(args); } catch (e) { caliber = null; }
|
|
37075
37804
|
}
|
|
37076
|
-
const
|
|
37805
|
+
const chart0 = (tab === 'ziwei' ? window.__PP.ziweiHTML(r)
|
|
37077
37806
|
: tab === 'bazi' ? (window.__PP.baziHTML(r) + (trend ? window.__PP.trendHTML(trend, { brief: false }) : ''))
|
|
37078
37807
|
: tab === 'hepan' ? (r.chart === 'ziwei' ? window.__PP.ziweiHepanHTML(r) : window.__PP.hepanHTML(r))
|
|
37079
37808
|
: tab === 'qimen' ? (window.__PP.qimenHTML(r) + window.__PP.qimenFactsHTML(r))
|
|
@@ -37092,6 +37821,12 @@ document.head.appendChild(Object.assign(document.createElement('style'), { textC
|
|
|
37092
37821
|
: tab === 'taiyi' ? window.__PP.taiyiHTML(r)
|
|
37093
37822
|
: tab === 'fengshui' ? window.__PP.fengshuiHTML(r)
|
|
37094
37823
|
: window.__PP.quickHTML(r));
|
|
37824
|
+
// 独立页按和面板一样的口径:盘面第一、白话其次、结论方框最后(早前只在 app.js 做,独立页没跟上)。
|
|
37825
|
+
const cut = chart0.startsWith('<section class="mp-br"') ? chart0.indexOf('</section>') : -1;
|
|
37826
|
+
const html = (lineWarn ? `<div class="note">${lineWarn}</div>` : '')
|
|
37827
|
+
+ (cut < 0 ? chart0 : chart0.slice(cut + 10))
|
|
37828
|
+
+ window.__PP.plainHTML(r)
|
|
37829
|
+
+ (cut < 0 ? '' : chart0.slice(0, cut + 10));
|
|
37095
37830
|
// 新盘就是新的一轮:上一次的自评、贴合度、候选时辰不能跟着贴到这张盘上
|
|
37096
37831
|
// (它们只在模块里存着,重绘不会自己清)。
|
|
37097
37832
|
pastMarks = {}; pastFit = null; rectOut = null;
|