fortel-ziweidoushu
Version:
紫微斗數排盤 Zi Wei Dou Shu
253 lines (219 loc) • 10.6 kB
text/typescript
import { DestinyBoard } from './destinyBoard'
import { Element } from './miscEnums'
import { Ground } from './ground'
import { Star } from './star'
import util from 'util'
/**
* 主星
*/
class MajorStar implements Star {
key: string
displayName: string
constructor(key: string, displayName: string) {
this.key = key
this.displayName = displayName
}
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 MAJOR_STAR_EMPEROR = Object.freeze(new MajorStar('MAJOR_STAR_EMPEROR', '紫微'))
static MAJOR_STAR_CHANGE = Object.freeze(new MajorStar('MAJOR_STAR_CHANGE', '天機'))
static MAJOR_STAR_SUN = Object.freeze(new MajorStar('MAJOR_STAR_SUN', '太陽'))
static MAJOR_STAR_GOLD = Object.freeze(new MajorStar('MAJOR_STAR_GOLD', '武曲'))
static MAJOR_STAR_ENJOYMENT = Object.freeze(new MajorStar('MAJOR_STAR_ENJOYMENT', '天同'))
static MAJOR_STAR_FIRE = Object.freeze(new MajorStar('MAJOR_STAR_FIRE', '廉貞'))
static MAJOR_STAR_TREASURY = Object.freeze(new MajorStar('MAJOR_STAR_TREASURY', '天府'))
static MAJOR_STAR_MOON = Object.freeze(new MajorStar('MAJOR_STAR_MOON', '太陰'))
static MAJOR_STAR_GREED = Object.freeze(new MajorStar('MAJOR_STAR_GREED', '貪狼'))
static MAJOR_STAR_ARGUMENT = Object.freeze(new MajorStar('MAJOR_STAR_ARGUMENT', '巨門'))
static MAJOR_STAR_SUPPORT = Object.freeze(new MajorStar('MAJOR_STAR_SUPPORT', '天相'))
static MAJOR_STAR_RULE = Object.freeze(new MajorStar('MAJOR_STAR_RULE', '天梁'))
static MAJOR_STAR_GENERAL = Object.freeze(new MajorStar('MAJOR_STAR_GENERAL', '七殺'))
static MAJOR_STAR_PIONEER = Object.freeze(new MajorStar('MAJOR_STAR_PIONEER', '破軍'))
static stars = Object.freeze([
MajorStar.MAJOR_STAR_EMPEROR,
MajorStar.MAJOR_STAR_CHANGE,
MajorStar.MAJOR_STAR_SUN,
MajorStar.MAJOR_STAR_GOLD,
MajorStar.MAJOR_STAR_ENJOYMENT,
MajorStar.MAJOR_STAR_FIRE,
MajorStar.MAJOR_STAR_TREASURY,
MajorStar.MAJOR_STAR_MOON,
MajorStar.MAJOR_STAR_GREED,
MajorStar.MAJOR_STAR_ARGUMENT,
MajorStar.MAJOR_STAR_SUPPORT,
MajorStar.MAJOR_STAR_RULE,
MajorStar.MAJOR_STAR_GENERAL,
MajorStar.MAJOR_STAR_PIONEER,
])
static majorStarPlacers: Readonly<Map<MajorStar, MajorStarPlacer>>
static {
const majorStarPlacers = new Map<MajorStar, MajorStarPlacer>()
// 紫微
majorStarPlacers.set(MajorStar.MAJOR_STAR_EMPEROR, {
evalGround: (destinyBoard: DestinyBoard) => {
const mapping = new Map()
mapping.set(Element.WATER, [1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 0, 0, 1, 1, 2, 2, 3, 3, 4])
mapping.set(Element.WOOD, [4, 1, 2, 5, 2, 3, 6, 3, 4, 7, 4, 5, 8, 5, 6, 9, 6, 7, 10, 7, 8, 11, 8, 9, 0, 9, 10, 1, 10, 11])
mapping.set(Element.GOLD, [11, 4, 1, 2, 0, 5, 2, 3, 1, 6, 3, 4, 2, 7, 4, 5, 3, 8, 5, 6, 4, 9, 6, 7, 5, 10, 7, 8, 6, 11])
mapping.set(Element.EARTH, [6, 11, 4, 1, 2, 7, 0, 5, 2, 3, 8, 1, 6, 3, 4, 9, 2, 7, 4, 5, 10, 3, 8, 5, 6, 11, 4, 9, 6, 7])
mapping.set(Element.FIRE, [9, 6, 11, 4, 1, 2, 10, 7, 0, 5, 2, 3, 11, 8, 1, 6, 3, 4, 0, 9, 2, 7, 4, 5, 1, 10, 3, 8, 5, 6])
return Ground.get(mapping.get(destinyBoard.element)[destinyBoard.config.day - 1])
},
evalEnergyLevel: (ground: Ground) => {
return [0, 2, 2, 1, -1, 1, 2, 2, 1, 0, 0, 1][ground.index]
},
})
// 天機
majorStarPlacers.set(MajorStar.MAJOR_STAR_CHANGE, {
evalGround: (destinyBoard: DestinyBoard) => {
return majorStarPlacers.get(MajorStar.MAJOR_STAR_EMPEROR)!.evalGround(destinyBoard).shift(-1)
},
evalEnergyLevel: (ground: Ground) => {
return [2, -1, 1, 1, 2, 0, 2, -1, 0, 1, 2, 0][ground.index]
},
})
// 太陽
majorStarPlacers.set(MajorStar.MAJOR_STAR_SUN, {
evalGround: (destinyBoard: DestinyBoard) => {
return majorStarPlacers.get(MajorStar.MAJOR_STAR_EMPEROR)!.evalGround(destinyBoard).shift(-3)
},
evalEnergyLevel: (ground: Ground) => {
return [-1, -1, 1, 2, 1, 1, 2, 0, 0, 0, -1, -1][ground.index]
},
})
// 武曲
majorStarPlacers.set(MajorStar.MAJOR_STAR_GOLD, {
evalGround: (destinyBoard: DestinyBoard) => {
return majorStarPlacers.get(MajorStar.MAJOR_STAR_EMPEROR)!.evalGround(destinyBoard).shift(-4)
},
evalEnergyLevel: (ground: Ground) => {
return [1, 2, 0, -1, 2, 0, 1, 2, 0, 1, 2, 0][ground.index]
},
})
// 天同
majorStarPlacers.set(MajorStar.MAJOR_STAR_ENJOYMENT, {
evalGround: (destinyBoard: DestinyBoard) => {
return majorStarPlacers.get(MajorStar.MAJOR_STAR_EMPEROR)!.evalGround(destinyBoard).shift(-5)
},
evalEnergyLevel: (ground: Ground) => {
return [1, -1, 0, 2, 0, 2, -1, -1, 1, 0, 0, 2][ground.index]
},
})
// 廉貞
majorStarPlacers.set(MajorStar.MAJOR_STAR_FIRE, {
evalGround: (destinyBoard: DestinyBoard) => {
return majorStarPlacers.get(MajorStar.MAJOR_STAR_EMPEROR)!.evalGround(destinyBoard).shift(-8)
},
evalEnergyLevel: (ground: Ground) => {
return [0, 1, 2, 0, 1, -1, 0, 2, 2, 0, 1, -1][ground.index]
},
})
// 天府
majorStarPlacers.set(MajorStar.MAJOR_STAR_TREASURY, {
evalGround: (destinyBoard: DestinyBoard) => {
const ground = majorStarPlacers.get(MajorStar.MAJOR_STAR_EMPEROR)!.evalGround(destinyBoard)
const emperorCell = destinyBoard.getCellByGround(ground)
const emperorCellOffset = emperorCell.getCellNextDist(destinyBoard.getCellByGround(Ground.get(2)))
return emperorCell.getNextICell(emperorCellOffset * 2).ground
},
evalEnergyLevel: (ground: Ground) => {
return [2, 2, 2, 0, 2, 0, 1, 2, 0, -1, 2, 1][ground.index]
},
})
// 太陰
majorStarPlacers.set(MajorStar.MAJOR_STAR_MOON, {
evalGround: (destinyBoard: DestinyBoard) => {
return majorStarPlacers.get(MajorStar.MAJOR_STAR_TREASURY)!.evalGround(destinyBoard).shift(1)
},
evalEnergyLevel: (ground: Ground) => {
return [2, 2, 0, -1, 0, -1, -1, 0, 0, 1, 1, 2][ground.index]
},
})
// 貪狼
majorStarPlacers.set(MajorStar.MAJOR_STAR_GREED, {
evalGround: (destinyBoard: DestinyBoard) => {
return majorStarPlacers.get(MajorStar.MAJOR_STAR_TREASURY)!.evalGround(destinyBoard).shift(2)
},
evalEnergyLevel: (ground: Ground) => {
return [1, 2, 0, 0, 2, -1, 1, 2, 0, 0, 2, -1][ground.index]
},
})
// 巨門
majorStarPlacers.set(MajorStar.MAJOR_STAR_ARGUMENT, {
evalGround: (destinyBoard: DestinyBoard) => {
return majorStarPlacers.get(MajorStar.MAJOR_STAR_TREASURY)!.evalGround(destinyBoard).shift(3)
},
evalEnergyLevel: (ground: Ground) => {
return [1, 1, 2, 2, 0, 0, 1, -1, 2, 2, 1, 1][ground.index]
},
})
// 天相
majorStarPlacers.set(MajorStar.MAJOR_STAR_SUPPORT, {
evalGround: (destinyBoard: DestinyBoard) => {
return majorStarPlacers.get(MajorStar.MAJOR_STAR_TREASURY)!.evalGround(destinyBoard).shift(4)
},
evalEnergyLevel: (ground: Ground) => {
return [2, 2, 2, -1, 1, 0, 1, 0, 2, -1, 0, 0][ground.index]
},
})
// 天梁
majorStarPlacers.set(MajorStar.MAJOR_STAR_RULE, {
evalGround: (destinyBoard: DestinyBoard) => {
return majorStarPlacers.get(MajorStar.MAJOR_STAR_TREASURY)!.evalGround(destinyBoard).shift(5)
},
evalEnergyLevel: (ground: Ground) => {
return [2, 1, 2, 2, 1, -1, 2, 1, -1, 0, 1, -1][ground.index]
},
})
// 七殺
majorStarPlacers.set(MajorStar.MAJOR_STAR_GENERAL, {
evalGround: (destinyBoard: DestinyBoard) => {
return majorStarPlacers.get(MajorStar.MAJOR_STAR_TREASURY)!.evalGround(destinyBoard).shift(6)
},
evalEnergyLevel: (ground: Ground) => {
return [1, 2, 2, -1, 1, 0, 1, 1, 2, 0, 2, 0][ground.index]
},
})
// 七殺
majorStarPlacers.set(MajorStar.MAJOR_STAR_PIONEER, {
evalGround: (destinyBoard: DestinyBoard) => {
return majorStarPlacers.get(MajorStar.MAJOR_STAR_TREASURY)!.evalGround(destinyBoard).shift(-2)
},
evalEnergyLevel: (ground: Ground) => {
return [2, 1, -1, 1, 1, 0, 2, 2, -1, -1, 1, 0][ground.index]
},
})
MajorStar.majorStarPlacers = Object.freeze(majorStarPlacers)
}
getType(): string {
return 'MajorStar'
}
getKey() {
return this.key
}
getDisplayName() {
return this.displayName
}
static getByKey(key: string): MajorStar | null {
return MajorStar.stars.find((star) => star.getKey() === key) ?? null
}
static getByName(name: string) {
return MajorStar.stars.find((star) => star.getDisplayName() === name) ?? null
}
equals(star: Star) {
return star === this || (star.getType() === this.getType() && star.getKey() === this.getKey())
}
}
declare interface MajorStarPlacer {
evalGround: (destinyBoard: DestinyBoard) => Ground
evalEnergyLevel: (ground: Ground) => number
}
export { MajorStar }