铁血丹心

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

金水的伤害公式相关

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

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

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

x
  1. function CalHurtValue(bnum1, bnum2, mnum, level: integer; mode: integer = 0): integer;
  2. var
  3.   i, j, rnum1, rnum2, mhurt, R1Att, R1Def, R2Att, R2Def, att, def, k1, k2, dis, neinum,
  4.   //攻方人物编号,防方人物编号,武功伤害,攻,防,武常1,武常2,距离,内力数
  5.   neilevel, livenum, speed1, speed2: integer;
  6.   //内功级别,生存人数,速度1,速度2
  7.   p, p2, p3, p4: real;
  8.   R1, R2: TRole;
  9.   B1, B2: TBattleRole;
  10. begin
  11.   //以下是状态影响属性的处理, 攻守方均可能中此类状态

  12.   rnum1 := Brole[bnum1].rnum; //攻方人物编号
  13.   rnum2 := Brole[bnum2].rnum; //防方人物编号

  14.   R1 := Rrole[rnum1];
  15.   R2 := Rrole[rnum2];
  16.   B1 := Brole[bnum1];
  17.   B2 := Brole[bnum2];

  18.   //攻击状态、防御状态、情侣的攻防加成
  19.   R1Att := max(0, R1.Attack * (100 + b1.StateLevel[0] + b1.loverlevel[0]) div 100);//(人物攻击+特技导致的攻击状态程度+情侣状态加的攻击)/100取整
  20.   R2Def := max(0, R2.Defence * (100 + b2.StateLevel[1] + b2.loverLevel[1]) div 100);//同上攻击改防御

  21.   //如果有武器, 增加攻击, 检查配合列表
  22.   if r1.Equip[0] >= 0 then
  23.   begin
  24.     R1att := R1att + Ritem[r1.Equip[0]].AddAttack;//武器本身加的攻击赋值到攻击里,R1att和R1Att是同一个东西
  25.     for i := 0 to 4 do//从0到4的循环,看武器配合列表,有5个配合列表,要从0到4试过去???
  26.     begin
  27.       if (Ritem[r1.Equip[0]].GetItem[i] = mnum) then
  28.       begin
  29.         R1att := R1att + Ritem[r1.Equip[0]].NeedMatAmount[i];
  30.         break;
  31.       end;
  32.     end;
  33.   end;
  34.   //防具增加攻击
  35.   if r1.Equip[1] >= 0 then
  36.     R1att := R1att + Ritem[r1.Equip[1]].AddAttack;
  37.   //武器, 防具增加防御
  38.   if r2.Equip[0] >= 0 then
  39.     R2def := R2def + Ritem[r2.Equip[0]].AddDefence;
  40.   if r2.Equip[1] >= 0 then
  41.     R2def := R2def + Ritem[r2.Equip[1]].AddDefence;

  42.   //9号状态, 孤注, 随生命减少而攻击增加
  43.   if b1.StateLevel[9] > 0 then
  44.   begin
  45.     R1Att := R1Att * (r1.MaxHP * 2 - r1.CurrentHP) div r1.MaxHP;//攻击*(最大血量*2-当前血)/最大血量后取整,血越少越威猛,最多可以达到几乎2倍的攻击
  46.   end;

  47.   //计算双方武学常识
  48.   k1 := 0;
  49.   k2 := 0;
  50.   for i := 0 to BRoleAmount - 1 do
  51.   begin
  52.     if (Brole[i].Team = Brole[bnum1].Team) and (Brole[i].Dead = 0) and
  53.       (Rrole[Brole[i].rnum].Knowledge > MIN_KNOWLEDGE) then
  54.       k1 := k1 + Rrole[Brole[i].rnum].Knowledge;
  55.     if (Brole[i].Team = Brole[bnum2].Team) and (Brole[i].Dead = 0) and
  56.       (Rrole[Brole[i].rnum].Knowledge > MIN_KNOWLEDGE) then
  57.       k2 := k2 + Rrole[Brole[i].rnum].Knowledge;
  58.   end;

  59.   //10号状态, 倾国
  60.   for i := 0 to BRoleAmount - 1 do
  61.   begin
  62.     if (Brole[i].Dead = 0) and (Brole[i].StateLevel[10] > 0) then
  63.       if Brole[i].Team = b1.Team then
  64.         k1 := k1 + Brole[i].StateLevel[10]//倾城的状态程度+原有的武常赋值给K1,应该是说倾城能增加队伍的武常吧
  65.       else if Brole[i].Team = b2.Team then
  66.         k2 := k2 + Brole[i].StateLevel[10];
  67.   end;



复制代码

花了几天业余时间,搞了个大概,明天把伤害公式总结下
bttt大大,轻功闪避的设置是啥意思呀,不是大于360的差距就打不到吧,游戏中就葵花内闪避厉害些呀
还有为什么都要{最小威力+(最大威力-最小威力)*级别}/10呀?直接最大威力*级别/10不行吗?

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2015-2-6 21:04 | 显示全部楼层
  1.   //武功伤害
  2.   //mhurt := Rmagic[mnum].Attack[level - 1];
  3.   mhurt := Rmagic[mnum].Attack[0] + (Rmagic[mnum].Attack[1] - Rmagic[mnum].Attack[0]) * level div 10;//武功伤害为该武功最大数值*武功级数/10,武功最小数值的设置还有意义吗

  4.   //内功影响武功伤害
  5.   p := 1;
  6.   p2 := 1;
  7.   p3 := 1;
  8.   p4 := 1;
  9.   for i := 0 to 3 do//把人物的四个内功一个个循环过去?
  10.   begin
  11.     neinum := Rrole[Brole[bnum1].rnum].neigong[i];
  12.     if neinum <= 0 then
  13.       break;
  14.     neilevel := Rrole[Brole[bnum1].rnum].NGLevel[i] div 100 + 1;//人物内功熟练度除100取整+1,即内功级别
  15.     if ((Rmagic[neinum].MoveDistance[0] = 6) or (Rmagic[neinum].MoveDistance[0] = Rmagic[mnum].MagicType)) and
  16.       (Rmagic[neinum].MoveDistance[1] >= Rmagic[mnum].Attack[1] div 100) then//如果内功加成是6即4系全加成,或者和武功的系别一样,且加成数值大于等于武功最大威力除以100,意思是加成数字高对大威力武功才有加成效果
  17.       p := max(p, (100 + Rmagic[neinum].movedistance[2] + (Rmagic[neinum].movedistance[3] -
  18.         Rmagic[neinum].movedistance[2]) * neilevel / 10) / 100);//p或者(100+十级加成*内功级别/10)/100取大

  19.     //特定武功加成
  20.     if Rmagic[neinum].AttDistance[4] = mnum then//如果内功加成指定武功为p2为1+0.1*内力级别neilevel,最多可以使得武功威力翻倍
  21.     begin
  22.       p2 := 1 + 0.1 * neilevel;
  23.     end;

  24.     //资质对武功加成, 段家心法
  25.     if Rmagic[neinum].AttDistance[7] > 0 then
  26.     begin
  27.       p3 := (Rmagic[neinum].AttDistance[7] * Rrole[rnum1].Aptitude) / 100;//设定的武功资质加成数值*人物资质/100不取整???
  28.     end;

  29.     //我方剩余人数加成, 神龙吟
  30.     if Rmagic[neinum].AttDistance[9] > 0 then
  31.     begin
  32.       livenum := 0;
  33.       for j := 0 to BRoleAmount - 1 do
  34.         if (Brole[j].Team = B1.Team) and (Brole[j].Dead = 0) then
  35.           livenum := livenum + 1;
  36.       p4 := 1 + livenum * 0.05 * Rmagic[neinum].AttDistance[9];//1+生存人数*0.05*设定里神龙吟加成数,说明里说会加强攻轻防,是不是其它地方还有定义?
  37.     end;

  38.   end;

  39.   mhurt := trunc(mhurt * p * p2 * p3 * p4); //数据设好之后恢复此句,武功伤害*内功加成*特定武功加成*资质加成*神龙吟加成取整数部分
  40.   //mhurt := trunc(mhurt * p);

  41.   //情侣技影响武功伤害
  42.   if Brole[bnum1].loverlevel[4] > 0 then//这句是情侣技的标示存在的情况下执行的意思吗???
  43.     mhurt := mhurt * (100 + Brole[bnum1].loverlevel[4]) div 100;

  44.   //轻功加成,猜测,内功的轻功加成是连成,100的威力*  *  *  *
  45.   if Rmagic[mnum].Attack[3] > 0 then
  46.   begin
  47.     p := (R1.Speed * (b1.StateLevel[2] + Rmagic[mnum].Attack[3]) / 100 / 500) + 1;
  48.     for i := 0 to 3 do//对4个内功进行循环
  49.     begin
  50.       neinum := R1.neigong[i];
  51.       if neinum <= 0 then
  52.         break;
  53.       neilevel := R1.NGLevel[i] div 100 + 1;
  54.       if Rmagic[neinum].MoveDistance[8] > 0 then//如果该内功有轻功加成属性则
  55.       begin
  56.         p := p * (100 + Rmagic[neinum].MoveDistance[8] + (Rmagic[neinum].MoveDistance[9] -
  57.           Rmagic[neinum].MoveDistance[8]) * neilevel / 10) / 100;
  58.       end;
  59.     end;
  60.     mhurt := trunc(mhurt * p);
  61.   end;

  62.   //内力加成
  63.   if Rmagic[mnum].Attack[2] > 0 then
  64.   begin
  65.     p := (R1.MaxMP * (Rmagic[mnum].Attack[2] + Brole[bnum1].loverlevel[5]) / 100 / 9999) + 1;
  66.     for i := 0 to 3 do
  67.     begin
  68.       neinum := R1.neigong[i];
  69.       if neinum <= 0 then
  70.         break;
  71.       neilevel := R1.NGLevel[i] div 100 + 1;
  72.       if Rmagic[neinum].MoveDistance[6] > 0 then
  73.       begin
  74.         p := p * (100 + Rmagic[neinum].MoveDistance[6] + (Rmagic[neinum].MoveDistance[7] -
  75.           Rmagic[neinum].MoveDistance[6]) * neilevel / 10) / 100;
  76.       end;
  77.     end;
  78.     mhurt := trunc(mhurt * p);
  79.   end;

  80.   //总攻击
  81.   if (Rmagic[mnum].MagicType = 5) then
  82.     att := k1 + R1.HidWeapon * 2 + mhurt div 2
  83.   else
  84.     att := k1 + R1Att + mhurt div 2;//上面计算的武常+总攻击+武功威力/2取整

  85.   //总防御
  86.   def := R2Def;

  87.   //内功影响防御
  88.   for i := 0 to 3 do
  89.   begin
  90.     neinum := R2.neigong[i];
  91.     if neinum <= 0 then
  92.       break;
  93.     neilevel := R2.NGLevel[i] div 100 + 1;
  94.     if Rmagic[neinum].MoveDistance[4] > 0 then
  95.     begin
  96.       def := def * (100 + Rmagic[neinum].MoveDistance[4] + (Rmagic[neinum].MoveDistance[5] -
  97.         Rmagic[neinum].MoveDistance[4]) * neilevel div 10) div 100;//防御*(100+防御加成*内功级别除以10)/100
  98.       if mode = 1 then
  99.         ShowStringOnBrole(pWideChar(@Rmagic[neinum].Name) + UTF8Decode('·剛體'), bnum2, 3);
  100.     end;
  101.   end;

  102.   //武常影响防御
  103.   def := def + k2;//武常不如人物防御,人物防御可以被内功加成

  104.   //攻击, 防御按受伤的折扣
  105.   att := att * (100 - Rrole[rnum1].Hurt div 2) div 100;
  106.   def := def * (100 - Rrole[rnum2].Hurt div 2) div 100;
  107.   att := max(att, 0);//确保攻击数值不为负数
  108.   def := max(def, 0);
  109.   //总公式
  110.   //result := (att - def) *2 div 3 + random(20) - random(20);
  111.   //分母仅在二者都为0时才为零, 此时认为攻击失败
  112.   if att + def > 0 then
  113.     Result := trunc((1.0 * att * att) / (att + def) / 2 + random(10) - random(10))
  114.   else
  115.     Result := 10 + random(10) - random(10);
  116.   //result := ( att * att ) div ( att + def ) div 4;
  117.   //writeln(att, ', ', def, ' ,', Result);
  118.   //距离衰减

  119.   dis := abs(b1.X - b2.X) + abs(b1.Y - b2.Y);
  120.   if dis > 10 then
  121.     dis := 10;
  122.   Result := Result * (100 - (dis - 1) * 3) div 100;

  123.   //轻功闪避
  124.   speed1 := R1.Speed * (100 + b1.StateLevel[2] + b1.loverlevel[9]) div 100;//轻功*(100+状态加的轻功+情侣状态加的轻功)除以100取整
  125.   speed2 := R2.Speed * (100 + b2.StateLevel[2] + b2.loverLevel[9]) div 100;

  126.   if (speed2 >= speed1) then
  127.   begin
  128.     p := 1 - ((speed2 - speed1) / 360);//如果轻功比对方少361的总和就必定打不到???
  129.     if (p < 0) then
  130.       p := 0;
  131.     Result := trunc(Result * p);
  132.   end;
  133. //最小伤害11,最大9999
  134.   if (Result <= 10) or (level <= 0) then
  135.     Result := random(10) + 1;
  136.   if (Result > 9999) then
  137.     Result := 9999;

  138.   //if (r2.CurrentHP - result < 0) then result := r2.CurrentHP;
  139.   //showmessage(inttostr(result));
  140.   {x50[28004] := Result;
  141.   x50[28001] := bnum1;
  142.   x50[28002] := mnum;
  143.   x50[28003] := rnum2;
  144.   //CallEvent(401);
  145.   Result := x50[28004];}//最后一段啥意思呀?

  146. end;                             
复制代码


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

伤害总结:不管特技,情侣的情况下
武器防具的攻防和自身攻防效果一样,同样享受内功加成
孤注状态最多可以达到几乎2倍的攻击
倾城状态是加强武常
有效武常的效果基本等于同数值攻防,不过不享受内功加成,所以作用很小
特定武功加成最多使武功威力翻倍,陈总舵主的加成武功垃圾,所以他的内功也是废内功,
内功对武功加成和内功级别有关,所以低等级内功除了有特效不然对武功加成很小
武功伤害为该武功最大数值*武功级数/10,在算总攻击的时候武功的设定威力是除以2,不向原版要除以3
内功轻功加成是连乘的,如果你四个武功都是加成武功威力,比如设定是40,最多可以达成
武功威力*1.4*1.4*1.4*1.4=3.84倍威力
要是有内功加成内力也加成轻功则,比如加成内力轻功都20,1.2*1.2=1.44倍
所以武功同时享受内力轻功加成的,当你都达到最大数值时候,威力吓人
内力最大值9999,轻功500,明显轻功驱动型武功合算呀
设置时候武功的轻功加成10则武功威力增加10%要最大500轻功时,100轻功只有2%的加成
当你的内功对轻功加成设置为20时,1.1*1.2=1.32威力
就是你的轻功500的时候,轻功加成为10的武功在内功对轻功加成为20时,能使你武功威力达到1.32倍
距离和原版一样最多减少27%的伤害
内伤高的时候,你的攻击可能只有一半的威力,
攻击=计算完内功加成的武功威力+人物和兵器攻击+武常
防御=人物防*内功加成+武常
攻击*攻击/(攻击+防御)/2
200的总攻击对0防御,100伤害
                     对50防御,80伤害
                    对100防御,67伤害
                   对200防御,50伤害
                   对400防御,33伤害
                  对800防御,20伤害
明显的攻击合算,防御吃亏,太高的防御对低级的攻击效果不佳,



【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2015-2-6 21:59 | 显示全部楼层
因为猪帝太懒,不设置2级到9级的数据。但是他又没懒到家或者没懒到够聪明。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2015-2-6 22:09 | 显示全部楼层
scc__ 发表于 2015-2-6 21:59
因为猪帝太懒,不设置2级到9级的数据。但是他又没懒到家或者没懒到够聪明。 ...

大大,轻功的闪避做用能解释一下吗
  if (speed2 >= speed1) then
  begin
    p := 1 - ((speed2 - speed1) / 360);//如果轻功比对方少361的总和就必定打不到???
    if (p < 0) then
      p := 0;
    Result := trunc(Result * p);
好像是超过360的差距p就为0了,取整数部分的伤害不还是0吗?
可是游戏中好像除了打东方没看到有啥miss的呀,
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2015-3-1 19:19 | 显示全部楼层
闪避我也没弄明白,好像这就是胡匪非常硬的原因。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2015-3-1 20:45 | 显示全部楼层
scc__ 发表于 2015-3-1 19:19
闪避我也没弄明白,好像这就是胡匪非常硬的原因。

是不是防守比进攻的轻功高个200,造成的伤害就只有原来的160/360=4/9了
这样就可以解释胡斐很硬了吧,设定里面是轻功最高500
可是加成按百分比加,所以600、700的轻功一定不稀罕呀
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2017-6-15 15:19 | 显示全部楼层
强势围观中
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

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

GMT+8, 2024-12-18 23:20

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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