dsh-metaphysics 0.63.0 → 0.64.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 +68 -0
- package/client.almanac.js +10 -10
- package/client.chart.js +132 -132
- package/client.chenggu.js +12 -12
- package/client.convert.js +14 -14
- package/client.daliuren.js +43 -43
- package/client.fengshui.js +3 -3
- package/client.js +204 -192
- package/client.liuyao.js +5 -5
- package/client.mbti.js +3 -3
- package/client.name.js +14 -14
- package/client.numerology.js +3 -3
- package/client.qimen.js +5 -5
- package/client.star.js +40 -40
- package/client.tarot.js +38 -38
- package/client.xiaoliuren.js +3 -3
- package/client.zeri.js +14 -14
- package/engine/diff.js +14 -0
- package/engine/index.js +4 -4
- package/engine/interpret.js +4 -3
- package/engine/ziwei.js +114 -19
- package/index.js +22 -2
- package/package.json +1 -1
- package//345/221/275/347/220/206/346/216/222/347/233/230.html +193 -46
|
@@ -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.64.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>测试:164 个测试文件 /
|
|
656
|
+
<ul><li>测试:164 个测试文件 / 8891 条断言;七道闸(回归 · 断言基线 · 测试可失败自检 · 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>
|
|
@@ -1224,9 +1224,23 @@ const CALIBER_SWITCHES = {
|
|
|
1224
1224
|
ziweiSchoolSwitch('shenzhuSchool', '身主:子午皆火星 / 子铃午火', '身主', 'common', 'verse', {
|
|
1225
1225
|
common: '子午皆火星', verse: '子铃午火(安身主诀逐字)',
|
|
1226
1226
|
}),
|
|
1227
|
+
ziweiSchoolSwitch('mingzhuSchool', '命主取法:命宫地支 / 生年年支', '命主取法', 'soul-branch', 'year-branch', {
|
|
1228
|
+
'soul-branch': '命宫地支(通行本)', 'year-branch': '生年年支(中州派)',
|
|
1229
|
+
}),
|
|
1227
1230
|
ziweiSchoolSwitch('zuoyaoSchool', '杂曜:49 颗简盘 / 61 颗全表', '杂曜全表', 'minimal', 'full', {
|
|
1228
1231
|
minimal: '49 颗(简盘)', full: '61 颗(加十二颗杂曜)',
|
|
1229
1232
|
}),
|
|
1233
|
+
ziweiSchoolSwitch('liunianSihua', '流年四化取干:流年天干 / 流年命宫宫干', '流年四化取干', 'year-stem', 'life-palace-stem', {
|
|
1234
|
+
'year-stem': '流年天干', 'life-palace-stem': '流年命宫宫干',
|
|
1235
|
+
}),
|
|
1236
|
+
// 十干四化变体有十一档,口径卡只拿「甲干廉破曲阳」当对照样本:
|
|
1237
|
+
// 甲年换成文曲化科、太阳化忌这一档,与本插件默认的武曲化科最近、最能看出整表在动。
|
|
1238
|
+
ziweiSchoolSwitch('sihuaVariant', '十干四化:通行表 / 变体整表替换', '十干四化变体', 'default', '廉破曲阳', {
|
|
1239
|
+
default: '各干通行表', 廉破曲阳: '甲干 廉破曲阳',
|
|
1240
|
+
贪阴阳机: '戊干 贪阴阳机', 阳武同阴: '庚干 阳武同阴', 阳武府同: '庚干 阳武府同',
|
|
1241
|
+
阳武府相: '庚干 阳武府相', 阳武同相: '庚干 阳武同相', 巨阳武昌: '辛干 巨阳武昌',
|
|
1242
|
+
梁紫府武: '壬干 梁紫府武', 梁紫相武: '壬干 梁紫相武', 破巨阳贪: '癸干 破巨阳贪',
|
|
1243
|
+
}),
|
|
1230
1244
|
],
|
|
1231
1245
|
qimen: [
|
|
1232
1246
|
{
|
|
@@ -9558,7 +9572,10 @@ const ZIWEI_SCHOOL_DEFAULTS = Object.freeze({
|
|
|
9558
9572
|
changshengSchool: 'yin-yang-shun-ni',
|
|
9559
9573
|
lateZishi: 'current-day',
|
|
9560
9574
|
shenzhuSchool: 'common',
|
|
9575
|
+
mingzhuSchool: 'soul-branch',
|
|
9561
9576
|
zuoyaoSchool: 'minimal',
|
|
9577
|
+
liunianSihua: 'year-stem',
|
|
9578
|
+
sihuaVariant: 'default',
|
|
9562
9579
|
});
|
|
9563
9580
|
|
|
9564
9581
|
const ZIWEI_SCHOOL_OPTIONS = Object.freeze({
|
|
@@ -9572,7 +9589,18 @@ const ZIWEI_SCHOOL_OPTIONS = Object.freeze({
|
|
|
9572
9589
|
changshengSchool: ['yin-yang-shun-ni', 'shui-tu', 'huo-tu'],
|
|
9573
9590
|
lateZishi: ['current-day', 'next-day', 'all-current', 'day-cur-time-next'],
|
|
9574
9591
|
shenzhuSchool: ['common', 'verse'],
|
|
9592
|
+
// 命主取法:两派共用同一张十二支→命主星的表(贪狼子、巨门丑亥、禄存寅戌、文曲卯酉、
|
|
9593
|
+
// 廉贞辰申、武曲巳未、破军午),分歧只在「拿哪个地支去查」——
|
|
9594
|
+
// soul-branch(默认,通行本 /《紫微斗数全书》卷二「安命主」):按命宫地支
|
|
9595
|
+
// year-branch(中州派,王亭之整理):按生年年支
|
|
9596
|
+
// 实测命宫地支与生年年支重合的只占约 8%,两派约九成的人的命主不同。
|
|
9597
|
+
mingzhuSchool: ['soul-branch', 'year-branch'],
|
|
9575
9598
|
zuoyaoSchool: ['minimal', 'full'],
|
|
9599
|
+
liunianSihua: ['year-stem', 'life-palace-stem'],
|
|
9600
|
+
// 十干四化变体:default 表示各干用本插件原有通行表;其余按文墨变体名整表替换。
|
|
9601
|
+
// 只列与 default 不同的那一档(default 之外全是「换掉某一干」的显式选择)。
|
|
9602
|
+
sihuaVariant: ['default', '廉破曲阳', '贪阴阳机', '阳武同阴', '阳武府同', '阳武府相',
|
|
9603
|
+
'阳武同相', '巨阳武昌', '梁紫府武', '梁紫相武', '破巨阳贪'],
|
|
9576
9604
|
});
|
|
9577
9605
|
|
|
9578
9606
|
function ziweiSchoolsOf(input = {}) {
|
|
@@ -9684,11 +9712,67 @@ const GENG_MUTAGEN = {
|
|
|
9684
9712
|
GYWTX: { 太阳: '禄', 武曲: '权', 天同: '科', 天相: '忌' },
|
|
9685
9713
|
};
|
|
9686
9714
|
|
|
9715
|
+
// 十干四化变体全表(文墨天机「十干四化」,2026-11 从 WMTJ-Pro64-2.5.26 的 App.swf 常量表挖出)。
|
|
9716
|
+
// 变体名一律取文墨原文四字,按「禄 权 科 忌」的顺序念,所以名字本身就是这张表:
|
|
9717
|
+
// 「廉破曲阳」= 廉贞化禄、破军化权、文曲化科、太阳化忌。
|
|
9718
|
+
// 每干第一个是与本插件原有默认表完全一致的那一档,乙丙丁己四干文墨没有变体。
|
|
9719
|
+
// 这张表和 gengYearSihua 不是一回事:gengYearSihua 只换生年四化里庚年那一支,
|
|
9720
|
+
// sihuaVariant 换的是整张十干四化表(生年、宫干自化、大限宫干、飞星、流年一起走)。
|
|
9721
|
+
const SIHUA_VARIANTS = Object.freeze({
|
|
9722
|
+
廉破武阳: { stem: '甲', table: MUTAGEN.甲 },
|
|
9723
|
+
廉破曲阳: { stem: '甲', table: Object.freeze({ 廉贞: '禄', 破军: '权', 文曲: '科', 太阳: '忌' }) },
|
|
9724
|
+
贪阴右机: { stem: '戊', table: MUTAGEN.戊 },
|
|
9725
|
+
贪阴阳机: { stem: '戊', table: Object.freeze({ 贪狼: '禄', 太阴: '权', 太阳: '科', 天机: '忌' }) },
|
|
9726
|
+
阳武阴同: { stem: '庚', table: GENG_MUTAGEN.GYWYT },
|
|
9727
|
+
阳武同阴: { stem: '庚', table: GENG_MUTAGEN.GYWTY },
|
|
9728
|
+
阳武府同: { stem: '庚', table: GENG_MUTAGEN.GYWFT },
|
|
9729
|
+
阳武府相: { stem: '庚', table: GENG_MUTAGEN.GYWFX },
|
|
9730
|
+
阳武同相: { stem: '庚', table: GENG_MUTAGEN.GYWTX },
|
|
9731
|
+
巨阳曲昌: { stem: '辛', table: MUTAGEN.辛 },
|
|
9732
|
+
巨阳武昌: { stem: '辛', table: Object.freeze({ 巨门: '禄', 太阳: '权', 武曲: '科', 文昌: '忌' }) },
|
|
9733
|
+
梁紫辅武: { stem: '壬', table: MUTAGEN.壬 },
|
|
9734
|
+
梁紫府武: { stem: '壬', table: Object.freeze({ 天梁: '禄', 紫微: '权', 天府: '科', 武曲: '忌' }) },
|
|
9735
|
+
梁紫相武: { stem: '壬', table: Object.freeze({ 天梁: '禄', 紫微: '权', 天相: '科', 武曲: '忌' }) },
|
|
9736
|
+
破巨阴贪: { stem: '癸', table: MUTAGEN.癸 },
|
|
9737
|
+
破巨阳贪: { stem: '癸', table: Object.freeze({ 破军: '禄', 巨门: '权', 太阳: '科', 贪狼: '忌' }) },
|
|
9738
|
+
});
|
|
9739
|
+
|
|
9687
9740
|
function mutagenOf(stem, schools) {
|
|
9688
9741
|
if (stem === '庚') return GENG_MUTAGEN[schools.gengYearSihua] || MUTAGEN.庚;
|
|
9689
9742
|
return MUTAGEN[stem] ?? {};
|
|
9690
9743
|
}
|
|
9691
9744
|
|
|
9745
|
+
/**
|
|
9746
|
+
* 取某一干的四化表(宫干自化、大限宫干、飞星、流年都用这张)。
|
|
9747
|
+
* 只认 `sihuaVariant`——`gengYearSihua` 按既有约定只管生年四化那一支,
|
|
9748
|
+
* 不能让它顺带改掉宫干自化(那是另一套断法,混了就是两派口径串味)。
|
|
9749
|
+
* 变体名所属天干对不上这一干时不生效,直接落回该干通行表,不会把甲的表套到乙上。
|
|
9750
|
+
* @param {string} stem 天干
|
|
9751
|
+
* @param {object} [schools] 流派开关
|
|
9752
|
+
* @returns {Record<string,string>} 星名 → 禄/权/科/忌
|
|
9753
|
+
*/
|
|
9754
|
+
function sihuaTableOf(stem, schools) {
|
|
9755
|
+
const variant = schools && schools.sihuaVariant;
|
|
9756
|
+
if (variant && variant !== 'default') {
|
|
9757
|
+
const v = SIHUA_VARIANTS[variant];
|
|
9758
|
+
if (v && v.stem === stem) return v.table;
|
|
9759
|
+
}
|
|
9760
|
+
return MUTAGEN[stem] ?? {};
|
|
9761
|
+
}
|
|
9762
|
+
|
|
9763
|
+
/**
|
|
9764
|
+
* 生年四化专用的取表:先看 `sihuaVariant`,没命中该干再让 `gengYearSihua` 生效。
|
|
9765
|
+
* 两项同时指向庚干时以 `sihuaVariant` 为准——它说的是「整张表长这样」,比单点覆盖更明确。
|
|
9766
|
+
* @param {string} stem 年干
|
|
9767
|
+
* @param {object} [schools] 流派开关
|
|
9768
|
+
* @returns {Record<string,string>} 星名 → 禄/权/科/忌
|
|
9769
|
+
*/
|
|
9770
|
+
function natalSihuaTableOf(stem, schools) {
|
|
9771
|
+
const table = sihuaTableOf(stem, schools);
|
|
9772
|
+
if (table === MUTAGEN[stem]) return mutagenOf(stem, schools || {});
|
|
9773
|
+
return table;
|
|
9774
|
+
}
|
|
9775
|
+
|
|
9692
9776
|
// 安魁钺三派:差异集中在庚辛壬癸年(「网络派」与 qs1 同表,不单列)
|
|
9693
9777
|
const KUI_YUE_SCHOOLS = {
|
|
9694
9778
|
qs2: {
|
|
@@ -9719,7 +9803,7 @@ const KUI_YUE = {
|
|
|
9719
9803
|
};
|
|
9720
9804
|
KUI_YUE_SCHOOLS.qs1 = KUI_YUE;
|
|
9721
9805
|
|
|
9722
|
-
/**
|
|
9806
|
+
/** 命主:按地支查表。两派共用这张表,分歧在拿哪个地支 —— 见 mingzhuSchool。 */
|
|
9723
9807
|
const MING_ZHU = {
|
|
9724
9808
|
子: '贪狼', 丑: '巨门', 寅: '禄存', 卯: '文曲', 辰: '廉贞', 巳: '武曲',
|
|
9725
9809
|
午: '破军', 未: '武曲', 申: '廉贞', 酉: '文曲', 戌: '禄存', 亥: '巨门',
|
|
@@ -10027,7 +10111,7 @@ function buildZiwei(input) {
|
|
|
10027
10111
|
}
|
|
10028
10112
|
|
|
10029
10113
|
// 生年四化(庚干按所选变体)
|
|
10030
|
-
const mutagenMap =
|
|
10114
|
+
const mutagenMap = natalSihuaTableOf(yearStem, schools);
|
|
10031
10115
|
for (const list of starsByBranch) {
|
|
10032
10116
|
for (const star of list) {
|
|
10033
10117
|
if (mutagenMap[star.name]) star.mutagen = mutagenMap[star.name];
|
|
@@ -10063,7 +10147,7 @@ function buildZiwei(input) {
|
|
|
10063
10147
|
const stepIndex = forward ? fix(branch - soulIndex) : fix(soulIndex - branch);
|
|
10064
10148
|
const dxStart = startAge + stepIndex * 10;
|
|
10065
10149
|
const gz = STEMS[stem] + BRANCHES[branch];
|
|
10066
|
-
const pal =
|
|
10150
|
+
const pal = sihuaTableOf(STEMS[stem], schools);
|
|
10067
10151
|
const selfHua = starsByBranch[branch]
|
|
10068
10152
|
.filter((s) => pal[s.name])
|
|
10069
10153
|
.map((s) => ({ star: s.name, type: pal[s.name] }));
|
|
@@ -10081,7 +10165,7 @@ function buildZiwei(input) {
|
|
|
10081
10165
|
start: dxStart,
|
|
10082
10166
|
end: dxStart + 9,
|
|
10083
10167
|
stem: STEMS[stem],
|
|
10084
|
-
mutagen: Object.entries(
|
|
10168
|
+
mutagen: Object.entries(sihuaTableOf(STEMS[stem], schools)).map(([s, k]) => `${s}化${k}`),
|
|
10085
10169
|
},
|
|
10086
10170
|
xiaoxian: { age: xiaoxianAge(branch, triad, gender) },
|
|
10087
10171
|
sanfang: [branch, branch + 4, branch + 8, branch + 6]
|
|
@@ -10145,10 +10229,21 @@ function buildZiwei(input) {
|
|
|
10145
10229
|
const xxAge = ((age - 1) % 12) + 1;
|
|
10146
10230
|
const xxPalace = palaces.find((p) => p.xiaoxian.age === xxAge);
|
|
10147
10231
|
const dxPalace = palaces.find((p) => age >= p.daxian.start && age <= p.daxian.end);
|
|
10232
|
+
// 流年四化取干:默认按流年天干;liunianSihua: life-palace-stem 改按该年命宫
|
|
10233
|
+
// 的宫干(文墨设置树里的「依据流年命宫天干」)。这两干各依不同的表:年干随年份走,
|
|
10234
|
+
// 命宫宫干由五虎遁从出生年干起,所以实测十二年会换掉十二次,不是只差个别年。
|
|
10235
|
+
// 取哪一干必须随盘回显,否则用户看不出四颗化星是被哪张表定的。
|
|
10236
|
+
const lnStemOf = (() => {
|
|
10237
|
+
if (schools.liunianSihua !== 'life-palace-stem') return gz.stem;
|
|
10238
|
+
const lp = palaces.find((p) => p.branch === gz.branch);
|
|
10239
|
+
return lp ? lp.stem : gz.stem;
|
|
10240
|
+
})();
|
|
10148
10241
|
liunian.push({
|
|
10149
10242
|
year: y,
|
|
10150
10243
|
ganzhi: gz.name,
|
|
10151
10244
|
age,
|
|
10245
|
+
sihuaStem: lnStemOf,
|
|
10246
|
+
sihuaStemFrom: schools.liunianSihua === 'life-palace-stem' ? '流年命宫天干' : '流年天干',
|
|
10152
10247
|
lifePalace: { branch: gz.branch, palace: palaceNames[b] },
|
|
10153
10248
|
doujun: BRANCHES[fix(b - (lunarMonth - 1) + hb)],
|
|
10154
10249
|
sanfang: [fix(b), fix(b + 4), fix(b + 8), fix(b + 6)].map((x) => palaceNames[x]),
|
|
@@ -10157,7 +10252,7 @@ function buildZiwei(input) {
|
|
|
10157
10252
|
liutuo: BRANCHES[fix(lu - 1)],
|
|
10158
10253
|
liukui: BRANCHES[kuiyueTable[gz.stem][0]],
|
|
10159
10254
|
liuyue: BRANCHES[kuiyueTable[gz.stem][1]],
|
|
10160
|
-
mutagen: Object.entries(
|
|
10255
|
+
mutagen: Object.entries(sihuaTableOf(lnStemOf, schools)).map(([s, k]) => `${s}化${k}`),
|
|
10161
10256
|
daxian: dxPalace
|
|
10162
10257
|
? { palace: dxPalace.palace, start: dxPalace.daxian.start, end: dxPalace.daxian.end }
|
|
10163
10258
|
: null,
|
|
@@ -10210,7 +10305,20 @@ function buildZiwei(input) {
|
|
|
10210
10305
|
nayin: soulNayin.name,
|
|
10211
10306
|
},
|
|
10212
10307
|
body: { palace: '身宫', branch: BRANCHES[bodyIndex], lands: palaceNames[bodyIndex] },
|
|
10213
|
-
lifeMaster: MING_ZHU[BRANCHES[soulIndex]],
|
|
10308
|
+
lifeMaster: MING_ZHU[schools.mingzhuSchool === 'year-branch' ? BRANCHES[yb] : BRANCHES[soulIndex]],
|
|
10309
|
+
lifeMasterSchool: schools.mingzhuSchool,
|
|
10310
|
+
...((() => {
|
|
10311
|
+
// 两派取的地支不同时,把另一派的结果一并回显——不然用户切档后只看到命主变了一个字,
|
|
10312
|
+
// 无从判断是取法变了还是排盘出了问题。
|
|
10313
|
+
const bySoul = MING_ZHU[BRANCHES[soulIndex]];
|
|
10314
|
+
const byYear = MING_ZHU[BRANCHES[yb]];
|
|
10315
|
+
if (bySoul === byYear) return {};
|
|
10316
|
+
return {
|
|
10317
|
+
lifeMasterNote: schools.mingzhuSchool === 'year-branch'
|
|
10318
|
+
? `中州派按生年年支${BRANCHES[yb]}取${byYear};通行本按命宫地支${BRANCHES[soulIndex]}取${bySoul}`
|
|
10319
|
+
: `通行本按命宫地支${BRANCHES[soulIndex]}取${bySoul};中州派按生年年支${BRANCHES[yb]}取${byYear}`,
|
|
10320
|
+
};
|
|
10321
|
+
})()),
|
|
10214
10322
|
bodyMaster: SHEN_ZHU[schools.shenzhuSchool][BRANCHES[yb]],
|
|
10215
10323
|
bodyMasterSchool: schools.shenzhuSchool,
|
|
10216
10324
|
...((yb === 0 || yb === 6) ? {
|
|
@@ -10257,15 +10365,15 @@ function buildZiwei(input) {
|
|
|
10257
10365
|
rules: {
|
|
10258
10366
|
ziweiPlacement: '借数法:局数除日数取商,商数自寅宫顺行,借数奇逆偶顺',
|
|
10259
10367
|
mutagen: '生年四化用中州派常用表;庚干可按流派切换(默认阳武阴同,另有同科阴忌、府科、府科相忌、同科相忌)',
|
|
10260
|
-
schools: `流派开关:亮度 ${schools.brightnessSchool}、庚干四化 ${schools.gengYearSihua}、天马 ${schools.tianmaSchool}、天空 ${schools.tiankongSchool}、截空 ${schools.jiekongSchool}、魁钺 ${schools.kuiyueSchool}、天伤天使 ${schools.tianshiTianshang}、长生 ${schools.changshengSchool}、晚子时 ${schools.lateZishi}、身主 ${schools.shenzhuSchool}(common 子午皆火星 / verse
|
|
10368
|
+
schools: `流派开关:亮度 ${schools.brightnessSchool}、庚干四化 ${schools.gengYearSihua}、天马 ${schools.tianmaSchool}、天空 ${schools.tiankongSchool}、截空 ${schools.jiekongSchool}、魁钺 ${schools.kuiyueSchool}、天伤天使 ${schools.tianshiTianshang}、长生 ${schools.changshengSchool}、晚子时 ${schools.lateZishi}、身主 ${schools.shenzhuSchool}(common 子午皆火星 / verse 子铃午火)、命主 ${schools.mingzhuSchool}(soul-branch 按命宫地支 / year-branch 按生年年支)、杂曜 ${schools.zuoyaoSchool}(minimal 49 颗 / full 61 颗)、流年四化取干 ${schools.liunianSihua}(year-stem 按流年天干 / life-palace-stem 按流年命宫宫干)、十干四化 ${schools.sihuaVariant}(default 各干通行表,其余为文墨变体整表替换);庚干四化只作用于生年四化,sihuaVariant 换的是宫干自化、大限宫干、飞星与流年共用的那张表`,
|
|
10261
10369
|
zuoyao: schools.zuoyaoSchool === 'full'
|
|
10262
10370
|
? `全表十二颗已安:生月 解神、天巫、天月、阴煞;生年干 天官、天福、天厨;生年支 蜚廉、天德、年解;命宫+生年支 天才、身宫+生年支 天寿。蜚廉与博士十二神的飞廉同名异星,年解与月解(解神)分列,天德与岁前十二神的天德同名异宫。`
|
|
10263
10371
|
: `本盘按 49 颗的通行简盘安星,未排全表杂曜。开 zuoyaoSchool: "full" 追加十二颗:解神、天巫、天月、阴煞(生月)、天官、天福、天厨(生年干)、蜚廉、天德、年解(生年支)、天才(命宫+生年支)、天寿(身宫+生年支),每颗都带安星诀。`,
|
|
10264
10372
|
leapMonth: '闰月默认按日切分(1–15 归本月、16 起归次月,主流排盘口径);可传 leapMonth: next(整月归次月)或 prev(整月归本月),leapAsNext: true 等同 next',
|
|
10265
10373
|
auxStars: '火铃按年支三合起点顺数至生时;羊陀夹禄存;魁钺按年干;地空亥起子时逆行、地劫顺行;三台八座随辅弼;恩光天贵随昌曲退一位;台辅封诰按时支',
|
|
10266
10374
|
shensha: '长生、博士随大限顺逆;将前、岁前恒顺行;天伤恒在交友、天使恒在疾厄',
|
|
10267
|
-
masters: '
|
|
10268
|
-
liunian: '流年命宫取该年地支宫;三方四正为本宫与 +4/+8/+6
|
|
10375
|
+
masters: '命主按 mingzhuSchool 取地支再查表(soul-branch 命宫地支 / year-branch 生年年支),身主按生年地支;两派共用同一张十二支命主表,只换查表用的地支',
|
|
10376
|
+
liunian: '流年命宫取该年地支宫;三方四正为本宫与 +4/+8/+6;并给该年所属大限与小限;四化取干按 liunianSihua 口径,sihuaStem 回显实际用的那一干',
|
|
10269
10377
|
flyComposite: '三方四正取本宫、对宫与两个三合宫共四宫,四宫宫干各化禄权科忌共 16 条,按落宫归堆标会聚(双忌会、禄忌同宫、三化会、自化);只描会照,不折吉凶',
|
|
10270
10378
|
changqu: '昌曲落宫只由时支决定,故与丑未的关系(夹/三合/同宫/无关)是结构性结论;absorb 的「清/杂」是启发式标记,依据昌曲化忌与会煞,不是断语',
|
|
10271
10379
|
},
|
|
@@ -10564,7 +10672,7 @@ function daxianList(chart) {
|
|
|
10564
10672
|
selfHua: p.selfHua,
|
|
10565
10673
|
sanfang: p.sanfang,
|
|
10566
10674
|
mainStars: mainOf(p.sanfang),
|
|
10567
|
-
mutagenHits: Object.entries(
|
|
10675
|
+
mutagenHits: Object.entries(sihuaTableOf(p.stem, chart.schools)).map(([star, type]) => {
|
|
10568
10676
|
const b = starBranchOf(chart, star);
|
|
10569
10677
|
return { star, type, branch: b >= 0 ? BRANCHES[b] : null, palace: b >= 0 ? chart.palaces.find((x) => x.branch === BRANCHES[b])?.palace ?? null : null };
|
|
10570
10678
|
}),
|
|
@@ -10581,9 +10689,10 @@ function daxianList(chart) {
|
|
|
10581
10689
|
const FLY_TYPES = ['禄', '权', '科', '忌'];
|
|
10582
10690
|
|
|
10583
10691
|
// 某天干下某一化的星曜;表里没有就返回 null(不会凭印象补)
|
|
10584
|
-
|
|
10585
|
-
|
|
10586
|
-
|
|
10692
|
+
// 第三参 schools 选填:给了就按该盘的十干四化变体取表,不给沿用通行表(旧调用零漂移)
|
|
10693
|
+
function flyStarOf(stem, type, schools) {
|
|
10694
|
+
const map = sihuaTableOf(stem, schools || {});
|
|
10695
|
+
if (!map || !Object.keys(map).length) return null;
|
|
10587
10696
|
for (const [star, t] of Object.entries(map)) if (t === type) return star;
|
|
10588
10697
|
return null;
|
|
10589
10698
|
}
|
|
@@ -10596,7 +10705,7 @@ function flyStars(chart) {
|
|
|
10596
10705
|
branch: p.branch,
|
|
10597
10706
|
stem: p.stem,
|
|
10598
10707
|
flies: FLY_TYPES.map((type) => {
|
|
10599
|
-
const star = flyStarOf(p.stem, type);
|
|
10708
|
+
const star = flyStarOf(p.stem, type, chart.schools);
|
|
10600
10709
|
const b = star ? starBranchOf(chart, star) : -1;
|
|
10601
10710
|
const target = b >= 0 ? palaces.find((x) => x.branch === BRANCHES[b]) : null;
|
|
10602
10711
|
return {
|
|
@@ -10622,7 +10731,7 @@ function flyChain(chart, { from = '命宫', type = '忌', maxSteps = 12 } = {})
|
|
|
10622
10731
|
let cur = start;
|
|
10623
10732
|
let ended = 'max';
|
|
10624
10733
|
for (let i = 0; i < Math.max(1, maxSteps); i++) {
|
|
10625
|
-
const star = flyStarOf(cur.stem, type);
|
|
10734
|
+
const star = flyStarOf(cur.stem, type, chart.schools);
|
|
10626
10735
|
if (!star) { ended = 'no-star'; break; }
|
|
10627
10736
|
const b = starBranchOf(chart, star);
|
|
10628
10737
|
if (b < 0) { ended = 'off-chart'; break; }
|
|
@@ -10672,7 +10781,7 @@ function flyComposite(chart, { from = '命宫' } = {}) {
|
|
|
10672
10781
|
branch: p.branch,
|
|
10673
10782
|
stem: p.stem,
|
|
10674
10783
|
flies: FLY_TYPES.map((type) => {
|
|
10675
|
-
const star = flyStarOf(p.stem, type);
|
|
10784
|
+
const star = flyStarOf(p.stem, type, chart.schools);
|
|
10676
10785
|
const b = star ? starBranchOf(chart, star) : -1;
|
|
10677
10786
|
const target = b >= 0 ? palaces.find((x) => x.branch === BRANCHES[b]) : null;
|
|
10678
10787
|
return {
|
|
@@ -10749,8 +10858,8 @@ function flyComposite(chart, { from = '命宫' } = {}) {
|
|
|
10749
10858
|
|
|
10750
10859
|
function enrichLiunian(chart) {
|
|
10751
10860
|
for (const ln of chart.liunian) {
|
|
10752
|
-
const stem = ln.ganzhi[0];
|
|
10753
|
-
ln.mutagenHits = Object.entries(
|
|
10861
|
+
const stem = ln.sihuaStem || ln.ganzhi[0];
|
|
10862
|
+
ln.mutagenHits = Object.entries(sihuaTableOf(stem, chart.schools)).map(([star, type]) => {
|
|
10754
10863
|
const b = starBranchOf(chart, star);
|
|
10755
10864
|
return {
|
|
10756
10865
|
star,
|
|
@@ -10812,7 +10921,7 @@ function flowOf(chart, asOf) {
|
|
|
10812
10921
|
const p = chart.palaces.find((x) => x.branch === br);
|
|
10813
10922
|
const stem = p ? p.stem : null;
|
|
10814
10923
|
const mutagenHits = stem
|
|
10815
|
-
? Object.entries(
|
|
10924
|
+
? Object.entries(sihuaTableOf(stem, chart.schools)).map(([star, type]) => {
|
|
10816
10925
|
const b = starBranchOf(chart, star);
|
|
10817
10926
|
return {
|
|
10818
10927
|
star,
|
|
@@ -10855,7 +10964,7 @@ function flowOf(chart, asOf) {
|
|
|
10855
10964
|
};
|
|
10856
10965
|
}
|
|
10857
10966
|
|
|
10858
|
-
return { PALACE_NAMES, BRIGHTNESS, MUTAGEN, ZIWEI_SCHOOL_DEFAULTS, ZIWEI_SCHOOL_OPTIONS, ziweiSchoolsOf, BRIGHTNESS_SCHOOLS, schoolBrightness, KUI_YUE_SCHOOLS, LUCUN, KUI_YUE, MING_ZHU, SHEN_ZHU, triadOf, HUO_START, LING_START, TIANMA, XIANCHI, HUAGAI, JIANGXING, GUCHEN, GUASU, posuIndex, XIAOXIAN_START, CHANGSHENG_NAMES, BOSHI_NAMES, JIANGQIAN_NAMES, SUIQI_NAMES, CHANGSHENG_START, hourBranchIndex, ziweiTianfuIndex, xiaoxianAge, LEAP_POLICIES, leapPolicyOf, effectiveLunarMonth, buildZiwei, detectPatterns, PATTERN_BREAK_RULES, PATTERN_TONE, daxianList, FLY_TYPES, flyStarOf, flyStars, flyChain, flyChains, flyComposite, enrichLiunian, asOfParts, flowOf };
|
|
10967
|
+
return { PALACE_NAMES, BRIGHTNESS, MUTAGEN, ZIWEI_SCHOOL_DEFAULTS, ZIWEI_SCHOOL_OPTIONS, ziweiSchoolsOf, BRIGHTNESS_SCHOOLS, schoolBrightness, SIHUA_VARIANTS, sihuaTableOf, natalSihuaTableOf, KUI_YUE_SCHOOLS, LUCUN, KUI_YUE, MING_ZHU, SHEN_ZHU, triadOf, HUO_START, LING_START, TIANMA, XIANCHI, HUAGAI, JIANGXING, GUCHEN, GUASU, posuIndex, XIAOXIAN_START, CHANGSHENG_NAMES, BOSHI_NAMES, JIANGQIAN_NAMES, SUIQI_NAMES, CHANGSHENG_START, hourBranchIndex, ziweiTianfuIndex, xiaoxianAge, LEAP_POLICIES, leapPolicyOf, effectiveLunarMonth, buildZiwei, detectPatterns, PATTERN_BREAK_RULES, PATTERN_TONE, daxianList, FLY_TYPES, flyStarOf, flyStars, flyChain, flyChains, flyComposite, enrichLiunian, asOfParts, flowOf };
|
|
10859
10968
|
})();
|
|
10860
10969
|
|
|
10861
10970
|
__mods['tarot-cards'] = (function () {
|
|
@@ -22042,7 +22151,7 @@ __mods.interpret = (function () {
|
|
|
22042
22151
|
|
|
22043
22152
|
const { HEX64, HEX_BY_CORE, TRIGRAM, YAO_POSITION, MOVING_NATURE, ZIWEI_STARS, WUXING_INDUSTRY, WUXING_ORGAN, TENGOD_STYLE, LIUREN_JIANG, TAROT_ELEMENT_FOCUS, DISCLAIMER } = (__mods['interpret-data'] || {});
|
|
22044
22153
|
// 生年四化要按年干反查四颗星,四化表只在紫微引擎里定义了一份,这里直接复用,避免两处维护打架
|
|
22045
|
-
const {
|
|
22154
|
+
const { natalSihuaTableOf } = (__mods.ziwei || {});
|
|
22046
22155
|
// 紫微的词库单列一处:宫位取象、主星细节、双星、煞星辅星、四化措辞、庙旺语气、格局读法
|
|
22047
22156
|
const { palaceFieldOf, starExtraOf, starPairOf, brightRead, huaInLine, shaLineOf, shaNatureOf, fuLineOf, patternReadOf, MAIN_SHA } = (__mods['ziwei-words'] || {});
|
|
22048
22157
|
// 八字的画像词库:日主取象、十神画像、命局基调与地支关系说法
|
|
@@ -22693,9 +22802,10 @@ function zwNatalSihua(r) {
|
|
|
22693
22802
|
}
|
|
22694
22803
|
|
|
22695
22804
|
// 年干四化表:用来补齐「盘上没有落点」的那几颗,以及保证输出顺序
|
|
22805
|
+
// 该盘若选了十干四化变体,这张表也要跟着换,否则文案里的四化与盘面标的不是同一张
|
|
22696
22806
|
const ganzhi = pick(r, 'yearGanzhi', '');
|
|
22697
22807
|
const yearStem = typeof ganzhi === 'string' ? ganzhi.slice(0, 1) : '';
|
|
22698
|
-
const table =
|
|
22808
|
+
const table = natalSihuaTableOf(yearStem, r?.schools);
|
|
22699
22809
|
const starOfType = {};
|
|
22700
22810
|
for (const [star, type] of Object.entries(table)) starOfType[type] = star;
|
|
22701
22811
|
|
|
@@ -22897,7 +23007,7 @@ function ziweiInterpret(r) {
|
|
|
22897
23007
|
soulPair ? `${soulPair.gist};要留意的是${soulPair.watch}。` : '',
|
|
22898
23008
|
bodyLands ? `身宫寄在${bodyLands}——${bodyField ? `${bodyField.field}是后天更容易使上劲的地方` : '这是后天着力点'},中年以后会越来越明显。` : '',
|
|
22899
23009
|
`五行局为${pick(r.bureau, 'name', '—')},${pick(r.daxian, 'startAge', '—')}岁起运:局定的是节奏(几步起、十年一换),不是好坏。`,
|
|
22900
|
-
`命主${pick(r, 'lifeMaster', '—')}、身主${pick(r, 'bodyMaster', '—')}
|
|
23010
|
+
`命主${pick(r, 'lifeMaster', '—')}、身主${pick(r, 'bodyMaster', '—')}:传统把这两颗当作整张盘的定调星,命主看底色,身主看后半程的着力点。${r.lifeMasterNote ? '(本盘' + r.lifeMasterNote + '。)' : ''}`,
|
|
22901
23011
|
].filter(Boolean).join('\n');
|
|
22902
23012
|
|
|
22903
23013
|
// ── 逐宫分析:十二宫各一行清单 + 一句读法 ────────────────────
|
|
@@ -27163,7 +27273,7 @@ function requireGender(value, who = '') {
|
|
|
27163
27273
|
const ZIWEI_SCHOOL_KEYS = [
|
|
27164
27274
|
'brightnessSchool', 'gengYearSihua', 'tianmaSchool', 'tiankongSchool', 'jiekongSchool',
|
|
27165
27275
|
'kuiyueSchool', 'tianshiTianshang', 'changshengSchool', 'lateZishi', 'shenzhuSchool',
|
|
27166
|
-
'zuoyaoSchool',
|
|
27276
|
+
'mingzhuSchool', 'zuoyaoSchool', 'liunianSihua', 'sihuaVariant',
|
|
27167
27277
|
];
|
|
27168
27278
|
|
|
27169
27279
|
/** 紫微流派参数原样透传;非法值交给引擎按默认口径回退 */
|
|
@@ -27296,8 +27406,8 @@ function ziweiText(r) {
|
|
|
27296
27406
|
const labels = {
|
|
27297
27407
|
brightnessSchool: '亮度', gengYearSihua: '庚干四化', tianmaSchool: '天马', tiankongSchool: '天空',
|
|
27298
27408
|
jiekongSchool: '截空', kuiyueSchool: '魁钺', tianshiTianshang: '天伤天使',
|
|
27299
|
-
changshengSchool: '长生', lateZishi: '晚子时', shenzhuSchool: '身主',
|
|
27300
|
-
zuoyaoSchool: '杂曜全表',
|
|
27409
|
+
changshengSchool: '长生', lateZishi: '晚子时', shenzhuSchool: '身主', mingzhuSchool: '命主取法',
|
|
27410
|
+
zuoyaoSchool: '杂曜全表', liunianSihua: '流年四化取干', sihuaVariant: '十干四化变体',
|
|
27301
27411
|
};
|
|
27302
27412
|
const diff = Object.entries(labels)
|
|
27303
27413
|
.filter(([key]) => r.schools[key] && r.schools[key] !== ZIWEI_SCHOOL_DEFAULTS[key])
|
|
@@ -27352,7 +27462,7 @@ function ziweiText(r) {
|
|
|
27352
27462
|
`【农历】${lunarText}(月首 ${r.lunar.monthStart}) 时支:${r.hourBranch} 年干支:${r.yearGanzhi}`,
|
|
27353
27463
|
`【时刻】${r.solarTime ? `${r.solarTime.civilText} → 真太阳时 ${r.solarTime.trueSolarText}${r.input.geo ? '(' + r.input.geo.note + ')' : ''}` : ''}`,
|
|
27354
27464
|
`【命宫】${r.soul.branch}(${r.soul.ganzhi}·${r.soul.nayin}) 【身宫】${r.body.branch}(落${r.body.lands}) 【五行局】${r.bureau.name}`,
|
|
27355
|
-
`【紫微】${r.ziwei} 【天府】${r.tianfu} 【命主】${r.lifeMaster} 【身主】${r.bodyMaster}${r.bodyMasterNote ? `(${r.bodyMasterSchool === 'common' ? '子午皆火星' : '子铃午火'})` : ''}`,
|
|
27465
|
+
`【紫微】${r.ziwei} 【天府】${r.tianfu} 【命主】${r.lifeMaster} 【身主】${r.bodyMaster}${r.bodyMasterNote ? `(${r.bodyMasterSchool === 'common' ? '子午皆火星' : '子铃午火'})` : ''}${r.lifeMasterNote ? `(${r.lifeMasterNote})` : ''}`,
|
|
27356
27466
|
`【大限】${r.daxian.rule},${r.daxian.startAge}岁起 【小限】${r.xiaoxianRule.direction}`,
|
|
27357
27467
|
schoolLine,
|
|
27358
27468
|
`【昌曲】文昌${r.changqu.wenchang.branch}(${r.changqu.wenchang.palace}${r.changqu.wenchang.mutagen ? '·化' + r.changqu.wenchang.mutagen : ''}) 文曲${r.changqu.wenqu.branch}(${r.changqu.wenqu.palace}${r.changqu.wenqu.mutagen ? '·化' + r.changqu.wenqu.mutagen : ''})`,
|
|
@@ -29199,7 +29309,7 @@ return { interpret, DIRECTIONS, DIRECTION_DEFAULT, BRIGHTNESS, flowOf, parseDate
|
|
|
29199
29309
|
})();
|
|
29200
29310
|
|
|
29201
29311
|
window.Engine = __mods.index;
|
|
29202
|
-
window.__MP_VER = "0.
|
|
29312
|
+
window.__MP_VER = "0.64.0";
|
|
29203
29313
|
</script>
|
|
29204
29314
|
<script>
|
|
29205
29315
|
// 两个 UI 共用的表单规则:宿主面板(src/app.js)与独立页(src/web-ui.js)。
|
|
@@ -29385,9 +29495,8 @@ window.__MP_VER = "0.63.0";
|
|
|
29385
29495
|
/* 大限/流年四化:只留色框不填充,与生年四化的实心块区分 */
|
|
29386
29496
|
.pp-m.view{background:transparent;box-shadow:inset 0 0 0 1px currentColor}
|
|
29387
29497
|
.pp-m.view.lu{color:var(--lu)}.pp-m.view.quan{color:var(--quan)}.pp-m.view.ke{color:var(--ke)}.pp-m.view.ji{color:var(--ji)}
|
|
29388
|
-
/*
|
|
29389
|
-
.pp-m.self
|
|
29390
|
-
.pp-m.self.lu{color:var(--lu)}.pp-m.self.quan{color:var(--quan)}.pp-m.self.ke{color:var(--ke)}.pp-m.self.ji{color:var(--ji)}
|
|
29498
|
+
/* 自化:宫干化回本宫。0.64.0 起不再用徽章,改在星名后画彩色小箭头(见 .pp-zha),
|
|
29499
|
+
与生年实心块、大限/流年空心框分成三层——所以这里不再保留 .pp-m.self 样式 */
|
|
29391
29500
|
/* 庙旺得利平不陷:星名后的等级小字。刻意压低视觉权重(灰为主、陷才微红),
|
|
29392
29501
|
避免与四化的实心彩色方块抢层次 */
|
|
29393
29502
|
.pp-b{font-style:normal;font-size:10px;margin-left:3px;padding:0 3px;border-radius:999px;color:var(--muted);letter-spacing:0;opacity:.92;background:var(--band)}
|
|
@@ -29493,11 +29602,21 @@ window.__MP_VER = "0.63.0";
|
|
|
29493
29602
|
#ppm-sc-feixing:checked~.pp-body .pp-fx{display:block}
|
|
29494
29603
|
#ppm-sc-feixing:checked~.pp-body .pp-m.view,
|
|
29495
29604
|
#ppm-sc-feixing:checked~.pp-body .pp-viewhua{display:none}
|
|
29496
|
-
/* 三合派:四化信息整体退场(生年/自化/大限流年/图例/飞星链 chips
|
|
29605
|
+
/* 三合派:四化信息整体退场(生年/自化/大限流年/图例/飞星链 chips/自化箭头) */
|
|
29497
29606
|
#ppm-sc-sanhe:checked~.pp-body .pp-m,
|
|
29498
|
-
#ppm-sc-sanhe:checked~.pp-body .pp-
|
|
29607
|
+
#ppm-sc-sanhe:checked~.pp-body .pp-zha,
|
|
29499
29608
|
#ppm-sc-sanhe:checked~.pp-body .pp-viewhua,
|
|
29500
29609
|
#ppm-sc-sanhe:checked~.pp-flywrap{display:none}
|
|
29610
|
+
/* 自化箭头(学文墨天机):自化是「宫干化回本宫」,箭头画在星名左边、箭头尖顶住星名,
|
|
29611
|
+
由左向右弧着落回这颗星——读成「这笔化飞出去又落回自己」。
|
|
29612
|
+
为什么必须放星名左边:放右边箭头就朝外,视觉上成了「从本宫飞出去」,意思正好反了。
|
|
29613
|
+
为什么 inline 在星名旁而不是绝对定位:宫格左侧会被满星曜的宫撞上(实测压住「紫微 庙」)。 */
|
|
29614
|
+
.pp-zha{display:inline-block;margin-right:3px;vertical-align:-1px;line-height:0;cursor:help}
|
|
29615
|
+
.pp-zha .z-a{width:19px;height:8px;display:block;overflow:visible}
|
|
29616
|
+
.pp-zha .z-shaft{fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round}
|
|
29617
|
+
.pp-zha .z-head{fill:currentColor;stroke:none}
|
|
29618
|
+
.pp-zha.lu{color:var(--lu)}.pp-zha.quan{color:var(--quan)}
|
|
29619
|
+
.pp-zha.ke{color:var(--ke)}.pp-zha.ji{color:var(--ji)}
|
|
29501
29620
|
#ppm-sc-sihe:checked~.pp-flywrap{display:block}
|
|
29502
29621
|
#ppm-sc-feixing:checked~.pp-flywrap{display:block}
|
|
29503
29622
|
/* 自化图示(文墨式图例行):箭头颜色跟四化色走 */
|
|
@@ -29510,7 +29629,6 @@ window.__MP_VER = "0.63.0";
|
|
|
29510
29629
|
.pp::before{content:"";position:absolute;inset:0;pointer-events:none;z-index:0;opacity:.5;
|
|
29511
29630
|
background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='p'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='2' seed='7'/%3E%3CfeColorMatrix values='0 0 0 0 0.32 0 0 0 0 0.29 0 0 0 0 0.24 0 0 0 0.10 0'/%3E%3C/filter%3E%3Crect width='220' height='220' filter='url(%23p)'/%3E%3C/svg%3E")}
|
|
29512
29631
|
.pp>*{position:relative;z-index:1}
|
|
29513
|
-
.pp-zh{margin-left:4px;white-space:nowrap}
|
|
29514
29632
|
.pp-borrow{font-size:9.5px;color:var(--muted);margin-top:1px;letter-spacing:.02em}
|
|
29515
29633
|
|
|
29516
29634
|
/* —— 宫位点击展开详情 + 三方四正联动 ——
|
|
@@ -29551,6 +29669,7 @@ window.__MP_VER = "0.63.0";
|
|
|
29551
29669
|
.pp-detail .dt-tri em{font-style:normal;color:var(--muted);font-size:12px;margin-left:5px}
|
|
29552
29670
|
.pp-detail .dt-tri em::before{content:"·";margin-right:3px}
|
|
29553
29671
|
.pp-detail .dt-empty{color:var(--faint);font-size:12.5px}
|
|
29672
|
+
.pp-detail .dt-self{margin-right:10px;white-space:nowrap}
|
|
29554
29673
|
.pp-detail .hint{color:var(--faint);font-size:11.5px;margin-top:6px}
|
|
29555
29674
|
.pp-ss{display:flex;flex-wrap:wrap;gap:0 7px;font-size:12.5px;line-height:1.6}
|
|
29556
29675
|
.pp-bz .pp-ss{flex-direction:column;align-items:center;gap:0;font-size:11.5px;line-height:1.5}
|
|
@@ -30802,7 +30921,7 @@ window.__MP_VER = "0.63.0";
|
|
|
30802
30921
|
pp._wxIcon = wxIcon;
|
|
30803
30922
|
pp._triGlyph = triGlyph;
|
|
30804
30923
|
|
|
30805
|
-
function starsHTML(stars, viewHua) {
|
|
30924
|
+
function starsHTML(stars, viewHua, selfHuaMap) {
|
|
30806
30925
|
if (!stars || !stars.length) return '';
|
|
30807
30926
|
return stars.map((s) => {
|
|
30808
30927
|
const cls = TYPE_CLASS[s.type] || 'aux';
|
|
@@ -30813,9 +30932,13 @@ window.__MP_VER = "0.63.0";
|
|
|
30813
30932
|
const b = s.brightness ? `<em class="pp-b ${BR_CLASS[s.brightness] || 'mid'}">${s.brightness}</em>` : '';
|
|
30814
30933
|
// 全表杂曜的入庙标记(天官/天福只有四宫入庙,来路是庙地专论,不是十四主星那张亮度表)
|
|
30815
30934
|
const tm = s.inTemple ? '<em class="pp-b good">庙</em>' : '';
|
|
30816
|
-
//
|
|
30935
|
+
// 自化(宫干化回本宫)画成箭头,箭头尖顶在星名前——«化» 从宫干飞出去又落回这颗星,
|
|
30936
|
+
// 所以读作「←这笔化飞回本宫」而不是「从这颗星飞出去」。放星名前是关键:
|
|
30937
|
+
// 放星名后箭头朝右,视觉上就成了「飞出本宫」,意思正好反了
|
|
30938
|
+
const zh = (selfHuaMap && selfHuaMap[s.name]) ? zhaMark(selfHuaMap[s.name], s.name) : '';
|
|
30939
|
+
// 顺序:自化箭头 → 星名 → 亮度灰字 → 四化色块。灰字紧贴星名变成一体,彩色实心框独立在末尾,
|
|
30817
30940
|
// 避免两者字号差导致视觉叠压(试过 星名→四化→亮度,10px 字形会压住 8.5px 的框)
|
|
30818
|
-
return `<span class="pp-st ${cls}">${s.name}${b}${tm}${m}${vm}</span>`;
|
|
30941
|
+
return `<span class="pp-st ${cls}">${zh}${s.name}${b}${tm}${m}${vm}</span>`;
|
|
30819
30942
|
}).join('');
|
|
30820
30943
|
}
|
|
30821
30944
|
|
|
@@ -30841,8 +30964,6 @@ window.__MP_VER = "0.63.0";
|
|
|
30841
30964
|
if (pos[1] === 4) cls.push('pp-lastcol');
|
|
30842
30965
|
const ss = p.shensha || {};
|
|
30843
30966
|
const pname = NAMES[fx(soulIdx - b)];
|
|
30844
|
-
const zh = (p.selfHua && p.selfHua.length)
|
|
30845
|
-
? `<span class="pp-zh">${p.selfHua.map((x) => `<i class="pp-m self ${MUT[x.type]}" title="自化:宫干化回本宫">${x.type}</i>`).join('')}</span>` : '';
|
|
30846
30967
|
// 命无正曜:命宫无十四主星时,传统要借对宫(迁移宫)主星来看
|
|
30847
30968
|
let borrow = '';
|
|
30848
30969
|
if (b === soulIdx && allPalaces) {
|
|
@@ -30856,7 +30977,7 @@ window.__MP_VER = "0.63.0";
|
|
|
30856
30977
|
}
|
|
30857
30978
|
}
|
|
30858
30979
|
return `<div class="${cls.join(' ')}" data-pi="${b}" data-view="${view}" role="button" tabindex="0" aria-expanded="false" style="grid-row:${pos[0]};grid-column:${pos[1]}">
|
|
30859
|
-
<div class="pp-stars">${starsHTML(p.stars, viewHua)}
|
|
30980
|
+
<div class="pp-stars">${starsHTML(p.stars, viewHua, selfHuaMapOf(p))}</div>
|
|
30860
30981
|
${borrow}
|
|
30861
30982
|
<div class="pp-ages">${agesHTML(p.xiaoxian.age)}</div>
|
|
30862
30983
|
${fxLineHTML(p, flyByBranch)}
|
|
@@ -30875,6 +30996,31 @@ window.__MP_VER = "0.63.0";
|
|
|
30875
30996
|
</div>`;
|
|
30876
30997
|
}
|
|
30877
30998
|
|
|
30999
|
+
/* 自化箭头(文墨天机式):自化的定义是「宫干化回本宫」,箭头从左侧弧进来、箭头尖顶住星名,
|
|
31000
|
+
读成「这笔化飞出去又落回本宫」,不是「从这颗星飞出去」。
|
|
31001
|
+
几何按 22×9 画:左侧起笔 → 弧线上行 → 右侧箭头尖落在星名左边缘。
|
|
31002
|
+
stroke 跟 currentColor 走,颜色由 .pp-zha.lu/.quan/.ke/.ji 决定。
|
|
31003
|
+
位置:星名左边 inline,不绝对定位——宫格左侧常被满星曜占满,绝对定位会压住星名(实测压「紫微 庙」);
|
|
31004
|
+
也不能放星名右边,那样箭头朝外,语义正好反了。 */
|
|
31005
|
+
function zhaMark(type, star) {
|
|
31006
|
+
return `<span class="pp-zha ${MUT[type]}" title="自化${esc(type)}:${esc(star)}·宫干化回本宫"><svg class="z-a" viewBox="0 0 22 9" role="img" aria-label="自化${esc(type)}">
|
|
31007
|
+
<path class="z-shaft" d="M1 7C6.6 7 11.4 5.6 17.2 3.2"/>
|
|
31008
|
+
<path class="z-head" d="M20.2 2 17.8 4.9 16.6 1.9Z"/>
|
|
31009
|
+
</svg></span>`;
|
|
31010
|
+
}
|
|
31011
|
+
pp._zhaMark = zhaMark;
|
|
31012
|
+
|
|
31013
|
+
/* selfHua → { 星名: 化类型 },供 starsHTML 把箭头贴到对应星上。
|
|
31014
|
+
同一颗星一般只被一种化命中;万一多条,取第一条(数据层已按四化顺序排)。 */
|
|
31015
|
+
function selfHuaMapOf(p) {
|
|
31016
|
+
const map = {};
|
|
31017
|
+
for (const x of p.selfHua || []) {
|
|
31018
|
+
if (!x || !x.star || !MUT[x.type]) continue;
|
|
31019
|
+
if (!map[x.star]) map[x.star] = x.type;
|
|
31020
|
+
}
|
|
31021
|
+
return map;
|
|
31022
|
+
}
|
|
31023
|
+
|
|
30878
31024
|
/* 飞星派专属:本宫宫干四化飞到哪一宫,逐条摊在宫格内(只此模式展开,CSS 控显隐)。
|
|
30879
31025
|
宫数据不带 mutagenHits,从 r.daxianList 借:同一宫干,飞化等价。 */
|
|
30880
31026
|
function fxLineHTML(p, flyByBranch) {
|
|
@@ -30928,14 +31074,14 @@ window.__MP_VER = "0.63.0";
|
|
|
30928
31074
|
<div class="ct-t2">公历 ${r.input.year}-${String(r.input.month).padStart(2, '0')}-${String(r.input.day).padStart(2, '0')} ${String(r.input.hour).padStart(2, '0')}:${String(r.input.minute).padStart(2, '0')}</div>
|
|
30929
31075
|
<div class="ct-t2">农历 ${r.lunar.year}年${r.lunar.isLeap ? `闰${r.lunar.monthRaw || r.lunar.month}` : r.lunar.month}月${r.lunar.day}日${r.hourBranch}时${r.lunar.isLeap && r.lunar.monthRaw && r.lunar.month !== r.lunar.monthRaw ? `(按${r.lunar.month}月起盘)` : ''}</div>
|
|
30930
31076
|
${sizhuOf(r) ? `<div class="ct-t3">${sizhuOf(r)}</div>` : ''}
|
|
30931
|
-
<div class="ct-t4">命主 ${r.lifeMaster} 身主 ${r.bodyMaster}${r.bodyMasterNote ? `<span class="pp-dim" title="${esc(r.bodyMasterNote)}">*</span>` : ''}</div>
|
|
31077
|
+
<div class="ct-t4">命主 ${r.lifeMaster}${r.lifeMasterNote ? `<span class="pp-dim" title="${esc(r.lifeMasterNote)}">*</span>` : ''} 身主 ${r.bodyMaster}${r.bodyMasterNote ? `<span class="pp-dim" title="${esc(r.bodyMasterNote)}">*</span>` : ''}</div>
|
|
30932
31078
|
<div class="ct-t4">命宫 ${r.soul.branch} 身宫 ${r.body.branch} 五行局 ${r.bureau.name}</div>
|
|
30933
31079
|
<div class="ct-t4">子年斗君 ${r.doujun ? r.doujun.zinian : '—'} 流年斗君 ${ln && ln.doujun ? ln.doujun : '—'}</div>
|
|
30934
31080
|
<div class="ct-t4">紫微 ${r.ziwei} 天府 ${r.tianfu} ${kind === 'da' ? '大限命宫 ' + BR[dxIdx] : kind === 'ln' ? '流年命宫 ' + BR[lnIdx] : '本命命宫 ' + r.soul.branch}</div>
|
|
30935
31081
|
${kind === 'da' || kind === 'ln' ? `<div class="ct-t4 pp-viewhua">${kind === 'da' ? '大限' : '流年'}四化 ${(kind === 'da' ? huaByView.da : huaByView.ln) && Object.keys(kind === 'da' ? huaByView.da : huaByView.ln).length
|
|
30936
31082
|
? Object.entries(kind === 'da' ? huaByView.da : huaByView.ln).map(([s2, t]) => `${s2}化${t}`).join(' ')
|
|
30937
31083
|
: '<span class="pp-dim">未飞四化</span>'}</div>` : ''}
|
|
30938
|
-
<div class="pp-legend"><span class="pp-m lu">禄</span><span class="pp-m quan">权</span><span class="pp-m ke">科</span><span class="pp-m ji">忌</span><span>实心=生年四化 空心=大限/流年四化
|
|
31084
|
+
<div class="pp-legend"><span class="pp-m lu">禄</span><span class="pp-m quan">权</span><span class="pp-m ke">科</span><span class="pp-m ji">忌</span><span>实心=生年四化 空心=大限/流年四化 箭头=自化 红框=命宫 浅底=三方四正</span></div>
|
|
30939
31085
|
</div>`;
|
|
30940
31086
|
};
|
|
30941
31087
|
|
|
@@ -31027,7 +31173,7 @@ window.__MP_VER = "0.63.0";
|
|
|
31027
31173
|
${body('ben', soulIdx, 'ben')}
|
|
31028
31174
|
${body('da', dxIdx, 'da')}
|
|
31029
31175
|
${body('ln', lnIdx, 'ln')}
|
|
31030
|
-
<div class="pp-zhlegend">自化图示 <
|
|
31176
|
+
<div class="pp-zhlegend">自化图示 <span class="z-lu">${pp._zhaMark('禄', '本宫')}禄</span><span class="z-quan">${pp._zhaMark('权', '本宫')}权</span><span class="z-ke">${pp._zhaMark('科', '本宫')}科</span><span class="z-ji">${pp._zhaMark('忌', '本宫')}忌</span></div>
|
|
31031
31177
|
<div class="pp-flywrap">${flyHTML}${flyCompositeHTML}</div>
|
|
31032
31178
|
</div>${flowHTML}${chips}${pats}${dxs}${lnHit}${zyHTML}`;
|
|
31033
31179
|
};
|
|
@@ -31059,8 +31205,9 @@ window.__MP_VER = "0.63.0";
|
|
|
31059
31205
|
const auxes = p.stars.filter((s) => s.type === '吉星' || s.type === '辅星');
|
|
31060
31206
|
const bads = p.stars.filter((s) => s.type === '煞星');
|
|
31061
31207
|
const misc = p.stars.filter((s) => !['主星', '吉星', '辅星', '煞星'].includes(s.type));
|
|
31208
|
+
// 自化与盘面统一用箭头:详情里额外标出被化那颗星(盘面靠位置,这里靠文字)
|
|
31062
31209
|
const selfHua = (p.selfHua || []).length
|
|
31063
|
-
? p.selfHua.map((x) => `<
|
|
31210
|
+
? p.selfHua.map((x) => `<span class="dt-self">${zhaMark(x.type, x.star || '本宫')}${esc(x.star || '')}</span>`).join('')
|
|
31064
31211
|
: '<span class="dt-empty">无</span>';
|
|
31065
31212
|
// 三方四正:三合(+4/+8)与对宫(+6)
|
|
31066
31213
|
const tri = [fx(b + 4), fx(b + 8), fx(b + 6)].map((idx) => {
|