- UID
- 781545
- 主题
- 0
- 阅读权限
- 20
- 帖子
- 297
- 精华
- 0
- 积分
- 199
- 金钱
- 2541
- 荣誉
- 5
- 人气
- 0
- 在线时间
- 546 小时
- 评议
- 0
- 帖子
- 297
- 精华
- 0
- 积分
- 199
- 金钱
- 2541
- 荣誉
- 5
- 人气
- 0
- 评议
- 0
|
这次研究的是沉船之城里面的伤害计算公式,对应的文件是游戏目录\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 编辑 ] |
-
总评分: 金钱 + 10
+ 1
查看全部评分
|