UNPKG

bazi-mcp

Version:

[![smithery badge](https://smithery.ai/badge/@cantian-ai/bazi-mcp)](https://smithery.ai/server/@cantian-ai/bazi-mcp)

904 lines (857 loc) 18.4 kB
import { EightChar } from 'tyme4ts'; // 各柱天干对月支 const SHEN_MAP_MONTHZHI_GAN: Record<string, Record<string, string>> = { 天德贵人: { 寅: '丁', 卯: '申', 辰: '壬', 巳: '辛', 午: '亥', // 疑似不合理 未: '甲', 申: '癸', 酉: '寅', // 疑似不合理 戌: '丙', 亥: '乙', 子: '巳', 丑: '庚', }, 天德合: { 寅: '壬', 卯: '巳', 辰: '丁', 巳: '丙', 午: '寅', 未: '己', 申: '戊', 酉: '亥', 戌: '辛', 亥: '庚', 子: '申', 丑: '乙', }, 月德贵人: { 寅: '丙', 卯: '甲', 辰: '壬', 巳: '庚', 午: '丙', 未: '甲', 申: '壬', 酉: '庚', 戌: '丙', 亥: '甲', 子: '壬', 丑: '庚', }, 月德合: { 寅: '辛', 卯: '己', 辰: '丁', 巳: '乙', 午: '辛', 未: '己', 申: '丁', 酉: '乙', 戌: '辛', 亥: '己', 子: '丁', 丑: '乙', }, }; // 年日天干对各地支 const SHEN_MAP_YEARDAYGAN_ZHI: Record<string, Record<string, string>> = { 天乙贵人: { 甲: '丑未', 乙: '子申', 丙: '亥酉', 丁: '亥酉', 戊: '丑未', 己: '子申', 庚: '丑未', 辛: '午寅', 壬: '卯巳', 癸: '卯巳', }, 太极贵人: { 甲: '子午', 乙: '子午', 丙: '酉卯', 丁: '酉卯', 戊: '辰戌丑未', 己: '辰戌丑未', 庚: '寅卯', 辛: '寅卯', 壬: '巳申', 癸: '巳申', }, 天厨贵人: { 甲: '巳', 乙: '午', 丙: '巳', 丁: '午', 戊: '申', 己: '酉', 庚: '亥', 辛: '子', 壬: '寅', 癸: '卯', }, 福星贵人: { 甲: '寅子', 乙: '丑亥', 丙: '子寅', 丁: '亥酉', 戊: '申', 己: '未', 庚: '午', 辛: '巳', 壬: '辰', 癸: '丑', }, 文昌贵人: { 甲: '巳', 乙: '午', 丙: '申', 丁: '酉', 戊: '申', 己: '酉', 庚: '亥', 辛: '子', 壬: '寅', 癸: '卯', }, 金舆: { 甲: '辰', 乙: '巳', 丙: '未', 丁: '申', 戊: '未', 己: '申', 庚: '戌', 辛: '亥', 壬: '丑', 癸: '寅', }, 国印: { 甲: '戌', 乙: '亥', 丙: '丑', 丁: '寅', 戊: '丑', 己: '寅', 庚: '辰', 辛: '巳', 壬: '未', 癸: '申', }, }; // 基于日干判断的神煞 (日干对各地支) const SHEN_MAP_DAYGAN_ZHI = { 禄神: { // 十干禄 甲: '寅', 乙: '卯', 丙: '巳', 丁: '午', 戊: '巳', 己: '午', 庚: '申', 辛: '酉', 壬: '亥', 癸: '子', }, 羊刃: { 甲: '卯', 乙: '寅', 丙: '午', 丁: '巳', 戊: '午', 己: '巳', 庚: '酉', 辛: '申', 壬: '子', 癸: '亥', }, 飞刃: { 甲: '酉', 乙: '申', 丙: '子', 丁: '亥', 戊: '子', // 待确认 己: '亥', // 待确认 庚: '卯', 辛: '寅', 壬: '午', 癸: '巳', }, 血刃: { // 疑似问题 甲: '卯', 乙: '辰', 丙: '午', 丁: '未', 戊: '午', 己: '未', 庚: '酉', 辛: '戌', 壬: '子', 癸: '丑', }, 流霞: { // 疑似问题 甲: '酉', 乙: '戌', 丙: '未', 丁: '申', 戊: '巳', 己: '午', 庚: '辰', 辛: '卯', 壬: '亥', 癸: '寅', }, 红艳: { 甲: '午', 乙: '午', 丙: '寅', 丁: '未', 戊: '辰', 己: '辰', 庚: '戌', 辛: '酉', 壬: '子', 癸: '申', }, }; // 年日支对各地支 const SHEN_MAP_YEARDAY_ZHI = { 将星: { 寅: '午', 午: '午', 戌: '午', 申: '子', 子: '子', 辰: '子', 亥: '卯', 卯: '卯', 未: '卯', 巳: '酉', 酉: '酉', 丑: '酉', }, 华盖: { 寅: '戌', 午: '戌', 戌: '戌', 申: '辰', 子: '辰', 辰: '辰', 亥: '未', 卯: '未', 未: '未', 巳: '丑', 酉: '丑', 丑: '丑', }, 驿马: { 寅: '申', 午: '申', 戌: '申', 申: '寅', 子: '寅', 辰: '寅', 亥: '巳', 卯: '巳', 未: '巳', 巳: '亥', 酉: '亥', 丑: '亥', }, 劫煞: { 寅: '亥', 午: '亥', 戌: '亥', 申: '巳', 子: '巳', 辰: '巳', 亥: '申', 卯: '申', 未: '申', 巳: '寅', 酉: '寅', 丑: '寅', }, 亡神: { 寅: '巳', 午: '巳', 戌: '巳', 申: '亥', 子: '亥', 辰: '亥', 亥: '寅', 卯: '寅', 未: '寅', 巳: '申', 酉: '申', 丑: '申', }, 桃花: { // 年月柱: 内桃花, 日时柱:外桃花 寅: '卯', 午: '卯', 戌: '卯', 申: '酉', 子: '酉', 辰: '酉', 亥: '子', 卯: '子', 未: '子', 巳: '午', 酉: '午', 丑: '午', }, }; // 月支对各地支 const SHEN_MONTHZHI_ZHI = { 天医星: { 寅: '丑', 卯: '寅', 辰: '卯', 巳: '辰', 午: '巳', 未: '午', 申: '未', 酉: '申', 戌: '酉', 亥: '戌', 子: '亥', 丑: '子', }, }; const SHEN_MAP_YEARZHI_ZHI = { 灾煞: { // 白虎煞 寅: '子', 午: '子', 戌: '子', 申: '午', 子: '午', 辰: '午', 亥: '酉', 卯: '酉', 未: '酉', 巳: '卯', 酉: '卯', 丑: '卯', }, 孤辰: { 寅: '巳', 卯: '巳', 辰: '巳', 巳: '申', 午: '申', 未: '申', 申: '亥', 酉: '亥', 戌: '亥', 亥: '寅', 子: '寅', 丑: '寅', }, 寡宿: { 寅: '丑', 卯: '丑', 辰: '丑', 巳: '辰', 午: '辰', 未: '辰', 申: '未', 酉: '未', 戌: '未', 亥: '戌', 子: '戌', 丑: '戌', }, 红鸾: { 子: '卯', 丑: '寅', 寅: '丑', 卯: '子', 辰: '亥', 巳: '戌', 午: '酉', 未: '申', 申: '未', 酉: '午', 戌: '巳', 亥: '辰', }, 天喜: { 子: '酉', 丑: '申', 寅: '未', 卯: '午', 辰: '巳', 巳: '辰', 午: '卯', 未: '寅', 申: '丑', 酉: '子', 戌: '亥', 亥: '戌', }, 勾绞煞: { 子: '卯', 丑: '辰', 寅: '巳', 卯: '午', 辰: '未', 巳: '申', 午: '酉', 未: '戌', 申: '亥', 酉: '子', 戌: '丑', 亥: '寅', }, 丧门: { 子: '寅', 丑: '卯', 寅: '辰', 卯: '巳', 辰: '午', 巳: '未', 午: '申', 未: '酉', 申: '戌', 酉: '亥', 戌: '子', 亥: '丑', }, 吊客: { 子: '戌', 丑: '亥', 寅: '子', 卯: '丑', 辰: '寅', 巳: '卯', 午: '辰', 未: '巳', 申: '午', 酉: '未', 戌: '申', 亥: '酉', }, 披麻: { 子: '酉', 丑: '戌', 寅: '亥', 卯: '子', 辰: '丑', 巳: '寅', 午: '卯', 未: '辰', 申: '巳', 酉: '午', 戌: '未', 亥: '申', }, 披头: { 子: '辰', 丑: '卯', 寅: '寅', 卯: '丑', 辰: '子', 巳: '亥', 午: '戌', 未: '酉', 申: '申', 酉: '未', 戌: '午', 亥: '巳', }, 六厄: { 寅: '酉', 午: '酉', 戌: '酉', 申: '卯', 子: '卯', 辰: '卯', 亥: '午', 卯: '午', 未: '午', 巳: '子', 酉: '子', 丑: '子', }, }; // 根据日干看四柱 const SHEN_ZHU = { 词馆: { 庚寅: '甲', 辛卯: '乙', 乙巳: '丙', 戊午: '丁', 丁巳: '戊', 庚午: '己', 壬申: '庚', 癸酉: '辛', 癸亥: '壬', 壬戌: '癸', }, }; // 禄命法,用看年干纳音和其他支 const SHEN_YEAR_GAN_NAYIN = { 学堂: { 金: '巳', 木: '亥', 水: '申', 土: '申', 火: '寅', }, }; // 拱禄 const GONG_LU = { 癸亥: '癸丑', 癸丑: '癸亥', 丁巳: '丁未', 己未: '己巳', 戊辰: '戊午', }; // 空亡 const KONG_WANG: Record<string, string> = { 甲子: '戌亥', 甲戌: '申酉', 甲申: '午未', 甲午: '辰巳', 甲辰: '寅卯', 甲寅: '子丑', }; // 天罗地网(基于纳音判断) const TIAN_LUO_DI_WANG = { 火: '戌亥', // 天罗 水: '辰巳', // 地网 }; // 隔角煞 const GEJIAO_SHA = { 子: '寅', 丑: '卯', 寅: '辰', 卯: '巳', 辰: '午', 巳: '未', 午: '申', 未: '酉', 申: '戌', 酉: '亥', 戌: '子', 亥: '丑', }; // 童子煞 const TONGZI_SHA_MONTH = { 寅卯辰: '丙子', 巳午未: '卯未辰', 申酉戌: '丙子', 亥子丑: '卯未辰', }; const TONGZI_SHA_YEAR_NAYIN = { 金: '午卯', 木: '午卯', 水: '酉戌', 火: '酉戌', 土: '辰巳', }; // 三奇贵人 const SANQI = ['甲戊庚', '乙丙丁', '壬癸辛']; // 基于月支和日柱判断的神煞 (月支对日柱) const SHEN_MONTHZHI_DAYZHU = { 天转: { 寅: '乙卯', 卯: '乙卯', 辰: '乙卯', 巳: '丙午', 午: '丙午', 未: '丙午', 申: '辛酉', 酉: '辛酉', 戌: '辛酉', 亥: '壬子', 子: '壬子', 丑: '壬子', }, 地转: { 寅: '辛卯', 卯: '辛卯', 辰: '辛卯', 巳: '戊午', 午: '戊午', 未: '戊午', 申: '癸酉', 酉: '癸酉', 戌: '癸酉', 亥: '丙子', 子: '丙子', 丑: '丙子', }, }; // 基于日柱判断 const SHEN_DAY_ZHU = { 十灵: ['甲辰', '乙亥', '丙辰', '丁酉', '戊午', '庚寅', '庚戌', '辛亥', '壬寅', '癸未'], 六秀: ['丙午', '丁未', '戊子', '戊午', '己丑', '己未'], 魁罡: ['戊戌', '壬辰', '庚戌', '庚辰'], 八专: ['甲寅', '乙卯', '丁未', '戊戌', '己未', '庚申', '辛酉', '癸丑'], 九丑: ['丁酉', '戊子', '戊午', '己卯', '己酉', '辛卯', '辛酉', '壬子', '壬午'], 四废: ['庚申', '辛酉', '壬子', '癸亥', '甲寅', '乙卯', '丙午', '丁巳'], 阴差阳错: ['丙子', '丙午', '丁丑', '丁未', '戊寅', '戊申', '辛卯', '辛酉', '壬辰', '壬戌', '癸巳', '癸亥'], 孤鸾: ['甲寅', '乙巳', '丙午', '丁巳', '戊午', '戊申', '辛亥', '壬子'], 十恶大败: ['甲辰', '乙巳', '壬申', '丙申', '丁亥', '庚辰', '戊戌', '癸亥', '辛巳', '己丑'], 金神: ['乙丑', '己巳', '癸酉'], }; // 基于月支判断的神煞 (月支对各天干) const DEXIU = { 寅午戌: { 德: '丙丁', 秀: '戊癸' }, 申子辰: { 德: '壬癸戊己', 秀: '丙辛甲己' }, 亥卯未: { 德: '甲乙', 秀: '丁壬' }, 巳酉丑: { 德: '庚辛', 秀: '乙庚' }, }; // 天赦星 const TIAN_SHE_XING: Record<string, string> = { 甲午: '巳午未', 戊寅: '寅卯辰', 戊申: '申卯酉', 甲子: '亥子丑', }; // 元辰,需区分男女属性 const YUAN_CHEN = { 阳男阴女: { 子: '未', 丑: '申', 寅: '酉', 卯: '戌', 辰: '亥', 巳: '子', 午: '丑', 未: '寅', 申: '卯', 酉: '辰', 戌: '巳', 亥: '午', }, 阴男阳女: { 子: '巳', 丑: '午', 寅: '未', 卯: '申', 辰: '酉', 巳: '戌', 午: '亥', 未: '子', 申: '丑', 酉: '寅', 戌: '卯', 亥: '辰', }, }; // 天干阴阳判断 const YIN_YANG = { 阳: '甲丙戊庚壬', 阴: '乙丁己辛癸' }; const getBrancheNames = (eightChar: EightChar) => { return [ eightChar.getYear().getEarthBranch().toString(), eightChar.getMonth().getEarthBranch().toString(), eightChar.getDay().getEarthBranch().toString(), eightChar.getHour().getEarthBranch().toString(), ]; }; const getStemNames = (eightChar: EightChar) => { return [ eightChar.getYear().getHeavenStem().toString(), eightChar.getMonth().getHeavenStem().toString(), eightChar.getDay().getHeavenStem().toString(), eightChar.getHour().getHeavenStem().toString(), ]; }; export function buildGods(eightChar: EightChar, gender: 0 | 1 = 1) { const gods: string[][] = [[], [], [], []]; // 年月日时 const zhiArray = getBrancheNames(eightChar); const ganArray = getStemNames(eightChar); const yearZhi = zhiArray[0]; const monthZhi = zhiArray[1]; const dayZhi = zhiArray[2]; const timeZhi = zhiArray[3]; const yearGan = ganArray[0]; const monthGan = ganArray[1]; const dayGan = ganArray[2]; const timeGan = ganArray[3]; const dayZhu = `${dayGan}${dayZhi}`; const timeZhu = `${timeGan}${timeZhi}`; for (const [godName, map] of Object.entries(SHEN_MAP_MONTHZHI_GAN)) { for (const [index, stemName] of Object.entries(ganArray)) { if (map[monthZhi].includes(stemName)) { gods[index].push(godName); } } } for (const [godName, map] of Object.entries(SHEN_MAP_YEARDAYGAN_ZHI)) { for (const [index, branchName] of Object.entries(zhiArray)) { if (map[yearGan].includes(branchName) || map[dayGan].includes(branchName)) { gods[index].push(godName); } } } for (const [godName, map] of Object.entries(SHEN_MAP_DAYGAN_ZHI)) { for (const [index, branchName] of Object.entries(zhiArray)) { if (map[dayGan].includes(branchName)) { gods[index].push(godName); } } } for (const [godName, map] of Object.entries(SHEN_MAP_YEARDAY_ZHI)) { const yearMatch = map[yearZhi]; const dayMatch = map[dayZhi]; for (const [index, zhi] of Object.entries(zhiArray)) { if ((zhi === yearMatch && index !== '0') || (zhi === dayMatch && index !== '2')) { gods[index].push(godName); } } } for (const [godName, map] of Object.entries(SHEN_MONTHZHI_ZHI)) { for (const [index, zhi] of Object.entries(zhiArray)) { if (index !== '1' && zhi === map[monthZhi]) { gods[index].push(godName); } } } for (const [godName, map] of Object.entries(SHEN_MAP_YEARZHI_ZHI)) { for (const [index, zhi] of Object.entries(zhiArray)) { if (index !== '0' && zhi === map[yearZhi]) { gods[index].push(godName); } } } for (const [godName, map] of Object.entries(SHEN_ZHU)) { for (const index of ganArray) { const ganzhi = `${ganArray[index]}${zhiArray[index]}`; if (index !== '0' && map[ganzhi] === yearGan) { gods[index].push(godName); } } } const yearSound = eightChar.getYear().getSound().toString(); for (const [godName, map] of Object.entries(SHEN_YEAR_GAN_NAYIN)) { for (const [wuxing, matchZhi] of Object.entries(map)) { if (yearSound.includes(wuxing)) { for (const [index, zhi] of Object.entries(zhiArray)) { if (index !== '0' && zhi === matchZhi) { gods[index].push(godName); } } } } } for (const [godName, map] of Object.entries(SHEN_MONTHZHI_DAYZHU)) { for (const [matchMonth, matchZhu] of Object.entries(map)) { if (monthZhi === matchMonth && matchZhu === dayZhu) { gods[2].push(godName); } } } for (const [godName, values] of Object.entries(SHEN_DAY_ZHU)) { if (values.includes(dayZhu)) { gods[2].push(godName); } } if (SANQI.includes(yearGan + monthGan + dayGan)) { gods[2].push('三奇贵人'); } if (SANQI.includes(monthGan + dayGan + timeGan)) { gods[3].push('三奇贵人'); } if (TIAN_SHE_XING[dayZhu]?.includes(monthZhi)) { gods[1].push('天赦星'); } if (GONG_LU[dayZhu] === timeZhu) { gods[3].push('拱禄'); } // 德秀贵人 for (const [monthRule, dexiuDict] of Object.entries(DEXIU)) { if (monthRule.includes(monthZhi)) { let isXiu = false; for (const [zhu1, gan1] of Object.entries(ganArray)) { for (const [zhu2, gan2] of Object.entries(ganArray)) { if (dexiuDict['德'].includes(gan1) && dexiuDict['秀'].includes(gan2) && zhu1 !== zhu2) { gods[zhu1].push('德秀贵人'); gods[zhu2].push('德秀贵人'); } } } } } // 空亡 const dayXun = eightChar.getDay().getTen().toString(); for (const [index, zhi] of Object.entries(zhiArray)) { if (index !== '2' && KONG_WANG[dayXun].includes(zhi)) { gods[index].push('空亡'); } } const yearXun = eightChar.getYear().getTen().toString(); for (const [index, zhi] of Object.entries(zhiArray)) { if (index !== '0' && KONG_WANG[yearXun].includes(zhi)) { gods[index].push('空亡'); } } // 天罗地网 for (const [wuxing, rule] of Object.entries(TIAN_LUO_DI_WANG)) { if (yearSound.includes(wuxing) && rule.includes(dayZhi)) { gods['2'].push('天罗地网'); } } // 判断元辰 let yinyang = ''; for (const [yy, dict] of Object.entries(YIN_YANG)) { if (dict.includes(dayGan)) { yinyang = yy; break; } } let yinyangGender = yinyang + (gender == 0 ? '女' : '男'); for (const [yuanchenGender, yuanchenDict] of Object.entries(YUAN_CHEN)) { if (yuanchenGender.includes(yinyangGender)) { for (const [index, zhi] of Object.entries(zhiArray)) { if (index !== '0' && zhi === yuanchenDict[yearZhi]) { gods[index].push('元辰'); } } } } // 隔角煞 if (GEJIAO_SHA[dayZhi] === timeZhi) { gods[3].push('隔角煞'); } // 童子煞 let tongziGodName = '童子煞'; for (const [monthS, rule] of Object.entries(TONGZI_SHA_MONTH)) { if (monthS.includes(monthZhi)) { if (rule.includes(dayZhi)) { gods[2].push(tongziGodName); } if (rule.includes(timeZhi)) { gods[3].push(tongziGodName); } } } for (const [yearEle, rule] of Object.entries(TONGZI_SHA_YEAR_NAYIN)) { if (yearSound.includes(yearEle)) { if (rule.includes(dayZhi)) { gods[2].push(tongziGodName); } if (rule.includes(timeZhi)) { gods[3].push(tongziGodName); } } } // 金神补充判断,看时柱 if (SHEN_DAY_ZHU['金神'].includes(timeZhu)) { gods[3].push('金神'); } return [[...new Set(gods[0])], [...new Set(gods[1])], [...new Set(gods[2])], [...new Set(gods[3])]]; }