
Elona改造講座 第1回(基本編・カスタムアイテムを食べられるようにする)
ものすごく今更ですがElona本体の改造講座です。
あらかじめ以下のものを準備しておきましょう。
・HSPコンパイラ
・HSP逆コンパイラ
・Elona実行ファイル
・ウィザードモードのセーブデータ
私はコンパイラはv3.5を、逆コンパイラはHSPdecomを使用しました。
Elona実行ファイルは改造したい版のものを使ってください。
この記事では例としてMMAhの20220121版(omake_mma_hack.exe)を使用します。
注意点として、ウィザードモードのセーブデータは必ず本来のセーブデータをコピーしたものにしましょう。一度ウィザードモードにすると原則戻せないので、絶対に本セーブを使ったりしないように。
(正確に言うと、環境によっては戻せることは戻せますが、その場合でも異名は失われてしまいます)
①逆コンパイル
HSPdecomを起動します。
Elona実行ファイルをHSPdecomにドラッグ&ドロップ。
実行ファイルと同名のフォルダの中にbmp・csv・start.ax等が生成されたら成功です。
(この時に生成されたファイルは覚えておきましょう)
(2024/01/27追記)
Elonaのバージョンによっては逆コンパイルできない場合があります。この記事の一番下の「補足」を参照してください。

その中のstart.axをHSPdecomにドラッグ&ドロップ。
『start.hsp』が生成されたら成功です。

②コンパイル
ソースファイルstart.hspを適当なテキストエディタで開きます。
start.hspの先頭に以下を追加してください。
注意点として、#packは①で生成されたファイルのうち「start.ax」を除いた全てのファイルについて記述してください。
(ヴァリアントによって、また同じヴァリアントでもバージョンによって、必要なファイルは変わります)
/* 生成される実行ファイル名の指定 */
#packopt name "myelona"
/* 実行ファイルに含めるファイルの指定 */
#pack "scene1.hsp"
#pack "scene2.hsp"
#pack "a_creature.csv"
#pack "area.csv"
#pack "cardref.csv"
#pack "fish.csv"
#pack "itemdb.csv"
#pack "itemdesc.csv"
#pack "itemmat.csv"
#pack "material.csv"
#pack "o_class.csv"
#pack "o_creature.csv"
#pack "o_race.csv"
#pack "o_skill.csv"
#pack "product.csv"
#pack "yespawn.csv"
#pack "286.bmp"
#pack "bufficon_29.bmp"
#pack "bufficon_30.bmp"
#pack "bufficon_31.bmp"
#pack "bufficon_32.bmp"
#pack "bufficon_33.bmp"
#pack "bufficon_35.bmp"
#pack "bufficon_36.bmp"
#pack "bufficon_37.bmp"
#pack "bufficon_38.bmp"
#pack "bufficon_39.bmp"
コンパイラhsed3.exeを起動してstart.hspを開いてください。
メニューの[HSP]->[実行ファイル自動作成]を実行します。
『myelona.exe』が生成されたら成功です。
(2024/05/26追記)
変数名が保持されないElonaの場合、ここでのコンパイルに失敗します。補足を参照してください。


③実行
Elonaのゲームフォルダをコピーして適当な名前にリネームします。
(ここでは仮に『Elona改造』としておきます)
先ほど生成された『myelona.exe』をここにコピーして実行。
Elonaが起動したら成功です。

④改造案:カスタムアイテムを食べる
まずは練習として、カスタムアイテムを食べられるように改造してみましょう。
カスタムアイテム「手投げ妹」を入手して、生ものに変換します。
(ウィザードモードだとF5で無限に願えるので、これを使って手投げ妹と劣悪素材の巻物を入手しておきましょう)


この状態で食べるアイテム選択欄を見ても、当然ながらカスタムアイテムである手投げ妹は表示されません。これはカスタムアイテムに関しては例外処理が効いている為です。今回はこの条件を外してみましょう。

⑤ソースから該当箇所を探す
※ここからElonaの内部知識が必要になります。
随時Wikiの「解析」のページを参考にしてください。
今回は食べる処理とカスタムアイテムに関する部分なのでソース中からこれらに関係した部分を探し出します。食料品のアイテム分類IDは57000、カスタムアイテム(公式版ではカルネアデスの板)のアイテムIDは743と分かっているので、ソース中からこれらの数値を探します。
参考①:https://wikiwiki.jp/elona/%3A解析/アイテム
参考②:https://wikiwiki.jp/elona/%3A解析/アイテム
ソース中を57000で検索して地道に探していきます。
次のような部分が見つかるはずです。

注目すべきはこの部分です。
if ( invctrl == 5 ) {
if ( reftype == 57000 | reftype == 91000 | inv(24, cnt) == 35 ) {
continue
}
if ( inv(3, cnt) == 743 ) {
continue
}
}
これだけだと何が何だか分かりませんが、invctrl==5の中にある2つのif文のうち、最初の方の条件部を翻訳すると
「アイテム分類が57000(食品類)でない」かつ「アイテム分類が91000(旅糧)でない」かつ「項目24(素材)の値が35(生もの)でない」となります。
ここまで言えばもうお分かりでしょう。
このif文は「アイテムが食べられない場合に真となる条件」なのです。
(連鎖的に1番目のifの条件部(invctrl == 5)は「インベントリ内の食べられるアイテムを表示するモード」と推測できます)
後ろの方のifの条件部は「cntが指し示すアイテムの項目3(アイテムID)の値が743(カスタムアイテム)である」になっています。これがカスタムアイテムを食べられないようにする為の処理になります。
⑥ソース変更とコンパイル
いざ改造です。
invctrl==5の中の、後ろの方のifを削除してみましょう。
完全削除でもかまわないですが、もしもの時にすぐに戻せるよう、コメントアウトするに留めておきましょう(/*と*/で囲んだ範囲がコメントアウトされます)。

(緑色の部分がコメントアウトされた箇所です)
変更を保存したらコンパイルして実行しましょう。
⑦結果の確認
食べられるアイテム欄に手投げ妹が表示されるようになりました。

実際に食べてみましょう。付与されていたエンチャントに応じて食事効果が発揮されるはずです。
(発動系は特に効果が無いようですね。妹召喚発動で妹が大量発生したら面白かったのに……)

補足
Q.①で逆コンパイルできません。
A.その実行ファイルは逆コンパイル対策がされています。諦めましょう。
(2024/01/27追記)
Elonaのバージョン(MMAh20230113版など)によっては逆コンパイル対策がされていなくても復号に失敗する場合があります。その場合はこちらから復号化失敗対策パッチを適用済のソースをダウンロードして、VisualStudio上でReleaseモードでビルドしてください。これにより生成されたHSPdecom.exeを使用すれば逆コンパイルができるかもしれません。
Q.②でコンパイルできません。
(2024/05/26追記)
A.変数名が保持されないElonaの場合、逆コンパイル時にdll内で定義される関数を呼び出す部分の関数名が消えてしまうようです。その場合はdll内に含まれる関数の読み込みと、関数呼び出しの部分を自力で補う必要があります。
Q.③で実行できません。
A.ソースファイルの編集に誤りが無いか確認してみてください。また、バージョン移行時等にはtmpファイルの削除等で複数回実行する必要があるかもしれません。
Q.ウィザードモードに移行したい。
A.F12でコンソールを開き"wizard"と入力しましょう。下記の方法で通常モードに戻れますが異名は戻らないのでご注意を。
Q.ウィザードモードから通常モードに戻りたい。
A.コンソールで"natural"と入力しましょう。ヴァリアントによってはこれで戻れます(omakeやその派生なら可能。本家1.22は無理だったような覚えがあります)。
Q.ウィザードモードに移行する処理ってどこ?
A.この辺り。解析情報サイト様によるとgdata(828)がウィザードモードフラグとのことです(gdata=Global Data、もしくはGame Dataかな)。
