【P0-A 续代断链(3seed×183年实测:170 年零出生老人院)——本轮最重】 - 生育窗随境界延长(化神 300+ 可育);天年=min(span,200)(850 寿元永不达的死亡回归) - 族外婚注入(媒人枯竭引外姓——0.1.1 至今缺失的最后一环) - 全局年胎 cap(≤18 人年 3 胎/18-24 1 胎/>24 停)→ 稳态 ~25 人、gens 3、2200 月 420ms - 确定性回归:inlaw 判定长度化+单一 chance(修复过程中的真 bug——det 二分锁定) 【P1 七件】legacypass 年锚(同一年 12 连发 224 次实测)/敌强度相对化(0.35+rel×0.55, cap 2.6——5000+ 战力零风险碾压的定锚)/eventRoll 插件权重防垄断(>核心 50% 压缩)/ allEvents 按 enabled 过滤(禁用 MOD 事件双闸全面兑现)/bundle 全量导入(modParseAll 导出 2 回 2)/ chronicle 表治理(write-only→no-op)/Stash 并发(open in-flight 去重+save try) + PluginManager catch 全回滚 + about 版本统一 【P2 群】decline 150 激活生灭/化神月俸 20 石泄灵石死水/灾因 brief+descOf 接线/ worldGenMods 落空/EventModal 文案对齐/LegacyPanel 恒等清理 【测试】70 套件 2014 全绿(audit-0.1.29 六例:人口曲线/传薪年锚/强度公式/bundle 全量/异常回滚/灾因 brief); 【金钟罩】0.1.29 基线重算(续代/战斗/事件数值受控变更);build 通过
51 lines
1.8 KiB
TypeScript
51 lines
1.8 KiB
TypeScript
import type { World } from '../World'
|
||
import { MAJORS } from '../../../data/realms'
|
||
import { calcLifespan } from '../pcgen'
|
||
|
||
export function lifespanOf(w: World, c: { realm: { major: keyof typeof MAJORS }; physique: number }): number {
|
||
return calcLifespan(c.realm.major, c.physique)
|
||
}
|
||
|
||
export function deathTick(w: World): void {
|
||
for (const c of Object.values(w.state.members)) {
|
||
if (!c.alive) continue
|
||
const age = w.ageOf(c)
|
||
const span = lifespanOf(w, c)
|
||
// P0-A 天年:仙家 240 年为限(span 供凡人/低境界;高境界同样 240 内退场——世界人口会换血)
|
||
const cap = Math.min(span, 200)
|
||
const softCap = cap * 0.85
|
||
let p = 0
|
||
if (age >= cap) p = 0.35
|
||
else if (age >= softCap) {
|
||
const t = (age - softCap) / (cap - softCap)
|
||
p = Math.min(0.3, Math.pow(t, 5) * 0.9)
|
||
}
|
||
if (c.health < 30) p += 0.18
|
||
if (age < 2) p = Math.max(p, 0.008)
|
||
if (p > 0 && w.rng.chance(p)) {
|
||
c.alive = false
|
||
c.deathYear = w.state.year
|
||
const cause = age < 2 ? '幼夭' : c.health < 30 ? '伤势不治' : '寿元将尽'
|
||
c.deathCause = cause
|
||
w.state.yearStats.deaths += 1
|
||
w.chronicle('death', `${c.name} 辞世,年 ${age}。${age < 2 ? '族人无不痛惜。' : c.health < 30 ? '临终前仍在牵挂家族。' : '族人焚香送别。'}`, c.id, true)
|
||
w.log('bad', `${c.name}(${age}岁)${cause}。`)
|
||
}
|
||
}
|
||
}
|
||
|
||
export function woundHealTick(w: World): void {
|
||
for (const c of Object.values(w.state.members)) {
|
||
if (!c.alive) continue
|
||
if (c.state === 'wounded') {
|
||
c.health = Math.min(100, c.health + 12 + c.physique)
|
||
if (c.health >= 95) {
|
||
c.state = 'idle'
|
||
w.log('info', `${c.name} 伤势痊愈。`)
|
||
}
|
||
} else if (c.health < 100) {
|
||
c.health = Math.min(100, c.health + 2 + c.physique * 0.5)
|
||
}
|
||
}
|
||
}
|