v0.1.4: 百年定局(终局/大比/寄读/春秋原)
- 望气定鼎:stats 追踪四维(人兴/道兴/威名/香火)+ 十二称号分档 + 铭文诗 春秋原页预演称号,落印定局(青册留档,不阻继续游历) - 太虚大比:每五年征召,点将三关(初试/拔擢/问鼎)复用战斗结算, 名次四档红利(声望/灵石/全场好感),史书战报自动落笔 - 宗门寄读:随机宗门收徒(适龄少年),寄读 2-4 年期间每季寄资源, 期满三选:归来精进(可触发突破+随机机运)或续读深造;低概率择师不回 - 求经台:藏书阁≥3 解锁,两年一访得稀有功法 - 春秋原复盘页:气数四维图/岁末族簿汇编/生卒与突破年表/大比年表 - 修复:大比征召曾因月份条件错过整年;抢在百年庆典前的优先级倒置 - 测试 161→176(评分边界/称号分档/大比三轨/寄读全链/求经冷却)
This commit is contained in:
@@ -11,6 +11,8 @@ import {
|
||||
import { Rng } from '../core/rng'
|
||||
import { BUILDINGS } from '../data/buildings'
|
||||
import { POSTS } from '../data/posts'
|
||||
import { TECHNIQUES } from '../data/techniques'
|
||||
import { computeLegacy, resolveLegacy, peakRealmIndex, grandTechniqueCount, LegacyArch } from '../core/legacy'
|
||||
import { productionTick } from './systems/production'
|
||||
import { deathTick, woundHealTick } from './systems/lifecycle'
|
||||
import { cultivationTick, resolveBreakthrough } from './systems/cultivation'
|
||||
@@ -37,6 +39,16 @@ export function normalizeGameState(state: GameState): GameState {
|
||||
if (!state.finance) state.finance = { accum: 0 }
|
||||
if (!state.yearStats) state.yearStats = { births: 0, deaths: 0 }
|
||||
if (!state.yearlyReports) state.yearlyReports = []
|
||||
if (!state.stats) {
|
||||
state.stats = {
|
||||
repPeak: state.family?.reputation ?? 0,
|
||||
popPeak: Object.values(state.members).filter((c) => c.alive).length,
|
||||
maxRealmIdx: peakRealmIndex(state.members ?? {}),
|
||||
techniqueGrand: grandTechniqueCount(state.members ?? {}),
|
||||
tourneyHistory: [],
|
||||
feishengCount: 0
|
||||
}
|
||||
}
|
||||
if (typeof state.totalTicks !== 'number') state.totalTicks = 0
|
||||
if (typeof state.seq !== 'number') state.seq = 10
|
||||
if (!state.battles) state.battles = []
|
||||
@@ -144,6 +156,33 @@ export class World {
|
||||
this.checkHead()
|
||||
const stonesEnd = s.family.stones
|
||||
s.finance.accum += stonesEnd - stonesStart
|
||||
this.trackStats()
|
||||
}
|
||||
|
||||
private trackStats(): void {
|
||||
const s = this.state
|
||||
const st = s.stats
|
||||
if (s.family.reputation > st.repPeak) st.repPeak = s.family.reputation
|
||||
const pop = this.aliveMembers().length
|
||||
if (pop > st.popPeak) st.popPeak = pop
|
||||
const idx = peakRealmIndex(s.members)
|
||||
if (idx > st.maxRealmIdx) st.maxRealmIdx = idx
|
||||
const g = grandTechniqueCount(s.members)
|
||||
if (g > st.techniqueGrand) st.techniqueGrand = g
|
||||
}
|
||||
|
||||
legacyPreview() {
|
||||
return computeLegacy(this.state)
|
||||
}
|
||||
|
||||
resolveLegacyNow(): LegacyArch {
|
||||
const arch = resolveLegacy(this.state)
|
||||
this.state.stats.resolvedYear = this.state.year
|
||||
this.state.stats.resolveTitle = arch.title
|
||||
this.state.family.flag['resolved'] = true
|
||||
this.chronicle('event', `望气观澜,本族百年气数终有定论——「${arch.title}」。开卷盖印,史入青册。`, undefined, true)
|
||||
this.log('good', `定鼎:${arch.title}。`)
|
||||
return arch
|
||||
}
|
||||
|
||||
private yearStart(): void {
|
||||
@@ -343,12 +382,12 @@ export class World {
|
||||
}
|
||||
|
||||
postCount(def: string): number {
|
||||
return this.aliveMembers().filter((c) => c.post === def).length
|
||||
return this.aliveMembers().filter((c) => c.post === def && c.state !== 'apprentice').length
|
||||
}
|
||||
|
||||
assignPost(memberId: Id, postId: string | undefined): boolean {
|
||||
const c = this.memberById(memberId)
|
||||
if (!c.alive) return false
|
||||
if (!c.alive || c.state === 'apprentice') return false
|
||||
if (postId === undefined || postId === '') {
|
||||
c.post = undefined
|
||||
return true
|
||||
@@ -402,6 +441,27 @@ export class World {
|
||||
return true
|
||||
}
|
||||
|
||||
seekSutra(): boolean {
|
||||
const fam = this.state.family
|
||||
if ((fam.buildings['cangshu'] ?? 0) < 3) return false
|
||||
const last = (fam.flag['sutraCD'] as number | undefined) ?? -999
|
||||
if (this.state.year - last < 2) return false
|
||||
if (fam.stones < 150) return false
|
||||
fam.stones -= 150
|
||||
fam.flag['sutraCD'] = this.state.year
|
||||
const pool = TECHNIQUES.filter((t) => t.grade >= 2 && !fam.techniques.includes(t.id))
|
||||
if (pool.length === 0) {
|
||||
this.log('info', '求经访道:天下典籍已入庶几,无可再得。')
|
||||
this.chronicle('event', '求经台广搜天下,经卷已穷。', undefined, false)
|
||||
return true
|
||||
}
|
||||
const t = this.rng.pick(pool)
|
||||
fam.techniques.push(t.id)
|
||||
this.chronicle('event', `遣人下江南求经,携回《${t.name}》。`, undefined, true)
|
||||
this.log('good', `求经台访得《${t.name}》!`)
|
||||
return true
|
||||
}
|
||||
|
||||
tauntNpc(npcId: string): boolean {
|
||||
const fam = this.state.family
|
||||
const npc = this.state.npcFamilies[npcId]
|
||||
@@ -425,7 +485,7 @@ export class World {
|
||||
const me = this.memberById(id)
|
||||
const meG = me.gender
|
||||
return this.aliveMembers()
|
||||
.filter((c) => c.gender !== meG && c.state !== 'expedition')
|
||||
.filter((c) => c.gender !== meG && c.state !== 'expedition' && c.state !== 'apprentice')
|
||||
.filter((c) => w2age(this, c) >= 16 && w2age(this, c) <= 46)
|
||||
.filter((c) => !c.spouseId || this.isWidowed(c))
|
||||
.filter(
|
||||
|
||||
Reference in New Issue
Block a user