同样是 60 点生命,可能是两段完全不同的人生

玛拉和伊莱现在都有 60 点生命。

如果只看人物资料,两人的状态似乎没有差别。

他们都还能行动。

都没有死亡。

也都失去了最大生命的一部分。

但玛拉的 60 点生命,是在一次战斗中受到 40 点伤害后留下的结果。

她的变化很简单:

100
→ 受到 40 点伤害
→ 60

伊莱的 60 点生命,则来自另一段历史。

他在遗迹里遭到重创,生命从 100 降到 10。同行者使用仅剩的药物替他恢复 30,回到营地后又接受治疗,恢复 20。

他的变化是:

100
→ 受到 90 点伤害
→ 10
→ 恢复 30
→ 40
→ 恢复 20
→ 60

最后的数值相同。

世界留下的东西却完全不同。

玛拉受过一次伤。

伊莱曾经濒临死亡。

有人为了救他消耗药物。

有人在最危险的地方选择留下。

那次重伤可能让他错过后面的行动,也可能改变他与救命者之间的关系。

如果治疗发生在不同时间,途中一些需要他保持足够生命的事件也可能得到不同结果。

人物卡上的 60 只能回答他们现在还剩下多少生命。

它不能回答这个数字如何形成。

也不能回答在抵达 60 以前,他们曾经穿过哪些状态。

数值告诉我们结果。

因果才让结果拥有历史。


属性不是人物资料,而是沿事件变化的状态

角色属性很容易被当成人物资料的一部分。

生命值是多少。

魔力有多少。

压力累积到哪里。

声望是正数还是负数。

这些栏位通常会显示一个最新答案。

玩家受到伤害,就把生命值改小。

休息或接受治疗,再把生命值改大。

时间久了,人物卡仍然可以显示正确数值。

但先前的变化已经被覆盖。

世界只知道伊莱现在有 60 点生命。

不知道他曾经降到 10。

不知道是哪两次治疗把他带回来。

也不知道某个发生在两次治疗之间的事件,应该面对 10、40,还是最后的 60。

世界模拟不能只保存属性的最新数字。

它需要保存:

角色的起始值是什么。

哪一个事件增加了数值。

哪一个事件扣除了数值。

每次变化发生在什么位置。

变化完成后,数值是否仍在允许范围内。

是否曾经碰到会改变角色生命周期的边界。

在 InkWeave 里,属性可以有预设值。

之后的伤害、治疗、消耗、恢复与累积,则分别成为正文时间流里的属性事件。

因果律引擎从起始值开始,按照事件顺序进行增加与扣除。

因此,游标停在伊莱受伤以前,他仍然有 100 点生命。

停在重伤之后、第一次治疗以前,他只有 10。

越过第一次治疗后,数值变成 40。

只有抵达第二次治疗以后,世界才会显示最后的 60。

属性不是贴在人物旁边的一个答案。

它是角色一路经历过的数值变化。


有些数值需要边界,有些数值可以持续累积

不是所有属性都应该使用相同规则。

生命值通常有明确范围。

它可能从 0 到 100。

角色接受治疗时,数值不应该无限制超过最大生命。

受到伤害时,也不能让世界在没有处理后果的情况下,继续把生命扣到无限小。

魔力、体力、理智、压力或其他有限资源,也可能需要最低值与最高值。

InkWeave 可以把这类属性设定成有界整数。

创作者可以定义预设值、最低值与最高值,让因果律引擎在重播事件时检查数值是否越过边界。

但另一些数值不一定需要固定范围。

声望可能从负数一路增加。

债务可能持续累积。

功勋、任务次数、累积失败与污染纪录,也可能没有一个适合所有世界的上限。

这些属性可以使用自由累积整数。

自由累积不是「比较不重要的数值」。

它只代表世界不应该替创作者擅自设定边界。

一个角色可以拥有负数声望。

也可以背负远超过原本预期的债务。

世界只需要忠实地累积每一次增加与扣除。

有界属性回答的是:

这个角色目前位于允许范围的哪个位置?

自由累积属性回答的则是:

到目前为止,角色一共累积了多少?

两者都是数值。

但它们描述的是不同的世界规则。


数值碰到边界时,不能永远只是数学问题

假设生命值的最低值是 0。

伊莱目前只剩 10 点生命,下一次攻击造成 15 点伤害。

从普通算术来看,结果是 -5。

但对故事世界来说,问题不能停在负数。

角色是否死亡?

是否失去行动能力?

是否进入昏迷?

是否有某种规则能在致命伤害发生时保住他?

他身上的物品怎么办?

原本需要他参与的后续事件是否仍然成立?

数值抵达某些边界时,会开始碰到其他世界状态。

因此,InkWeave 允许创作者把有界属性标记为致命属性。

当一次扣除会让致命属性触及或低于最低值时,系统不会把它当成普通的数值变化安静带过。

在建立事件的过程中,InkWeave 会辨认这次变化已经碰到生命周期,让创作者进一步处理死亡。

因果律验证也会辨认致命属性已经抵达下限,避免角色带着一个理应造成死亡的数值,却继续像普通状态一样参与后面的世界。

当然,不是所有归零都代表死亡。

魔力归零可能只代表无法施法。

体力归零可能代表需要休息。

某种护盾归零,可能只是保护失效。

是否具有致命意义,由创作者在属性定义中决定。

InkWeave 不替所有世界规定相同的死亡法则。

它只让创作者明确说出:在这个世界里,哪一项数值抵达边界时,不能再被当成普通算术。


角色与属性靠近时,世界会先查询当下数值

作者在正文里写到角色与属性,不代表属性一定要立刻改变。

「玛拉感觉到伤口再次裂开。」

这可能代表生命值下降。

也可能只是疼痛描述。

「伊莱恢复了精神。」

可能代表压力降低。

也可能只是情绪与叙事节奏。

「他的魔力已经所剩无几。」

可能要建立魔力消耗。

也可能是在描述先前事件已经造成的结果。

InkWeave 不会因为角色名和属性名出现在附近,就擅自增加或扣除数值。

当角色与适用于目前身分的属性在正文中形成交互时,AVG 可以先向因果律引擎查询:

角色在这一刻的属性值是多少?

这项属性的最低值与最高值是什么?

它是不是致命属性?

角色目前的身分是否适用这项属性?

世界先把当下状态带回写作现场。

接着才由作者决定,这里是否真的要建立增加或扣除事件,以及数值应该改变多少。

如果作者只是描述伤口,世界不需要改变。

如果作者确认伤势确实恶化,这次扣除才会进入正文时间流。

如果变化会碰到致命边界,系统也能在事件建立时提醒作者:这已经不只是少掉几点生命。

这种互动不是替作者计算剧情应该有多痛。

它是在作者决定改变世界以前,先让他看见自己正在改变哪一个数值,以及那个数值此刻真正位于哪里。


Inspector 显示结果,历史查询保存来路

当游标停在伊莱第二次治疗之后,Inspector 可以显示他的生命值是 60。

如果只需要继续写下一场行动,这个答案可能已经足够。

但当作者发现数值不符合预期时,还需要回答另一个问题:

为什么是 60?

InkWeave 的属性历史可以列出每一次相关变化。

初始生命 100。

遗迹重伤,扣除 90。

同行者使用药物,恢复 30。

回到营地接受治疗,恢复 20。

作者可以查看单一属性的历史,也可以查看角色全部属性的变化。

这让生命、魔力、压力、声望与其他状态不必分散在不同章节与人物笔记里。

历史查询不是只为了回忆剧情。

它还能帮助作者判断目前数值是否真的具有来源。

如果伊莱现在有 60 点生命,历史里却只存在一次 90 点伤害与一次 30 点治疗,那么世界真正能推导出的答案应该是 40。

人物卡上手动填写的 60,不能取代缺少的治疗事件。

因为角色的当前状态,应该由世界真正经历过的变化形成。

Inspector 告诉作者此刻还剩下多少。

历史查询则让作者看见,每一点是在哪里失去,又在哪里回来。


修改早期数值,后面的状态也必须重新计算

假设作者回到遗迹场景,认为原本的 90 点伤害太重。

他把伤害改成 70。

伊莱的数值历史便会变成:

100
→ 受到 70 点伤害
→ 30
→ 恢复 30
→ 60
→ 恢复 20
→ 80

最后结果不再是 60。

而是 80。

作者不应该只修改前面的伤害,却让后面的 Inspector 继续保留旧答案。

同样地,如果第一次治疗事件被删除,第二次治疗之后的数值也必须重新计算。

如果某次恢复超过上限,因果律引擎需要按照属性定义处理边界。

如果修改后的伤害让生命触及致命下限,后面的移动、物品交易与其他事件也可能开始失去成立条件。

这就是数值进入因果律以后产生的差别。

早期事件不是一段已经失去作用的旧文字。

它仍然是后面数值的来源。

改变来源,后面的答案就不能保持不动。

InkWeave 不会替作者决定伤害究竟应该是 70 还是 90。

也不会要求故事必须保留原本结果。

作者可以修改任何事件。

但世界会忠实地重新计算这次修改带来的变化。

创作仍然自由。

数学不会为了维持旧稿而假装没有看见新的数字。


这不是 AI 判断角色看起来有多疲惫

当正文写着「玛拉已经快要站不住了」,不同读者可能对她的状态有不同理解。

有人认为她只是疲倦。

有人认为她已经接近昏迷。

也有人认为这只是一种夸张描述。

InkWeave 不会把这句话交给 AI,要求它决定应该扣除多少体力。

它也不会因为角色说了一句「我没事」,就自行恢复生命值。

数值规则先由创作者定义。

哪些属性存在。

预设值是多少。

是否具有上下限。

是否可以自由累积。

是否在最低值触发死亡。

每一次实际增加或扣除,也由创作者确认。

InkWeave 自研的因果律引擎负责的是另一件事:

按照已确认的属性事件与正文顺序,重播数值变化。

100 - 90 + 30 + 20 会得到 60。

只要初始值、事件、顺序与规则相同,结果就不会因为系统对文字产生不同理解而改变。

这种数学保证只涵盖已经被建模的内容。

如果创作者没有建立疲劳属性,InkWeave 不会凭空知道角色累积了多少疲劳。

如果正文只描写治疗,却没有确认恢复事件,数值也不会自行增加。

系统不假装理解所有叙事。

它只保证已建立的数字,不会在事件之间失去自己的算术。


现实世界不一定使用 HP,但同样需要数值历史

真实人生通常不会把一个人的状态写成 HP 或 MP。

但现实流程里仍然存在许多需要沿事件累积的数值。

训练时数。

任务次数。

累积工时。

设备使用次数。

专案贡献。

功勋。

债务。

需要明确定义的负荷或进度。

这些数值有些具有上下限。

有些可以自由累积。

有些在抵达特定范围后,会让其他条件成立或失效。

InkWeave 不是医疗、薪资或职业安全系统。

它不替专业领域判断哪些数值具有法律、健康或管理意义。

但如果创作者需要模拟一段明确的流程,可以自行定义这些属性与变化事件,让世界在不同时间点呈现正确结果。

架空世界则能使用同一套骨架,建立现实里不存在的数值。

魔力。

神性。

污染。

诅咒深度。

信仰。

精神侵蚀。

世界不需要证明魔力在现实里存在。

它需要证明,在这套架空规则中,角色使用过的魔力不会自行回来,尚未解除的污染不会突然消失,已经抵达致命边界的生命也不会在下一章毫无理由地恢复正常。

现实流程让我们看见数值追踪需要多精确。

架空世界则让这种精确支撑读者愿意相信的规则。


角色承担的,不只是最后一个数字

玛拉有 60 点生命。

伊莱也有 60 点生命。

如果世界只保存最新资料,他们看起来没有差别。

但故事真正的重量,往往藏在抵达数值以前的路上。

谁受过更严重的伤?

谁曾经靠近死亡?

谁消耗了资源?

谁接受过帮助?

哪一次恢复发生得太晚?

哪一个后续事件,其实发生在角色最虚弱的时候?

这些答案不一定全部写在属性栏位里。

有些会成为关系。

有些会改变物品。

有些会影响位置、死亡与后续条件。

但属性历史至少能让世界知道:角色不是直接出现在最后那个数字上。

他是被一次次事件推到这里。

InkWeave 不替创作者决定角色应该承受多少伤害。

也不替故事选择何时治疗、何时消耗、何时跨过致命边界。

它让每一次已经被作者确认的变化,沿着正文继续算数。

因为数值只告诉我们角色现在还剩下多少。

因果才告诉我们,他为了走到这里,曾经失去过什么。