cataclysmdda吧 关注:21,775贴子:338,337

大家关注过cdda的消化系统模拟吗

取消只看楼主收藏回复

感觉很多人对消化过程有误解


IP属地:陕西1楼2024-11-25 11:45回复
    之前提过,角色的等效(湿)体重由脂肪体重和非脂肪体重两部分组成。这里说(湿)体重,是和游戏内体重秤的读数相区别,那个除了包括随身物品装备,还包括cbm之类的重量,只有等效(湿)体重会参与角色的生化过程模拟。
    脂肪体重会体现在角色面板的体重一栏,即8个胖瘦等级,这个胖瘦等级是根据玩家当前的积累热量水平换算的。
    那么积累热量水平是如何变化的呢?我们从热量这个指标开始,浅析一下cdda的消化系统模拟。


    IP属地:陕西4楼2024-11-25 15:44
    回复
      每个角色都有三个热量指标,胃内容物热量水平、肠内容物热量水平以及代表脂肪体重的积累热量水平。
      玩家吃的食物都标注了卡路里,比如肉干的卡路里是348 kcal。每当玩家食用了某种食物,这个食物会进入胃部,立刻让胃内容物热量水平上升相应的数值。



      (图1:未进食;图2:进食肉干后,667+348=1015;图3:消化1次后)
      胃内容物热量水平以半个小时为周期进行一次更新,胃内的物质经过节点后就会被消化进入肠道。
      肠内容物热量水平同样以半个小时为周期进行消化,经肠道吸收后,玩家的积累热量水平得以提升。


      IP属地:陕西5楼2024-11-25 15:54
      回复
        不过cdda的消化过程模拟当然不是单纯的口→胃→肠→血液依次传递这么简单,下面更为具体地描述一下。
        首先消化系统分别模拟三组参数,固形物、水和营养物质,固形物和水的体积之和即为胃内物质总体积。
        水和另外二者不同,其更新频率是5分钟,且在胃和肠均以固定速率(250ml/5分钟)进行吸收。
        然后这个更新频率,也就是这个5分钟和30分钟是怎么算的呢?特别注意,不是计算从你进食动作开始,或者食物进入胃/肠之后经过的时间,而是是否经过了整点时刻!如果更新频率是一小时,那么你在07:59:59分吃完一个肉干,08:00:01的时候就会进行一次消化。



        (图1:等待至8点29分;图2:进食肉干;图3:8点31分时的消化情况。作为对比,上一层是同一角色8点1分进食,可以看到两次消化后的热量水平相同)
        也就是说,系统在钟表指向5/10/15……分钟时,会检测胃/肠中是否有水,如果有则向下一系统传递最大250ml。如果时刻指向的是30分钟或整点,还将继续固形物和营养成分的消化。


        IP属地:陕西6楼2024-11-25 16:02
        收起回复
          对于固形物,胃每次消化的上限是最大胃容量的1/6,而肠道设定了一个和吸收水一样的250ml(仅占位符,无实际意义,因为肠道内固形物这个参数不影响任何代谢过程)。
          对于热量,胃有一个5kcal的消化基准,当内容物少到不足5kcal时,会全部吸收转移至肠道,在内容物为5-30kcal之间时会转移5kcal,而在大于30kcal时是当前胃内容物热量水平的1/6(如上面的例子,1次消化后,胃内热量由1015减少至846,169/1015=1/6);
          肠道吸收热量的机制类似,只不过其消化系数基于新陈代谢速率变化,基准是(当日总热量消耗/24)*实时有效新陈代谢速率的kcal,肠内容物热量足够高时是肠内容物热量水平*5%*实时有效新陈代谢速率的kcal。


          IP属地:陕西7楼2024-11-25 16:07
          收起回复
            新陈代谢速率我在上一贴提到过,游戏有一个平衡参数PLAYER_HUNGER_RATE(默认为1),玩家通过变异、cbm及魔法获取METABOLISM系数,加算/乘算后得到基础的metabolic_rate,然后计算基础代谢率bmr:每100g等效体重参数+1,每1cm身高参数+6.25,每1岁参数-5,再加上默认的5点参数,以上四项相加的和乘以metabolic_rate,就是bmr(默认角色的bmr大约是1000)。而实时有效新陈代谢速率在这个基础上,再通过有效饥饿进行加权。这里还有一点需要注意,那就是速度越快的角色,饥饿惩罚越高。


            IP属地:陕西8楼2024-11-25 16:10
            收起回复
              细心的人应该注意到了,我开始说的是“营养物质”,但上面替换成了“热量”,漏掉了“维生素”,这是因为维生素的有特别之处。
              游戏里的“维生素”是一个大类,除了vitamin子类(钙、铁和维c),还有toxin、counter和drug三种子类。
              对于钙、铁和维c,系统使用和热量类似的胃→肠→血液吸收模式以30分钟为周期吸收,只不过具体参数不同,胃的基准是1mg,肠的基准是(100/24)*实时有效新陈代谢速率mg。另外,食物json里记录的不是mg,而是RDA参考量,需要换算成实际物质数量生效。
              toxin类目前只有变异肉的毒素,counter类则是各类诱变剂、血、人肉、过敏原及寄生蜂卵,其吸收方式目前和上面的vitamin子类一样。
              最后是drug,目前只有三种,β-受体阻滞剂(美托洛尔)、抗凝血剂(阿司匹林)和布洛芬(布洛芬和萘普生)。这类“药物维他命”的生效方式是口→胃→血液,在经过1次5分钟周期后,胃里的“药物维他命”就会直接被吸收而不需要经过肠道周期。
              同时维生素这一大类物质的生效也比较复杂,本质上摄取得到维生素不会产生直接的效果,只是相当于一种标志物。


              IP属地:陕西9楼2024-11-25 16:52
              回复
                维生素生效的第一种方式是“缺乏症”,钙、铁和维c摄入不足的负面效果即属于此类。
                第二种方式是“过量症状”,变异肉的毒素和各类诱变剂引物的效果属于此类。
                第三种方式是“转化”,比如诱变剂泥浆和诱变螯合剂,会衰变并增减诱变剂和特定种类引物。
                第四种是“标志物”,代表是各类过敏原,无关数量只要存在即会生效。
                最后一种是基于EOC的效果,寄生蜂孵化就是根据寄生蜂卵的维生素水平进行math脚本计算来实现的。


                IP属地:陕西10楼2024-11-25 17:11
                收起回复
                  下班了,明天估计也没时间摸鱼码字,有空再补完饥饿/口渴值的变化


                  IP属地:陕西11楼2024-11-25 17:59
                  回复
                    另外补充一点,玩家是每轮(每秒)都会更新一次胃部状态,而NPC则可能因为不在现实气泡内,间隔较长时间才更新一次


                    IP属地:陕西12楼2024-11-25 18:10
                    回复
                      先补充一个关于胃容量和食物体积的问题:
                      熏肉的体积是0.25L,小at的默认胃容量是2.5L,那么小at吃第几块肉会提示已吃撑了?9、10还是11?
                      都不是,答案是最多吃7块!
                      食物的json中定义了其热量、重量和体积,但我们不能直接使用这3个数据
                      首先要算干体积,扣除其水分,每1解渴5ml,没有或负数则不计,然后如果重量比体积小,则使用重量的克数替代体积的毫升数继续下面的计算
                      接下来计算热量/干体积,最小为1,1-3之间取实际值,大于3则取(3*商)的平方根,得到体积系数
                      用干体积*体积系数得到有效体积,这个体积用于消化计算
                      以下是几种常见食物的数据:


                      IP属地:陕西18楼2024-11-25 21:27
                      收起回复
                        更正几处:
                        18楼的表格数据没错,但是有几个表头写错了,用于计算体积系数的是热量/干质量


                        IP属地:陕西21楼2024-11-26 16:02
                        回复
                          然后水吸收的部分,和固体物质是一样的,肠循环无意义
                          在胃循环后,直接就减少最大50口渴(每5ml减少1口渴,最大250ml)


                          IP属地:陕西22楼2024-11-26 16:05
                          回复
                            然后
                            这类“药物维他命”的生效方式是口→胃→血液,在经过1次5分钟周期后,胃里的“药物维他命”就会直接被吸收而不需要经过肠道周期
                            这一行需要重新确认一下
                            胃→血液的周期是30分钟而不是5分钟,这个是明确写错了
                            但是胃→肠吸收的drug,后续会如何处理,可能需要再看一下代码实现


                            IP属地:陕西23楼2024-11-26 16:25
                            收起回复
                              我们再看看小at每日热量消耗的情况。
                              一个出生在避难所的全8属性微胖身高175左右无变异默认角色,其bmr大约是1850,如果一天24小时一动不动,那么他消耗的热量就是最小值1850kcal,如果24小时不眠不休保持极限运动状态,可能达到的最大热量消耗是bmr的10倍即18500kcal。
                              考虑到睡眠时的消耗减少,将一天三等分,大概有以下9个等级:
                              ①8小时睡眠,8小时读书,8小时轻微活动,消耗倍率约1.3;
                              ②8小时睡眠,8小时轻微活动,8小时轻体力劳动,消耗倍率约2.3;
                              ③8小时睡眠,16小时轻体力劳动,消耗倍率约3;
                              ④8小时睡眠,8小时轻体力劳动,8小时中体力劳动,消耗倍率约3.6;
                              ⑤8小时睡眠,16小时中体力劳动,消耗倍率约4.3;
                              ⑥8小时睡眠,8小时中体力劳动,8小时重体力劳动,消耗倍率约5;
                              ⑦8小时睡眠,16小时重体力劳动,消耗倍率约5.6;
                              ⑧8小时睡眠,8小时重体力劳动,8小时极限状态,消耗倍率约6.3;
                              ⑨8小时睡眠,16小时极限状态,消耗倍率约7;
                              实际情况中,因为移动本身就是中活动强度,而对于挖矿、伐木这样的极限运动状态,角色很快就会疲劳需要休息,两头的情况不太可能出现。
                              我们按照8小时睡眠、4小时读书及休息、4小时轻微活动、2小时轻劳动、2小时中劳动、2小时重劳动、2小时极限状态,模拟一个理想状态下小at长周期中的日均热量消耗,列在最后一格。
                              运动情况、疲劳、体力消耗、热量消耗都是5分钟粒度的,实际计算会更复杂,有兴趣的可以在游戏中测试一下。


                              IP属地:陕西25楼2024-11-27 12:15
                              回复