※この記事は2017年2月10日にブロマガで記載した内容です。
1.概要
先日公開した以下の動画。
風のささやきを使用し、次のターンに石化くちばしで撃破しています。
一見簡単そうに見えるこの作業。ここに達するまでの経緯を解説します。
悪いけどくっそ長いので、お読みいただける場合はあらかじめご注意を。
2.石化のために必要なこと
そもそもなぜサルーインは石化するのか?
サルーインは石化耐性を持っていないため、石化剣や石化くちばしが効きます。
ただし、即死耐性は持っているので、即死属性を持つストーンスタチューは効きません。
石化剣は大地の剣レベルを上昇させないといけないので、
RTAでは風のささやきを使用してタイニイフェザーを召喚することが必要となります。
石化くちばしの追加効果である「石化」が成功する確率ですが、
以下の状態異常判定式を満たしたとき、状態異常が成功します。
(武器レベル*7+30)-(相手の体力*2)-50≧判定値
サルーインの体力は95なので、武器レベルが16だろうが左辺は最小値の0となります。
ただ、判定を行う際にイコールも含まれているため、右辺の「判定値」も0であれば成功します。
この「判定値」がどう決まるかについては、乱数によって以下のように決定されます。
判定値=mod(乱数,101)
つまり、0~255の値を取る乱数を101で割った余りが判定値となるわけです。
よって、乱数の値が0、101、202であれば良いということになります。
以上を踏まえ、RTAでサルーインを石化させるためには大きく分けて以下が必要です。
・初ターンに安全に風のささやきを使用する
・石化くちばしの状態異常判定3/256を引き当てる
これらのためにリセット(乱数初期化)から調整が必要となります。
乱数の調整として、サルーイン直前の部屋では以下の行動が可能です。
・マップを開く
・メニューを開く
→アイテム欄を開く
→セーブ欄を開く
→ならびかえ欄を開く
→キャラクターを選択する
→術欄を開く
→武器装備欄を開く
→防具装備欄を開く
以上の行動から乱数を調整していきます。
ロマサガ1の乱数は、ロマサガ3のように時間経過で乱数がずれたりはしませんが、
ロマサガ2のようにキャンセルで乱数を1つずつずらすようなことが出来ません。
また、サルーインの部屋では敵シンボルの移動がないため、
敵やNPCの移動による乱数の消費がないのが分析する上で嬉しいところですね。
2-1 初ターンに安全に風のささやきを使用する
まずはタイニイフェザーを召喚できなければ話になりません。
こちらはほぼ初期ステータスのため、サルーインのどの攻撃にも耐えられません。
当然先制することも不可能なので、無害な術を使用してくれることが必要となります。
サルーインの使用する術で無害なのは以下の3つです。
・ダイヤモンドウェポン
・アニメート
・幻影魅力術
いずれかを最初のターンに使わせる必要があるため、まずはこの乱数調整から始めます。
※パーティーが2人以上であれば、単体攻撃であるサルーインソード、ライトニングボルト、エナジーボルト、ブラックファイアも候補に挙がりますが、ここではRTAを前提として人数1人として考えます。
2-2 石化くちばしの状態異常判定3/256を引き当てる
実際にやったことがある人は分かると思うんですが、
タイニイフェザーの石化くちばしを使用してもなかなか石化してくれません。
前述したように石化するための乱数は、乱数値を101で割った余りが0のとき、
数式で表すと、mod(乱数,101)=0 が当てはまったときであり、
ロマサガ1の乱数は0~255の値をとるため、0、101、202のときに石化します。
石化くちばしを使用するタイミングで、石化するかどうかを判定する乱数を使うときに、
上記のいずれかの値になるように調整する必要があります。
3.乱数の動き方の特定と調整方法
簡単に乱数調整すると言っていますが、まずはこのゲームの乱数の動き方を把握する必要があります。
・乱数の消費方法
・サルーイン戦中の行動による乱数
・戦闘前の行動による乱数
・そもそもの初期乱数の特定
初期乱数はロマサガ3のようにリセットしただけでどんな環境でも一定の値になるものではなく、
使用する実機・環境によって異なることが確認されています。
3-1 乱数の消費方法
実機で確認することはさすがに無理なのでエミュレーターを使用して、
以下のように数値を見ながら特定してました。
いろいろと操作をしてみて実際に特定したところ、
7E1210 の値が実際に使われる乱数、
7E1211 の値が乱数の番号を15で割った余りであることが分かりました。
7E1210 = X(n)
7E1211 = mod(n,15)
また、乱数生成式は、
X(n+1)=mod[{X(n)*3 + mod(n,15)},256] X(0)=0or1
順番に当てはめていくと、
0,0,1,5,18,58,179,31,100,52,165,249,246,238,215…
または
1,3,10,32,99,45,140,170,5,23,78,244,231,193,80…
このようにどちらかの乱数が生成されます。
なお、以上のことは以前よりスルメ氏のページで公開されています。
RPG INSTITUTE > ロマサガ1の乱数表
http://surume5.han-be.com/ins/RS1/text10.htm
ただし、公開されている乱数表は、00~0Fまでの16列で表記されていますが、
上述のように7E1211が0~14の値(15個)をとるため、
明確な確認ができるように、エクセルで乱数表を新たに書き起こしました。
以下の画像がその一部となります。
※色付けや文字が異なることについては後述。
また、0または1が先頭ってのがミソで、後から結果的に確認できたことですが、
・僕の所有する実機・・・0
・Snes9X・・・1
となっていました。
つまりどちらの種類(0or1)の乱数表が使用されているかを見極めなければなりません。
3-2 サルーイン戦中の行動による乱数
ロマサガ1の乱数は、何らかの行動で順に1つずつ消費されます。
まず、サルーインは最初に攻撃する属性を決定します(乱数消費1つ目)。
●mod(乱数,10)
0:火、1:水、2:土、3:風、4:光
5:闇、6:邪、7:気、8:魔、9:幻
次に術を使用するかどうかを決定します(乱数消費2つ目)。
●乱数<128
乱数の値が128未満なら術使用、128以上なら武器使用となります。
術を使用する場合、何の術を使用するか(乱数消費3つ目)、誰に使用するか(乱数消費4つ目)を決定します。
武器を使用する場合は、何の武器を使用するか(3つ目)、何の技を使用するか(4つ目)、誰に使用するか(5つ目)を決定します。
サルーインの術に関しては相当なターン数を稼ぐと別の術を使うことがありますが、
基本的に各属性につき1種類のみ使用します。
ただし、「光」と「気」の術は持っていないため、その場合は武器使用となります。
武器を使用する場合、4つ目の乱数が、mod(乱数,15)>11なら撃剣波を使用します。
ここまででサルーインの行動が決定するため、どの乱数を踏んでいるか区別することが可能です。
前述のエクセルでの色分けは、条件付き書式で設定したものとなります。
レインコールを使用する乱数の場合は、水色で塗りつぶし
撃剣波の場合は、斜体・太字・・・というように、上記の行動を条件に表示させています。
ちなみに色分けはミンサガのディスティニーストーンっぽい色にしました。
続いて行動順の決定をします。それぞれのキャラについて速度値を計算します。
タイニイフェザーを召喚済みの場合、こちらは1キャラしかいないので、1つ消費。
●味方側の速度値 素早さ+mod(乱数,21)
タイニイフェザーの素早さは67なので、67~87の値を取ります。
サルーインの速度を決定するために1つ消費。
●敵側の速度値 素早さ+mod(乱数,素早さ+1)
サルーインの素早さは75なので、75~150の値を取ります。
速度値の大きい方から行動を開始します。
サルーインが先制した場合、サルーインの行動による乱数の消費。
ダメージやら何やら計算してると思われますが、詳細は未検証です。
しかしながら、あまり考慮しても意味のない部分であるため、気にしない方向で。
・サルーインソード・・・2個
・撃剣波・・・2個
・ファイアボール(火)・・・1個
・レインコール(水)・・・1個
・ダイヤモンドウェポン(土)・・・0個
・ライトニング(風)・・・2個
・ブラックファイア(闇)・・・1個
・アニメート(邪)・・・0個
・エナジーボルト(魔)・・・1個
・幻影魅力術(幻)・・・1個 ※パーティー2人以上の場合、増加する可能性あり
その後、こちらのコマンド選択による消費が行われます。
タイニイフェザーの行動は「防御」「くちばし」「石化くちばし」のいずれかです。
防御・・・0個
くちばし・・・ダメージ計算のため1個
石化くちばし・・・命中判定、石化判定、ダメージ計算で3個
例として以下のような乱数配列の場合、
【サルーインの行動決定】
①サルーインの行動属性判定 ←1つ消費 mod(140,10)=0 なので「火」
②サルーインの術使用判定 ←1つ消費 165>128 なので武器使用
③サルーインの武器使用判定 ←1つ消費 241 サルーインソードを選択する
④サルーインの技使用判定 ←1つ消費 mod(214,15)=4≦11 なので撃剣波は使用しない
⑤サルーインの攻撃を行う対象判定 ←1つ消費 134 タイニイフェザーを選択する
【速度値の決定】
⑥タイニイフェザーの速度判定 ←1つ消費 67+mod(151,20)=78
⑦サルーインの速度判定 ←1つ消費 75+mod(203,76)=126 よってサルーインが先制
【先制側の行動】
⑧サルーインソードの命中判定 ←1つ消費 104 まあ当たる
⑨サルーインソードのダメージ判定 ←1つ消費 64 ダメージくらう
【後攻側の行動】
⑩石化くちばしの命中判定 ←1つ消費 201 まあ当たる
⑪石化くちばしの石化判定 ←1つ消費 mod(101,101)=0 なので石化する。優勝
⑫石化くちばしのダメージ判定 ←1つ消費 58 まあ1ダメ
このような順に消費され、1ターンで12個の乱数を使用することとなります。
上記の乱数配列のように、こちらが石化くちばしを使用して、石化する乱数を探せば良いわけです。
それぞれの行動で消費される乱数から、1ターンで消費される乱数は以下を基本として考えます。
・サルーインソード/撃剣波・・・5+2+2=9個
・ファイアボール/レインコール/ブラックファイア/エナジーボルト・・・4+2+1=7個
・ライトニング・・・4+2+2=8個
・ダイヤモンドウェポン/アニメート・・・4+2+0=6個
・幻影魅力術・・・4+2+1=7個(仮)
これにこちらの行動で決定する+0/+1/+3と足した行動を元に乱数表から特定していきます。
3-3 戦闘前の乱数調整
サルーイン前でセーブすると、移動する敵シンボルがいないフロアであるため、乱数の消費はありません。
乱数を消費させるためには、画面を切り替える必要があります。
セーブデータをロードした直後、サルーイン前から画面を切り替える方法は2通りあります。
・SELECTボタンで「マップを開く」
・Yボタンで「メニューを開く」
マップを開くと、どのボタンを押しても元の画面に戻ります。
メニューを開くと、次に画面を切り替える方法は、「アイテム欄を開く」「セーブ欄を開く」「ならびかえ欄を開く」「キャラクターを選択する」「最初の画面に戻る」「メニュー画面を呼び戻す」の6通り。
呼び戻すというのは、アイテム欄を開く前にキャンセルをすることや「スピード」「おんがく」を選択した後に、もう一度メニュー画面の読み込みが入るため、そこで乱数が消費されます。
さらに「キャラクターを選択する」後は、「術欄を開く」「武器欄を開く」「防具欄を開く」「メニューに戻る」の4通り・・・というようにコントローラーの操作で出来る範囲の行動ごとに乱数を数えていきました。
Snes9Xでの調査で以下の消費数であることが確認できました。
・マップを開く・・・48個
・メニューを開く、メニュー画面の呼び戻し・・・57個
・最初の画面に戻る・・・0個
・アイテム欄を開く・・・90個
・セーブ欄を開く、セーブする・・・57個
・ならびかえ欄を開く・・・59個
・キャラクターを選択する・・・52個
・術欄を開く、術欄の呼び戻し・・・29個
・武器欄を開く・・・90個
・防具欄を開く・・・90個
・アイテムの使用、ならびかえをいじる、武器や防具の付け外し・・・0個
戦闘と比べてだいぶ多めですが、これで調整を行います。
具体的な話になると、2年前の動画の通常RTAにおいて、石化する乱数を探して採用した際の行動は、
最初の画面(サルーイン前)から「メニューを開く」「キャラクターを選択する」「術欄を開く」「術欄を呼び戻す×7回」「キャラクター選択に戻る」「メニューに戻る」「最初の画面に戻る」といったものでした。
数字に直すと、57+52+29+29*7+52+57=450個の乱数を動かして、サルーインに挑んだわけです。
また、過去の調整法として人力で探していく場合、「メニューを開いてすぐに戻る」ことを繰り返して調整する方法が主流でした。
メニューを何回も開いて閉じるのは地味に時間がかかります。
RTA的には当然早い方が良いので、メニューを開いて閉じる(最初に戻る)のではなく、
「メニューを開いて、アイテムを選択し、『つかう みる』『すてる』の選択時点でキャンセル」を行うことで、
メニュー画面の呼び戻しとなり、同じ57個の乱数が消費されます。
戦闘前の乱数調整の方法として、最初の画面から最初の画面に戻る必要があるので、
イメージとしては、こんな感じのフローチャートになります。
「メニューを開く」と「セーブ欄を開く」が同じ57個の乱数消費なので、メニューの呼び戻しで代用可能です。
また、術欄や武器・防具欄を表示させるためには必ずキャラクター選択画面を表示させる必要がある点に留意します。
以上のことから、最初の画面からいろいろ調整して最初の画面へと戻り、
風のささやきを安全に使用できるようにするためには、以下の計算式で乱数消費を数えることができます。
a,b,c,d,e,f,g,hは自然数とする。
48a + 57b + (90+57)c + (59+57)d + (52+57)e + (29+52)f + (90+52)g + 29h = 全体の乱数消費
h≧1のとき、b≧1かつe≧1かつf≧1
f≧1またはg≧1のとき、b≧1かつe≧1
c≧1またはd≧1またはe≧1のとき、b≧1
a = マップを開いて戻る回数
b = メニューを開く または メニューを呼び戻す回数
c = アイテム欄を開いてメニューに戻る回数
d = ならびかえ欄を開いてメニューに戻る回数
e = キャラクター選択をしてメニューに戻る回数
f = 術欄を開いてキャラクター選択に戻る回数
g = 武器・防具欄を開いてキャラクター選択に戻る回数
h = 術欄を呼び戻す回数
このような条件を満たした複数解の式から計算することが可能です(もっと簡単な表現があるかも)。
もちろん総当たりで探すのはしんどいので、エクセルのソルバー機能を使って探索します。
実際には不等号のIf条件を指定できないっぽいので、
f=0,g=0,h=0(術欄や武器防具欄を開かない)などを指定して数回に分けて解決します。
いやマジでエクセルすげえ!って思ったね。
3-4 そもそもの初期乱数
前述したようにロマサガ1は、使用する実機・利用環境・温度・電流・電圧etc…
様々な要因で初期乱数が異なります。
現在自分の環境は、スーファミ実機、ニンテンドー3DS(VC)、Snes9Xでプレイ可能な環境ですが、
どれもサルーインの行動はもちろん、NPCや敵の動き方なども全く異なります。
また、私的な事情で関西方面に住んでいた時と現住所では同じスーファミ実機でも乱数が異なり、
引っ越しによりすべての状況再現を一から作り直すハメになった苦い過去もあります。
敵避けに関しては、乱数値がどう絡んでくるかなどは不明で調査する気も起きないので、
適当に敵避けできるルートを探した方が効率はいい気がします。
ただ、せめて石化だけは楽に探したい。今後何があるか分かりませんからね。
さて、初期乱数の探し方ですが、ロマサガ2の電源地裂撃のような便利に特定できる技もないので、
もう実地調査しかないです。頑張りましょう。
僕が実際やった方法は以下です。
まず、2年前のRTAで乱数を調整して石化で撃破したときのパターンを再度考慮します。
幸い動画に残しておいたため、簡単に確認が出来て良かった。
【戦闘前の乱数調整】
ロード後、メニュー→キャラ選択→術欄→術欄呼び戻し×7→キャラ選択に戻る→メニューに戻る→最初に戻る
【戦闘中の行動】
1ターン目 サルーイン「幻影魅力術」い「風のささやき」
2ターン目 サルーイン「アニメート」い「くちばし」
3ターン目 サルーイン「エナジーボルト」い「石化くちばし」
4ターン目 サルーイン「ダイヤモンドウェポン」い「石化くちばし」
5ターン目 サルーイン「サルーインソード」い「石化くちばし」終了
石化くちばしで石化する乱数は0,101,202というのは分かっているので、そこから逆算していきます。
乱数表から0,101,202を検索して、石化くちばしの消費乱数3個を炙り出します。
サルーインに先攻されているので、石化くちばしを出す前に、
サルーインソード+速度+ダメージの乱数9個が消費されているはずです。
以下の例だと、【151,202,100】の塊を石化くちばしと仮定すると、
それより前の【21,74,~,186,49】の9個が消費されているはずです。
しかしながら、先頭の【21】はレインコールの乱数であるため、これは違うことが分かります。
このように先頭がサルーインソードとなる乱数を探していきます。
ちなみに上記の乱数配列だと、ライトニングの8個、各攻撃術の7個、各補助術の6個でも該当しないため、
絶対に踏むことの出来ない石化乱数であることが分かります。
乱数表の中には、「0」が7個、「101」が8個、「202」が8個存在します。
これは初期値0と1のどちらの乱数表でも同様です。
ただ、上記のように絶対に踏むことの出来ない石化乱数が存在し、
さらにサルーインが後攻する可能性も考慮して数えたところ、
初期値0の乱数表では合計23パターン、初期値1の乱数表では合計22(21?)パターンありました。
上記のうち、「サルーインソードが先攻し、石化くちばしで石化する」パターンは、
初期値0の乱数表で12パターン、初期値1の乱数表では11パターン存在します。
これで5ターン目が合計23パターンのうちのどれかであることが分かりました。
続いて、直前の4ターン目、「ダイヤモンドウェポンが先攻し、石化くちばし」
ダイヤモンドウェポンの決定で4個、速度値の計算で2個、石化くちばしで3個の乱数を消費するため、
23パターンのうち、9個前の行動が「ダイヤモンドウェポン」であれば良いわけです。
同様に3ターン目、「エナジーボルトが先攻し、石化くちばし」(4個+2個+1個+3個)
2ターン目に「アニメート先攻、くちばし」(4個+2個+1個)
ここまで来るとパターンは1つしか見つかりません。
初期値0の乱数表で、
(42,1)の「140」が5ターン目のサルーインソード、
(41,7)の「112」が4ターン目のダイヤモンドウェポン
(40,C)の「118」が3ターン目のエナジーボルト
(40,5)の「186」が2ターン目のアニメート
(3F,D)の「179」が初ターンの幻影魅力術・・・といった感じに特定できます。
さらに戦闘前の乱数調整では、450個の乱数を消費しているため、
僕の実機では(21,D)の「87」が初期乱数ということになります。
※厳密にはタイトル画面からロード画面に切り替わったタイミングで乱数を消費しているので、
本当の意味での初期乱数はもうちょっと前になりますが、
どうせAボタン押しっぱでロードするのであまり関係ないです。
3-5 最強の乱数を引き当てるために
RTA的には当然最速で石化することが最良なわけで、風のささやきを使用して、
次のターンで石化することが一番望ましい状況です。
前述のように石化する乱数から直前の行動を探索し、
無害な行動をとる乱数を探します。
ただし、パーティー人数が2人(シフ増殖チャート)でやる場合、
初ターンのみ2人分+猿の速度値を計算するため、乱数消費が1つ増えることに留意します。
また、初ターンに幻影魅力術を使う場合のみ、なぜか乱数消費が2つ増えていることが確認できました。
現在この原因は不明ですが、まあ何とでもなるでしょうw
前述で調査した石化する行動乱数のうち、
(39,1)のサルーインソードの直前が、(38,9)のアニメート
(61,E)のサルーインソードの直前が、(61,7)のアニメート
これが安全に召喚できる乱数になります。
初期乱数が(21,D)なので、(38,8)までの計341個、
または(61,6)までの計954個の乱数を、戦闘前に消費させれば一発で石化する調整の完了です。
戦闘前の乱数調整方法は、エクセルのソルバー機能を使用して探索します。
合計で341個消費する解がなかったため、954個消費する解を探索したところ、
57*9 + 147*3 = 954 が解として算出されました。
つまり、召喚後に一発で石化させる行動は、
。メニューを開く(57個)
・アイテム欄を開いて戻る(90個+57個)を3回
・メニューの呼び戻し(57個)を8回
以上が先日の動画で披露した乱数調整までの経緯となります。
4.今後の課題
とりあえずRTA用の乱数調整方法は確立できました。
ただ、幻影魅力術の謎の乱数消費が不明であったり、
初期乱数の特定方法の簡略化や、そもそもこんな説明で理解できるのかといった課題があります。
しかしながら、ほぼ理論的に間違いないところまで来ているので、
応用すれば、どの実機・どの環境でも風のささやきで石化させることが可能となります。
乱数表やエクセルでの計算は、自分用に作成して使用しているため、
どんな人でも使えるような計算機を実装する場合を考えると少し難しくなります。
例えば、初期乱数の特定は、実際のサルーインの行動から特定しているため、
そもそも石化する手順を見つけないといけないことに変わりありません。
もっと別の方法で乱数を特定する手段があれば良いのですが・・・。
例えば、ロード直後に戦闘→サルーインソード
ロード後にメニュー1回(57個消費)してから戦闘→サルーインソード
ロード後にメニュー2回(114個消費)してから戦闘→ファイアボール・・・
このように簡単な初期シードを与えることで乱数が特定できるかも。
パターンが多いのでこればかりは計算機を作るしかないかな。
サルーイン以外でも判定できる手っ取り早い場所があればいいんですが、なかなか。
またVB勉強し直しますかね。
5.参考文献
・Romancing虎の巣
http://www8.plala.or.jp/alice4/
・RPG INSTITUTE
http://surume5.han-be.com/ins/index.htm
・cheapなゲーム攻略情報
http://www.ric.hi-ho.ne.jp/cheap_restaurant/GAME/
・カエル研究室
http://kaerulabo.web.fc2.com/