トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

ダメキャンめも

ベータ版として仮公開。「自分の経験と食い違うよ」などあれば、意見下さると助かります。

  • 06/05/19 3人以上の場合を加筆

基礎原理

雑魚エネミーの「状態」の扱い

ボス以外のエネミー(中ボスを含む)の「状態」は全ての(正確にはそのエリアにいる)クライアントがそれぞれ別に管理している。このため、すべてのクライアントで一貫した敵の「状態」というものは存在しない。敵の残りHPでさえ、クライアントによって違うことが十分にありうる。そこで、ある程度いい加減な手段を使って擬似的に同期を取っているように見せかけている。なお、ここでいう「状態」とは次のものを示す。

  • HP
  • ステータス異常(凍結・麻痺・感電など)

ちょっと厳密に

このページで関係するエネミーの状態は次の2つ組で表される。

(HP, S)

ここで、HPはエネミーのHPを表す整数、Sはステータス異常を表す集合で、

S ⊆ {死亡, 混乱, 凍結, 麻痺, 感電, ジェルン(LV), ザルア(LV), ...}

である。なお、各クライアント内部では、凍結やジェルンなどの残り持続時間も別に保持してる。

自クライアントでの状態変化の扱い

自クライアントで次のことが起きると状態が変化したこととなる。

  • 自キャラによる通常攻撃(N/H/E)やダメージテクニックの命中
    • 与えたダメージ分、HPの値が差し引かれる
    • 0ダメージの場合も含む
    • 半減系や吸収系などのEXによるHP変化も含む
    • dtによるダメージを含む
    • MISSは含まない
  • 自クライアント上の混乱エネミーの攻撃
    • MISSや0ダメージの扱いは自キャラの場合と同様
    • 自クライアント上の非混乱エネミーの攻撃(ベルラや馬)に関しては未調査
      • ベルラパンチ一発で複数クライアント分のダメージが入ることあったっけ?
    • 皿のレスタの扱いが不明
      • 一発で2〜4クライアント分回復されることってある?
  • ジェルン/ザルア
    • LVが低くて逆ジェルン(=シフタ)を打ち消せない場合については未調査
  • 自キャラ・他キャラが置いたステータス異常トラップ(ftやct)の発動効果
    • 自キャラだけではなく、他キャラのものも、自クライアントでの状態異常として扱う

なお、これらの状態変化によってHPが0以下になった場合は、死亡のステータス異常が付加され、即座に画面上では死亡した表示がされる。

状態変化が起きたとき、自クライアントで管理している状態(残りHPとステータス異常)を他クライアントにそのまま送信する。ただし、自クライアント内で完全に同じフレームで同時に複数の状態変化が起きた場合(トラップの発動にNが重なったり、gfの遅延ダメージがほかのものと重なったり)、これらはまとめて他クライアントに送信される。

ちょっと厳密に

状態(HP, S)だったエネミーの状態は、状態変化によって次のように変化する。

  • ダメージdを受けた場合
HP - d > 0 のとき、(HP - d, S)
HP - d <= 0 のとき、(0, {死亡})
  • 状態異常sを受けた場合
(HP, S ∪ {s})

他クライアントでの状態変化の扱い

他クライアントから状態情報が送られてきた場合、まず、それに死亡情報が入っていれば、即座に死亡したものとみなして、自分の画面上でも死亡した表示をする。自クライアントですでに死亡したことになっていたのであれば、何もしない。

死亡情報が入っていなかった場合、次のように自クライアントでの状態を書き換える。

  • HP情報
    • HPは、送信されてきたHP情報で上書きする
  • ステータス異常情報
    • 元にあったステータス異常情報と送信されてきたステータス異常情報とで、どっちかにでもあれば、そのステータス異常であるとする
    • シフタとジェルンなどで相反するものの場合、どちらを優先するかは未調査
    • 元のステータス異常情報になく、送信されてきたステータス異常情報にあるステータス異常は、そのステータス異常のタイマーをリセットする(時間を最大に戻す)

ちょっと厳密に

状態(HP, S)であるところに、状態(HP', S')が送信されてきた場合、次の状態に更新される。

(HP', S ∪ S')

ただし、S' - Sに含まれるステータス異常があった場合、対応するタイマーがリセットされる。

ダメージキャンセルの実例

クライアントAとBがおり、一体のエネミーがいたとする。これに、両クライアントのキャラAとBがともに攻撃を仕掛け、それぞれのダメージが40と70だととする。

両キャラがタイミングをずらして攻撃したとき

次のような順番で「状態」の変化がおきる。エネミーの初期HPを100とする。

  1. Aがダメージ40を与える。
    • AでのHPが 100 - 40 = 60 に変化する。
    • HP=60を他クライアントに送る。
  2. BがHP=60を受信する。
    • BでのHPも 60 となる。
  3. Bがダメージ70を与える。
    • BでのHPが 60 - 70 = -10 に変化する。
    • 死亡しているので、Bの画面上で倒した表示。
    • 死亡通知を他クライアントに送る。
  4. Aが死亡通知を受け取る
    • Aの画面上で倒された表示。

このように、タイミングをずらして攻撃すれば、厳密に言うと、上記の2と3の順番がひっくり返らなければ、ダメージキャンセルは起きない。

両キャラの攻撃のタイミングが(ほぼ)同時のとき

次のような順番で「状態」の変化がおきる。エネミーの初期HPを200とする。

  1. Aがダメージ40を与える。
    • AでのHPが 200 - 40 = 160 に変化する。
    • HP=160を他クライアントに送る。
  2. Bがダメージ70を与える。
    • BでのHPが 200 - 70 = 130 に変化する。
    • HP=130を他クライアントに送る。
  3. BがHP=160を受信する。
    • 更新後のHPは 160 となる。
    • さっきの自分の与えたダメージ70が無効化されている。
  4. AがHP=130を受信する。
    • 更新後のHPは 130 となる。
    • さっきの自分の与えたダメージ40が無効化されている。

このように、ダメージキャンセル、正確には、ダメージの回復現象が起きる。

さらに、ここで問題となるのが、両クライアントにおけるHPが異なるということである。この状況でさらに、Bが弱めの攻撃をして20のダメージを与えたとする。

  1. Bがダメージ20を与える。
    • BでのHPが 160 - 20 = 140 に変化する。
    • HP=140を他クライアントに送る。
  2. AがHP=140を受信する。
    • 更新後のHPは 140 となる。

これで、さらにAでのHPが回復したような結果となる。

少し戻って、再びAでのHP130、BでのHP160 の状況を考え、両者がほぼ同時攻撃をしたとする。

  1. Aがダメージ40を与える。
    • AでのHPが 90 に変化する。
    • HP=90を他クライアントに送る。
  2. Bがダメージ70を与える。
    • BでのHPが 90 に変化する。
    • HP=90を他クライアントに送る。
  3. BがHP=90を受信する。
    • 更新後のHPは 90 となる。
  4. AがHP=90を受信する。
    • 更新後のHPは 90 となる。

このように、両者のHPは揃うことになり、その見かけのダメージ合計値は110と、本来の半分となる。言い換えると、ほぼ同時の攻撃は長期的に見ると平均化される

罠による誘爆

エネミーに対し、ft→dtの順で罠を置いたとする。ftが発動し、dtが誘爆されたときのことを考える。エネミーの初期HPを100、dtによるダメージを50とし、2クライアントはAとBを考える。罠を置くのはAとする。

  1. Aでftが発動する。
    • 状態(100, {凍結})を他クライアントに送る。※これのBによる受信は省略
  2. Bでftが発動する。
    • 状態(100, {凍結})を他クライアントに送る。
  3. Aが(Bから送られてきた)状態(100, {凍結})を受信する。
    • 更新後の状態は、状態(100, {凍結})となる。
  4. Aでdtが誘爆する。
    • ダメージ50によって、状態(50, {凍結})に変化する。
    • 状態(50, {凍結})を他クライアントに送る。
  5. Bが状態(50, {凍結})を受信する。
    • 更新後の状態は、状態(50, {凍結})となる。

この場合、ダメージキャンセルは起きていない。しかし、誘爆の間隔は短いため、ラグが大きい場合、次のようにもなりうる。

  1. Aでftが発動する。
    • 状態(100, {凍結})を他クライアントに送る。※これのBによる受信は省略
  2. Bでftが発動する。
    • 状態(100, {凍結})を他クライアントに送る。
  3. Aでdtが誘爆する。
    • ダメージ50によって、状態(50, {凍結})に変化する。
    • 状態(50, {凍結})を他クライアントに送る。
  4. Aが(Bから送られてきた)状態(100, {凍結})を受信する。
    • 更新後の状態は、状態(100, {凍結})となる。
  5. Bが状態(50, {凍結})を受信する。
    • 更新後の状態は、状態(50, {凍結})となる。

こうなるとdtを置いたAは状態(100, {凍結})であり、dtのダメージ分が完全に回復してしまっている。

この現象は、ftやctなどの状態変化トラップのみでおきることで、一人で出したdt→dtへの誘爆では起きない(当然、他人の出したdtとの間ではダメージキャンセルは起きうる)。

ダメージキャンセルのキャンセル

マシンガン系のような攻撃間隔の小さい武器と、セイバー系などの単発武器とでほぼ同時に攻撃することを考える。プレイヤーAとBがおり、Aはマシンガン系(一発50ダメージ)で、Bはセイバー系(一発110ダメージ)で攻撃を繰り返すとする。エネミーのHPは1000とする。

  1. Aがダメージ50を与える。
    • AでのHPが 1000 - 50 = 950 に変化する。
    • HP=950を他クライアントに送る。
  2. Bがダメージ110を与える。
    • BでのHPが 1000 - 110 = 890 に変化する。
    • HP=890を他クライアントに送る。
  3. BがHP=950を受信する。
    • AでのHPが950になる。
  4. AがHP=890を受信する。
    • AでのHPが890になる。

ここまでは通常のダメージキャンセルであり、互いに相手のダメージをキャンセルしてしまっている。ここで、Aはマシンガン系で攻撃間隔が小さいため、次のダメージはAが与えることとなる。よって、

  1. Aがダメージ50を与える。
    • AでのHPが 890 - 50 = 840 に変化する。
    • HP=840を他クライアントに送る。
  2. BがHP=840を受信する。
    • AでのHPが840になる。

のようになり、AとBともにHPが840となる。これは、Aの攻撃が一回だけキャンセルされた計算であり、一旦キャンセルされたBの110ダメージはちゃんと通っている計算になる。ダメージキャンセルが全くないわけではないが、最も恐ろしい、間隔が長く一発の大きいBのダメージが無効になるという事態にはなっていない。

マシンガン系でHHHをした場合、攻撃間隔は、最長の1段目から2段目へのつなぎでも11フレーム程度である。これに対し、セイバー系HHHでは、最短の2段目から3段目へのつなぎでも17フレーム程度ある。つまり、通常はダメージキャンセルのキャンセルが起きる前にセイバー系のダメージが割り込むことはなく、最終的にセイバー系でのダメージは有効になることがほとんどである。

ただし、気をつけねばならないのは、マシンガン系での3段目Hから次の1段目Hへのつなぎの間隔は非常に大きいことである。この間隔ではダメージキャンセルをキャンセルする前に、容易にセイバー系が割り込んでしまい、ダメージが無効になる。

3人以上の場合

3人以上で同一のエネミーにダメージを与える場合を考えると、事情は非常に複雑になる。今、プレイヤーA,B,Cの3人がいるする。現象をわかりやすくするために、極端な場合を考え、Aはマシンガン系でNNN(一発0ダメージ)、BとCはセイバー系でHHH(一発100ダメージ)を繰り返しているとする。つまり、ほぼずっとマシンガンの0ダメージによる通信が起きている状況である。

前述のとおり、マシンガンそれそのもののダメージは、他のダメージをキャンセルするということは少ないため、BやCの攻撃がAによって直接キャンセルされることはあまりないと考えてよい。

実際にこの状況をシミュレートしてみる。敵の初期HPは1000とする。なお、Aのダメージによる通信は、必要なものを除いて省いている。

まず、BとCだけの状況でダメージキャンセルが起きない場合を考えると、

  1. Bがダメージ100を与える。
    • BでのHPが900に変化する。
    • HP=900を他クライアントに送る。
  2. CがHP=900を受信する。
    • 更新後のHPは900となる。
  3. Cがダメージ100を与える。
    • CでのHPが800に変化する。
    • HP=800を他クライアントに送る。
  4. BがHP=800を受信する。
    • 更新後のHPは800となる。

のようになる。この場にAがいた場合、次のようになる可能性が出てくる。

  1. Bがダメージ100を与える。
    • BでのHPが900に変化する。
    • HP=900を他クライアントに送る。
  2. AがHP=900を受信する。
    • 更新後のHPは900となる。
  3. CがHP=900を受信する。
    • 更新後のHPは900となる。
  4. Aがダメージ 0 を与える。
    • AでのHPが900に変化する。
    • HP=900を他クライアントに送る。
  5. Cがダメージ100を与える。
    • CでのHPが800に変化する。
    • HP=800を他クライアントに送る。
  6. CがHP=900を受信する。
    • 更新後のHPは900となる。

このように、C上ではさきほどは起きなかったダメージキャンセルが起きてしまっている。もちろんこの後、

  1. CがHP=900を受信する。
    • 更新後のHPは900となる。
  2. BがHP=800を受信する。
    • 更新後のHPは800となる。

のようにBは影響を受けないこともあるが、ラグの大きさなどを考慮に入れると、ダメージキャンセルが起きる頻度が上がっている。

要するに、この状況においてAが攻撃することで、BとCの間のラグの大きさがおおよそ2倍になっているような状況となり、ダメージキャンセルを引き起こすタイミングが増えてしまっている、と考えられる。

ここでの例はマシンガンのダメージが0と仮定した極端な仮定であるが、マシンガンのダメージがそれなりに大きい場合でも、他の二人のダメージ同士がキャンセルするのを助長するのは同じである。実際にどの程度の影響が出るかどうかは、ラグ・攻撃タイミング・ダメージ量の比など、さまざまな要因に左右されるので、一概にマシンガンで攻撃することが良いかどうかは言うことができない。

実際どの程度なのかは調査中。。。

要するにダメージキャンセルって?

よく言われるような「ほぼ同時攻撃した場合、どちらか一方のダメージしか入らない」というのは、厳密には間違いである。そもそも「正にこれがエネミーのHP」といえるものは存在せず、各クライアントが別々にHPを管理しているからである。プレイヤーにとって表立って見ることができるのは「HPが0以下になることによって敵が倒れた」というものだけであるし、関心があるのもその部分だけである。

よくある誤解

次にあげるものは、ダメージキャンセルに関するよくある誤解である。

  • ×同時攻撃はダメージキャンセルし、小さいほうのダメージが適用される
    • すべてのダメージは一旦は必ず適用される
    • ただし、通信の関係上、ダメージを与えた事実が後に無効にされることがある
    • しかも、クライアントによって無効にされるダメージも異なる
  • ×遠距離攻撃のダメージが優先される
    • まったく根拠なし
  • ×一つの攻撃は一つのダメージキャンセルを引き起こす
    • ラグが大きい場合、間隔の小さな攻撃は同時にキャンセルされうる
    • Nで55、Hで100与えられる攻撃で、HP200の敵にNNHをした際に、一発100のテクニックが割り込んだような場合にも、2回キャンセルされて倒しきれないことがありうる
  • ×マシンガンは他のダメージをキャンセルしやすい
    • 確かにしやすいが、すぐに相手クライアントでのHPも上書きしなおすため、意外と影響しにくい
    • ただし、他のダメージ同士をダメージキャンセルさせやすくする

事実と回避法

  • トドメの攻撃は決してダメージキャンセルされない
    • ダメージが無効になる前に死亡したことになる
    • ct→dt複数 などの誘爆も、それがトドメになるならまったく問題ない
  • ダメージキャンセル回避に攻撃をずらすときは、相手のダメージが表示された直後に自分のダメージが入るようにする
    • このタイミングがもっとも通信の交差がおきにくい
    • 逆に、相手のダメージの表示される直前に自分のダメージが入ると、ほぼ確実にキャンセルする
    • つまり、二人そろって攻撃タイミングを遅らせたりすると悲惨
    • ずらすときは、どちらか一人にする
  • 武器の攻撃間隔の小ささは、ダメージキャンセルされやすさ
    • 他のダメージのキャンセルのしやすさではない
    • マシンガン系それそのものは、ダメージキャンセルをあまり引き起こさないが、3人以上で集中攻撃した場合は、他2人のダメージ同士をキャンセルさせやすくしてしまう

その他の通信に起因する現象

無限凍結

通常、凍結は約5秒間経つと解除されるが、次のような通信が起きた場合、凍結し続ける。プレイヤーA,BとHP100のエネミーを考える。

  1. AがEXアイスを命中させる。ダメージは0。
    • Aでの状態(100, {凍結})で、凍結タイマー残り5秒。
    • 状態(100, {凍結})が他クライアントに送られる。
  2. Bが状態(100, {凍結})を受信する。
    • Bでの状態(100, {凍結})で、凍結タイマー残り5秒。
  3. 5秒経過直前に、Bでダメージ50を与える。
    • Bでの状態(50, {凍結})になる。
    • 状態(50, {凍結})が他クライアントに送られる。
  4. Aで5秒経過し凍結が解ける。
    • Aでの状態(50, {})になる。
  5. Bで5秒経過し凍結が解ける。
    • Bでの状態(50, {})になる。
  6. Aが状態(50, {凍結})を受信する。
    • Aでの状態(50, {凍結})になり、新しく凍結したとみなされ、凍結タイマー残り5秒。
  7. Aでダメージ20を与える。
    • Aでの状態(30, {凍結})になる。
    • 状態(30, {凍結})が他クライアントに送られる。
  8. Bが状態(30, {凍結})を受信する。
    • Bでの状態(30, {凍結})になり、新しく凍結したとみなされ、凍結タイマー残り5秒。

このように、凍結の解ける寸前にダメージを与えることで、凍結時間を初期化し延長することができる。これは、混乱や感電などでも同様のことができる(ジェルン等でも恐らくできると考えられるが未確認)。

混乱エネミーによる多重攻撃

混乱エネミーによる攻撃は、各クライアントで処理され、通信としては、それぞれのプレイヤーが与えたダメージと同じように扱われる。つまり、4人でプレイしていれば、4クライアントでそれぞれダメージを与える処理がなされており、合計して本来の4倍のダメージが入ることになる。実際は、エネミーの攻撃同士のタイミングが近いことから、ダメージキャンセルによって3倍前後におさえられてしまうことが多いが、それでも非常に強力なダメージ元になる。この効果は互いの攻撃などによるのけぞりによって大幅に減ってしまうため、イカなどののけぞりの長いエネミーや、直接近接攻撃をしないベルラなどにディメニアンをぶつけるなどが効果が大きい。また、一方を凍結させてしまえば、のけぞりはなくなるので、ゾア2の一方を混乱させ、もう一方を凍結させて殴らせると、パンチ1セットで沈めるようなことも可能である。

このページで使用されている画像の一部は(株)ソニックチームの許諾を得て、ニンテンドーゲームキューブ用ゲーム「ファンタシースターオンラインエピソード1&2」よりキャプチャーしたものです。配布や再掲載は禁止されています。

(C) SONICTEAM / SEGA, 2000, 2002, 2003.