ダメージの計算は、hiwasaさんのページに計算式が載っているんですけど、どうも違うらしい・・・ということなので、やってみました。解析は黄色でやりましたけど、他の色(赤、緑、青)もアドレスが違うだけで計算方法は同じです。



    ダメージの計算は、ROM0F:6392Hから始まるルーチンで基本的な部分を計算して、その次に呼ばれる ROMF:681BH でタイプ別(「こうかはばつぐんだ」とか)の処理をしてます。 解説付き逆アセンブルリスト(6392H)

    この計算で使われるのは、自分と相手の能力(ノーマル攻撃なら「こうげき」と「まもり」、特殊攻撃なら「とくしゅ」)と、技の威力、自分のレベル です。処理の流れは、こんな感じです。

      (1)このルーチンが呼ばれた時、次のパラメータがすでに前のルーチンで読まれています

        B=自分の能力 C=相手の能力 D=技の威力 E=自分のレベル
        P=出した技 Q=技のタイプ R=技の威力 S=なんでしょ(^^;

        ※B〜Eはレジスタの値そのまま。P〜Sは実際は(CFB9)〜(CFBC)の内容
         また(FFF3)=0 なら、こっちの攻撃。=1 なら相手の攻撃

        ※※クリティカル(きゅうしょにあたった!)の場合は、このすぐ前のルーチンで、E(レベル)の値が2倍されます

      (2)攻撃する技のタイプ(Q)の値で条件判断

        Q=7 ならC=C÷2 C=0になってしまったら C=1
        (↑「じばく」「だいばくはつ」の場合で相手の守りを半分にしてます)

        Q=1D or 1EH なら 前回(3)で計算した値をクリアしない(連続攻撃ってことかな)
        Q=26H なら相手を倒した処理(「いちげきひっさつ」)

      (3)次の計算をします(※注意 わり算の小数点以下は切り捨て)

        z=E×2
        z=z÷5
        z=z+2
        z=z×D
        z=z×B
        z=z÷C
        z=z÷32
        [ダメージ]=z (実際のアドレスは(D0B4,5H)です
        [ダメージ]>997 なら[ダメージ]=997 [ダメージ]=[ダメージ]+2

        なので計算式で書くとすれば、こうなります:

        [ダメージ]= int[ int{ int( 自分のレベル *2 /5 +2) *自分の能力 *技の威力 /相手の能力 } /50 ] +2

        ※ int は割り算の結果の整数部分だけとるという意味です

      (4)ここからは、ROMF:681BHです。技、ポケモンのタイプによるダメージ値の変更をします

        B,C=攻撃する方のポケモンのタイプ  D,E=守る方のポケモンのタイプ

        出した技のタイプが、そのポケモンのタイプと同じなら [ダメージ]=[ダメージ]×1.5

      (5)相性表サーチ 自分の出した技と相手のポケモンのタイプが表に載っている関係の時は、下の処理をする

        [ダメージ]= int ( [ダメージ]×表にあるタイプ別倍率 ÷ 10 )

        計算の結果が 0 になってりまったら → 「こうげきははずれた」の処理

        ※このルーチンは相手のポケモンのタイプが2つあって、2つともリストにあれば2回やってきます

        ダメージの表 (よくあるやつです順番に 技のタイプ、守る側のタイプ、倍率)

        15 14 14  14 16 14  14 19 14  16 15 14  17 15 14  15 05 14  04 02 00
        15 15 05  14 14 05  17 17 05  19 19 05  16 16 05  18 18 05  14 15 05
        16 14 05  15 16 05  17 16 05  00 05 05  00 08 00  08 08 14  14 07 14
        14 05 05  15 04 14  17 04 00  17 02 14  16 04 14  16 07 05  16 03 05
        16 05 14  16 02 05  19 15 05  19 16 14  19 04 14  19 02 14  01 00 14
        01 03 05  01 02 05  01 18 05  01 07 05  01 05 14  01 19 14  01 08 00
        03 16 14  03 03 05  03 04 05  03 07 14  03 05 05  03 08 05  04 14 14
        04 17 14  04 16 05  04 07 05  04 05 14  04 03 14  02 17 05  02 01 14
        02 07 14  02 16 14  02 05 05  18 01 14  18 03 14  07 14 05  07 16 14
        07 01 05  07 02 05  07 18 14  07 08 05  07 03 14  05 14 14  05 01 05
        05 04 05  05 02 14  05 07 14  05 19 14  08 00 00  08 18 00  14 1A 05
        15 1A 05  17 1A 05  16 1A 05  19 1A 14  1A 1A 14  FF

        倍率はなぜか14,05,0 の3種類。要するにダメージ倍、半分、なし だけ

      (6)次のランダムに作った係数をかけて、最終的に敵に与えるダメージとします

        ダメージ(D0B4,5)=ダメージ*(217〜255のランダムな数字)/255

        なので敵に与えるダメージは 〜(5)で計算した値の85.1%〜100%の間になります。
        まぁ、だいたいは目減りするわけですね。

        この計算がされるのは、 〜(5)で計算したダメージが02FFH(=767)以下の場合です。>768の場合は、この処理は飛ばされて 〜(5)計算した値がそのまま使われます

最終的にダメージの値はこうなります。

[ダメージ]= (((((( 自分のレベル *2 /5 +2) *自分の能力 *技の威力 /相手の能力 ) /50 ) +2 ) * X ) * Y /10 ) * Z / 255

    X:自分のタイプ=技のタイプ なら X=1.5 それ以外の時 X=1
    Y:タイプによる相性 20(こうかはばつぐん) 5(あまりこうかがない) 0(こうかがない) リストに無いときは Y=10
    Z:217〜255のランダムな数字 前の()内の数字が768以上の時はz=255
    自分(相手)の能力は:ノーマル攻撃なら(自分の攻撃力)と(相手の防御力)、特殊攻撃なら(自分の特殊能力)と(相手の特殊能力)

    クリティカルの時は(自分のレベルは、その2倍の値で計算します)




戻る