第10章 どうなってんのこれ??


とりあえずその詳細は置いといて、現時点で判明したのは「X1,H1,Y1,X2,H2,Y2」である。
320バイトのデータ構造の中で6*4=24バイトが判った状態です。つまり320-24=296バイトがまだ不明な状態です。



それをひとつひとつ謎解いていく必要があるが、現時点謎があるのでそれを先に理解しないといけないような気がするのである。

一つは、X1,H1,Y1とX2,H2,Y1は、絶対値の座標なのか、それともなにかを基準にした距離(相対値)なのかと、もう一つは、カメラの焦点についてである。
そのカメラの焦点も座標なのか距離なのかも理解しないといけない。

はじめは漠然とX,Y,Hは、カメラの焦点からの距離だろうと判断していたのだが、色々と試すとどうも違うようであった。
例えばカメラの焦点(プレイヤーの近く)に、カメラ近づけようとして、おおまかにXやYの値を減らすと、逆に遠くなったり、とんでもない場所からそこを写すのである。
つまり、微調整が難しいのである。
それが距離でなく座標と考えると、しっくりくるのだが、そうするとその値が極端に大きいように思えるのである。

座標と考えた場合、その起点となる「0,0」の場所はいったいどこなのかがよくわからなかったのです。

予想では、下記のマップの4隅のどこか「0,0」であると思うのだが、距離感がまったくつかめない。
初心のバー見取り図

YとX値が大きすぎて、このMAPをはるかに飛びだしてしまうように思えるのである。
まぁ、あれやこれやと考えずに、座標と考え素直に各INDEX0のX1,Y1とX2,Y2の値を求め、それをこのMAPに「点」としてマークを配置したらどうなるのかを確認してみることにした。

INDEX
X1
Y1
X2
Y2
カメラの動き概要
0
9129
12682
9129
13067
Y方向に大きく移動
1
8721
12593
8721
12593
カメラ移動なし
2
8840
13070
8770
13287
YとXとHが微妙に移動
3
8583
12750
8447
12775
X方向に大きく移動
4
9032
12988
8708
13226
カメラ移動なし
5
7902
12939
7907
12289
Y方向に大きく移動。Xは微妙。
6
8931
13049
8931
13039
Y方向へ微妙に移動
7
8773
12606
8772
12960
Y方向に大きく移動
8
7845
12865
7847
11999
カメラ移動なし
9
7345
12836
7437
12754
未使用??

そして、その座標をMAPに配置すると、次のようになった。
初心のバー見取り図

赤●は、X1,Y1であり、カメラが移動する場合のX2,Y2は青●で示している。
そして矢印先の黄色のダイヤは、そのカメラのおおよその焦点を示している。
プレイヤーが移動して、INDEXの領域に入った時に、赤●から黄色ダイヤ方向を撮り、プレイヤーが移動すると青●の範囲でカメラが動く。(常に黄色ダイヤを焦点としている)

この略図はおおよその適当な図面であるので縮尺図としては、まったく正しくはないが、それにしても、各値があきらかに大きいのである。
つまり、起点の0,0は、はるか遠い場所にあるのがわかった。
こんな感じである。


どうしてこなに遠くに0,0があるのかは不明であるが、恐らく、発生の全エリアを配置した時の全体のMAPからすると、J's BARの店内は、Xが7000〜10000位、Yが12000くらいから14000位の間に配置されているのだと思われる。

また、開発者は、数字によって値を設定しているわけではなく、ツールによって自動的に値が計算させて設定されると思われるので、この数字そのものを恐らく意識はしていないと考えられる。
これは、StuntmanSnake氏が保存していたオフィシャルのカメラ設定の動画で推測できる。


恐らくカメラワークの担当者は、上記のようなツールでひょいひょいと設定をして、隣の人に

「ねぇねぇ。この場所てこんな感じでいいと思う?」
「うーん…いいんじゃない?」

て感じで設定していったに違いないのでしょう。


カメラの焦点について

次は、カメラの焦点について調べないといけない。

カメラは、常に画面の中央を映している。
これは当たり前といえば当たり前だが、重要なポイントでもある。
そしてそれは常にプレイヤーの近くでもある。
上記の動画では「青い旗」が画面の中央にあり、カメラは常にそこを見ていることがわかる。
つまり、その場所が「カメラの焦点」である。


つい我々は、プレイヤーを中心に見ているので、プレイヤーが画面の中心にいると思いがちであるが、実はそうではない。
そして前から気にはしていたことだが、「上から下を見下ろす」アングルがほとんどであると思われる。

逆に「下から上を見上げる」アングルを思い出そうとしてもなかなか頭に浮かばない。
パッと思い出すのは、「階段や梯子を昇り降りする」ところや、「記憶の病院へ続く吊り橋」と「記憶の病院の屋上へ行くための外廊」と「突破の最後のところのトラックの荷台」部分である。

他もよく見るとどこかあるとは思うが、強い印象に残っていない。
どちらにしても圧倒的に「上から下を見下ろす」アングルが多いのである。

そしてその角度は緩やかな場合もあるし、急角度もある。
普通にプレイをしていて、「見下ろす」感じがしなくても、よく見ると緩やかな角度で下の方角を見下ろしているところが多いと思われる。

これには理由がある。
つまり、ほとんど地面を映すようにしているのである。
地面が画面に映らないと、地面に落ちているアイテムや地面に倒れたゾンビなどが視界に入らない可能性がある。
つまり、ローアングルで下から上を見上げるようにしてしまうと、地面が画面に入らず、落ちているアイテムや倒れているゾンビや倒れている仲間に気づかない可能性があるわけである。
これを防ぐため、ほとんど「上から下を見下ろす」アングルが多く、なるべく地面が映るようにしていると思われる。

しかし、それは「迫力を感じる」アングルとはいえない。
巨大な敵と相対する時に、上から下を見下ろすアングルよりも、下から上を見上げるほうが迫力が増すのである。
また巨大な敵と戦う時に遠い場所からそれを撮るよりも、近い場所から撮ったほうが、敵が大きく見えてさらに迫力が増す。
また、迫ってくるゾンビに対してローアングルで撮るとその迫力も増し、恐怖感を味わうことができると思われる。
この調整ができれば、かなりアグレッシブな戦いを演出できるはずだ。

話が長くなったが、カメラの焦点のデータの場所を特定する必要がある。
そして、それを見つけて値を変更することによって、今まで見れなかった場所や、逆のアングルを見ることがてぎるようになるはずである。

そして、その場所は、ある程度推測することによって格納場所を特定できると思われる。

まずは理解しやすいカメラ焦点の「高さ」を指定しているところを探すと良いと思われる。
カメラはほとんど上から下を見下ろすので、見下ろすアングルでは、少なくともH1より低い位置で地面(0)よりも高い位置がに焦点が合うようにしているはずだ。

下記、INDEX0の場所でH1とH2の値をそれぞれ変更した時の動きである。
例@
例A
H1=10 / H2=222
H1=222 / H2=10
例@を見ると、ケビンが手前にし移動し、カメ
ラの高さH1の10に下がった時に×印の高さは、
地面より少し上にあるこどわかる。
つまりカメラ焦点の高さは、少なくとも10以
上、222未満の値であることがわかる。
例Aを見ると、ケビンが手前に移動し、カメラ
の高さH1が222になった時に、×印は地面を映
している。つまり、カメラの焦点のY値は、画
面の壁ではなく、その手前の女子トイレの扉の
手前あたりにあるとわかる。
従って、女子トイレの扉のあたりのY座標がカ
メラ焦点のY値であると推測できる。

例Aだけでは、わかりにくいのでもう一つ例Bでも確認してみる。
例B
Y1=12682→12882
Y2=13067
例Bは、Y1の値を+200して、ケビンが手前に来
た時に、ケビンに寄った時の実験です。
これを見ると、ケビンが手前に移動した時の×
印は、女子トイレの扉の少し手前当たりにあ
る。やはり、焦点のY値は、女子トイレの扉の
手前あたりだとわかる。

上記の結果により、INDEX0のカメラの焦点は、次ように推測できる。
カメラ
焦点
推測
推測値10進数
HEX値
上位下位入替値
X
X1とX2の値はともに同じ値であり、9129である。
そして×印を見ると画面から向かって左寄りに見える。
つまり通路中央ではなく左寄りである。
またカメラは通路中央からそれを撮影しているように見える。
従って、カメラのX1の9129の値より少し多い値と推測できる。
9129〜9300
あたり
000023A9〜00002454
A9230000〜54240000
H
例@で推測したが、少なくとも10以上で222未満。
恐らく50〜100の間だと思われる。
10〜222の間
0000000A〜000000DE
0A000000〜DE000000
Y
例Aと例Bで女子トイレの手前あたりと推測できたが値までわからない。
少なくとも、Y1の12682以上、Y2の13067あたりの前後だと思われる。
12682〜13067
の前後
0000318A〜0000330B
の前後
8A310000〜0B330000
の前後

上位と下位を入れ替えた16進のHEXデータの予測範囲の値をすでに特定したX1,H1,Y1,X2,H2,Y2以外の不明な領域をバイナリエディタで当てはまりそうな場所を探せばよい。

この不明領域から



上記に当てはまる条件の値をバイナリエディターで探す。
(黄色は、すでに特定したX1,H1,Y1でピンクはX2,H2,Y2である)


そして「これかな?」「いやこっちかも?」「あれ?違う?」て感じで、その値をバイナリエディターで変更してみてカメラの焦点が変わることを確認していくしかないのである。
しかも違った場所を書き換えると何が起きるかよくわからなくなる。
そして値をまたもとに戻し、「これではなかったから、やっぱりこれかな?」という感じで堂々巡りをしてしまう。

毎度毎度だが苦しい調査であるが、このように一つ一つ特定していくしかないのである。
その結果、特定できた。だいたい予想通りの値であった。


つまり、下記のところまで特定できた。



これによって、カメラの焦点とカメラの位置とその移動範囲をそれぞれ変えることができるようになった。
もちろん、はじめは、〇〇さんが作ったツールによってそられが可能になったが、そこから先の調査と特性の研究は自分の力である。

そして、その値を変更する場合は、10進数で数値を考え、それを16進数に変更し、それ特定したアドレスをINDEX単位でオフセットアドレスを計算し、そこを書き換えて、AFSExplorerでRDTファイルをインポートし、実動作を確認し、うまくいかない場合は、またやり直すというカット&トライで試しながらやっていく必要がある。

とても大変な作業です。これを全てのシナリオの全てのエリアの全てのアングルを変更していく場合、とてもではないが、手作業によりバイナリエディタで書き換えていく方法は無理がある。

少なくともある程度はツールを作る必要がある。
いや必須である。

またこの解析だけでは不足である。

320バイトのデータ構造の中で9*4=36バイトが判った状態です。つまり320-36=284バイトがまだ不明な状態であり、そのデータがどのようなものかも想像が足りていないのである。

足りないと思われる情報は、次と考えている。

・カメラの固定モード(カメラが動かないモード)
・INDEX領域の範囲

少なくともそれらは特定して変更できるようにしたいと思っています。
それにしても、残りの不明のデータ領域には、まだまだ様々な情報があると思われる。

これから先どうすかるかが課題である。


次章に続く