PS lainの移動法則
まあ主に自分用の備忘録になるであろうが。間違っているかもしれないのでご了承を。
lainのゲームでは、一つの階層(level)ごとにデータが縦3段、横8列配置されうる円筒状の構造をしている。
実際のゲーム画面では以下のように見えている。
https://gyazo.com/d4262d636c89782cdc4cb9a07629056c
右の(手前に)見えている列を0として円筒状の列に時計回りに番号を付けていくと、画面に映っている4列は右から0、5、4、1(右手前、右奥、左奥、左手前)となる。
https://gyazo.com/e1ad903c7b7e4f43ad6adca57950c0ad
以後の説明では、画面に映っているデータ(が入りうる位置)を、3行4列の表で表すこととする。0始まりで番号を付けて説明するのでご了承を。
https://gyazo.com/a2c1cb5c6026efb7b11614f89e1a0c91
↓これの0~7がぐるぐる回る感じ。(下に視点があるとする)
https://gyazo.com/70176d30945c02d5915708b5471395a0
ざっくりした説明
基本的に
近い列優先、同じ距離の列は右優先
(同じ列内では)近い行優先、同じ距離の行は上優先
ってだけ。もちろん方向があるものはその方向のみで考えるという制限がかかるが。
カーソル
以下では、データ名などを表示しているやつを"カーソル"として話を進める。(データ名などが表示されているところにカーソルが合っている)
十字ボタン左右
探索優先順位は次の通り。今画面に映っている3行4列の範囲からはみ出ている場合はスキップして次の優先順位の場所を調べる。(とすると今どの行にカーソルがあるかを気にしなくて済む。)○が現在のカーソル位置とする。以下ほぼ同様。
table: 右ボタン
4 9 14
2 7 12
○ 1 6 11
3 8 13
5 10 15
table: 左ボタン
14 9 4
12 7 2
11 6 1 ○
13 8 3
15 10 5
範囲内にデータブロックがない場合
右ボタンの場合は列0、列1にいる場合は右回転(データが時計回り)し、元と同じカーソル位置から汎用移動を行う(R1での回転と同様 汎用移動については後述)
左ボタンの場合は列2、列3にいる場合は左回転(データが反時計回り)し、元と同じカーソル位置から汎用移動を行う(L1での回転と同様)
ただしカーソル位置にデータブロックがない場合(unknownになっている場合。見えていない場合も含む)はどの列にいても回転・移動が発生する
十字ボタン上下
table:上ボタン
14 10 6 2 4 8 12
13 9 5 1 3 7 11
○
table: 下ボタン
○
13 9 5 1 3 7 11
14 10 6 2 4 8 12
上下ともに3列先の優先度(11~14)が漏れていたため追記(2022/6/7)
範囲内にデータブロックがない場合
上ボタンの場合は1階層上昇してカーソルを一つ上に移動した場所から(2列にいる場合は0列から つまり1を足して3で割った余りの行から)汎用移動を行う
下ボタンの場合は1階層下降してカーソルを一つ下に移動した場所から(0列にいる場合は2列から つまり2(=3-1)を足して3で割った余りの行から)汎用移動を行う
無論その方向に階層がない場合は移動は発生しない(カーソルの移動もなし)
L2ボタン(階層移動)、R1・L1ボタン
それぞれ階層移動、右回転(データが時計回り)、左回転(データが反時計回り)したうえで、元と同じカーソル位置から汎用移動を行う
汎用移動
汎用移動って何ぞやという話だが、何回も出てくるので勝手にそう呼んでいるだけの移動。
というわけで探索優先順位。面白い範囲になっている。初期位置と探索位置が被っているので初期位置は①で表す。範囲内にデータブロックがなければ①の場所にとどまる。
table: 汎用移動
4
22 16 10 2 7 13 19
21 15 9 ① 6 12 18
23 17 11 3 8 14 20
5
3列先の優先度(19~23)が漏れていたため追記(2022/6/7)
キーワードリンク
キーワードリンク先のデータブロックが3列(左手前)に表示されるように移動する。キーワードリンク先がない場合は"404 not found"で移動しない。
キーワードリンクに関するデータを見つけられていなかったりほぼ検証していなかったりするのでよく分かっていない。まあキーワードリンクでジャンプするかどうかの制御の話なのでここでしなくてもいいよね、ということでここはひとつ。
サイト間移動、ロード
各サイトで最後にカーソルがあった位置(セーブ時含む 円筒上における位置)が記録されており、そこが3列(左手前)に表示されるようにして再開される。
エンディング後には初期位置にリセットされる。(Cou001とLda151)