cataclysmdda吧 关注:20,206贴子:323,512
  • 9回复贴,共1
上班摸鱼研究怎么让弓箭使用更顺手,翻了翻json没有关键信息,去看了下c++代码
尽管有关弓箭的更新一直在持续,上个月罗马车载弩炮刚刚被添加
然而弓箭的核心bug/feature在代码里已经挂起3年而未被解决了,注释写着:等这两个问题解决了就可以删掉这行


IP属地:陕西1楼2024-03-11 18:51回复
    大前提:在CDDA,当你使用枪械/弓弩/投石索进行射击时,你必须持有一把有子弹的远程武器,否则会退出射击模式。
    在这个背景下,CDDA里的弓和投石索等武器属于一类,拥有RELOAD_AND_SHOOT(装填并射击,以下简称ras)这个ras。
    对于普通的枪械以及弩,它们使用弹仓装填弹药(不论是否可拆卸),需要预装填,没有弹夹/子弹时会提示空枪,不进行任何消耗回合数的行动,如果按f进行射击预瞄动作后立刻退出射击模式,同样不消耗回合数。
    而有ras标签的武器则不同,原则上在非射击模式时,你手上的弓箭或投石索应当是空的,且对于PC,你不能预装填这种武器(尽管它们也有“弹仓”属性,所以在一定条件下,非射击模式也可以保持装填,比如NPC就可以拿着装填的弓行动)。
    而基于大前提,处于射击模式时你手上不能是一把空枪,所以,当PC身上或周围地块有弹药可用,按下f,ras武器会同时进行装填及预瞄两个操作;进一步,在退出射击模式时,ras武器又要执行一个清空武器的操作。
    在这个进入又退出射击模式的过程中,涉及了三个可能消耗回合数的行动,取出弹药,装填弹药,清空武器,那么实际耗时是怎样的呢?
    如果在预瞄之后,至少点过一次.键进行实际瞄准,那么当你退出射击状态时,这部分用于瞄准的时间会被消耗,而取出弹药,装填弹药和清空武器的用时都不会被计算;
    重点来了,如果我一次也没有瞄准,预瞄之后立刻退出呢?不幸的灾难来了,清空武器仍然不耗时,也没有消耗瞄准用时,但取出弹药及装填弹药的时间不会被程序清零。
    极端的情况下,比如把箭放在基础耗时1000的绳圈里,使用装填耗时50的弓执行一次预瞄并退出的操作,将会凭空消耗玩家1054及以上的行动点!


    IP属地:陕西4楼2024-03-11 21:33
    收起回复
      “凭空”是重点:
      取出弹药,装填弹药,清空武器,如果没有最后一步操作,让箭搭在弓上不动,那么计算取出弹药及装填弹药的时间在逻辑上仍然是不矛盾的。
      有没有办法达到这个效果呢?答案是有,如果武器有NO_UNLOAD标签,那么在f预瞄抽箭搭弓之后,退出射击模式并不会清空武器,玩家将和NPC一样使用弓箭——此时ras武器将和普通枪械一样,f预瞄不再消耗行动点。
      当然这不是完全没有代价的:有NO_UNLOAD标签的道具无法被清空操作清空,只要你不射击,这箭就挂在弓上了。一般来说这不算太大的代价,不过如果你是个爆裂箭射手,情况可能就比较尴尬了。


      IP属地:陕西5楼2024-03-11 21:59
      回复
        能不能再贪心一点,既要正常的清空武器的能力,又要standby的射击模式呢?
        答案还是yes,使用现成的功能,不进行硬编程也能达到我们想要的效果。
        现代狩猎复合弓是一把可以变形的武器,可以在标准、高拉力、低拉力三种形态下切换。
        这三种形态其实是属性继承的三个不同道具,拥有各自的物品id。
        知道这一点,就有了操作空间了:我们给武器的一种形态加上NO_UNLOAD,另一种不加,当处于前一种形态时,武器以类似普通枪械的方式工作,而在后一种形态下,则拥有正常的弓切换弹药的能力。
        首先把箭搭在弦上,执行使用命令切换形态后,武器内装填的弹药没有消失,但是可以正常清空弹药了。


        IP属地:陕西6楼2024-03-11 22:09
        回复




          IP属地:陕西7楼2024-03-11 22:10
          回复
            测试了下,CBN那边的弓没有bug


            IP属地:陕西12楼2024-03-12 19:22
            回复


              修改后的弓箭等RAS武器将在瞄准界面里显示实际射击用时(装填+射击),如图中的投石杖,从地上装填石头需要154点行动力,0等级0专长的基础射击速度220行动力,合计即为374行动力
              退出瞄准界面不会消耗装填所需的这154点行动力,也不会重置瞄准进度,点击射击后才会和射击用时一并消耗
              在重新瞄准函数里解锁了RAS武器,现在射击后也将和普通远程武器一样,如果发现有效目标将自动进入瞄准状态


              IP属地:陕西15楼2024-04-28 09:25
              回复
                还剩最后一个PR没有合并,等到那个也合并了弓箭相关的问题就基本优化完成了
                优化完成后的状态:
                单独绑定一个按键用于设置/清空弓默认使用的弹药,F仅作为切换射击模式的快捷键使用
                需要将弹药装在at小人的包里才可将其指定为默认弹药,绑定选项/清除选项/选择错误弹药时将有文本提示
                因力量不足等原因导致无法拉弓时,不再提示“弓箭未装填”
                在拾取菜单里,弓不再被视为有效容器,如果手持弓而并未装备箭袋等有效容器,地上的弹药将不再显示为可选择拾取(显示可拾取是一个bug,修复前可选择但实际无法拾取,会提示“未成功拾取某些物品”),这一设置作用于所有容器类型为MAGAZINE/MAGAZINE_WELL的道具


                IP属地:陕西16楼2024-04-28 11:25
                收起回复
                  因为最新版弹药选择函数已经被修改了,所以有些机制有变化(比如默认弹药不再显示*号标记),不过那个和弓箭无关,后面会考虑另行提交修改
                  大家用弓箭还遇到什么其他问题吗,如果我能解决的话后续也会去提交PR


                  IP属地:陕西17楼2024-04-28 11:33
                  回复
                    由于未在commit里标注,仅仅是在PR描述里贴了BN来源,惨遭revert(修改透过这个PR发现的bug的PR倒是没受影响)
                    不过在沟通后确定可以重新提交,另外这两天我也想到了一处应当修改的地方,晚上回去再发PR


                    IP属地:陕西18楼2024-05-06 16:53
                    回复