fortel-ziweidoushu
Version:
紫微斗數排盤 Zi Wei Dou Shu
282 lines (247 loc) • 11.7 kB
text/typescript
import { DestinyBoard } from './destinyBoard'
import { Ground } from './ground'
import { Luckiness } from './miscEnums'
import { Sky } from './sky'
import util from 'util'
import { Star } from './star'
class MinorStar implements Star {
key: string
displayName: string
luck: Luckiness
constructor(key: string, displayName: string, luck: Luckiness) {
this.key = key
this.displayName = displayName
this.luck = luck
}
toJSON() {
return this.displayName
}
toString(): string {
return this.displayName
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars
[util.inspect.custom](depth: number, opts: any): string {
return this.toString()
}
static MINOR_STAR_EARN = Object.freeze(new MinorStar('MINOR_STAR_EARN', '祿存', Luckiness.LUCK))
static MINOR_STAR_BENEFACTOR_MAN = Object.freeze(new MinorStar('MINOR_STAR_BENEFACTOR_MAN', '天魁', Luckiness.LUCK))
static MINOR_STAR_BENEFACTOR_WOMAN = Object.freeze(new MinorStar('MINOR_STAR_BENEFACTOR_WOMAN', '天鉞', Luckiness.LUCK))
static MINOR_STAR_CLEVER = Object.freeze(new MinorStar('MINOR_STAR_CLEVER', '文昌', Luckiness.LUCK))
static MINOR_STAR_SKILL = Object.freeze(new MinorStar('MINOR_STAR_SKILL', '文曲', Luckiness.LUCK))
static MINOR_STAR_SUPPORT_LEFT = Object.freeze(new MinorStar('MINOR_STAR_SUPPORT_LEFT', '左輔', Luckiness.LUCK))
static MINOR_STAR_SUPPORT_RIGHT = Object.freeze(new MinorStar('MINOR_STAR_SUPPORT_RIGHT', '右弼', Luckiness.LUCK))
static MINOR_STAR_VOID_GROUND = Object.freeze(new MinorStar('MINOR_STAR_VOID_GROUND', '地空', Luckiness.BAD_LUCK))
static MINOR_STAR_LOST = Object.freeze(new MinorStar('MINOR_STAR_LOST', '地劫', Luckiness.BAD_LUCK))
static MINOR_STAR_BURNING = Object.freeze(new MinorStar('MINOR_STAR_BURNING', '火星', Luckiness.BAD_LUCK))
static MINOR_STAR_HIDDEN_FIRE = Object.freeze(new MinorStar('MINOR_STAR_HIDDEN_FIRE', '鈴星', Luckiness.BAD_LUCK))
static MINOR_STAR_COMPETITION = Object.freeze(new MinorStar('MINOR_STAR_COMPETITION', '擎羊', Luckiness.BAD_LUCK))
static MINOR_STAR_HINDRANCE = Object.freeze(new MinorStar('MINOR_STAR_HINDRANCE', '陀羅', Luckiness.BAD_LUCK))
static MINOR_STAR_PEGASUS = Object.freeze(new MinorStar('MINOR_STAR_PEGASUS', '天馬', Luckiness.NEUTRAL))
static stars = Object.freeze([
MinorStar.MINOR_STAR_EARN,
MinorStar.MINOR_STAR_BENEFACTOR_MAN,
MinorStar.MINOR_STAR_BENEFACTOR_WOMAN,
MinorStar.MINOR_STAR_CLEVER,
MinorStar.MINOR_STAR_SKILL,
MinorStar.MINOR_STAR_SUPPORT_LEFT,
MinorStar.MINOR_STAR_SUPPORT_RIGHT,
MinorStar.MINOR_STAR_VOID_GROUND,
MinorStar.MINOR_STAR_LOST,
MinorStar.MINOR_STAR_BURNING,
MinorStar.MINOR_STAR_HIDDEN_FIRE,
MinorStar.MINOR_STAR_COMPETITION,
MinorStar.MINOR_STAR_HINDRANCE,
MinorStar.MINOR_STAR_PEGASUS,
])
static minorStarPlacers: Readonly<Map<MinorStar, MinorStarPlacer>>
static {
const minorStarPlacers = new Map<MinorStar, MinorStarPlacer>()
// 祿存
minorStarPlacers.set(MinorStar.MINOR_STAR_EARN, {
evalGround: (destinyBoard: DestinyBoard) => {
return minorStarPlacers.get(MinorStar.MINOR_STAR_EARN)!.evalRuntimeGround(destinyBoard.config.yearSky)
},
hasRuntime: () => true,
evalRuntimeGround: (sky: Sky) => {
return Ground.get([2, 3, 5, 6, 5, 6, 8, 9, 11, 0][sky.index])
},
})
// 天魁
minorStarPlacers.set(MinorStar.MINOR_STAR_BENEFACTOR_MAN, {
evalGround: (destinyBoard: DestinyBoard) => {
return minorStarPlacers.get(MinorStar.MINOR_STAR_BENEFACTOR_MAN)!.evalRuntimeGround(destinyBoard.config.yearSky)
},
hasRuntime: () => true,
evalRuntimeGround: (sky: Sky) => {
return Ground.get([1, 0, 11, 11, 1, 0, 1, 6, 3, 3][sky.index])
},
})
// 天鉞
minorStarPlacers.set(MinorStar.MINOR_STAR_BENEFACTOR_WOMAN, {
evalGround: (destinyBoard: DestinyBoard) => {
return minorStarPlacers.get(MinorStar.MINOR_STAR_BENEFACTOR_WOMAN)!.evalRuntimeGround(destinyBoard.config.yearSky)
},
hasRuntime: () => true,
evalRuntimeGround: (sky: Sky) => {
return Ground.get([7, 8, 9, 9, 7, 8, 7, 2, 5, 5][sky.index])
},
})
// 文昌
minorStarPlacers.set(MinorStar.MINOR_STAR_CLEVER, {
evalGround: (destinyBoard: DestinyBoard) => {
const bornGround = destinyBoard.config.bornTimeGround.ground
return Ground.get(10).shift(-bornGround.index)
},
hasRuntime: () => true,
evalRuntimeGround: (sky: Sky) => {
return Ground.get([5, 6, 8, 9, 8, 9, 11, 0, 2, 3][sky.index])
},
})
// 文曲
minorStarPlacers.set(MinorStar.MINOR_STAR_SKILL, {
evalGround: (destinyBoard: DestinyBoard) => {
const bornGround = destinyBoard.config.bornTimeGround.ground
return Ground.get(4).shift(bornGround.index)
},
hasRuntime: () => true,
evalRuntimeGround: (sky: Sky) => {
return Ground.get([9, 8, 6, 5, 6, 5, 3, 2, 0, 11][sky.index])
},
})
// 左輔
minorStarPlacers.set(MinorStar.MINOR_STAR_SUPPORT_LEFT, {
evalGround: (destinyBoard: DestinyBoard) => {
const month = destinyBoard.config.getLogicalMonth()
return Ground.get(4).shift(month - 1)
},
hasRuntime: () => false,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
evalRuntimeGround: (sky: Sky) => {
throw new Error('Runtime not supported')
},
})
// 右弼
minorStarPlacers.set(MinorStar.MINOR_STAR_SUPPORT_RIGHT, {
evalGround: (destinyBoard: DestinyBoard) => {
const month = destinyBoard.config.getLogicalMonth()
return Ground.get(10).shift(-(month - 1))
},
hasRuntime: () => false,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
evalRuntimeGround: (sky: Sky) => {
throw new Error('Runtime not supported')
},
})
// 地空
minorStarPlacers.set(MinorStar.MINOR_STAR_VOID_GROUND, {
evalGround: (destinyBoard: DestinyBoard) => {
const bornGround = destinyBoard.config.bornTimeGround.ground
return Ground.get(11).shift(-bornGround.index)
},
hasRuntime: () => false,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
evalRuntimeGround: (sky: Sky) => {
throw new Error('Runtime not supported')
},
})
// 地劫
minorStarPlacers.set(MinorStar.MINOR_STAR_LOST, {
evalGround: (destinyBoard: DestinyBoard) => {
const bornGround = destinyBoard.config.bornTimeGround.ground
return Ground.get(11).shift(bornGround.index)
},
hasRuntime: () => false,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
evalRuntimeGround: (sky: Sky) => {
throw new Error('Runtime not supported')
},
})
// 火星
minorStarPlacers.set(MinorStar.MINOR_STAR_BURNING, {
evalGround: (destinyBoard: DestinyBoard) => {
const yearGround = destinyBoard.config.yearGround
const bornGround = destinyBoard.config.bornTimeGround.ground
const mapping = [2, 3, 1, 9, 2, 3, 1, 9, 2, 3, 1, 9]
return Ground.get(mapping[yearGround.index]).shift(bornGround.index)
},
hasRuntime: () => false,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
evalRuntimeGround: (sky: Sky) => {
throw new Error('Runtime not supported')
},
})
// 鈴星
minorStarPlacers.set(MinorStar.MINOR_STAR_HIDDEN_FIRE, {
evalGround: (destinyBoard: DestinyBoard) => {
const yearGround = destinyBoard.config.yearGround
const bornGround = destinyBoard.config.bornTimeGround.ground
if ([2, 6, 10].includes(yearGround.index)) {
return Ground.get(3).shift(bornGround.index)
} else {
return Ground.get(10).shift(bornGround.index)
}
},
hasRuntime: () => false,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
evalRuntimeGround: (sky: Sky) => {
throw new Error('Runtime not supported')
},
})
// 擎羊
minorStarPlacers.set(MinorStar.MINOR_STAR_COMPETITION, {
evalGround: (destinyBoard: DestinyBoard) => {
return minorStarPlacers.get(MinorStar.MINOR_STAR_COMPETITION)!.evalRuntimeGround(destinyBoard.config.yearSky)
},
hasRuntime: () => true,
evalRuntimeGround: (sky: Sky) => {
return Ground.get([3, 4, 6, 7, 6, 7, 9, 10, 0, 1][sky.index])
},
})
// 陀羅
minorStarPlacers.set(MinorStar.MINOR_STAR_HINDRANCE, {
evalGround: (destinyBoard: DestinyBoard) => {
return minorStarPlacers.get(MinorStar.MINOR_STAR_HINDRANCE)!.evalRuntimeGround(destinyBoard.config.yearSky)
},
hasRuntime: () => true,
evalRuntimeGround: (sky: Sky) => {
return Ground.get([1, 2, 4, 5, 4, 5, 7, 8, 10, 11][sky.index])
},
})
// 天馬
minorStarPlacers.set(MinorStar.MINOR_STAR_PEGASUS, {
evalGround: (destinyBoard: DestinyBoard) => {
return Ground.get([2, 11, 8, 5, 2, 11, 8, 5, 2, 11, 8, 5][destinyBoard.config.yearGround.index])
},
hasRuntime: () => false,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
evalRuntimeGround: (sky: Sky) => {
throw new Error('Runtime not supported')
},
})
MinorStar.minorStarPlacers = Object.freeze(minorStarPlacers)
}
getType(): string {
return 'MinorStar'
}
getKey() {
return this.key
}
getDisplayName() {
return this.displayName
}
static getByKey(key: string): MinorStar | null {
return MinorStar.stars.find((star) => star.getKey() === key) ?? null
}
static getByName(name: string) {
return MinorStar.stars.find((star) => star.getDisplayName() === name) ?? null
}
equals(star: Star) {
return star === this || (star.getType() === this.getType() && star.getKey() === this.getKey())
}
}
declare interface MinorStarPlacer {
evalGround: (destinyBoard: DestinyBoard) => Ground
hasRuntime: () => boolean
evalRuntimeGround: (sky: Sky) => Ground
}
export { MinorStar }