非公式パッチ

すいかが食べたいのarpg.jarファイルを逆コンパイルし、ソースコードを改変し、再コンパイルするリバースエンジニアリング環境の構築方法を解説する。

現時点ではmacOS Mojave 10.14.6での情報のみ記す。

* すいかが食べたい非公式パッチ版 - GitHubリポジトリ

作成した非公式パッチと、それを適用した改造版アプレットをCC0（著作権放棄）で公開する。著作権に配慮し、全ソースコードの公開は控え、パッチとJARファイルの公開に留める。ただし、すいかが食べたいはアバンダンウェアであるとも考えられる。

プレイするには通常のすいかが食べたいのプレイ方法で、例外サイト・リストにhttps://suika3.github.io/を追加する必要がある。

## 開発環境

開発環境としてはIntelliJ IDEA IDEを使用し、逆コンパイラとしてIntelliJに内蔵されているFernflowerを使うのが最も良いようである。

他の選択肢としてEclipseのEnhanced Class Decompilerプラグインを使用する方法もあると思われる（未確認）。

Bytecode Viewerというツールもあるが、Macでは頻繁にクラッシュして使いづらかった。

Javaの逆コンパイラとしては、歴史的にはJAD、JD、CFR、Procyonなどがあった。JD-GUIは手軽だが、IDEの方が包括的だと思われる。すいかが食べたいのJARファイルでは、JD、Procyonでは正しく逆コンパイルできないクラスがあった。

以下IntelliJ IDEA 2020.2 Community Editionでの開発環境の構築方法を解説する。

## arpg.jarと画像・データファイルのダウンロード

IntelliJでJavaプロジェクトを作成する。ここでは名前を仮にarpgとする(~/IdeaProjects/arpgに作成される)。

プロジェクトのディレクトリにarpg.jarとすいかが食べたいの読み込みに必要な画像・データファイルをダウンロードする。

左側のプロジェクトツールウィンドウでarpgディレクトリを右クリック→Open in TerminalでTerminalを開き、以下のようなコマンドを実行する。

```
sh -c 'BASE_URL="http://www.din.or.jp/~null/game/rpg"; curl --remote-name-all -- "$BASE_URL/arpg.jar" "$BASE_URL/image[00-31].gif" && mkdir data && cd data && curl --remote-name-all -- "$BASE_URL/data/mdl[000-203]._k3" "$BASE_URL/data/{stage._su,event.sui,param._da}"'

```

次のような内容のHTMLファイルを作成し（appletタグ以外は任意）、通常のすいかが食べたいをプレイする方法と同様にappletviewerコマンドまたは古いバージョンのブラウザで開く。これでオフラインでプレイできるようになる。

```
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>すいかが食べたいオフライン版</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
    </style>
  </head>
  <body>
    <applet archive="arpg.jar" code="ARpg.class" height="320" width="400">
      <param name="Mode" value="0">
      <param name="Safe" value="0">
    </applet>
  </body>
</html>

```

`<param name="Mode" value="1">`にすると無理無理無理、コスモトリップ、超ガードが全ての戦闘コマンドの末尾に追加される。

`<param name="Safe" value="1">`にするとTerminalやJava Consoleに読み込みが完了したデータファイル名が出力されるため、デバッグに使用できる。

## 逆コンパイル

IntelliJではarpg.jar内の.classファイルを開くと自動的にFernflowerで逆コンパイルされて表示されるが、"File is read-only"と表示されて編集できない。

ソースコードを編集するには、以下のコマンドでTerminalから手動でFernflowerを呼び出して全ての.classファイルを逆コンパイルし、生成された.javaファイルを編集する必要がある。

```
java -cp /Applications/IntelliJ\ IDEA\ CE.app/Contents/plugins/java-decompiler/lib/java-decompiler.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler arpg.jar src
cd src
jar xf arpg.jar
rm arpg.jar

```

Fernflowerで.jarファイルを逆コンパイルすると、指定したディレクトリに結果の.javaファイルをまとめた同名の.jarファイルが作成される（元の.jarファイルと同じディレクトリを指定するとファイルが壊れる）。

ここではIntelliJによって作成されたsrcディレクトリに結果のarpg.jarを出力し、srcディレクトリ内に.javaファイルを展開している（混同防止のため結果のarpg.jarは削除している）。

これで逆コンパイルされたソースコードを編集できるようになる。

## 再コンパイル

プロジェクトツールウィンドウで元のarpg.jarを右クリック→Add as Library...で、arpg.jarをプロジェクトのライブラリとして追加する（もしくはFile→Project Structure→Modules→Dependenciesで、左下の+を押す→1 JARs or directories...でarpg.jarを追加）。

次にFile→Project Structure→Artifactsで、左上の+を押す→JAR→From modules with dependencies...で、Main ClassにARpgと入力し、OKを押す。Output directoryを/Users/*ユーザー名*/IdeaProjects/arpgに変更し、出力ファイル名がarpg.jarになっていることを確認する（ファイル名を右クリック→Renameで名前を変更できる）。最後にOKを押す。

これで、Build→Build Artifacts...からarpg:jar→Buildを選択すれば、改変したソースコードで再コンパイルしてarpg.jarを上書きできるようになる。

脚注
--

1. ↑ オリジナルのJARファイルを逆コンパイルしたソースコードにパッチを適用するか、改造版JARファイルを逆コンパイルすることにより継続開発が可能。