基礎知識
戦闘関係
戦闘における行動順やターンについて、もう少し突っ込んだ話をここに記しておく。
以下は、先に▶ターンを読んでいただいていることを前提としている。
また、世界の合言葉は森部様、ZsnsK's F**kin' Site様の内容をほぼ転載しているようなものだが、一応、プログラミング関係の知識がなくてもわかるように努めたつもりである(筆者もプログラミングのことはよくわからない)。
とはいえ、ある程度の数学の知識が必要になることをご了承いただきたい。
▶プログラミング関係の表記及び解説にも、一通り目を通してから御覧いただきたい。
行動順を理解する上で重要なのは、
この3つである。
戦闘中は、敵味方共通の値である行動ポイントが増減することで、味方ターンと敵ターンが切り替わっている、と▶ターンで説明した。
というのが基本的な仕組みである。
ただし例外として、敵の場合、「何かの行動を取ると、行動ポイントの値に関わらず停止して、敵ターンが終わる」ようになっており、上の2.より優先される。
味方が技を出すかアイテムを使う(アイテム使用も実際は技扱いである)と、行動ポイントが510増加する。
このため、味方が技を出すと、行動ポイントが必ず255以上になって、敵ターンに切り替わる。
上に書いた例外に従い、敵は敵ターンで「1マス移動か、向き変えか、技を出す」と、必ず敵ターンが終わって味方にターンが周る仕組みになっている。
敵ターンでは、敵が取った行動に従い、行動ポイントが必ず「減少」する。
敵が移動または向き変えをした時は、行動ポイントは最大でも64しか減らない。
味方の行動で510増加→敵の移動または向き変えで64減ったとしても、行動ポイントは255以上のはずだから、本来なら敵ターンが続いてしまうはず。
だが、上に書いた通り、敵の場合は何かの行動後は行動ポイントに関係なく停止し、味方ターンが周る。
味方ターンでは、「行動ポイントが255を越えると敵ターンとなる」法則通りに、味方の行動で行動ポイントが255を越えたら、また敵ターンになる。
敵が移動または向き変えをした後だと、上に記した通りに、そもそも味方ターンに回った時、既に255を越えている。
このため、味方が移動か向き変えなど、何か行動をした途端に敵ターンに回ってしまうのである。
これが、「敵と距離を離そうとしてもぴったり後をくっついてくる」などの現象の正体である。
一方で、敵ターンで敵が何かしらの技を出して行動ポイントが16以上128未満になった状態で味方ターンになると、行動ポイントが255を越えるまで余裕がある。
よって味方ターンにて、「何マスか移動した後、敵を攻撃する」といった行動が可能になるのである。
以下で細かい計算について記しておく。
「敵ターンで敵が何かしらの技を出したら、行動ポイントは16以上128未満になる」のだが、敵が技を出した後の行動ポイントは、以下のように計算される。
プログラミングの知識がないとわかりにくいため解説するが、面倒なら飛ばしてもらって構わない。
「ビット演算」(ビット演算 - Wikipedia)というのはデータをビット列、つまり2進法で記した場合での演算である。
▶プログラミング関係の表記及び解説 > ビット演算も参照。
2進法は0と1で数値を表示する。
0と1しか使えないため、10進法の「2」を表したい場合は2ケタ目を使って、2進法だと「10」になる。
この理屈でケタ数がどんどん増えて、2進法の「1000」は10進法の「8」、2進法の「10000」は10進法の「16」に当たる。
人間側にはケタばかり増えて見辛いのだが、コンピュータ側では0と1のみ、言い換えると「OFF」と「ON」だけで数値が表現できることは都合が良い。
とはいえ0と1の羅列ではプログラミングをする側の人間には都合が悪いことと容量を食うことから、2進法ではなく16進法を使っているのが、スーパーファミコンのゲームのプログラムである。
スーパーファミコンのデータは16進法(十六進法 - Wikipedia)で表記されており、16進法は0~9,A,B,C,D,E,Fの16文字を使って1ケタ分の数値を表す。
16進法の1文字分に、2進法の4文字分(4ケタ分)がちょうど収まるようになっている。
2進法の「1111」は10進法の「15」であるが、16進法なら「F」の1文字だけで表すことができるのである。
長々と記したが、ビット演算は、この「2進法の4ケタ分データ」を操作するのに都合が良い、と考えていただきたい。
上に記した通りに、0と1で記録されたデータは「OFF」と「ON」のデータでもあるので、「OFF」状態を「ON」に変える、またはその逆を実行して、ゲームで様々な動作を実行させている。
話を行動ポイントの計算式に戻す。
111の2進数は「1101111」、
行動ポイントが、味方が1回技を出した後の「510(10進数)」とすると、2進数では「111111110」である。
その「論理積」というのは、これら2進数表記での「それぞれの桁を比較し、どちらも1なら1、それ以外は0になる計算」と考えていただきたい。
先に記した「OFF」と「ON」の話を用いると、「ONの共通部分はONのまま、それ以外は片方がONであったとしてもOFFに切り替える計算」である。
以下表を縦方向に見るとわかりやすいと思う。
510の2進数 | 111111110 |
111の2進数 | 001101111 |
論理積 | 001101110(10進数だと110) |
「論理和」は2進数表記での「それぞれの桁を比較し、どちらも0なら0、それ以外は1になる計算」と考えていただきたい。
「OFF」と「ON」の話を用いると、「ONの共通部分はONのまま、どちらかがONならONに切り替え、どちらもOFFならOFFのままにする計算」である。
「110 | 16」は、
110の2進数 | 01101110 |
16の2進数 | 00010000 |
論理和 | 01111110(10進数だと126) |
以上より、
510 & 111 | 16 = 126よって、行動ポイントが510の時に、敵が技を出すと、その後の行動ポイントは126まで落ちる。
ということになる。
と、計算式を書き連ねてきたが、あくまでも理屈はこうだというだけであり、難しく考えすぎる必要はないし、手計算もわざわざやる必要はない。
人間がせっせと計算するとただ面倒なようにしか見えないが、プログラミングにおいては高速処理かつ容量の節約のテクニックになるのである。
なお、プログラミングができる環境でなくても、ビット演算ができる電卓、例えばWindows付属(Windows 10以降)の電卓なら機能をプログラマー向け電卓に切り替えて、
510 AND 111 OR 16 =
と打ち込めば計算してくれるし、ExcelやLibreOffice Calc、Google スプレッドシートなどの表計算ソフトなら、セルに、
=BITOR(BITAND(510,111),16)
と、計算式を入力すれば計算してくれる。
おまけ:
(敵が技を出した時の行動ポイント) & 111 | 16を計算するフォームは以下。
0~65535の整数のみ入力できます
結局、上の計算でいったい何が行われたのかというと、
(敵が技を出した時の行動ポイント) & 111
は値が必ず0以上111以下になり、
(0以上111以下の数値) | 16
は値が必ず16以上127以下になる。
そういう計算で行動ポイントを減少させたと思っておけば問題ない。
「敵が移動または向き変えをした時は、移動時は1~64、向き変え時は1~32、行動ポイントが減少する」について記す。
これは敵味方共通の、移動または向き変え時の行動ポイント増減の計算方法になる。
味方の場合は以下の計算分の値だけ増え、敵の場合は減る。
▶プログラミング関係の表記及び解説で説明しているが、本作では数値計算中に割り算を行う場合、その都度小数点以下切り捨て処理を行う。
ここでは小数点以下切り捨て処理をtrunc()と表記する。
なので上の計算式は、
1マス分の移動の行動ポイント増減量 = 64 - trunc(速の現在値 / 4)
向き変え時の行動ポイント増減量 = trunc(64 - trunc(速の現在値 / 4) / 2)
となる。
上の計算式より、「速」の値が高いキャラは行動ポイント増減量が小さくなり、「速」の値が低いキャラは行動ポイント増減量が大きくなる。
そして、「速の現在値/4」は最小で0、最大でtrunc(255/4)であるから、「1マス分の移動の行動ポイント増減量」の最大値は63で、最小値は1ということになる。
▶ターンに記した「1ターンで味方キャラが移動できるマスの数」は、上計算式を使っている。
戦闘開始時は行動ポイントが0であるから、255になるまでマス目を移動できることになる。
つまり、
trunc(255 / (64 − trunc(速の現在値/4)))
は、「戦闘開始時に敵ターンに周るまで味方が移動可能なマス目の数」になる。
これが正確に成り立つのは「戦闘開始時」だけである。
敵が技を出して行動ポイントが16以上128未満にまで減って味方ターンに回ったとする。
次の敵ターンまでは、255 - (現在の行動ポイント)である。
255より少なくなっているため、移動可能なマス目の数は減って、計算式としては、
trunc((255 - (現在の行動ポイント)) / (64 − trunc(速の現在値/4)))
ということになる。
敵が技を出した後の行動ポイントは、上で述べた通り、最大だと127である。
「現在の行動ポイント」の部分に127を代入してみるとわかるが、この時は、移動可能なマス目の数が戦闘開始時の半分くらいまで減ってしまう、ということになる。
ここまで文章でのみ説明してきたのでわかりにくいと思われるが、実際の例を示してみる。
シンプルに、味方と敵が1体ずつの戦闘、ここでは現代編のナムキャット戦を例に取り上げる。
高原の「速」は31、ナムキャットの「速」は60である。
初期配置は以下の通り。
行動ポイントは「0」から開始になる。
高原がナムキャットを攻撃するために移動する場合、1マスの移動で増える行動ポイントは、
64 - trunc(速の現在値 / 4)
= 64 - trunc(31/4)
= 57
高原の移動1マスにつき、57ずつ行動ポイントが増えていく、ということになる。
4マス移動すると、57×4 = 228
5マス移動すると、57×5 = 285で、この時点で255を越えるため、5マス移動直後にナムキャットにターンが回って、何かしら行動してくる。
つまり、高原が上1マス→左3マス移動(合計4マス移動)で、
ここまで移動する間は、ナムキャットは何もしない。行動ポイントが255未満だからである。
だが次に高原が1マスどこかへ移動すると、行動ポイントが255を越えてしまうため、ナムキャットにターンが周る。
例えば上の状態で高原が左に1マス移動すると、
高原がナムキャットの右下に移動した直後、ナムキャットは右下の高原に「ローキック」「イナズマアッパー」「パンチャマキック」あたりで攻撃してくるだろう。
プレイヤーからすれば移動と同時に攻撃されているように見えるが、ゲーム内の処理が一瞬なのでそう見えるというだけで、実際には移動の直後に攻撃をされている。
初期配置で高原とナムキャット右下マスの距離が最短距離で5マスなので、攻撃してみようとナムキャットへ向け5マス移動すると、ちょうどナムキャットの懐に飛び込んでしまって攻撃される、という初見殺しな罠である(これが現代編の初見プレイの難易度を上げている原因でもある……)。
とにかく、この時点で285まで増えた行動ポイントだが、ナムキャットが高原を攻撃することにより減少することになる。
先に上げたややこしい計算式により、ナムキャットの攻撃後の行動ポイントは、以下のように計算される。
285 & 111 | 16 = 29
ナムキャットの攻撃後、29まで行動ポイントが減少して、高原にターンが回ってくる。
では、ここで「どう回し回転げり」で回転嵌めを狙ってみる。
高原が技を出すと、攻撃が当たるかどうか、回転するかどうかは関係なく、行動ポイントが510増加する。
つまり行動ポイントは、
29 + 510 = 539
となる。
ここでは回転が成功したものとする。つまりナムキャットが左下向きになり、行動ポイントが539になる。
ナムキャットにターンが周ると、左下向きから右下向きに向き変えをする。
向き変えでの行動ポイント増減量は、
(64 - trunc(速の現在値 / 4) ) / 2
ナムキャットの「速」は60なので、
trunc((64 - trunc(60 / 4) ) / 2) = 24
つまり、行動ポイントは24減少して、
539 - 24 = 515
となる。
255を越えているが、「敵は何かの行動を取ると、行動ポイントの値に関わらず停止して、敵ターンが終わる」という大原則があるので、高原にターンが周る。
この時に高原が1マス右に移動すると、ナムキャットがぴったり高原を追いかけてくるようになるが、これは「行動ポイントが255越えなので、高原が1マス移動しただけで即座に敵ターンが回って、延々と追いかけられる」という、よく見かける現象になる。
もちろん上1マスなど敵の技の射程内に移動した場合は、攻撃されることになる。
高原が1マス上に移動したことで、行動ポイントが57増える。
つまり、
515 + 57 = 572
そしてナムキャットにターンが回って、何かしら攻撃されるだろう。
これにより、
572 & 111 | 16 = 60
行動ポイントが60に減少して、高原にターンが周る。
行動ポイントが255を越えるまでは、高原の行動中、ナムキャットは何もしてこない、ということになる。
60 + 57 + 57 + 57 = 231
60 + 57 + 57 + 57 + 57 = 288
であるから、高原が3マス移動するまではナムキャットは何もしないが、4マス移動すると255を越えるため、ナムキャットが何かしら行動することになる。
戦闘開始時は4マス移動できたが、このタイミングだと3マスしか移動ができないのである。
……というような理屈で、味方と敵のターンの回り方や、ターン内でできる行動が決まっているのである。
ターンにおいて、タメ時間のある技のタメ時間は16の倍数で表記され、16は1ターン分である、と記した。
これまで「行動ポイント」について説明をしてきたが、行動ポイントの増減とタメ時間の消費はまったく別になっている。
タメ時間は以下の状況の時に減り、0になると技が発動する。
上の減少に行動ポイントは全く関与しない。
「敵または味方が技を出す」ということは、これまでの行動ポイントの説明通り、敵または味方の行動が終了して相手側にターンが渡ることになるから、「タメ時間16は1ターン」という考え方でだいたい間違いではない。
それ以外のタメ時間の減少については、「速の値によって、行動ゲージ増減量が変化する」ため、必ずしも1ターンがタメ時間16にはならない。
しかも、敵が移動または向き変えした時には、タメ時間が減らない。
ということで、タメ時間の説明がやや難しいということになってしまうのである。
ここでひとつ疑問が湧いた方もいらっしゃると思う。
「敵味方1体ずつ、行動ポイントが255未満で敵が動けないタイミングで、味方がタメ時間のある技を使い始めたら、いつタメ時間が減って技が出るのか?」
なのだが、この時は、行動ポイントが1フレーム(1/60秒)につき10ずつ増加すると同時に、タメ時間が1ずつ減る処理が入る。
(ちなみに、この状況には、「敵が移動のみする」「敵が攻撃判定をしている」も含まれる)
よって、タメ時間16の技なら、16フレーム(16/60秒)後にタメ時間が終了し、技が出ることになる。
この時には、プレイヤーにもゲーム画面が16/60秒の間、動かず停止しているように見えることになる。
つまり、タメ時間16の技なら、技選択から技を出すまで、敵が何もしないのなら行動ポイントが160増え、更に技を出すと行動ポイントが+510される、ということになる。
上で現代編のナムキャット戦の例を出したが、この戦闘で例を示すと、戦闘直後に高原が「気合いため」を選択した場合、行動ポイントが0の状態でタメ時間16の「気合いため」を開始することになる。
ナムキャットは行動ポイント0の状態では行動できないので、「気合いため」選択後、16/60秒経過すると17/60秒目のタイミングで「気合いため」が出て、行動ポイントが170 + 510 = 680となる。
これで行動ポイントが255を越えたので、ナムキャットにターンが回り、ナムキャットが1マス移動することで行動ポイントが−59されて、631まで減り、高原に再びターンが回る。
ということになる。
もし最終編で高原以外の味方がいる場合は、高原が「気合いため」を選択すると行動ポイント0のまま他の味方にターンが回るので、そのキャラが適当な行動でタメ時間を16消費するなりした後、「気合いため」が発動することになる。
16/60秒という時間経過は、普通にプレイしているだけなら大した違和感はないだろう。
だがタメ時間が長めの場合は、明らかに画面が処理中で止まっているように感じられるはず。
高原ならタメ時間128の「大激怒岩バン割り」と「気合いため」を比較してみるとわかりやすいだろう。
更にわかりやすいのはSF編キャプテンスクウェア内のジェムパラペット戦で、ジェムパラペットが技を出せない位置で「クオークソード」(タメ時間240)を開始してみると妙な待ち時間があるが、実際に240/60秒、つまり4秒経過しているのである。この時は行動ポイントが一気に+2400され、241/60秒目に「クオークソード」が出るので、「クオークソード」を出した直後は技選択前から行動ポイントが2920も増えることになる。
なお、タイムアタックでも「タメ時間16の技を16フレームで出す」テクニックとして使われている場面があるようである。
パーティが2人以上の時、1人がタメ時間のある技をタメ始めた場合、他の味方が行動可能なので、Yボタン足踏みや技を出すなどして時間経過させないとタメ時間が減らない。一方、味方全員がタメ時間のある技を選択すると、16フレームでタメ時間を消費できるので、時間短縮ができるという理屈である。
余談になるが、このタメ時間の消費方法は、ステータスの値の変化後の復元処理時、力・速・体・知が元に戻る時の値と同じである。
力・速・体・知のいずれかの値がステータスダウンする技をくらって減少した後は、敵または味方が技を出すと元の値へ16戻るし、味方が向き変えをすれば2戻るし、味方が誰も行動できない時には1フレーム(1/60秒)につき1戻る。
ここまでは敵が1体の場合について説明してきたが、敵が複数居る時は更に「敵にそれぞれ設定された順序ポイント」を考慮しなければならなくなる。
敵が行動してくるタイミング自体は、これまでの説明通りに、行動ポイントで決まる。
行動ポイントが255を越えると敵ターンになるが、敵が複数の時は、敵それぞれの順序ポイントを比較して、その時点で一番順序ポイントが高い敵キャラが実際に行動する。
この仕組みがあるため、本作では、複数の敵が居ても、敵ターンでは敵が一体しか行動しない。
さて、順序ポイントがどう決まっているのかだが、戦闘開始時のそれぞれの敵の順序ポイントは、
である。つまり、複数の種類の敵が出現した場合、知の値が高い敵ほど順序ポイントが低く、知の値が低い敵ほど順序ポイントが高い。
よって、知の値が低い敵から順番に行動してくるということになる。
ただし、この順序ポイントは戦闘中に増減するので、必ずしも戦闘開始時の順序ポイントのまま順番に攻撃してくるとは限らない。
また、順序ポイントが増減する条件は多く、なかなか複雑である。
順に説明していく。
以下計算式でも、割り算は常に小数点以下切り捨て処理をすることに注意。
敵が敵ターンで1マス移動すると、順序ポイントが以下の値になる。
大雑把に言えばだいたい3/4に減ることになる。
敵が石化やマヒ、眠り状態といった行動不能状態であっても、順序ポイントの順番で行動順は回ってくる。
この時は行動できないが、順序ポイントが1/2になり、行動終了になる。
ややこしいことで名高い(?)行動異常は、様々な条件で順序ポイントを増減させる。
行動異常発生時には以下の順序ポイントに変化する。
「発生時修正値」は行動異常の種類によって異なる。
世界の合言葉は森部様の「行動異常」一覧の「発生時修正値」が順序ポイントの増減値に当たる。
敵がダメージを受けた時(フィールドダメージ及び、自爆技含む)には、以下の順序ポイントに変化する。
「被ダメージ定数」は「行動異常」一覧に掲載されている値である。
行動異常になっていない場合は「行動異常0」の値が採用される(これ以降も同様)。
つまり、「max(trunc(最大HP/16), 1)」は、最大HPが16以下の敵なら1、17以上ならtrunc(最大HP/16)が採用される。
「trunc(総ダメージ / max(最大HP/16, 1)) + 1」は、大雑把に言えば、ダメージ量が最大HPに近い、つまり大きなダメージをくらうほど、大きな値となる。
結局のところ、「大ダメージを受けるほど、大きな順序ポイントに変化する」ので、行動順が早まるということになる。
また、被ダメージ定数も大きければ大きいほど、順序ポイントが高くなることもわかる。
キューブの「ノイズストリーム」など行動異常4の効果がある技は、被ダメージ定数が1と最低値なので、敵の順序ポイントが下がり行動が回りにくくなる。
味方キャラが技やアイテム使用以外の移動、パス、Yボタン足踏み、向き変えにより、「行動異常」一覧の「攻撃以外の増加値」分だけ増減する。
減少する、つまり負の値に設定されているのは行動異常8のみで、それ以外は上昇。
敵ターンで敵が攻撃すると、「行動異常」一覧の「攻撃時の減少値」だけ減少する。
以上が順序ポイントの変動である。
敵味方合わせてありとあらゆる行動で増減することがわかる。
戦闘開始時ならともかく、それ以降はプレイヤーがいちいち計算しないと正確な行動順がわからないということになるが、もちろん、通常のプレイの範囲内ならそこまでやる必要はまったくない。
「こういう理屈で行動順が決まっている」というだけのことである。
これまで紹介してきた計算式や定数に、乱数は一切使われていないので、敵味方の速の値や行動ポイント、順序ポイントを把握していれば、「味方キャラはあと何歩移動できるか」「敵が次に行動してくるのはいつか」「次はどの敵が行動してくるのか」が完全に先読みできることになる。
そこまでやる必要があるのは、タイムアタックなどきつめの制限プレイくらいであろうが……
話が長くなったがもうひとつ、おまけとして記しておく。
行動ポイントは最小値が0で最大値が65535であり、65535を越える増加で0に戻る(俗に言う「オーバーフロー」)。
つまり、敵に一切攻撃させずに味方側が何かの方法で行動ポイントだけ増やしていくと、いずれ65535を越えて0に戻るので、敵ターンを飛ばして味方ターンが戻ってくる、ということになる。
もちろん、「敵に一切攻撃させずに味方側が何かの方法で行動ポイントだけ増やしていく」のは通常では無理なのだが、本作には、「技を選んで範囲を決める状態の時に、LまたはRボタンを押すと、敵が行動することなく行動ポイントだけが増える」という、バグのような挙動がある。
行動ポイントを65025から65279の間まで増やしてから技を出すと、本来なら510増加して65535から65789の間になるはずなのだが、65535を越えてしまったのでオーバーフローし、行動ポイントは0から254の間の値に「減ってしまったように見える」。
そして行動ポイントが0以上255未満なら「味方にターンが周る」。
これにより敵に一切攻撃させずに味方が一方的に攻撃し続けることができる……のだが、LまたはRボタンで増やすことができる行動ポイントは微々たる値である。
上で、レベル2の高原の場合、1マス移動で57ずつ行動ポイントが増える、と記した。
LまたはRボタンの向き変えでは、1回で28しか増えない。
戦闘開始時は0の行動ポイントを、65025まで増やすとしたら、65025÷28で2323回ボタンを押すことになる。
そんなことをしている暇があったら、普通に戦闘をした方がよほど速いのは言うまでもない。
(おそらくゲームを開発した側も、オーバーフローするまで行動ポイントが増えるような行動をプレイヤーが取ることはまずないしできないだろうという前提で、この仕様にしたのではないかと思われる。実際には上の通りに、LRボタンで行動ポイントを好きなだけ増やせるバグのような挙動が存在していたのだが……)
「時間をかけても低レベルクリアがしたい」というような、特定条件下のやりこみでは使える……かもしれない。
上には、「敵に一切攻撃させずに味方側が何かの方法で行動ポイントだけ増やしていく」のは通常では無理と記したが、現実的な範囲でも一応は可能。
先に上げたSF編キャプテンスクウェア内のジェムパラペット戦は、ジェムパラペットが一切移動しない(キャプテンが何かしら攻撃して行動異常になった場合は移動することがある)上、ジェムパラペットは攻撃できない死角がある。
よってキャプテンが、ジェムパラペットの攻撃範囲外から、ジェムパラペットのいないカラマスへひたすら「クオークソード」を撃つと、行動ポイントが2920ずつ増えていく。
もし行動ポイントが0の状態から開始したのなら、22回「クオークソード」を使った時点で行動ポイントは64240。
22回なら実際に試してみてもさしたる時間はかからない。
これに加えて、タメ時間32の「プラズマチャージ」(1回使うと行動ポイントが+840)や、Yボタン足踏みなどでうまく調節することで、「ジェムパラペットの技の射程上に乗った時に行動ポイントが65535(つまり00)から254の間になる」ようにしてみることもできる。
ただ、計算値を自分でメモしながらやる必要がある上、やってみても地味で特に面白みはないが……。
実際にやってみるなら、戦闘中でもセーブが可能なバーチャルコンソール版で試す方が楽。