rimworld吧 关注:303,472贴子:5,505,659

回复:攻击、命中、伤害机制的知识整合与代码解读

取消只看楼主收藏回复

(7)独特类型、毒素积累、气体
1.击昏
每点击昏伤害会造成0.5秒的击昏效果
每点EMP伤害会对机械体造成0.5秒的击昏效果,但多次EMP攻击的伤害无法叠加
关于EMP伤害的细节可以看第⑦号链接。
击昏伤害与EMP伤害不受各种减伤易伤效果的影响。
2.熄灭
每点熄灭伤害降低一火焰大小,降低后火焰大小<10则火焰消失。
受到熄灭伤害的单位都会获得阻燃泡沫状态,持续15秒。
3.气体
I.一般制造致盲烟雾会使周围4.9格内充满烟
致盲烟雾效果见前文远程命中
II.(生物技术DLC)所有产生毒气的爆炸都会在半径内充满毒气,如引爆毒气弹为4格半径,毒气手榴弹、毒气弹发射器为1.9格、毒气弹陷阱为8.9格。(每格充满需要255点毒气)
有毒垃圾被外来伤害时,将产生(6*堆叠数量*实际伤害量)点毒气。
发射毒气迫击炮会在落点留下弹壳,10秒内每半秒释放255点毒气,留下的弹壳500秒后消失。
毒气背包激活后12.75秒内每半秒释放450点毒气。
III.尸体腐烂后每4.16秒释放(52*体型*人尸)点腐烂气体,是人类尸体时人尸=115%,否时100%。
IV.每格致盲烟雾平均每秒消散1.47%点,毒气1.1%点,腐烂气体1.47%。无论室内室外是否有屋顶都无法改变消散速度。
V.致盲烟雾不会扩散,每格毒气和腐烂气体平均每秒判定1.875次,浓度<6.67%的气体不会扩散。判定时,随机顺序向上下左右四个邻格都扩散一次,如果气体不能通过则扩散失败,浓度相差13.3%及以上的两格的浓度平均化。
VI.暴露在浓度≤19%的毒气中时获得较轻症状。20%≤浓度≤49%中等,50%≤浓度≤100%严重。拥有完全抗毒肺、毒素免疫基因或佩戴毒污面具时无视这些效果。

VII.毒气无法被屋顶保护,生物每暴露在毒气中0.83秒都会增加(2.3%*浓度*(1-有毒环境抗性)*(1-毒素抗性)*(随机85%~115%))点中毒,中毒(极重)阶段时中毒速度降为0.25倍。

VIII.生物暴露在腐烂气体中时,每秒都会增加(5%*浓度*(1-有毒环境抗性))点尸瘟暴露,未在腐烂气体中时每天减少15%,尸瘟暴露≥50%后还暴露在腐烂气体时有概率得肺瘟,拥有排毒肺或完美免疫基因可无视这些效果。

5.中毒
每点毒咬、毒击伤害造成1.5%中毒,每点渗毒枪伤造成0.65%中毒。
实际中毒量还要再除以体型,乘以毒素抗性
这三种中毒伤害在动物觅食时不会使猎物中毒。

具体影响可见wiki(第⑧号链接)
6.活着的生物每4.16秒产生(1.25*体型*人因)点热量,是人类时人因=100%,否则=60%
(DamageWorker_Extinguish、AddGas、GasGrid.Tick、CompReleaseGas.CompTick、HediffComp_SeverityFromGas.CompPostTick、RotStinkToSpawnForCorpse)


IP属地:天津16楼2023-01-15 15:24
收起回复
    就这些了,还是边写边添了不少不相关的内容


    IP属地:天津17楼2023-01-15 15:27
    收起回复
      2026-08-16 05:26:13
      广告
      不感兴趣
      开通SVIP免广告
      视线总结出来的规律与代码实际实现其实不太一样,虽然规律也是能用的
      代码:
      1.数终点与起点横竖轴上分别差几个格子,像图中两个终点都是差1个横格,3个竖格

      2.计算K=(横差-竖差)*2,像这俩就是负四
      3.从起点开始检测,向着终点走一格,当K>0时横着走,K<0时在竖轴上走。K=0时,如果终点在起点的东面或正北方向,就直接往东走一格,如果终点在起点的西面或正南方向,就往北或南走一格。
      像一开始K=-4,所以向北或南走,终点在北面,就往北走。

      4.如果是横着走了,K就减(竖差*4)。竖着走了,K就加(横差*4)。
      像上图中向北走了,K就加4,K=0。
      5.检测走到的格子上是否有填充率100%的建筑,如果有,就是视线被阻挡。没有就可以回到第3步骤,直到走到终点。
      开始走第二次时,K已经等于0,这时就出现了视野不对称的分歧,像东边的终点在起点的东面,于是向东走,K减12。最后路途如下:

      而左终点,在起点的西面,于是向北走,K加4,这格有墙,所以视线被挡。路途如下:


      IP属地:天津26楼2023-01-17 11:16
      收起回复
        补个死亡和倒地的条件吧
        倒地的条件是疼痛达到阈值,或移动能力≤15%

        死亡的条件跟灰机wiki记录得差不多

        有几点需要补充的:
        对于机械族,关键身体机能是数据处理、液体过滤、动力供给

        当单位的所有部位累积了(血量乘数*150)点伤害时就会死亡,注意这个血量乘数不是体型,比如对于人类来说是1,对于战争女皇来说是5.2
        另外缺失的部位只算一伤害
        也就是说其实角色还是有一条总血条的,这个血条跟游戏里如下显示的一致。只不过打人类肯定是做不到只把这个血条打光,也就打机械族时太倒霉了才有可能做到

        像战争女皇打满150*5.2=780点伤害就能杀掉,如下情况已经累积了769伤害,完全没有伤害到身体机能和核心部位

        再补两拳就直接死亡了

        当单位因外来伤害而倒地时,如果它不是野人、不属于玩家的派系且与玩家敌对
        那么它有概率直接死亡
        对于动物,这个概率固定是50%。对于机械族,概率固定是100%。
        对于人类,概率=人口调整值*敌人倒地死亡几率
        其中敌人倒地死亡几率在难度自定义设置中可以查到。

        人口调整值简单来说就是人越少,上次获得人口日期越久,就越低。当开着死忠难度设置时,这个值也会比关着时低6%左右。这样敌人就不容易当场死亡,方便抓俘虏。
        当基地等效人口达到20时,关死忠时敌人被补刀概率=92%。人口1时,开死忠时补刀概率=50%

        细节如下:
        人口调整值由人口调控系数经过插值得到,如下表:

        人口调控系数="等效人口"经过插值的P值×"经过日期"经过插值的D值
        (当P值≤0时,就不用乘D值了)
        其中人口调控系数、"等效人口"、"经过日期"都可以通过开发者模式查看到。("write storyteller"指令)
        "等效人口"一般是每个殖民者算1,每个奴隶算0.75,死忠囚犯算0.25,非死忠囚犯算0.5。然后再乘上年龄的相关正比例修正,比如婴儿是0。
        "经过日期"就是距离上次获得人口日期后经过的天数。
        插值如下表:

        (CheckForStateChange)


        IP属地:天津28楼2023-01-21 15:04
        收起回复
          一、天气机制
          天气会随机持续266.6~2666.6秒,持续时间结束后改变天气
          当地图上出现火灾或户外温度不适合当前天气时,当前天气的总持续时间会缩短至0.25倍。
          当出现强制天气影响时,当前天气如果已经持续66.6秒,则立刻改变为此天气。
          改变天气时,不允许连续同一种天气,必须满足户外温度条件,定居时间<8天时不允许坏天气(旱天雷、暴雨之类的),闪电风暴结束后500秒内不允许降雨降雪
          然后根据当地的生态系统来决定各天气的权重,按照权重抽选一个天气,改变为此天气。
          比如热带雨林的权重如下

          雨雪天气的权重还需根据当地的降雨量进行修正,一般1300mm达到1倍,而雨天在4000mm达到3倍。
          如果地图上出现火灾,那么所有雨雪天气的权重都变成15倍。
          当地图上所有火焰的火焰大小总和加上火焰个数*50>9000时,就会判定为出现火灾。

          (开发者模式weather chances)
          (WeatherDeciderTick)
          二、温度交换机制
          每点热量对于1格房间可以升温1摄氏度,房间内的温度一定是均匀的。
          参考了英文wiki"Temperature_mechanics"部分
          每2秒更新一次所有房间的温度:
          如果房间在地图边缘,或露天区域≥房间格数*0.25,那么温度直接等于户外温度。
          房间温度交换需要考虑屋顶、墙、特殊建筑,但某种"isdoorway"房间不需要考虑屋顶温度交换
          ①露天与薄屋顶区域与户外温度计算温差。温差超过100℃时,超出的部分乘5倍。
          ③露天区域使房间温度变化(8.4%*温差*露天区域占比)
          ④薄屋顶区域使房间温度变化(0.6%*温差*薄屋顶区域占比)
          ⑤厚岩顶区域在室内温度≤15℃时,不会产生温度交换。温度>15℃时,与15℃计算温差,使房间温度变化(0.6%*温差*厚岩顶区域占比)
          ⑥墙体温度交换需要列出所有参与的隔墙格,一般隔墙格就是房间的内表面往外的第二格。如图

          (开发者模式draw rooms功能)
          每次随机挑其中五分之一隔墙格(向上取整)。如果隔墙格处于另一个房间,就记录两个房间的温差;如果隔墙格没有处于房间,那么记录房间与户外温差的半值。将这些记录值累加。
          使房间热量变化(2.04%*累加结果*5)点
          关于这四种温度交换的具体数据可以在开发者模式查看。

          (开发者模式show all room stats功能)
          ⑦对于关着的门,每6.25秒进行一次温度交换。而对于开着的门,则是每0.56秒。对于通风口,是每4.16秒。
          门温度交换时,先将门的温度变为邻接所有房间温度的平均值。
          当门或通风口邻接至少2个房间时,其中房间的室内温度会变化[(平均值-房间温度)*建筑系数/房间大小]℃;门的建筑系数=1,通风口的建筑系数=14
          但室温只能变化到平均值为止,出现这种限制时,计算T=实际变化值/本应变化值,其他房间的变化值乘以T。
          三、空调的机制
          如果两端被堵住了,空调就无法生效。
          每4.16秒空调改变一次两端温度。
          计算两端的温差,温差=排热端-制冷端温度,此处制冷端温度最高取40。
          空调使制冷端房间减少[(87.5-温差*67.3%)/房间大小]点温度,负数时不会增温,最多降温至目标温度。
          使制热端产生(109.375-温差*84.13%)点热量
          四、其他温控建筑的机制
          篝火平均每秒释放21点热量,最多加热至28℃
          蒸发制冷器平均每秒减少11点热量,最多降温至17℃
          加热器每4.16秒释放87.36点热量,周围温度>20℃时释放的量逐渐减少,直到120℃无法释放,同时最高加热至目标温度。


          IP属地:天津29楼2023-01-22 11:47
          收起回复
            战斗经验获得机制:
            攻击时,无论是否命中,如果目标是非倒地的单位,且不是玩家的机械体。
            那么近战攻击获得(200*攻击间隔)点格斗经验。
            远程射击获得(基础值*攻击间隔)点经验。有敌意时基础值=170,无敌意=20。
            攻击间隔修正=瞄准时间+冷却时间+连射时间,以秒为单位。
            瞄准时间以武器面板为准,冷却时间在武器面板基础上算上远程冷却系数。
            连射时间=(连射次数-1)*单次开火时长


            IP属地:天津来自Android客户端34楼2023-02-01 15:09
            收起回复
              ①随机任务
              整体上与来袭击的算法一样,就不提细节了。
              简而言之开局8天内不会有任务,8天后渐渐有任务获得机会,15天后可正常获得任务。
              每0.4小时判定一次,不过会保证任务的分布均匀,随机任务之间至少间隔三天。
              无皇权dlc时,平均每10天获得一个随机任务。
              有皇权dlc时,平均每12天获得两个随机任务。
              然后根据每种可用任务的权重来随机抽选,其中也有一些复杂因素,具体概率可以用开发者模式输出页面quest selection weights now来看。
              ②布施官任务会在固定时间点发放,时间点间隔15小时,即平均15小时可获得一次。
              ③帝国征募队开局20天后、基地财富≥2万时才会来,两次之间间隔至少30天。也是来袭击的算法,总之是每0.4小时判定一次,保证均匀地每60天来两次。
              ④星系主宰任务至少开局35天后可获得,任务失败后22天可重新获得。
              ⑤圣物 主任务没找着,等以后补充吧。目前测试来看是上一个主任务结束后的半年到一年内刷新
              当前子任务未满2个、总子任务未满5个时,每5~10天获得一个子任务。
              ⑥机器师任务有两种,一种探索遗迹,一种飞船降落。开局60天后,每0.4小时判定一次,如果玩家地图中没有机械师和机控中枢,则0.027%概率获得机械师任务,即平均一年获得一次。如果有,则是0.0069%概率,即平均四年获得一次。
              ⑦血族有两种任务,一种聚会,一种飞船坠毁。收到其中一种后200天内无法再获得收到的这种任务,无论你接不接受任务。每种权重0.5,像开局时每随机得到一个任务有6.3%概率是血族任务。
              ⑧召唤机械体袭击 将在召唤后1~2小时内到达,如果当前地图有贸易队、布施官、访客将延后,直到以上单位离开。最多延后到1~3天,超出后将强制到达。
              ②、④~⑥、⑧机制无论是卡桑还是兰迪故事叙事者都不受影响。


              IP属地:天津36楼2023-02-09 22:36
              收起回复


                IP属地:天津38楼2023-02-12 14:19
                回复
                  2026-08-16 05:20:13
                  广告
                  不感兴趣
                  开通SVIP免广告
                  睡觉不减心情的默认温度为16~26℃,躺下后1~4小时随机时间点会判定温度,那时温度不合适会减心情

                  只有基因能改变这个温度区间

                  假如畏寒和惧热都有 那么就算房间保持21℃ 也必然降心情
                  另外如果每隔一小时征召一次 也不会降心情


                  IP属地:天津44楼2023-02-26 13:25
                  回复
                    每溶解或摧毁一次有毒垃圾,就有(1.2%*垃圾虫茧侵袭)概率触发毒污虫害。注意一次摧毁堆叠的五份也是只判定一次。
                    "垃圾虫茧侵袭"在难度选项中可调,荒野求生及以上时默认为100%
                    毒污虫害触发后15天以内无法再被触发
                    产生的茧数量仅与当前应得袭击点数有关,与溶解的垃圾量无关。
                    (StorytellerComp_DissolutionTriggered.Notify_DissolutionEvent)
                    "过深:虫害侵袭":每个正在使用中的深钻井都会独立计算概率,每16.6秒判定一次(0.14*深钻井虫害)%,即差不多累积使用(12/深钻井虫害)天后可能触发一次
                    "深钻井虫害"在难度选项中可调,荒野求生默认为100%
                    触发后,10格内的深钻井7天内不会再触发"过深虫害"。但移除掉触发过虫害的深钻井会使此条限制失效
                    "过深:虫害侵袭"的袭击点数是0.3~0.6倍,最低200点最高1000点
                    (StorytellerComp_DeepDrillInfestation.MakeIntervalIncidents)


                    IP属地:天津49楼2023-04-03 12:11
                    收起回复
                      1.5研究了远程敌人AI,之前看制作组那意思1.5应该是不改了,不过姑且还是放在这贴里
                      总结:
                      1.AI选取目标时,优先选目前有视线的目标,优先选旧、成年、非倒地、误伤敌方容易友方不易、想打自己、近的目标,机械族无视误伤
                      2.站原地且看得到目标时,脚下无障碍物且有掩体就会开枪,或者距离目标5格以内也会开枪
                      (另外不仅路障,像圣诞树、献祭旗、文化木雕和基因库等是0%掩体效果的障碍物,不过这些也算是家具)
                      3.人类选取射击位置避免接近5格内和火,优先掩体、回避炮塔密集火力区、避免更长移动、接近0.8倍射程距离
                      机械族和虫族无视炮塔火力区,机械族反而会回避掩体邻格,并且很倾向于选择原地开枪
                      常规远程敌人AI:
                      一.选取目标:
                      1.筛出所有有效的敌意事物作为可能目标。(通常不会算非作战人员、无威胁对象、武器不对口的目标等,可通过通过开发者模式的Write Attack Targets查看)
                      2.判断56格内有无可直接射得到的目标,若有则对这些目标评分,按最终分数为权重随机选一个作为最终目标。
                      ①基础60分,减去自己与目标之间的直线距离,最多减40

                      ②如果目标瞄准自己(后摇中也算),加10分
                      ③如果自己在5秒内攻击过目标,加40分
                      ④减去面对目标的掩体百分比*10 (比如20%掩体-2分)
                      ⑤目标如果是非作战人员(60秒内未拿武器的幼年或动物)减50分,如果是作战幼年则是只减25分
                      ⑥目标如果倒地减50分

                      ⑦自己的武器是帝王业火炮,对远程武器目标加50分
                      ⑧统计与目标之间弹道和目标邻格上所有可能的拦截事物,加分=(事物属性*拦截概率中的距离倍率*敌意属性)的总和
                      其中事物属性在拦截事物为单位时为18,动物7,非单位(如炮塔)10
                      敌意属性在拦截事物为敌对时为0.6,友方则是-1
                      机械族不会统计这个因素
                      (部分AOE类武器则是另一套算法,根据目标附近单位来算,具体就懒得写了)

                      ⑨如果目标是虫巢,分数乘以0.4
                      (以上分数结果可以通过开发者模式的Darw Attack Target Scores查看实际情况)
                      ⑩所有目标的分数低于1时,直接选择最高分作为最终目标
                      ⑪只筛选出分数在[最高分-30,最高分]范围内的目标,并将目标的分数在此范围内对0~100%的插值作为最终分数。
                      3.在第二步的判断中,若没有则直接选择一个最近的作为最终目标。
                      二、判断是否站在原地开枪
                      满足以下其中一条即必会原地开枪
                      1.原地可射击目标,且面对目标存在有效掩体,且脚下无障碍物,且未有队友预定此位置
                      (有障碍物指小人征召后无法直接右键走上去的情况)
                      2.原地可射击目标,且距离目标在5格直线距离内
                      3.选取射击位置时选取到原地,见后文

                      三、选取射击位置
                      1.首先判定原地的分数,不低于1则直接选取原地
                      2.选取范围为以目标为中心、半边长为自己射程的正方形,边长最大为57
                      3.在自己与目标的连线上,在目标处做垂线,将选取范围以垂线分为两半,先对自己这一侧的所有格进行选取,如果最高分数低于0.33则再对另一侧选取。
                      (站在目标横方向上有BUG,仅对选取范围内的所有格进行一次选取)

                      4.对每格进行评分,选取分数最高的格作为射击位置
                      (分数可以通过开发者模式的Darw Cast Position Search查看实际值)
                      ①无法射击目标、有障碍物、无法抵达、有队友预定、地面有火或"对自己的防守位置超出射程"的格子的评分无效
                      ②基础分0.3
                      ③自己射程大于5格时,加上(0.55*面对目标的掩体百分比)分
                      (仅指袭击进攻情况)
                      ④机械族统计8邻格的掩体效果的总和,加(8 - 掩体效果总和)分
                      ⑤分数乘以0.967的x次方,x=自己与格之间直线距离,"自己与目标距离"超过100格时,x还需减去超出的距离,x最低0
                      ⑥分数乘以理想距离因素,=1-0.3*格与目标直线距离和理想射击距离的远离程度
                      理想射击距离为射程的0.8倍处
                      远离程度=两个距离的平方差/理想距离平方
                      ⑦如果"格与目标直线距离"低于5格,分数减半
                      ⑧如果自己不是机械族或虫族,分数乘以炮塔因素,= (37.5 - 格被炮塔射程覆盖的炮塔数量)/37.5,因素最低取0.1
                      5.如果所有格都评分无效,那么选取原地
                      (JobGiver_AIFightEnemy.TryGiveJob、JobGiver_AIFightEnemy.UpdateEnemyTarget、GetShootingTargetScore、TryFindCastPosition)
                      ③附图

                      ④附图

                      ⑤~⑦附图:

                      ⑧附图:


                      IP属地:天津53楼2024-03-23 22:09
                      收起回复
                        限流条件限流就是触发单位互相之间的碰撞体积,使得一格只能站一个单位。
                        一、
                        先介绍一下"区域"划分吧
                        固定的地块会被划分为一个区域。在不考虑其他因素的情况下,地图最左下角的12*12格正方形范围划为一个区域,以此类推,每12*12格会被划分为区域。

                        墙体会分割区域各个门、连着的栅栏与路障 算作区域,且会分割区域
                        其他建筑(包括木柴发电机、沙袋等)对区域无影响
                        清污泵类和深水不算区域,会分割区域

                        泰南的这种反直觉导致你在同一个区域里用墙连一个不封口的迷宫,那其实没有任何隔绝仇恨的作用。不过在某个地块区域分界线上来回横跳,可以分割出大量区域。像左侧的整个迷宫只算一个区域,而右侧的算6个区域

                        二、
                        具体区域划分可以借着开发者模式功能来演示,在open debug actions menu菜单下,挑勾draw regions和draw region traversal即可。
                        暂停时可以看到鼠标指向的格子出现绿或黄框范围,这是该格所属区域。然后邻接的白框范围是所有邻接区域。时间流动时,蓝框范围会不停闪烁,显示每个单位的索敌范围。注意任何索敌行为都会闪一次,像是敌人改变目标时会有一次全图的检测。

                        三、
                        每个单位每1.66秒检索周围若干"区域",如果区域内有敌对事物就触发"警惕"。默认是检索18个区域,如果已触发"警惕"则检索24个区域。门、深水不参与区域计数。注意就算不是在进攻基地路上的无关区域,只要在旁边也会被数进去。因此可以在旁边分开放一堆栅栏来遮蔽限流检测。图中有11个栅栏,占了11个区域,剩余向外检测7个区域。(内部的镂空优先级很低,所以没算区域)

                        所有区域都会额外检测8邻格内的事物,墙门类可阻止斜角探测,但斜角上的门可无视墙门的阻止。

                        四、
                        单位大致上以从内向外、(南西北东内)的顺序检查区域,实际上从内向外分轮次、每轮按上一轮优先级检查邻接区域。具体顺序可以参考下图,从1开始数到19,有19是因为其中一个门只算区域不计数。

                        五、
                        单位在"警惕"状态下才会被限流,主要由以下两个方式触发。
                        ①格中有敌对事物,触发限流。
                        ②格中至少两个单位都有战斗工作,触发限流。如果其中一个单位是动物,另一个单位被征兆,则不触发限流。
                        上述的"格中"有两种情况,一种是当前所在格有至少两个单位,这时触发限流会弹飞,不过附近没有任何可达空格时无法弹飞。另一种是想进到的下一格中有单位占着,这时触发限流会无法移动。另外还有一些例外,当单位A的体型<1.5且<单位B的3.57分之一时,A与B之间无视限流。

                        使用爆炸物的工作不算战斗工作。隔门有通电炮塔时,ai会倾向于设定纯粹移动的工作,不算战斗工作。这两种情况会使敌人可以穿人
                        另外,有些情况在无警惕时也会强制限流,比如:
                        征召待命时,会移动散开。
                        远程自动选择敌人时,会弹开限流。包括敌人远程、未征召远程、征召时自动选择下一个目标。不包括征召后第一次自动选择,征召手动选择。
                        (MindStateTick、EnemiesAreNearby、BreadthFirstTraverseWork、PatherTick)


                        IP属地:天津55楼2024-04-29 20:48
                        收起回复