原版相关内容

存放一些在mod中发现的原版相关的有趣内容

属性计算

符号定义:

  • 我们记kk表示一项工作速度的基础值,例如智人种的普通工作速度基础值为100%
  • 我们记GG表示全局工作速度
  • 我们定义算符: (a)x(bM):=(1+a(x1))(最大取b)(a')x(bM):=(1+a(x-1))(最大取b).
    对应游戏中的 权重a,最大值b. 在表格中,我们直接简记为a(bM)
  • 我们定义算符: (c)y(dM):=(cyc)(最大取d)('c)y(dM):=(cy-c)(最大取d).
    对应游戏中的 影响c,最大值(d/c +1). 在表格中,我们直接简记为c(dM)
  • 部分社交属性的权重带有豁免线.其会降低能力值过低对属性造成的影响
    具体为:当能力值<豁免线时,则使用 能力值/豁免线 代替能力值进行计算
    对应游戏中的 权重a,最大值b,如果低于豁免线. 在表格中,我们直接简记为(豁免线)a(bM)
    例如,教化能力的听觉权重为 (80%)0.9(1M),则对于30%听觉能力的人来说,其听觉对教化能力的实际影响为(1+0.9(0.3/0.81))(1M)=0.4375(1+0.9(0.3/0.8-1))(1M)=0.4375,从而30%听觉能力对教化能力造成总共42.75%影响.

工作速度计算主要分为两类

  • 乘算类:大部分计算走的都是乘算,例如各种工作速度/工作效率的计算方式.
    其大体结构为:kG×f(技能等级)×(操作权)操作能力×(视觉权)视觉能力kG\times f(技能等级)\times (操作权重')操作能力\times(视觉权重')视觉能力
    亦即: 基础值×全局工作速度×技能等级加成×加权后的操作能力×加权后的视觉能力
    例如,建造速度的公式为 kG×(0.3+0.0875建造)×(1)操作×(0.2)视觉(1M)kG\times(0.3+0.0875建造)\times(1')操作\times(0.2')视觉(1M)
    若某种族的建造速度基础值为1.2,全局工作速度1.35,建造10级,操作能力1.5,视觉能力0.6,则其实际建造速度为
    建造速度=1.2×1.35×(0.3+0.0875×10)×(1)1.5×(0.2)0.6(1M)=1.9035×(1+1×(1.51))×(1+0.2×(0.61))(1M)=1.9035×1.5×0.92=2.62683262%\begin{aligned} 建造速度&=1.2\times 1.35\times(0.3+0.0875\times 10)\times(1')1.5\times(0.2')0.6(1M)\\ &=1.9035\times (1+1\times(1.5-1))\times (1+0.2\times(0.6-1))(1M)\\ &=1.9035\times 1.5\times 0.92\\ &=2.62683\approx 262\% \end{aligned}
  • 加算类:主要用于战斗计算.通常使用(c)y(dM)('c)y(dM)这种加算结构.几乎所有的加算最后都要再过一遍后期曲线
    例如,射击精度的公式为 k+射击等级+(8)操作(1M)+(12)视觉(12M)k+射击等级+('8)操作(1M)+('12)视觉(12M)
    若某种族的射击基础值为3,射击等级为10,操作能力1.3,视觉能力1.5,则其实际射击精度为
    射击精度=3+10+(8)1.3(0M)+(12)1.5(12M)=13+(8×1.38)(0M)+(12×1.512)(12M)=13+0+6=19\begin{aligned} 射击精度&=3+10+('8)1.3(0M)+('12)1.5(12M)\\ &=13+(8\times 1.3-8)(0M)+(12\times 1.5-12)(12M)\\ &=13+0+6=19 \end{aligned}

工作速度

属性名 技能加成 操作权重 视觉权重 额外权重
普通工作速度 1 1 0.5(1M)
建造速度 0.3+0.0875建造 1 0.2(1M)
打磨速度 0.3+0.0875建造 1 0.3(1M)
采矿速度 0.04+0.12采矿 1 0.5(1M)
深钻井操作速度 0.04+0.12采矿 1 0.5(1M)
屠宰速度 0.4+0.06烹饪 1 0.4(1M)
酿酒速度 0.4+0.06烹饪 1 0.3(1M)
种植速度 0.08+0.115种植 1 0.3(1M)
动物收集速度 0.04+0.12驯兽 1 0.5(1M)
钓鱼速度 0.75+0.025驯兽 0.5
机械族拆解速度 0.4+0.06手工 1 0.4(1M)
熔炼速度 1 1 0.3(1M)
手术速度 0.4+0.06医疗 1 0.7(1M)
治疗速度 0.4+0.06医疗 1 0.8(1.3M)
阅读速度 1+0.02智识 1(1M) 1意识
研究速度 0.08+0.115智识 0.5(1.1M) 0.5(1.1M)
驾驶能力 0.2+0.075智识 0.5 0.5 1意识
制药速度 0.3+0.0875智识 1 0.6(1M)
骇入速度 0.75+0.025智识 0.5(1.1M) 0.5(1.1M) 1意识(1.2M)
实体调查速率 0.08+0.115智识 0.5(1.1M) 0.5(1.1M)

工作效率

属性名 技能加成 操作权重 视觉权重
建造成功率 0.75+见表格 0.3 0.2(1M)
修理成功率 0.75+见表格 0.3 0.2(1M)
采矿效率 0.6+见表格 0.3(1M) 0.2(1M)
屠宰效率 0.75+0.025烹饪 0.9 0.4(1M)
植物收获效率 0.6+见表格 0.3 0.2(1M)
动物收集效率 0.6+见表格 0.3 0.2(1M)
钓鱼效率 0.3+见表格 0.3
机械族拆解效率 0.75+0.025手工 0.9 0.4(1M)
治疗质量 0.2+0.1医疗 1(1.4M) 0.7(1.4M)
手术成功率 0.1+见表格 1 0.4(1M)

社交

属性 技能加成 语言权重 听觉权重 操作权重 后处理
社交效果 0.82+0.0275×社交 (0.95)0.9(1M) (0.95)0.3(1M)
谈判能力 0.4+0.075×社交 (0.95)0.9(1M) (0.8)0.9(1M)
交易价格改善 0.015×社交 (0.95)0.9(1M) (0.8)0.9(1M)
拘捕成功率 0.6+0.075×社交 (0.95)0.9(1M)
驯服动物成功率 0.04+0.03×驯兽 (0.8)0.9(1M) (0.95)0.3(1M) (0.8)0.5(1M)
训练动物成功率 0.10+0.05×驯兽 (0.8)0.7(1M) (0.95)0.3(1M) (0.8)0.5(1M)
教化能力 0.3+0.0875×社交 (0.95)0.9(1M) (0.8)0.9(1M)
压制能力 0.05+0.0225×社交
狩猎隐蔽度 0.05×射击,0.05×驯兽

战斗相关

本部分全部使用加算而非乘算

属性 技能加成 操作影响 视觉影响 其他
近战命中率 +格斗 12(6M) 12(6M)
近战闪避率 +格斗 8(3.2M) 18移动
射击精度 +射击 8(0M) 12(12M)
迫击炮偏移 0.2-0.025射击 -0.5 -1(0M)
烹饪速度 +烹饪 16(8M) 4(2M) 乘全局工作速度G
活跃抑制速度 0.03+0.0075智识+0.0075社交 乘心灵敏感度

战斗

近战

武器近战伤害

此部分内容对应 灰机wiki官方wiki

对于一个近战武器,我们设其各类型的伤害值分别为D1,D2,...,DnD_1,D_2,...,D_n,其对应的冷却时间为C1,C2,...,CnC_1,C_2,...,C_n

  1. 每种伤害被选中的权重为 伤害的平方 ,即 Di2D^2_i, 从而每种伤害的加权值为 Di×Di2Dk2=Di3Dk2D_i\times\dfrac{D_i^2}{\sum D^2_k}=\dfrac{D^3_i}{\sum D^2_k}
  2. 进而我们不难得出每次攻击的期望伤害为 DE=Di3Di2D_E=\dfrac{\sum D^3_i}{\sum D^2_i}
    每次攻击的期望冷却时间为 CE=CiDi2Di2C_E=\dfrac{\sum C_iD^2_i}{\sum D^2_i}
  3. 最终得到期望DPS为 DPS=DECE=Di3CiDi2DPS=\dfrac{D_E}{C_E}=\dfrac{\sum D^3_i}{\sum C_iD^2_i}

好麻烦好乱不想写了,之后有兴趣再说吧

护盾腰带

护盾腰带的"xxx%/s护盾充能速率"实际等价于每秒恢复xxx点盾
护盾腰带的伤害翻3.3倍,使用11伤害的武器攻击护盾腰带,实际会扣11*3.3=36.3点盾.注意该机制仅对护盾腰带生效,对盾螳,卫螽等不适用

伤害类型

如果你英文不错,建议参考官方wiki
如果你英文不好,可以参考本文以及灰机Wiki

另外还发现了一个blog写的不错旋风Monster的blog
还有灰机君的视频
谁懂花了两天拷打ai才搞明白机制然后发现有人造过轮子了的救赎感

本部分的前置内容为身体部位

如果你英文不错,建议参考官方wiki
如果你英文不好,可以参考本文以及灰机wiki

内/外部部位:部位分为内部部位和外部部位两种
在原版智人种中,内部部位仅有:颅骨,大脑,舌,脊椎,肋骨,胸骨,心脏,肺,胃,肝,肾,锁骨,肱骨,桡骨,盆骨,股骨,胫骨

父/子部位:我不知道该怎么解释…在rimworld中,部位是树状的,我们将一个部位的上一个部位称为父部位,下一个部位称为子部位

过量保护

过量保护是一种对小人的防护机制,当单次攻击伤害大于击中部位的总血量时,有概率锁血,保留该部位的1点血量.具体概率为:

摧毁概率=(伤害量当前血量)/部位总血量最小过量范围最大过量范围最小过量范围摧毁概率=\dfrac{(伤害量-当前血量)/部位总血量-最小过量范围}{最大过量范围-最小过量范围}

例如,割伤的过量范围为0% 10%0\%~10\%,若对满血40,现剩20血的部位造成23点割伤,则

摧毁概率=(2320)/4000.10=75%摧毁概率=\dfrac{(23-20)/40-0}{0.1-0}=75\%

从而在该例子中,有75%概率直接摧毁该部位,25%概率将该部位降至1血

割伤(Cut)

割伤是最常见的近战伤害类型.造成割伤时,有概率造成伤害分裂,将伤害增强并平均到多个部位.具体如下:

  • 有30%概率不分裂伤害,直接对部位造成伤害
  • 有45%概率将伤害分裂成两份,对每个部位造成70.6%伤害,总计141%
  • 有20%概率将伤害分裂成三份,对每个部位造成54.5%伤害,总计164%
  • 有5%概率将伤害分裂成四份,对每个部位造成44.4%伤害,总计178%

以下内容是AI扒的,不一定正确仅供参考.我仅验证了伤害倍率是正确的
受伤流程如下:

  1. 选中一个外部部位作为初始受击部位,并对初始受击部位进行护甲减伤判定
  2. 根据概率决定分裂次数.30%概率不分裂,45%概率分裂一次,20%概率分裂成两次,5%概率分裂三次
  3. 在以下列表中随机选择分裂份数个部位,将其加入受击部位
    • 初始受击部位的子部位(例如足的子部位趾)
    • 初始受击部位的父部位(例如足的父部位腿)
    • 初始受击部位的父部位的子部位,不包括自己(例如足的父部位腿的子部位股骨)
  4. 对每个(初始)受击部位分别造成 2.4×伤害/(分裂份数+1.4)2.4\times 伤害/(分裂份数+1.4) 伤害,总计 2.4×伤害×分裂份数/(分裂份数+1.4)2.4\times 伤害\times 分裂份数/(分裂份数+1.4) 伤害
  5. 仅有不分裂时进行过量保护判定

割伤的期望伤害为 30%+45%×141%+20%×164%+5%×178%=1.35%30\%+45\%\times 141\%+20\%\times 164\%+5\%\times 178\%=1.35\%
割伤的过量范围为0%~10%,带入摧毁概率公式 摧毁概率=10×过量比例摧毁概率=10\times 过量比例,只需过量10%就能摧毁部位

**注意这段为猜测,尚未测试正确性!**由于护甲减伤判定是先于部位选择的,所以可以"逃护甲关税",例如,割伤击中了足,而众所周知rimworld的动力甲是不包括足部和手部的,假如此次割伤分裂到了足的父部位-腿上,那么伤害会绕过腿的护甲判定,直接对腿造成伤害,从而逃避了护甲.同样,也可能导致击中腿蔓延到足,导致足也减伤.后面所有护甲减伤先于部位选择的伤害类型都有可能由此问题.

刺伤(Stab)

刺伤分为近战刺伤和远程刺伤两种,其都有将伤害从内部部位向外部延伸的特性:

  • 造成近战刺伤时,有60%概率将40%伤害传递到内部的随机子部位,并将外部伤害衰减为原来的75%,造成总共115%伤害.
  • 造成远程刺伤时,若击中外部部位,则有60%概率将40%伤害传递到内部的随机子部位,并将外部伤害衰减为原来的75%,造成总共115%伤害
  • 造成远程刺伤时,若击中内部部位,则沿着部位链一路向上传递到第一个外部部位,内部部位造成40%伤害,外部部位造成75%伤害,造成总共75%+40%x75\%+40\%x伤害,xx为内部部位个数

以下内容是AI扒的,不一定正确仅供参考.我仅验证了远程刺伤能够造成二次穿透,近战暂时未发现二次穿透
受伤流程:

  1. 选取初始受击部位:
    • 若是近战刺伤,随机选中一个外部部位作为受击部位
    • 若是远程刺伤,随机选中一个任意部位作为受击部位
  2. 若选中的部位是外部部位,则有60%概率选取其中一个内部子部位代替选中部位作为受击部位
  3. 对受击部位进行护甲减伤判定和过量保护判定
  4. 沿着受击部位的父部位一路传递直到第一个外部部位(包括自身),对所有的内部部位造成40%伤害,对所有的外部部位造成75%伤害

例如,某部位树为:A(外部)-B(内部)-C(外部)-D(内部)-E(内部),无护甲,伤害100

  • 若为近战刺伤,则初始选中只能选中A/C(近战仅能选中外部部位),同时有60%概率传递到B/D(内部子部位),若传递,则A/C受到75伤害,B/D受到40伤害,总伤害115
  • 若为远程刺伤,则ABCDE都可作为初始选中(任意部位)
    1. 若选中A/C,则其同上面的近战,至多只能造成115伤害
    2. 当选中B/D时,由于B/D是内部部位,无法二次选中内部子部位,直接开始一路传递,造成115伤害
    3. 当选中E时,由于E是内部部位,同样开始一路传递直到第一个外部部位C,即C受到75伤害,D,E受到40伤害,总伤害155
  • 注:在此例中,向上传递到C时已经是外部部位了,所以AB不会因BCD的传递而受伤

近战刺伤仅能传递一次,期望伤害为 40%+60%×115%=109%40\%+60\%\times 115\%=109\%
远程刺伤理论传递无上限,但鉴于受击概率影响,期望伤害也并不会提高很多.
刺伤过量保护范围为40%~100%,带入摧毁概率公式 摧毁概率=(过量比例0.4)/0.6摧毁概率=(过量比例-0.4)/0.6 ,得溢出100%才能摧毁,非常难摧毁部件

另外值得一提的是原版远程刺伤只有重标枪(25伤10穿),脊刺(30伤100穿)和骨刺射击(单爪兽7伤100穿).原版可造成两次传递的内部部位树有且仅有 头(外部)-颅骨-大脑

钝伤(Blunt)

钝伤除了众所周知的会把伤害延伸到父部位以外,还有40%概率吸走外部的10%~20%伤害,并对随机子部位造成10%~20%+20%~35%伤害

以下内容是AI扒的,不一定正确仅供参考.我仅验证了内部打击的正确性.
受击流程:

  1. 选中一个外部部位作为初始受击部位,并对初始受击部位进行护甲减伤判定
  2. 有40%概率触发内部打击,从伤害中抽取10%~20%,将外部实际受伤变为原始伤害的80%~90%
  3. 对受击部位造成伤害,若伤害溢出,则直接摧毁部位,并将溢出的伤害传递到其父部位,如此循环直至无溢出或无父部位
  4. 若触发内部打击,则对受击部位的随机子部位造成10%~20%(在2中被抽走的伤害)+20%~35%的伤害
  5. 若击中躯干及其非头部分支,有较低概率造成2s眩晕,若击中头及其分支,有较高概率造成2s眩晕

打躯干的眩晕概率表:

伤害占躯干耐久比例 眩晕概率
40%以下 0%
50% ~3%
90% ~15%

打头部分支的眩晕概率表:

伤害占躯干耐久比例 眩晕概率
4% 20%
10% ~38%
25% ~57%
50% 100%

钝伤的期望伤害为 100%+40%×(20%+35%)/2=111%100\%+40\%\times (20\%+35\%)/2=111\%
钝伤没有过量保护,伤害溢出必定破坏部位.
若选中了没有子部位的外部部位,同时触发了内部打击时,被抽走的10%~20%伤害将直接消失.

子弹伤(Bullet)

子弹伤是最常见的伤害类型了,当其命中内部子器官时候,会对父器官也造成同等伤害

受击流程如下:

  1. 选中任意部位作为初始受击部位,并计算护甲减伤
  2. 若受击部位是内部部位,则一路向上传递伤害直到第一个外部部位,对所有部位都造成100%伤害
  3. 对每个部位都进行过量保护判定

例如:若某器官链为A(外部)-B(内部)-C(内部),10伤的子弹伤打到了C,则会对ABC都造成10伤害.

子弹伤的过量范围为0%~70%,同样非常难摧毁部件

炸伤(Bomb)

炸伤是爆炸武器的伤害类型,造成伤害时同样有概率分裂,最高造成双倍伤害

受击流程:

  1. 随机选择1~4个部位作为受击部位
  2. 将伤害均分到受击部位,并分别计算护甲减伤
  3. 若受击部位是内部部位,则一路向上传递伤害直到第一个外部部位,对所有部位都造成100%伤害

炸伤没有过量保护,原版的炸伤通常为固定10%穿甲

抓伤(Scratch)

动物的伤害类型,与割伤类似,固定选双目标,分别67%伤害,总共134%伤害

以下内容是AI扒的,不一定正确仅供参考.全部未经验证
受伤流程如下:

  1. 选中一个外部部位作为初始受击部位,并对初始受击部位进行护甲减伤判定
  2. 在以下列表中随机选择1个外部部位,将其加入受击部位
    • 初始受击部位的子部位(例如足的子部位趾)
    • 初始受击部位的父部位(例如足的父部位腿)
    • 初始受击部位的父部位的子部位(例如足的父部位腿的子部位股骨)
  3. 对这两个受击部位分别67%伤害,总共134%伤害.若不存在第二个受击部位,则仅对初始受击部位造成100%伤害
  4. 对每个部位都进行过量保护判定

杂类伤害

注意,本部分全是ai扒的,未进行任何验证

眩晕(Stun):每点stun伤害实际造成0.5s眩晕,不受体型影响

咬伤(Bite):动物撕咬伤害,与子弹伤相同,但仅命中外部部位(所以实际也无法造成额外伤害)

箭伤(Arrow/ArrowHighVelocity):完全同子弹伤

压伤(Crush):环境伤害(屋顶坍塌等),完全同子弹伤

捅(Poke):类似刺伤,但内部选中概率降为40%,伤害类型替换为钝伤(没有钝伤的特性)

烧伤(Flame/Burn):

  1. 随机选中任意部位,进行护甲减伤(热能护甲类别)
  2. 若伤害 ≥ 15,则分裂到多个部位(同炸伤逻辑)
  3. 若未被护甲减伤,有概率使目标着火

冻伤(Frostbite):无视护甲减伤的纯上海,且仅从固定列表的权重随机选取部位受伤.

原版人类可受冻伤的部位及权重:

部位 冻伤权重
10
手指 8
5
5
颌骨 2
0.5
0.5

气化(Vaporize):业火炮的伤害,同炸伤

酸蚀(AcidBurn):同烧伤,但不会点燃目标

衣物护甲

护甲计算方式

衣物护甲的计算方式为:

(基础值+材料防护能力×材料效果乘数)×品质偏移(基础值+材料防护能力\times 材料效果乘数)\times 品质偏移

  • 材料防护能力:材料的防御数值,即游戏中材料的"护甲-利器",以及服装显示的 材料(骇人皮革):127%
  • 材料效果乘数:服装自带的属性,即游戏中服装的 材料效果乘数 30%

材料整体分为金属/皮革/纤维三类.

  • 金属防护能力较低,但金属制品一般本身材料效果乘数高.通常在90%左右
  • 皮革或纤维自身防护能力高,但皮革纤维制品一般本身材料效果乘数低,通常在30%左右

例如:

  • 原版玻璃钢板甲的利防为 114%×90%=102114\%\times 90\%=102%.若为传奇品质,则为102%×1.8=183.6%102\%\times 1.8=183.6\%
  • 原版敲击兽大衣的利防为 208%×30%=62.4%208\%\times 30\%=62.4\%.若为传奇品质,则为62.4%×1.8=112.32%62.4\%\times 1.8=112.32\%

减伤计算

此部分可参考海星地联的视频

对于单层护甲,我们设护甲值为AA,武器穿甲值为PP,我们称ΔA:=AP\Delta A:=A-P有效护甲值.此时取一个[0,100][0,100]的随机数kk与其进行比较

  • k<ΔA/2k<\Delta A/2,则伤害无效
  • ΔA/2k<ΔA\Delta A/2\leq k<\Delta A,则伤害减半,并传递到下一层
  • ΔAk\Delta A\leq k,则无视该护甲

则当ΔA<100\Delta A<100

  • ΔA/2\Delta A/2概率使得伤害无效
  • ΔAΔA/2=ΔA/2\Delta A-\Delta A/2=\Delta A/2的概率受到减半伤害
  • 1ΔA/2ΔA/2=1ΔA1-\Delta A/2-\Delta A/2=1-\Delta A概率受到全额伤害

从而其期望伤害为 ΔA2×12+(1ΔA)=13ΔA4\dfrac{\Delta A}{2}\times\dfrac{1}{2}+(1-\Delta A)=1-\dfrac{3\Delta A}{4}

100ΔA<200100\leq\Delta A<200

  • ΔA/2\Delta A/2概率使得伤害无效
  • 不可能受到全额伤害,此时100ΔA100\leq\Delta A恒成立
  • 1ΔA/21-\Delta A/2概率受到减半伤害

从而此时数学期望为 12×(1ΔA2)=12ΔA4\dfrac{1}{2}\times\left(1-\dfrac{\Delta A}{2}\right)=\dfrac{1}{2}-\dfrac{\Delta A}{4}

从而整体公式为

{1,ΔA<013ΔA4,0ΔA<10012ΔA4,100ΔA<2000,ΔA200\begin{cases} 1,&\Delta A<0\\ 1-\dfrac{3\Delta A}{4},&0\leq\Delta A<100\\ \dfrac{1}{2}-\dfrac{\Delta A}{4},&100\leq\Delta A<200\\ 0,&\Delta A\leq200 \end{cases}

若使用xx代替100ΔA100\Delta A,使用小数代替繁琐的分数,并去除1和0这两个极端值,则化为我们熟悉的公式:

{10.75x,x<10.50.25x,1ΔA<2\begin{cases} 1-0.75x,&x<1\\ 0.5-0.25x,&1\leq\Delta A<2\\ \end{cases}

对于多层护甲,则是单层护甲的简单嵌套.由于乘法是有交换律的,实际先计算哪个没区别(实际会因为扣除耐久而有区别)

护甲曲线生成器

原版护甲分析

  • 极佳防弹头盔+极佳防弹背心+极佳防弹夹克+极佳防弹裤(81.9;130;71.5;71.5) 在20%穿甲下护甲承伤为43.1%

    点击看穿甲-承伤曲线

    ArmorPenetration(%)DamageMultiplier0204060800.000.250.500.751.0020%,0:431

  • 极佳钢铁简易头盔+极佳钢铁板甲(58.5;105.3) 在20%穿甲下护甲承伤为42.3%

    点击看穿甲-承伤曲线

    ArmorPenetration(%)DamageMultiplier0204060800.000.250.500.751.0020%,0:423

  • 传奇骑士头盔+传奇敲击兽皮防尘大衣+传奇防弹背心+传奇敲击兽皮T恤衫+传奇级防弹裤(200;112.3;180;74.9;99) 在20%穿甲下护甲承伤为15.2%

    点击看穿甲-承伤曲线

    ArmorPenetration(%)DamageMultiplier0204060800.000.250.500.751.0020%,0:152

  • 传奇骑士头盔+传奇骑士装甲+传奇敲击兽皮T恤衫(200;200;74.9) 在20%穿甲下护甲承伤为9.2%

    点击看穿甲-承伤曲线

    ArmorPenetration(%)DamageMultiplier0204060800.000.250.500.751.0020%,0:092

可以看到,在20%穿甲下,骑士套的护甲承伤系数为9.2%,大约相当于血量翻10.9倍.敲击兽皮防尘大衣的护甲承伤系数为15.2%,大约相当于血量翻6.6倍.

事件

此部分未经验证

罕见的敲击兽:0.7权重,最小间隔13天,数量2~6只

人口对事件概率影响

注意此部分全部为AI扒源码生成,本人未作任何验证,点开查看

一、基本概念

populationEffectIncidentDef 中的一个属性,用于影响事件触发概率。它有以下枚举值:

枚举值 XML写法 偏移量 含义
None (不填写或None) - 无人口效果,事件概率不受人口意图影响
IncreaseMedium IncreaseMedium 0 中等增长 - 事件概率因子直接等于PopulationIntent
IncreaseEasy IncreaseEasy -0.4 简单增长 - 事件概率因子 = PopulationIntent - 0.4
IncreaseHard IncreaseHard +0.4 困难增长 - 事件概率因子 = PopulationIntent + 0.4

二、核心计算公式

事件触发概率因子(Population Intent Factor):

1
事件触发概率因子 = max(PopulationIntent + 偏移量, minIncChancePopulationIntentFactor)

参数说明:

  • minIncChancePopulationIntentFactor 默认值为 0.05 (定义在 StorytellerCompProperties 中)
  • PopulationIntent 是游戏动态计算的"人口意图"值

三、PopulationIntent 的计算

PopulationIntent 表示游戏 storyteller 想要增加人口的意图强度,取值范围通常为 -1.0 ~ 8.0

计算公式:

1
2
PopulationIntent = populationIntentFactorFromPopCurve(当前调整后人口) 
× populationIntentFactorFromPopAdaptDaysCurve(适应天数)

3.1 人口因子曲线 (populationIntentFactorFromPopCurve)

原版 BaseStoryteller 的曲线定义:

1
2
3
4
5
6
7
8
9
10
<populationIntentFactorFromPopCurve>
<points>
<li>0, 8.0</li>
<li>1, 2.0</li>
<li>4, 1.0</li>
<li>7, 0.35</li>
<li>11, 0.0</li>
<li>20,-1.0</li>
</points>
</populationIntentFactorFromPopCurve>
调整后人口 人口意图因子
0 8.0
1 2.0
4 1.0
7 0.35
11 0.0
20 -1.0

解读:

  • 人口越,游戏越给你加人口(因子高)
  • 人口越(超过11人),游戏会不想给你加人口(因子为0甚至负数)
  • 这是游戏的负反馈机制,让殖民地人口趋于稳定

3.2 适应天数因子曲线 (populationIntentFactorFromPopAdaptDaysCurve)

1
2
3
4
5
6
<populationIntentFactorFromPopAdaptDaysCurve>
<points>
<li>( 0, 0)</li>
<li>( 8, 1)</li>
</points>
</populationIntentFactorFromPopAdaptDaysCurve>
适应天数 因子
0 0
8 1

解读:

  • 适应天数越高(你越适应了当前人口),游戏越想给你加人口
  • 适应天数 < 8天时,因子在 0~1 之间线性插值
  • 适应天数 ≥ 8天时,因子固定为 1

四、调整后人口 (AdjustedPopulation) 的计算

4.1 基本公式

1
调整后人口 = Σ 各殖民者/囚犯/奴隶的贡献值 + 任务借出人数

4.2 各类型单位的贡献值

类型 贡献值计算
成年殖民者 1.0
未成年殖民者 0.3~1.0 (按生物学年龄/成年年龄比例线性插值)
婴儿 0
可招募囚犯(成年) 0.5
不可招募囚犯(成年) 0.25
奴隶(成年) 0.75

4.3 源码参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// StorytellerUtilityPopulation.cs
private static float AdjustedPopulationValue(Pawn pawn)
{
if (pawn.DevelopmentalStage.Baby())
{
return 0f; // 婴儿贡献为0
}

// 未成年按年龄比例: 0.3 ~ 1.0
float num = (pawn.DevelopmentalStage.Adult() ? 1f : Mathf.Lerp(0.3f, 1f,
(float)pawn.ageTracker.AgeBiologicalYears / pawn.ageTracker.AdultMinAge));

if (pawn.IsPrisonerOfColony)
{
// 可招募囚犯: 0.5倍, 不可招募: 0.25倍
num = ((!pawn.guest.Recruitable) ? (num * 0.25f) : (num * 0.5f));
}
else if (pawn.IsSlaveOfColony)
{
num *= 0.75f; // 奴隶: 0.75倍
}
return num;
}

五、适应天数 (AdaptDays) 的机制

适应天数是一个动态值,表示殖民地对当前人口的"适应程度":

  • 增长: 随时间自然增长(每6小时增长约0.005天)
  • 减少: 当殖民者死亡或被击倒时减少
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- 死亡时减少的适应天数 -->
<adaptDaysLossFromColonistLostByPostPopulation>
<points>
<li>( 0, 30)</li> <!-- 人口≤11时减少30天 -->
<li>(11, 30)</li>
<li>(20, 20)</li> <!-- 人口20时减少20天 -->
</points>
</adaptDaysLossFromColonistLostByPostPopulation>

<!-- 被击倒时减少的适应天数 -->
<adaptDaysLossFromColonistViolentlyDownedByPopulation>
<points>
<li>(1, 8)</li>
<li>(2, 6)</li>
<li>(3, 6)</li>
<li>(11, 5)</li>
<li>(20, 3.5)</li>
</points>
</adaptDaysLossFromColonistViolentlyDownedByPopulation>

六、完整计算实例

场景假设:

  • 4个成年殖民者
  • 1个可招募成年囚犯
  • 1个未成年殖民者(生物学年龄10岁,成年年龄18岁)
  • 游戏已进行较久(适应天数 > 8)
  • 事件: HAR_LL_Id_a 年幼的决战种, populationEffect = IncreaseMedium

计算步骤:

Step 1: 计算调整后人口

1
2
3
4
5
成年殖民者: 4 × 1.0 = 4.0
可招募囚犯: 1 × 0.5 = 0.5
未成年殖民者: 1 × Lerp(0.3, 1.0, 10/18) = 1 × 0.7 ≈ 0.7

调整后人口 = 4.0 + 0.5 + 0.7 = 5.2

Step 2: 查人口因子曲线

1
2
人口 = 5.2 时,在曲线 (4, 1.0) 和 (7, 0.35) 之间插值
人口因子 ≈ 1.0 - (5.2-4)/(7-4) × (1.0-0.35) = 1.0 - 0.26 = 0.74

Step 3: 计算PopulationIntent

1
2
适应天数 > 8, 适应天数因子 = 1.0
PopulationIntent = 0.74 × 1.0 = 0.74

Step 4: 计算事件概率因子

1
2
IncreaseMedium 偏移量 = 0
事件概率因子 = max(0.74 + 0, 0.05) = 0.74

Step 5: 计算最终触发概率

1
2
最终概率 = baseChance × 当前人口因子 × 事件概率因子 × 其他修正
= 200 × ... × 0.74 × ...

七、各populationEffect的实际意义

IncreaseMedium (中等增长)

  • 偏移量 = 0
  • 事件概率直接跟随PopulationIntent波动
  • 人口少 → 高概率触发
  • 人口多 → 低概率触发
  • 最常用的设置,实现负反馈平衡

IncreaseEasy (简单增长)

  • 偏移量 = -0.4
  • 即使PopulationIntent较低,也能有不错的触发概率
  • 适合希望更频繁触发的人口增长事件

IncreaseHard (困难增长)

  • 偏移量 = +0.4
  • 需要更高的PopulationIntent才能触发
  • 适合不想频繁触发的人口增长事件

None

  • 不受人口意图影响
  • 触发概率仅取决于baseChance和其他因素
  • 适合与人口无关的事件

八、源码位置参考

文件 说明
Source/RimWorld/IncidentDef.cs 定义 populationEffect 字段
Source/RimWorld/IncidentPopulationEffect.cs 枚举定义
Source/RimWorld/StorytellerComp.cs 核心计算逻辑 IncidentChanceFactor_PopulationIntent
Source/RimWorld/StorytellerUtilityPopulation.cs PopulationIntent 计算
Source/RimWorld/StorytellerDef.cs 曲线定义
Defs/Core/Storyteller/Storytellers.xml 原版曲线参数

九、总结

populationEffect 是 RimWorld 讲述者系统的一部分,用于动态调整人口增长类事件的触发概率:

  1. 目的: 实现负反馈机制,让殖民地人口趋于稳定
  2. 机制: 根据当前人口和适应天数动态调整触发概率
  3. 应用: 人口少时多送人,人口多时少送人

对于 IncreaseMedium:

  • 这是最"中立"的设置
  • 事件触发概率完全取决于当前游戏状态
  • 当人口 ≤ 4 时,触发概率较高
  • 当人口 ≥ 11 时,触发概率接近或等于最低值 0.05
评论