铁血丹心

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

請問傷害公式把左邊的括號要如何移到右邊去(只移到所使用武學攻擊)

[复制链接]
发表于 2012-3-24 11:36 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 jerry8192 于 2012-3-25 17:12 编辑

原版中︰
攻擊防禦之差=
[攻方武學常識之和*2+(攻方人物基本攻擊*3+所使用武學攻擊)*(1/2)+武器裝備加成+武功武器配合加成]
-(守方有效武學常識之和*2+守方人物基本防禦+武器裝備加成)*3
實際傷害=攻擊防禦之差*2/3+隨機攻擊(<20)-隨機防禦(<20)
要如何改成(就是紅色的地方)
攻擊防禦之差=
[攻方武學常識之和*2+攻方人物基本攻擊*3+(所使用武學攻擊*1/2)+武器裝備加成+武功武器配合加成]
-(守方有效武學常識之和*2+守方人物基本防禦+武器裝備加成)*3
實際傷害=攻擊防禦之差*2/3
就是這裡
000392D2: 8D 14 38 lea edx,[eax][edi],我改了好幾次就不行,那肯定是機器碼問題!
比如攻方人物基本攻擊=200;所使用武學攻擊=2000(野球拳);守方人物基本防禦=200
修改前的實現
實際傷害=[(200*3+2000)*(1/2)-(200*3)]*2/3=466
要如何改成這樣的實現
實際傷害=[200*3+(2000*1/2)-(200*3)]*2/3=666
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2012-3-24 17:49 | 显示全部楼层
本帖最后由 jerry8192 于 2012-3-25 23:56 编辑

回复 winson7891 的帖子

DOS 版用 IDA 5.5 按下 F5 後的結果[code]// 计算武功对敌人伤害生命值
void __fastcall war_WugongHartLife(int a1, int edx0, int a3, int a4, __int16 mywarid, int a2, __int16 personid, __int16 emenyID, __int16 PersonWugong, __int16 Juli)
{
  signed __int64 v10; // qax@1
  int i; // ebx@1
  int v12; // esi@1
  signed int j; // ebx@10
  int v14; // ecx@15
  int v15; // ebx@15
  int v16; // eax@17
  signed __int64 v17; // qax@19
  int v18; // ebx@19
  signed __int64 v19; // qax@23
  int v20; // ebx@23
  signed int v21; // edi@23
  int v22; // ebx@23
  int v23; // eax@23
  int v24; // ebx@23
  int v25; // edx@23
  int v26; // ecx@23
  int v27; // edx@24
  int v28; // edi@24
  int v29; // eax@24
  int v30; // edi@24
  int v31; // edx@24
  int v32; // ecx@24
  int v33; // ebx@26
  unsigned int v34; // eax@27
  unsigned int v35; // ebx@27
  __int16 v36; // bx@27
  signed __int64 v37; // qtt@27
  unsigned int v38; // eax@28
  unsigned int v39; // ecx@28
  int v40; // eax@33
  int v41; // ecx@33
  signed __int64 v42; // qax@35
  int v43; // ecx@35
  signed __int64 v44; // qax@37
  int v45; // ecx@37
  int v46; // ecx@37
  int v47; // edi@37
  int v48; // eax@39
  int v49; // eax@41
  int v50; // [sp+4h] [bp-10h]@1

  LODWORD(v10) = check_stack(a1, edx0, a3, a4, 0x1Cu);
  v12 = 0;
  v50 = 0;
  word_E6EC2 = 0;
  for ( i = 0; (_WORD)i < word_556D2; ++i )
  {
    HIDWORD(v10) = 28 * (signed __int16)i;
    LODWORD(v10) = 182 * *(__int16 *)((char *)word_DC72C + HIDWORD(v10));
    if ( *(__int16 *)((char *)word_901BA + v10) > 80 )
    {
      if ( *(__int16 *)((char *)word_9016E + v10) > 0 )
      {
        if ( !*(__int16 *)((char *)word_DC736 + HIDWORD(v10)) )
        {
          if ( *(__int16 *)((char *)word_DC72E + HIDWORD(v10)) == word_DC72E[14 * mywarid] )
          {
            LODWORD(v10) = 364 * *(__int16 *)((char *)word_DC72C + HIDWORD(v10));
            v12 += v10;
          }
          else
          {
            LODWORD(v10) = 364 * *(__int16 *)((char 因為我家網路瀏覽速度過慢,所以帖子會變成這樣!誰來幫我?
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-3-24 17:08 | 显示全部楼层
复刻看源码

DOS版不知道,不过应该也很困难
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-3-29 15:38 | 显示全部楼层
本帖最后由 weyl 于 2012-3-29 15:44 编辑

dseg02:000392C5                 movsx   edx, ds:word_230056[ecx] ; 攻击
dseg02:000392CC                 mov     eax, edx
dseg02:000392CE                 shl     eax, 2
dseg02:000392D1                 sub     eax, edx
这个部分是先移位再减一次,相当于乘3,直接把后两句改成
imul eax,6
就相当于你所需的效果
如果指令长不够可以从这几句变通一下,总之就是利用一些间接技巧

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

回复 weyl 的帖子

dseg02:000392CC                 imul    eax, edx, 1
dseg02:000392D2                 mov     edx, edi
dseg02:000392D4                 add     esi, eax
dseg02:000392D6                 imul    dx, 2  *2(分子)
dseg02:000392DA                 call    sub_54590
dseg02:000392DF                 mov     ebx, eax
sub_54590
dseg02:00054590                 mov     ebx, 5 /5(分母)
dseg02:00054595                 mov     eax, edx
dseg02:00054597                 sar     edx, 1Fh
dseg02:0005459A                 idiv    ebx
dseg02:0005459C                 retn

DOS 版源碼(從 IDA 6.1 擷取)
  v14 = 91 * a3;
  v11 = *(_WORD *)((char *)&dword_901A2 + v14 * 2);攻擊力
  v12 = *(&word_9F5FE[68 * *(__int16 *)((char *)&word_901CA[a5] + v14 * 2)] + word_E6EC2);
  v13 = v11 + v6;
  LOWORD(v12) = 2 * v12;
  v15 = sub_54590(v11, v12);

int __fastcall sub_54590(int a1, signed int a2)
{
  return a2 / 5;
}

[攻方武學常識之和*2+攻方人物基本攻擊*3+(所使用武學攻擊*2/5)+武器裝備加成+武功武器配合加成]
-(守方有效武學常識之和*2+守方人物基本防禦+武器裝備加成)*3
實際傷害=攻擊防禦之差*2/3
因為 DOS 版的確非常難搞,採用移花接木法就 OK!
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

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

GMT+8, 2024-12-19 02:07

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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