[中国語] ゲームチュートリアル 第 4 章: 絵文字をシステム単語に変更する

オリジナルポスター: Cry&小殤 ビュー: 2657 返信: 5 で投稿される: 2011-12-18 07:09:07
補足的な内容ですが、非常に重要なのでしっかりと覚えておきましょう-----
絵文字は絵の上に文字を描くもので、システム文字は携帯電話に付属しているフォントのことで、基本的には見た目で区別できます。この種のゲームのテキストを直接中国語に翻訳すると、ゲームはすべて「口口口口口」(空白)と表示されます。独自の絵文字を使用するゲームの中国語翻訳方法には、マトリックスの中国語化とシステム文字の修正が含まれます。ドットマトリックス ローカリゼーションには、テキストが多すぎる、クラス ファイル内のドットマトリックス インデックスなどの制限があり、一部のゲームにのみ適用できます。さらにシステムワードに修正されます。改造には Java 言語のある程度の理解が必要ですので、Java を知らない方はこのチュートリアルを読む前に、JAVA 入門 をダウンロードして学習することをお勧めします (解凍が必要です)。 S40 側準備ツール: MC、MobyExplorer、
(url=http://down2.s60net.com:8118/res/20118/15/74317096/paojiao_74310.jar?) Mocha 逆コンパイル

BE バイトコードエディタ
ジャスミン(/ur l)
(url=http://down2.s60net.com:8118/res/201112/10/17938831/paojiao_94825.jar?) 前の監査人 ( /url)
(url=http://down2.s60net.com:8118/res/20118/15/89301505/paojiao_89300.jar?) Disass embler2Jasmin


絵フォントを使用する Java ゲームの中で、DigitalChocolate ゲーム メーカーのゲームが最も単純です。一般的に、DigitalChocolate ゲームは変更されています。チョコレート ゲームは学習への入門です。このメーカーのゲームの改造方法は定型であり、それほど複雑ではありません。 DigitalChocolate の「 My Pet Shop My Pet Store」を例に挙げます。ゲームを解凍した後、Mocha 逆コンパイルを使用してゲーム内のクラス ファイルを逆コンパイルし、それらを簡単に参照して次のメソッドを見つけます。 (Image image, DataInputStreamdatainputstream, Font font, int?, int?) {} i にあることが分かりました。クラスでは、一般的にこのメソッドのファイルは 3 ~ 4K のクラス ファイル内にあります。したがって、3 ~ 4K ファイルを優先的に開いて参照すると、すぐに見つかります。 public i (イメージ画像、DataInputStreamdataInputStream、フォントフォント、inti1、int j1) {int k; int i2; int j2;チャーch; if (image ! = null) (省略…) if (image! = null) の上に image = null を追加する必要があります。 iでは考えないでください。 Javaに追加しても機能しません。混乱やツールの理由により、基本的に、逆コンパイルされた Java ファイルをクラス ファイルにコンパイルし直すことはできません。この目的はバイトコードを変更することで達成できます。まず新しいフォルダー「1」と「2」を作成し、i を置きます。クラスを入れて、Disassembler2Jasminというソフトウェアを開くと、アドレスボックスが2つあります。最初の E:/1/i を入力します。クラスの 2 番目のフィールドに入力します。E:/2/左側のソフト キーの「Unshell」をクリックし、i を変更します。クラスはバイトコードに逆コンパイルされ、i が生成されます。 j ファイル。テキストエディタでiを開きます。 j、いわゆるバイトコードで、先頭にあります: invokespecial java/lang/Object/ () Vaload_1ifnull Label216 私たちがしなければならないことは、aload_1 の前に aconst_null
astore_1 を追加し、最後に: invokespecial java/lang/Object/() Vaconst_nullastore_1aload_1ifnull Label216 さて、変更を保存して、i を入力します。 j はコンパイルされて i に戻ります。クラスで Jasmin を開くと、アドレス ボックスが 2 つあります。最初の E:/2/i を入力します。 j 2 番目の項目を入力します。E:/2/左側のソフトキーの「Compile」をクリックします。コンパイルが成功すると、事前監査が行われます。コンパイルされたクラス ファイルは、ソフトウェアにパッケージして使用できるようにする前に、監査人の検証に合格する必要があります。監査 Preverifier を開き、両方のパス ボックスに E:/2/ を入力して、監査を開始します。 Mocha Reverse 2 フォルダー内の修正およびレビューされた i を使用して、正しく追加されたかどうかを確認してみましょう。クラスで、コードの if (image ! = null) 行に image=null が追加されているかどうかを確認してください。さて、追加が成功したら、元の i を置き換えるだけです。ゲームをクラス化し、再パッケージ化し、インストールして実行し、効果を確認します。変更前のフォントは次のようになります。 変更後のフォントは次のようになります。 ほら、フォントが変更され、携帯電話のシステム フォントと同じになっています。上記のツールに加えて、バイトコード エディター BytecodeEditor を使用すると、逆コンパイルせずに変更を加えることができ、より高速になります。クラスの定数プール、フィールド、メソッドなどを表示および変更し、バイトコードを直接変更するために使用できるソフトウェア。プロセスは、ソフトウェアを開くことです - i を見つけて開きます。クラス--メソッド-「init」、見覚えのあるコードが見えますか? invokespecial java/lang/Object/() Vaload_1ifnull Label216 aconst_null
astore_1 を編集して追加し、保存して確認すると、はるかに便利です。 -------------基本的な操作手順はこんな感じですが、なぜこのように修正する必要があるのでしょうか?以下にその原理について話しましょう。 iで。 Java では次のメソッドが見られます。 public void a (Graphics graphics, String string, int i1, int j1, int k1) {if (a! = null) {... graphics. setClip(i5, j5, k5 - i5, i6 - j5);グラフィックス。 drawImage(a, i1 - (a[i4] & 255), j1 - a[i4] - b2, 20);}i1 += b1 + c;}グラフィックス。 setClip(i2, k2, i3, j3); return;} 注: 多くのゲームは、文字列を描画するために public void a (Graphics graphics, String string, int i1, int j1, int k1...) メソッドを使用します。 if セクションには、画像を切り取るための setClip メソッドが表示されます。 setClip メソッドの原理は、画面上のコンテンツの一部のみを表示し、その部分に正確に位置するピクチャのコンテンツが表示されるようにすることです。 drawImageは、指定された絵を描画するために使用されるメソッドです。絵言葉を表示するためにifのメソッドが使われているのは容易に想像できます。グラフィックス. setFont(a); int j2 = グラフィックス. getColor();if (a){......グラフィックス。 setColor(b);グラフィックス。 drawString(string, i1, j1 - 1, k1);グラフィックス。 drawString(string, i1 - 1, j1, k1);グラフィックス。 drawString(string, i1 + 1, j1, k1);グラフィックス。 drawString(string, i1, j1 + 1, k1);} グラフィックス。 setColor(a);グラフィックス。 drawString(string, i1, j1, k1);グラフィックス。 setColor(j2);} 注: if より下の部分が重要な部分です。文字列を描画するためのdrawStringメソッドを見てきましたので、このメソッドがif内の部分を実行するのではなく、下のシステムワード部分に直接移動するようにする必要があることがわかります。 (補足: 条件分岐文が条件に応じて別の処理に変換される場合。では、冒頭の if (a! = null) を見ると、変数 a を判定して判定していることが分かります。そして、この変数はどこで定義されているのでしょうか。先ほど public c (Image image, DataInputStreamdatainputstream, Font font, int i, int j) メソッドについてお話しましたが、ここで少し切り取って見てみましょう。 public i (Image image, DataInputStreamdataInputStream, Font font, int i1, int j1) {int k; int i2; int char ch; if (image ! = null) {a = font;b = j1; a=j1! = -1;注: このメソッドには変数 a が含まれており、この変数の役割は画像量が null かどうかを判断することであることがわかります。次に、else に = font が表示されました。この文は、フォント量を a (フォント変数) に割り当てることを意味し、システム フォントを a に割り当てると理解できます。そこで、このメソッドが常に else を実行するようにしたいと考えています。そのため、if (image ! = null); の前に image = null を追加できます。このように、最初はimageの値がnullで、else内の部分が実行されます。バイトコード内: aload_1ifnull Label216 は if (image! = null) に対応します。 (このツールのおかげで、携帯電話上で位置を変更するのはコンピュータ上よりも困難です。) aload_1 は、ローカル変数によって参照される最初 (1) のオブジェクトをロードし、スタックにプッシュします。最初のローカル変数は、メソッド名の最初の位置にあるイメージに対応します。ここに image=null を追加して、画像の null 量を作成します。 aconst_nullastore_1 原理について詳しく知りたい場合は、「Java Bytecode Revealed」を参照してください。 astore_1 の「1」は前の if (image ! = null) に基づいていることに注意してください。 3 行目は aload_1 であることがわかります。ここでは 1 であるため、astore_1 も 1 でなければなりません。また、aload_2 の場合は、astore_2 などとなります。 aconst_null
astore_1 このコード セグメントは比較的機械的なため、覚えておくとよいでしょう。 Digital Chocolate によって作成されたゲームは比較的固定されているため、ゲームをローカライズしたい場合は、この方法でゲームを変更する必要があります。 DC のゲーム修正は、基本的に多くのゲーム修正の基礎となっています。したがって、誰もがそれを徹底的にマスターすることをお勧めします。他のメーカーのゲームはそう簡単ではありませんし、同じメーカーのゲームでも改造方法が異なる場合があります。必要なのは、継続的な学習と実践、経験の蓄積、そして Java への理解を深めていくことです。

-------------------デジタルチョコレートゲームのテキストの中国語版。画像文字をシステム文字に変更できたら、テキストを直接中国語化できます。言語ファイルは基本的に l0_0、l0_1、l0_2 などです。 「My Pet Store」では通常、中国語 l0_0 (英語) を選択します。コンピューター ツール Halo の SUMEA フォルダーにあるプラグインを使用して、直接開いて変更します。携帯電話では 16 進数を使用する必要があります。 l0_0 を 16 進数で開きます。 00 00 3c 75 はバイトの総数 15477 を表し、00 00 01 6c は開始バイトの総数 364 を表し、00 00 05 b8、00 00 05 c1... はフィールドの開始バイトを表します。フィールドスタートバイトとは何ですか?左ソフトキー - 編集 - アドレスに移動し、アドレス 0x5b8 または 10 進数の 1464 を入力します。確認後、英語のバイト番号 00 06 に移動することがわかります。次に、2 番目の 0x5c1 を入力して、以下の Ok の 00 02 に移動します。各開始バイトは、次のフィールドに順番に対応します。端的に言えば、5b8 は 00 06 より前の総バイト数です。ローカライズするとバイト数が変わるので、これらを修正する必要があり、非常に複雑で面倒です。
返事 🤍 0 📤 共有 集める

返信 (5)

あまりにも奥深い!
頂…………
これこそ難しい……
上はなんとかなるとして、これは本当にわからない。
もしBEで開くと、中にはinvokespecial java/lang/Object/()Vしかなくて、他の部分は後ろに何もない場合、どうすればいいですか
— すべての返信が読み込まれました —

返信を残す