Elona検証01(潜入:狂気の森)
Elona改造講座が一段落した為、今回は検証編となります。検証の為に改造も行いますがあくまでメインは検証の方ですので、Elonaの改造にあたって有益な情報は無いかと思います。
今回はNPC冒険者が時々立ち寄るという謎のマップ「狂気の森」について検証していきましょう。先に結論だけ書いておくと未実装マップらしくマップファイルすらありませんでした。したがってどう頑張ってもいかなるチートを使用しても訪れることはできません。
①狂気の森とは?
次の画像でカーソルを合わせたNPC冒険者の現在地に注目してください。
現在地が「狂気の森」になっています。機械の森などと同じランダムネフィアの一種のようにも見えますが、よくよく考えるとそんな接頭語が付くランダムネフィアなんて無いはずです。

情報収集してみましたが、めぼしい情報は見つからず。唯一得られたのはしたらばのMMAhスレのこんな記述だけでした。
(結果的にはこれも誤りでしたが。というかカスタムワールド入れてない環境でも出てきたし)
42:名無しさん:2018/02/17(土) 19:39:08 ID:b9YCbIBw0
情報屋で冒険者の調査をしたら狂気の森って場所に居ると出たけどネフィア一覧を見てもそんな場所が無いんだが
43:名無しさん:2018/02/17(土) 22:23:31 ID:q3TikF4.0
カスタムワールドの可能性がある
44:名無しさん:2018/02/18(日) 16:35:38 ID:OiYOfbgQ0
言われてみればカスタムワールドでそんな名前の場所に行ったような気がする
②レッツ検証
気になることがあった時には? そうだね、検証だね!
……ということで早速検証してみましょう。まずは手始めにソースコードの解析から。「狂気の森」で検索するとどうやらAA拡張のマップらしいことが分かります。マップIDは55になっていますね。
if ( aaextended ) {
if ( adata(16, prm_544) == 49 ) {
s = lang("南アセリア北部", "Northern part of South Asseria")
}
if ( adata(16, prm_544) == 50 ) {
s = lang("南アセリア南部", "Southern part of South Asseria")
}
if ( adata(16, prm_544) == 51 ) {
s = lang("キッカス", "Kikkas"), lang("キッカスの港が見える。巨大な港街だ。", "You see Port Kikkas. It's a huge port city.")
}
if ( adata(16, prm_544) == 52 ) {
s = lang("エウダーナ", "Eulderna"), lang("南アセリア大陸の首都エウダーナが見える。水と厚い壁に守られている。", "You see Eulderna the capital of South Asseria. The city is protected by the water and great walls.")
}
if ( adata(16, prm_544) == 53 ) {
s = lang("南アセリア西部", "Western part of South Asseria")
}
if ( adata(16, prm_544) == 54 ) {
s = lang("南アセリア東部", "Eastern part of South Asseria")
}
if ( adata(16, prm_544) == 55 ) {
s = lang("狂気の森", "the Crazy Forest")
}
if ( adata(16, prm_544) == 90 ) {
s = lang("遺跡", "Ancient Ruin")
}
}

移動処理も見つかりました。マップID:53は上を見れば分かる通り「南アセリア西部」です。「cdata(4, cc) > mdata(1) - 1」となっていることからどうやら南端から移動できるようですが、「0 != 0」という必ず偽となる条件がAND条件に含まれる為、実際には移動できないようです。
if ( gdata(20) == 53 ) {
<中略>
if ( cdata(4, cc) > mdata(1) - 1 & 0 != 0 ) {
txt_select -1, lang("狂気の森へ行く? ", "Do you want to go the Crazy Forest? "), "", "", "", "", "", "", "", ""
rtval = questionyesno()
gosub *label_0470
if ( rtval == 0 ) {
snd 49
levelexitby = 2
fixtransfermap = 1
gdata(5) = cdata(1, 0) - 23, 0
gdata(64) = 55
gdata(65) = 1
gdata(850) = 55
gdata(79) = 1
gosub *label_0720
gosub *label_0726
if ( stat ) {
gosub *label_1177
if ( stat ) {
return 2
}
}
return 0
}
return 0
}
}

マップファイルも調べてみましょう。マップID:55「狂気の森」のマップファイルは"AAcrazyforest"となっています。すなわちmapフォルダの"AAcrazyforest.map"からマップデータが読み込まれる設定になっています。……が、MMA(h)にも取り込み元のAAにもmapフォルダにそんなファイルは存在しません。
if ( aaextended ) {
if ( gdata(20) == 49 ) {
map_initcustom "AAasseriasn"
gosub *label_0729
map_placeplayer
}
if ( gdata(20) == 50 ) {
map_initcustom "AAasseriass"
gosub *label_0729
map_placeplayer
}
if ( gdata(20) == 53 ) {
map_initcustom "AAasseriasw"
gosub *label_0729
map_placeplayer
}
if ( gdata(20) == 54 ) {
map_initcustom "AAasseriase"
gosub *label_0729
map_placeplayer
}
if ( gdata(20) == 55 ) {
map_initcustom "AAcrazyforest"
gosub *label_0729
map_placeplayer
}
if ( gdata(20) == 51 ) {
if ( gdata(22) == 1 ) {
map_initcustom "AAkikkas"
mdata(10) = 60
map_placeplayer
mdata(15) = 0
flt

③侵入してみましょう
Elonaでは「扉が開かないなら横の壁を掘る」のが鉄則です。
侵入経路が無いなら作ればいいのです。
上で見つけた移動処理の部分。ここを
if ( cdata(4, cc) > mdata(1) - 1 & 0 != 0 ) {
txt_select -1, lang("狂気の森へ行く? ", "Do you want to go the Crazy Forest? "), "", "", "", "", "", "", "", ""
rtval = questionyesno()
gosub *label_0470
if ( rtval == 0 ) {
snd 49
<略>
このように書き換えます。
必ず偽となるAND条件を外しただけですね。
if ( cdata(4, cc) > mdata(1) - 1 ) {
txt_select -1, lang("狂気の森へ行く? ", "Do you want to go the Crazy Forest? "), "", "", "", "", "", "", "", ""
rtval = questionyesno()
gosub *label_0470
if ( rtval == 0 ) {
snd 49
<略>
画像のようになれば成功です。

それでは南アセリア西部の南端に行きましょう。道中は長く敵も非常に強力な為、神を護衛に付けて大量の食糧を持参するなど万全の準備を整えて挑みましょう。
どうにか頑張って南アセリア西部まで到達。
「おぉ、選択肢が出てきた!」と驚きつつ侵入してみると……

残念ながらこの後エラー落ちしてしまいました。
(エラーコードはエラー19となっています。これは0除算とのことです)

条件は不明ですが、エラー落ちせずに謎の草原に移動することもありました。直前の行動や直前に通ったマップ等に依存するのかもしれません。
(現段階ではゲーム起動後、南アセリア北部→西部→狂気の森と移動してきた場合は行けるのでは? という仮説を立てています。ちなみにこの謎の草原のマップサイズは40x70で、ここから南アセリア西部に戻ることも可能でした)

④結論
マップ定義の存在しないマップへの不法侵入はやめましょう(当たり前)