lunisolar
Version:
专业农历库,支持公历阴历互转,支持各类黄历数据查询,如八字四柱、阴历、神煞宜忌、时辰吉凶、建除十二神、胎神占方、五行纳音等。支持自定义插件。
364 lines (353 loc) • 12.9 kB
text/typescript
/*
```
-----------------------------------
卷十 p251
goodBadLevel:
宜忌等第表
[級別, 地支[], 神煞名[]]
級別: 0 to 5
0:上 吉足胜凶,从宜不从忌
1:上次 吉足抵凶,遇德从宜不从忌,不遇从宜亦从忌
2:中 吉不抵凶,遇德从宜不从忌,不遇从忌不从宜
3:中次 凶胜于吉,遇德从宜亦从忌,不遇从忌不从宜
4:下 凶又逢凶,遇德从忌不从宜,不遇诸事皆忌
5: 下下 凶叠大凶,遇德亦诸事皆忌
------------------------------------
actLevel:
通过goodBadLevel是否遇德再分级
0: 从宜不从忌
1: 从宜亦从忌
2:从忌不从宜
3:诸事皆忌
```
*/
import type { TheGods } from '../class/theGods'
import type { ProcessData } from '../constants'
import { getAct, monthHateBadAct } from '../actData'
import {
LEVEL_SIGNGOD_LIST,
LEVEL_GOD_KEYS,
MEETING_DES,
PARDON_WISH,
GOD_LEVEL_DICT
} from '../constants'
import { getBranchValue } from '../../../utils'
type FilterActHooksKey = 'l0' | 'l1' | 'l2' | 'l3'
type FilterActHooks = {
[key in FilterActHooksKey[number]]?: ((actLevel: number, acts: ActsSet) => void | true)[]
}
export function getTheSignGodSet(): Set<string> {
const gs = new Set<string>()
for (const item of LEVEL_GOD_KEYS) gs.add(item)
for (const item of LEVEL_SIGNGOD_LIST) gs.add(item)
return gs
}
/**
* 查询等第
* @param monthBranchValue 月的地支
* @param signGods 用于计算等第的神煞
* @returns {[number, number]}
*/
export const findLevel = function (theGods: TheGods, signGods: Set<string>): [number, number] {
const mbValue = getBranchValue(theGods.lsr, 'month')
let levelDictItem = null
// let currLevelKey = null
for (const levelkey of LEVEL_GOD_KEYS) {
if (signGods.has(levelkey)) {
levelDictItem = GOD_LEVEL_DICT[levelkey]
// currLevelKey = levelDict[levelkey]
}
}
if (!levelDictItem) return [-1, -1]
let level = -1
outer: for (const levelItem of levelDictItem) {
const [lv, mv, gl] = levelItem
if (mv.includes(mbValue)) {
for (const glItem of gl) {
if (signGods.has(glItem)) {
level = lv
break outer
}
}
}
}
let actLevel = 1
if (level === 5) actLevel = 3
else if (level === 4) actLevel = signGods.has('德') ? 2 : 3
else if (level === 3) actLevel = signGods.has('德') ? 1 : 2
else if (level === 2) actLevel = signGods.has('德') ? 0 : 2
else if (level === 1) actLevel = signGods.has('德') ? 0 : 1
else if (level === 0) actLevel = 0
return [level, actLevel]
}
// 諸事不忌日
function unBadDay(lsr: lunisolar.Lunisolar, gods: Set<string>, acts: ActsSet) {
// 二月甲戌、四月丙申、六月甲子、七月戊申、八月庚辰、九月辛卯、十月甲子、十二月甲子,德和与赦、愿所汇之辰,诸事不忌。
const sbArr = [null, 10, null, 32, null, 0, 44, 16, 27, 0, null, 0]
if (
sbArr[lsr.lunar.month] === lsr.char8.day.value &&
(MEETING_DES.some(i => gods.has(i)) || PARDON_WISH.some(i => gods.has))
) {
acts.bad = new Set<string>()
}
}
/**
* 等第表篩選宜忌
* @param actLevel 宜忌分級 0: 从宜不从忌 1: 从宜亦从忌 2:从忌不从宜 3:诸事皆忌
* @param acts 宜忌對象 {good, bad}
*/
export function filterActByLevel(actLevel: number, acts: ActsSet, hooks?: FilterActHooks): void {
const setHooks = function (level: FilterActHooksKey): boolean {
if (!hooks) return false
const fns =
hooks[level] === undefined
? []
: (hooks[level] as ((actLevel: number, acts: ActsSet) => void | true)[])
for (let i = 0; i < fns.length; i++) {
if (fns[i](actLevel, acts)) return true
}
return false
}
if (actLevel === 3) {
if (setHooks('l3')) return
acts.good = new Set(['諸事不宜'])
acts.bad = new Set(['諸事不宜'])
return
}
for (const b of Array.from(acts.bad.keys())) {
if (acts.good.has(b)) {
// 2:从忌不从宜
if (actLevel === 2) {
if (setHooks('l2')) return
acts.good.delete(b)
}
// 1: 从宜亦从忌
else if (actLevel === 1) {
if (setHooks('l1')) return
acts.good.delete(b)
acts.bad.delete(b)
} else if (actLevel === 0) {
if (setHooks('l0')) return
acts.bad.delete(b)
}
}
}
return
}
/**
* 鋪注條例,等第表之后再篩選 卷十 p251
```
凡鋪注 萬年書 通書,先依用事次第,察其所宜忌之日,
於某日下注宜某事,某日下注忌某事, 次按宜忌,較量其吉凶之輕重,以定去取。
```
* @param theGods 諸神對象
* @param levelData 等第數據
* @param processData 由extractGodActs函數返回的數據
*/
export function filterActAfterLevel(
theGods: TheGods,
levelData: [number, number],
processData: ProcessData
) {
const [_, actLevel] = levelData
const { acts, mdsbActs, gods, signGods } = processData
const mdsbActsSet = new Set(mdsbActs)
const { good, bad } = acts
// 凡鋪宜宜政事,布政事之日,止注宜宣政事
if (good.has('宣政事') && good.has('布政事')) good.delete('布政事')
// 凡宜營建宮室,修宮室之日,止注宜營建宮室
if (good.has('營建宮室') && good.has('修宮室')) {
good.delete('修宮室')
}
// --- 处理遇德犹忌之事
// 凡吉足胜凶,从宜不从忌者,如遇德犹忌之事,仍注忌;
// 凡吉凶相抵,不注宜不注忌者,如遇德犹忌之事,仍注忌;
if (mdsbActs.length > 0) {
for (const actItem of mdsbActs) {
good.delete(actItem)
bad.add(actItem)
}
}
// 凡德合、赦愿、月恩、四相、时德等日,不注忌进人口、安床、经络、酝酿、开市、立券、交易、纳财、开仓库、出货财。
// 如遇德犹忌,及从忌不从宜之日,则仍注忌
if ([...MEETING_DES, ...PARDON_WISH, '月恩', '四相', '时德'].some(item => gods.has(item))) {
;['進人口', '安床', '經絡', '醞釀', '開市', '立券', '交易', '納財', '開倉庫', '出貨財'].forEach(
item => {
// 遇德猶忌,及从忌不从宜之日, 仍注忌
if (!(mdsbActsSet.has(item) || actLevel > 1) && bad.has(item)) {
bad.delete(item)
}
}
)
}
var branchValue = theGods.lsr.char8.day.branch.value
var stemValue = theGods.lsr.char8.day.stem.value
// 凡天狗寅日忌祭祀,不注宜求福、祈嗣。(应为祈福,求嗣?)
if (gods.has('天狗') || branchValue === 2) {
bad.add('祭祀')
good.delete('祭祀')
good.delete('祈福')
good.delete('求嗣')
}
// 凡卯日忌穿井,不注宜開渠
if (branchValue === 3) {
bad.add('穿井')
good.delete('穿井')
good.delete('開渠')
}
// 壬日忌開渠,不注宜穿井
if (stemValue === 8) {
bad.add('開渠')
good.delete('開渠')
good.delete('穿井')
}
// 凡巳日忌出行,不注宜出师、遣使。
if (branchValue === 5) {
bad.add('出行')
good.delete('出行')
good.delete('出師')
good.delete('遣使')
}
// 凡酉日忌宴會,亦不注慶賜 賞賀
if (branchValue === 9) {
bad.add('宴會')
good.delete('宴會')
good.delete('慶賜')
good.delete('賞賀')
}
// 凡丁日忌剃頭,亦不注宜整容
if (stemValue === 3) {
bad.add('剃頭')
good.delete('剃頭')
good.delete('整容')
}
// 凡吉凶相抵,不注忌祈福,亦不注忌求嗣
if (actLevel === 1 && !bad.has('祈福')) {
if (!mdsbActsSet.has('求嗣')) bad.delete('求嗣')
}
// 凡忌诏命公卿、招贤,不注宜施恩封拜、举正直、袭爵受封。
if (['詔命公卿', '招賢'].some(item => bad.has(item))) {
;['施恩封拜', '舉正直', '襲爵受封'].forEach(it => good.delete(it))
}
// 凡忌施恩封拜、举正直、袭爵受封,不注宜诏命公卿、招贤。
if (['施恩封拜', '舉正直', '襲爵受封'].some(item => bad.has(item))) {
;['詔命公卿', '招賢'].forEach(it => good.delete(it))
}
// 凡宜宣政事之日遇往亡则改宣为布
if (good.has('宣政事') && gods.has('往亡')) {
good.delete('宣政事')
good.add('布政事')
}
// 凡月厌忌行幸、上官,不注宜颁诏、施恩封拜、诏命公卿、招贤、举正直。
// 遇宜宣政事之日,则改宣为布
if (gods.has('月厭')) {
;['行幸', '上官赴任'].forEach(item => {
good.delete(item)
bad.add(item)
})
;['頒詔', '施恩封拜', '詔命公卿', '招賢', '舉正直'].forEach(item => {
good.delete(item)
})
if (good.has('宣政事')) {
good.delete('宣政事')
good.add('布政事')
}
}
if (actLevel === 1) {
// 凡吉凶相抵,不注忌结婚姻,亦不注忌冠带、纳采问名、嫁娶、进人口,如遇德犹忌之日则仍注忌。
if (!bad.has('結婚姻')) {
;['冠帶', '納采問名', '嫁娶', '進人口'].forEach(item => {
if (!mdsbActsSet.has(item)) bad.delete(item)
})
}
// 凡吉凶相抵,不注忌嫁娶,亦不注忌冠带、结婚姻、纳采问名、进人口、搬移、安床,如遇德犹忌之日,则仍注忌
if (!bad.has('嫁娶')) {
;['冠帶', '結婚姻', '納采問名', '進人口', '般移', '安床'].forEach(item => {
if (!mdsbActsSet.has(item) && !gods.has('不將')) bad.delete(item)
})
}
// 遇亥日、厌对、八专、四忌、四穷而仍注忌嫁娶者,只注所忌之事,其不忌者仍不注忌。
// ? 不理解“不忌仍不注忌”,不忌肯定不注忌?
;(function () {
const tempGods = ['厭對', '八專', '四忌', '四窮']
if (stemValue === 9 || tempGods.some(item => gods.has(item))) {
bad.add('嫁娶')
}
})()
// 凡吉凶相抵,不注忌般移,亦不注忌安床; 不注忌安床,亦不注忌般移。如遇德犹忌之日,则仍注忌
if (!bad.has('般移') && !mdsbActsSet.has('安床')) bad.delete('安床')
if (!bad.has('安床') && !mdsbActsSet.has('般移')) bad.delete('般移')
// 凡吉凶相抵,不注注忌解除,亦不注忌整容剃头,整手足甲,如遇德犹忌之日,则仍注忌
if (!bad.has('解除')) {
getAct([14], false).forEach(i => {
if (!mdsbActsSet.has(i)) bad.delete(i)
})
}
if (!bad.has('修造動土') && !bad.has('豎柱上梁')) {
;[
'修宮室',
'繕城郭',
'筑堤防',
'鼓鑄',
'苫蓋',
'修置產室',
'開渠穿井',
'安碓磑',
'補垣塞穴',
'修鉓垣墻',
'平治道涂',
'破屋壞垣'
].forEach(i => {
if (!mdsbActsSet.has(i)) bad.delete(i)
})
}
// 凡吉凶相相抵,不注忌開市 ,亦不注忌立券 交易 納財。
// 不注忌納財,亦不注忌開市 立券 交易。
// 不注立券交易, 亦不注忌立券交易,亦不注忌 開市 納財
if (!bad.has('開市') || !bad.has('納財') || (!bad.has('立券') && !bad.has('交易'))) {
getAct(['019a']).forEach(i => {
bad.delete(i)
})
}
// 凡吉凶相抵,不注忌開市 立券 交易,不注忌開倉庫出貨財,如遇專忌之日,仍注忌
if (['開市', '立券', '交易'].every(i => !bad.has(i))) {
;['開倉庫', '出貨財'].forEach(i => {
bad.delete(i)
})
}
// 凡吉凶相抵,不注忌牧養,亦不注忌納畜,不注忌納畜,亦不注忌牧養。
if (!bad.has('牧養')) bad.delete('納畜')
if (!bad.has('納畜')) bad.delete('牧養')
// 凡吉兇相抵,有宜安葬,不注忌啟攢。有宜啟攢,不注忌安葬
if (good.has('安葬')) bad.delete('啟攢')
if (good.has('啟攢')) bad.delete('安葬')
}
// 凡土符土府地囊,止注忌補垣,亦不注宜塞穴
if (['土符', '土府', '地囊'].some(i => good.has(i)) && bad.has('補垣塞穴')) {
good.delete('補垣塞穴')
}
// 凡開日,不注宜破土,安葬,啟攢,亦不注忌。遇忌則注
if (signGods.has('開日')) {
;['破土', '安葬', '啟攢'].forEach(i => {
good.delete(i)
if (!gods.has('四忌')) bad.delete(i)
})
}
// 凡四忌、四穷止忌安葬。如遇鸣吠、鸣吠对亦不注宜破土、启攒。
if (gods.has('四忌') || gods.has('四窮')) {
bad.add('安葬')
good.delete('安葬')
if (gods.has('鳴吠') || gods.has('鳴吠對')) {
good.delete('破土')
good.delete('啟攢')
}
}
// 凡歲薄,逐陣日所宜事,照月厭所忌刪,所忌仍從本日。
if (gods.has('歲薄') || gods.has('逐陣')) {
monthHateBadAct.forEach(i => {
good.delete(i)
})
}
// 諸事不忌日
unBadDay(theGods.lsr, gods, acts)
}