注册 | 登录

游侠NETSHOW论坛





查看: 2203|回复: 7
打印 上一主题 下一主题

[分享] 沉船伤害公式初步研究报告 [复制链接]

帖子
297
精华
0
积分
199
金钱
2541
荣誉
5
人气
0
评议
0
跳转到指定楼层
楼主
发表于 2009-7-13 22:40:43 |只看该作者 |倒序浏览
这次研究的是沉船之城里面的伤害计算公式,对应的文件是游戏目录\Program\loc_ai下面的LAi_fightparams.c文件。由于我并没有完全解读这个文件,所以这次这次的研究结果不作为独立的一弹出现。剩下的疑问留待有兴趣的朋友继续研究。

      这个文件的第一部分//Blade parameters描述了近战攻击几种不同攻击模式的击中概率、伤害倍数、消耗能量等基本参数。第二部分//Gun parameters描述了对应的远程攻击的一些基本参数。第三部分//Calculate total讲了各种攻击的攻击算法,这一部分是这个文件的关键内容。

    第三部分首先是近战伤害的计算。这一段从void LAi_ApplyCharacterAttackDamage(aref attack, aref enemy, string attackType, bool isBlocked)开始,首先是:
float dmg = LAi_CalcDamageForBlade(attack, enemy, attackType, isBlocked);
        float critical = 0.0;
        if(IsCharacterPerkOn(attack, "SwordplayProfessional"))
        {
                if(rand(100) <= 20)
                {
                        critical = LAi_GetCharacterMaxHP(enemy)*0.30;
                }
        }else{
                if(IsCharacterPerkOn(attack, "CriticalHit"))
                {
                        if(rand(100) <= 5)
                        {
                                critical = LAi_GetCharacterMaxHP(enemy)*0.20;
                        }
                }

这一段描述了两个个人特技造成的爆击效果,它对应后面这条语句:    dmg = dmg + critical; 其中一个是20%几率造成30%HP的伤害,另一个是5%的几率造成20%的伤害。

接下来一段
if(CheckAttribute(attack, "chr_ai.group") && CheckAttribute(enemy, "chr_ai.group"))
        {
                if(attack.chr_ai.group == enemy.chr_ai.group)
                {
                        dmg = 0.0;
                        critical = 0.0;
                        noExp = true;
                }
        }
        if(isBlocked || CheckAttribute(enemy, "cirassId"))// 羼腓 觇疣襦 桦?犭铌, 蝾 牮栩桕嚯 礤忸珈铈屙
        {
                critical = 0;
        }
说明在砍到自己人或者被格档时,伤害为0。

kDmg = 1.0;
        if(IsCharacterPerkOn(enemy, "BasicDefense")) kDmg = 0.9;
        if(IsCharacterPerkOn(enemy, "AdvancedDefense")) kDmg = 0.8;
        if(IsCharacterPerkOn(enemy, "SwordplayProfessional")) kDmg = 0.7;

        dmg = dmg*kDmg;
这一段应该是分别描述几个技能对受到的伤害的削减作用。

if(CheckAttribute(enemy, "cirassId"))
        {
                dmg = dmg * (1.0 - stf(Items[sti(enemy.cirassId)].CirassLevel));
        }
        if(dmg > 0.0)
        {
                //袜眍耔?镱怵彐溴龛?
                LAi_ApplyCharacterDamage(enemy, MakeInt(dmg + 0.5));
                //橡钼屦桁 磬 耢屦螯
                LAi_CheckKillCharacter(enemy);
                //镳钼屦桁 磬 铗疣怆屙桢
                MakePoisonAttackCheckSex(enemy, attack);
        }

这一段是很关键的一段,它描述了盔甲的作用:受到的伤害=基础伤害*(1-盔甲的防御百分比)
不过当盔甲改为100%防御后,在实际测试中依旧会受到一定的伤害,这个伤害存在的原因尚不得而知。

中间很长一段没什么好说的,主要是讲经验的加成。

接下来远程伤害void LAi_ApplyCharacterFireDamage(aref attack, aref enemy, float kDist)里面有这样一段:

float p = LAi_GunCalcProbability(attack, kDist);
        //篷腓 镳铎圊眢腓顸, 蝾 恹殇屐
        if(rand(10000) > p*10000) return;          
        // boal 狃铐 疣犷蜞弪 怦邈溧, ?礤 蝾觐 ?犭铌?23.05.2004 -->
        if(CheckAttribute(enemy, "cirassId"))
        {
        if(rand(1000) < stf(Items[sti(enemy.cirassId)].CirassLevel)*500) return;
        }
        // boal 23.05.2004 <--
        //袜麒耠屐 镱怵彐溴龛?
        float damage = LAi_GunCalcDamage(attack, enemy);

      这段其实是两段,前一部分是讲武器的击中几率,可以暂且不提。后一部分按照字面理解,应该是如果从1-1000中随机出的一个数<盔甲的防御百分比*500,则程序返回。按照这样理解盔甲对远程攻击的防御应该是近战时的一半,可实际上把我500改为1000,又把盔甲的防御百分比设为1后,远程攻击依旧能击穿盔甲,所以我怀疑这个语句并没有发挥效果。仔细分析逻辑关系,我觉得这里应该是个设计bug,设计这本来是打算用if条件来决定是否执行后面的伤害语句,可在实际操作中,return终止的应该只是if条件的语句,后面的造成伤害的语句实际上无论前面条件成立与否都执行了。由于我已经有五六年没有用C语言编过程序了,return的用法我现在记得不是很准确,希望有编程高手来指正。

      至此,我不得不承认如果想改造出完美的盔甲,必须修改远程伤害的全局计算公式。考虑到游戏中有无敌命令,这个研究继续下去已经没多大意义。所以关于伤害公式的研究我决定到此为止。上面发的就是我截至目前关于这个内容的全部研究成果,虽然对修改来说意义不大,但总归是又破译了游戏设定中的一项内容,所以还是发了出来,希望对狂派的朋友们有所帮助。如果大家对此有了新的发现,也希望能发帖告诉大家。

[ 本帖最后由 ccxq 于 2009-7-13 22:52 编辑 ]
已有 1 人评分金钱 收起 理由
小小旅行家 + 10 + 1 文章不错,继续努力!

总评分: 金钱 + 10  + 1   查看全部评分

使用道具 举报

帖子
398
精华
0
积分
259
金钱
1085
荣誉
6
人气
0
评议
0
沙发
发表于 2009-7-14 10:59:48 |只看该作者
return是立即结束函数并返回值,这里的问题是他没说返回哪个值……

使用道具 举报

帖子
297
精华
0
积分
199
金钱
2541
荣誉
5
人气
0
评议
0
板凳
发表于 2009-7-14 12:40:08 |只看该作者
恩,所以当时我也被绕晕了,完全不知道这个语句在这里是想干什么,后来猜测可能是游戏编写者这里编写的时候自己弄错了。

使用道具 举报

帖子
854
精华
1
积分
667
金钱
3634
荣誉
4
人气
1
评议
0
地板
发表于 2009-7-14 16:30:55 |只看该作者
幸运值和伤害有较大关系。。。。。。。。。。。。幸运高的话受到致命攻击概率就少多了
被围殴背刺的话容易出致命攻击
高幸运+黄金甲+较高的HP=一骑当千,无视围殴
这几个公式不知在哪

使用道具 举报

帖子
3148
精华
0
积分
1675
金钱
13612
荣誉
10
人气
14
评议
0
5#
发表于 2009-7-14 16:38:39 |只看该作者

回复 #4 jhd218 的帖子

14项技能100 + 特技全会  +黄金甲+高HP就是血牛了。。。。。。。。。。。。

否则就算是14项技能100 + 特技全会  +6位数HP在高难度下1V多照样被敌人虐杀。。。。。。。。。。。。。。。。。。。
他还是妖吗?不是...
是神仙?不是....  
答:是如来佛祖!
肖龙王何时出现在中国...

使用道具 举报

帖子
3148
精华
0
积分
1675
金钱
13612
荣誉
10
人气
14
评议
0
6#
发表于 2009-7-14 16:43:43 |只看该作者

回复 #4 jhd218 的帖子

我感觉黄金甲的有很多的秘密,此装备绝对值得研究........................
他还是妖吗?不是...
是神仙?不是....  
答:是如来佛祖!
肖龙王何时出现在中国...

使用道具 举报

帖子
398
精华
0
积分
259
金钱
1085
荣誉
6
人气
0
评议
0
7#
发表于 2009-7-14 16:59:22 |只看该作者

回复 #6 2697 的帖子

没有什么秘密,盔甲和档格可以抵消致命一击,而致命一击的伤害是按总HP的百分比来算的。

使用道具 举报

帖子
3148
精华
0
积分
1675
金钱
13612
荣誉
10
人气
14
评议
0
8#
发表于 2009-7-14 17:01:58 |只看该作者

回复 #7 NoWater 的帖子

哦  那就对了。盔甲抵挡了致命一击...........

高HP加老黄才是王道, [汗水] [汗水] ,看来电脑也应该普及盔甲[汗水] [汗水]
他还是妖吗?不是...
是神仙?不是....  
答:是如来佛祖!
肖龙王何时出现在中国...

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

手机版|Archiver|游侠NETSHOW论坛 ( 苏ICP备2023007791号 )

GMT+8, 2025-7-13 11:09 , Processed in 0.332526 second(s), 13 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

分享到