铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 3880|回复: 5

原版复刻版的伤害公式

[复制链接]
发表于 2015-2-4 15:13 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
  1. //计算伤害值, 第一公式如小于0则取一个随机数, 无第二公式

  2. function CalHurtValue(bnum1, bnum2, mnum, level: integer): integer;
  3. var
  4.   i, rnum1, rnum2, mhurt, att, def, k1, k2, dis: integer;
  5. begin
  6.   //计算双方武学常识
  7.   k1 := 0;
  8.   k2 := 0;
  9.   for i := 0 to BRoleAmount - 1 do//当i<BRoleAmount - 1时,加1循环,应该是不超过最大武常的一个设定把
  10.   begin
  11.     if (Brole[i].Team = Brole[bnum1].Team) and (Brole[i].Dead = 0) and
  12.       (Rrole[Brole[i].rnum].Knowledge > MIN_KNOWLEDGE)//大于最小有效武常 then
  13.       k1 := k1 + Rrole[Brole[i].rnum].Knowledge;//把有效武常加0赋值给K1,至此K1这个数值就是武常了
  14.     if (Brole[i].Team = Brole[bnum2].Team) and (Brole[i].Dead = 0) and
  15.       (Rrole[Brole[i].rnum].Knowledge > MIN_KNOWLEDGE) then
  16.       k2 := k2 + Rrole[Brole[i].rnum].Knowledge;
  17.   end;
  18.   rnum1 := Brole[bnum1].rnum;
  19.   rnum2 := Brole[bnum2].rnum;
  20.   if level > 0 then
  21.     mhurt := Rmagic[mnum].Attack[level - 1]
  22.   else
  23.     mhurt := 0;

  24.   att := Rrole[rnum1].Attack + k1 * 3 div 2 + mhurt div 3;//人物攻击+武常*3+武功伤害/3取整
  25.   def := Rrole[rnum2].Defence * 2 + k2 * 3;//人物防御*2+武常*3

  26.   case Rmagic[mnum].MagicType of     //根据武功的所属的拳剑刀特来选择加什么系数
  27.     1:
  28.     begin
  29.       att := att + Rrole[rnum1].Fist;//把上面算的攻击+拳系数(猜的)
  30.       def := def + Rrole[rnum2].Fist;
  31.     end;
  32.     2:
  33.     begin
  34.       att := att + Rrole[rnum1].Sword;//把上面算的攻击+剑系数(猜的)
  35.       def := def + Rrole[rnum2].Sword;
  36.     end;
  37.     3:
  38.     begin
  39.       att := att + Rrole[rnum1].Knife;
  40.       def := def + Rrole[rnum2].Knife;
  41.     end;
  42.     4:
  43.     begin
  44.       att := att + Rrole[rnum1].Unusual;
  45.       def := def + Rrole[rnum2].Unusual;
  46.     end;
  47.   end;

  48.   //攻击, 防御按伤害的折扣
  49.   att := att * (100 - Rrole[rnum1].Hurt div 2) div 100;//攻击*(100-受伤数值/2)/100取整
  50.   def := def * (100 - Rrole[rnum2].Hurt div 2) div 100;

  51.   //如果有武器增加攻击, 检查配合列表
  52.   if Rrole[rnum1].Equip[0] >= 0 then
  53.   begin
  54.     att := att + Ritem[Rrole[rnum1].Equip[0]].AddAttack;
  55.     for i := 0 to MAX_WEAPON_MATCH - 1 do
  56.     begin
  57.       if (Rrole[rnum1].Equip[0] = matchlist[i, 0]) and (mnum = matchlist[i, 1]) then
  58.       begin
  59.         att := att + matchlist[i, 2] * 2 div 3;//上面的攻击数值+武器配合数值*2/3(在这个公式里,配合数值的价值是武功数值的两倍)
  60.         break;
  61.       end;
  62.     end;
  63.   end;
  64.   //防具增加攻击
  65.   if Rrole[rnum1].Equip[1] >= 0 then
  66.     att := att + Ritem[Rrole[rnum1].Equip[1]].AddAttack;//这个公式里,防具加的攻击无效,只有武器加的攻击有效?
  67.   //武器, 防具增加防御
  68.   if Rrole[rnum2].Equip[0] >= 0 then
  69.     def := def + Ritem[Rrole[rnum2].Equip[0]].AddDefence;
  70.   if Rrole[rnum2].Equip[1] >= 0 then
  71.     def := def + Ritem[Rrole[rnum2].Equip[1]].AddDefence;
  72.   //showmessage(inttostr(att)+' '+inttostr(def));
  73.   Result := att - def + random(20) - random(20);//刚才所有算完后的攻击-防御+随即数20以内-随即数20以内
  74.   dis := abs(Brole[bnum1].X - Brole[bnum2].X) + abs(Brole[bnum1].Y - Brole[bnum2].Y);//猜测是距离减轻伤害的设置吧
  75.   if dis > 10 then
  76.     dis := 10;//最大距离是10

  77.   Result := max(Result, att div 10 + random(10) - random(10));//伤害数值,攻击/10+随即数10-随机数10,取小(如果你的总攻击>对方总防御的数值小于你的攻击/10取整,就不划算,要想不破,伤害小就把攻击/10的10改大
  78.   Result := Result * (100 - (dis - 1) * 3) div 100;//距离最多减少27%的最终伤害
  79.   if (Result <= 0) or (level <= 0) then
  80.     Result := random(10) + 1;
  81.   if (Result > 9999) then
  82.     Result := 9999;//伤害最小随即数10+1,最大9999
  83.   //showmessage(inttostr(result));

  84. end;

  85. //AI专用

  86. function CalHurtValue2(bnum1, bnum2, mnum, level: integer): integer;
  87. begin
  88.   Result := CalHurtValue(bnum1, bnum2, mnum, level);
  89.   if Result >= Rrole[Brole[bnum2].rnum].CurrentHP then//伤害大于我方的血,伤害*1.5???
  90.     Result := Result * 3 div 2;
  91.   if Rmagic[mnum].HurtType = 1 then
  92.     Result := (Rmagic[mnum].HurtMP[level - 1] * 3) div 2;
  93. end;
复制代码




总结:原版复刻的伤害公式
【(人物攻击+武常*3+武功伤害/3取整)+相应的系数】*(100-受伤数值/2)/100 - (人物防御*2+武常*3)*(100-受伤数值/2)/100
最后伤害的数值受到距离的修正,最多减少27%的伤害
防具加的攻击数值无效
武器防具的其他数值视同人物本身的攻防

最后的一段电脑专用伤害公式,就看懂1.5倍,还是来的大大讲解下吧
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2015-2-4 15:49 | 显示全部楼层
本帖最后由 scc__ 于 2015-2-4 15:54 编辑

贴代码有专用的一个功能,给你编辑了。

AI专用功能是这样:AI会对每个攻击点计算一遍收益,收益值就是直接用伤害公式算的。如果能够打退某个敌人,增大这个收益值,也就是说AI会优先选择可以击退的攻击方式。实际行动时还是使用原本的伤害公式。
开始的循环是查找战场上所有人物。

后面的装备增加攻防是武器防具都增加的。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2015-2-4 19:34 | 显示全部楼层
scc__ 发表于 2015-2-4 15:49
贴代码有专用的一个功能,给你编辑了。

AI专用功能是这样:AI会对每个攻击点计算一遍收益,收益值就是直接 ...

  //防具增加攻击
  if Rrole[rnum1].Equip[1] >= 0 then
    att := att + Ritem[Rrole[rnum1].Equip[1]].AddAttack;
  //武器, 防具增加防御
  if Rrole[rnum2].Equip[0] >= 0 then
    def := def + Ritem[Rrole[rnum2].Equip[0]].AddDefence;
  if Rrole[rnum2].Equip[1] >= 0 then
    def := def + Ritem[Rrole[rnum2].Equip[1]].AddDefence;


大大,不是Equip[0] 是武器嘛
没看到 att := att + Ritem[Rrole[rnum1].Equip[0]].AddAttack;呀

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2015-2-4 19:34 | 显示全部楼层
本帖最后由 koko4444 于 2015-2-4 19:40 编辑
scc__ 发表于 2015-2-4 15:49
贴代码有专用的一个功能,给你编辑了。

AI专用功能是这样:AI会对每个攻击点计算一遍收益,收益值就是直接 ...

//防具增加攻击
  if Rrole[rnum1].Equip[1] >= 0 then
    att := att + Ritem[Rrole[rnum1].Equip[1]].AddAttack;
  //武器, 防具增加防御
  if Rrole[rnum2].Equip[0] >= 0 then
    def := def + Ritem[Rrole[rnum2].Equip[0]].AddDefence;
  if Rrole[rnum2].Equip[1] >= 0 then
    def := def + Ritem[Rrole[rnum2].Equip[1]].AddDefence;


大大,不是Equip[0] 是武器嘛
没看到 att := att + Ritem[Rrole[rnum1].Equip[0]].AddAttack;呀
当初那刺猬甲是您设置的呀,那10.28的群芳源代码也是您写的

var
  i, j, rnum1, rnum2, mhurt, R1Att, R1Def, R2Att, R2Def, att, def, k1, k2, dis, neinum,
  neilevel, livenum, speed1, speed2: integer;
  p, p2, p3, p4: real;
  R1, R2: TRole;
  B1, B2: TBattleRole;
金水的伤害公式涉及的变量也太多了吧,还什么类型的数都有,太可怕了
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2015-2-4 20:12 | 显示全部楼层
第59行那里。

群芳原本也是用原版的代码改的,后来独立发展了。

水壶用浮点数是因为中间计算过程多是乘法,用整数有溢出可能(曾经溢出过,目前的值其实都不会溢出)。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2015-2-10 21:00 | 显示全部楼层
咱 就是在找这个
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-5-7 09:24

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表