v3.6.0 同步发版
- 交互契约改对话式询问(禁点选工具、一次1~2问、先铺垫再问),规则库 3.6 - 盘面图默认生成+chart_shot 截图;品牌区、大运/流年小卡信息补全、交流群二维码卡 - day_boundary 子正换日;memory_save --update-chart 换盘留痕;share_export 事件简介+城市级地域 - share_push 失败诊断+代理引导;_runtime_guard;修 STAR_ORDER 三奇贵人 KeyError - README 规则计数 541→542;manifest 重建(1275 文件);测试 142 项全绿
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
"""干支派生纯查表:五行、十神、十二长生(星运)、旬空、六十甲子纳音。
|
||||
|
||||
本命四柱的同名信息由 chart/tyme_adapter.py 经 tyme4py 求得;本模块为同口径的
|
||||
纯 Python 实现,供岁运干支(大运/流年/流月)与渲染层复用,保证 HTML 盘面
|
||||
与排盘正文口径一致。纯查表,零命理判断(P1)。
|
||||
"""
|
||||
|
||||
GAN = "甲乙丙丁戊己庚辛壬癸"
|
||||
ZHI = "子丑寅卯辰巳午未申酉戌亥"
|
||||
|
||||
WX_GAN = {"甲": "木", "乙": "木", "丙": "火", "丁": "火", "戊": "土",
|
||||
"己": "土", "庚": "金", "辛": "金", "壬": "水", "癸": "水"}
|
||||
WX_ZHI = {"子": "水", "丑": "土", "寅": "木", "卯": "木", "辰": "土",
|
||||
"巳": "火", "午": "火", "未": "土", "申": "金", "酉": "金",
|
||||
"戌": "土", "亥": "水"}
|
||||
|
||||
_YY = {"甲": 1, "丙": 1, "戊": 1, "庚": 1, "壬": 1,
|
||||
"乙": -1, "丁": -1, "己": -1, "辛": -1, "癸": -1}
|
||||
_SHENG = {"木": "火", "火": "土", "土": "金", "金": "水", "水": "木"}
|
||||
_KE = {"木": "土", "土": "水", "水": "火", "火": "金", "金": "木"}
|
||||
|
||||
|
||||
def ten_god(me: str, other: str) -> str:
|
||||
"""other 天干相对日干 me 的十神(命名与 tyme4py get_ten_star 一致)。"""
|
||||
wx_m, wx_o = WX_GAN[me], WX_GAN[other]
|
||||
same = _YY[me] == _YY[other]
|
||||
if wx_m == wx_o:
|
||||
return "比肩" if same else "劫财"
|
||||
if _SHENG[wx_m] == wx_o:
|
||||
return "食神" if same else "伤官"
|
||||
if _KE[wx_m] == wx_o:
|
||||
return "偏财" if same else "正财"
|
||||
if _KE[wx_o] == wx_m:
|
||||
return "七杀" if same else "正官"
|
||||
return "偏印" if same else "正印"
|
||||
|
||||
|
||||
_TERRAIN_ORDER = ["长生", "沐浴", "冠带", "临官", "帝旺", "衰",
|
||||
"病", "死", "墓", "绝", "胎", "养"]
|
||||
_TERRAIN_START = {"甲": "亥", "乙": "午", "丙": "寅", "戊": "寅", "庚": "巳",
|
||||
"壬": "申", "丁": "酉", "己": "酉", "辛": "子", "癸": "卯"}
|
||||
|
||||
|
||||
def terrain(me: str, zhi: str) -> str:
|
||||
"""日干 me 对地支 zhi 的十二长生(阳顺阴逆,命名与 tyme4py get_terrain 一致)。"""
|
||||
start = ZHI.index(_TERRAIN_START[me])
|
||||
zi = ZHI.index(zhi)
|
||||
off = (zi - start) % 12 if _YY[me] == 1 else (start - zi) % 12
|
||||
return _TERRAIN_ORDER[off]
|
||||
|
||||
|
||||
def gz_void(gz: str) -> str:
|
||||
"""一柱干支所在旬的空亡两支(与 tyme4py get_extra_earth_branches 同果)。"""
|
||||
g, z = GAN.index(gz[0]), ZHI.index(gz[1])
|
||||
return ZHI[(z - g + 10) % 12] + ZHI[(z - g + 11) % 12]
|
||||
|
||||
|
||||
# 六十甲子纳音( pairwise ),末字即五行
|
||||
_NAYIN_PAIRS = [
|
||||
"海中金", "炉中火", "大林木", "路旁土", "剑锋金",
|
||||
"山头火", "涧下水", "城头土", "白蜡金", "杨柳木",
|
||||
"泉中水", "屋上土", "霹雳火", "松柏木", "长流水",
|
||||
"沙中金", "山下火", "平地木", "壁上土", "金箔金",
|
||||
"覆灯火", "天河水", "大驿土", "钗钏金", "桑柘木",
|
||||
"大溪水", "沙中土", "天上火", "石榴木", "大海水",
|
||||
]
|
||||
_JIAZI = [GAN[i % 10] + ZHI[i % 12] for i in range(60)]
|
||||
NAYIN = {gz: _NAYIN_PAIRS[i // 2] for i, gz in enumerate(_JIAZI)}
|
||||
Reference in New Issue
Block a user