[Chinois] Tutoriel de jeu Chapitre 4 : Changer les mots de l'image en mots système

L'affiche originale: Cry et Petit Chagrin Vues: 2660 Réponses: 5 Publié dans: 2011-12-18 07:09:07
Il s'agit d'un contenu supplémentaire, mais il est également très important et doit être soigneusement mémorisé -----
Les caractères d'image doivent dessiner des caractères sur des images, tandis que les caractères système doivent appeler les polices fournies avec le téléphone, qui peuvent fondamentalement être distinguées de l'apparence. Une fois le texte de ce type de jeu directement traduit en chinois, le jeu affichera tous « 口口口口口口 » (vide). Pour les jeux qui utilisent leurs propres caractères d'image, les méthodes de traduction chinoise incluent la Chineseisation matricielle et la modification des caractères système. La localisation matricielle a ses limites, comme trop de texte, des index matriciels dans les fichiers de classe, etc., et n'est applicable qu'à certains jeux. D'autres sont modifiés en mots système. La modification nécessite une certaine compréhension du langage Java, donc avant de lire ce tutoriel, si vous ne connaissez pas Java, il est recommandé de télécharger et d'apprendre JAVA Débutants pour comprendre JAVA (doit être décompressé). Outils de préparation côté S40 : MC, MobyExplorer,
Décompilation Moka
Éditeur de bytecode BE
jasmin(/ur l)
(url=http://down2.s60net.com:8118/res/201112/10/17938831/paojiao_94825.jar?) auditeur précédent ( /url)
(url=http://down2.s60net.com:8118/res/20118/15/89301505/paojiao_89300.jar?) Disass embler2Jasmin


Parmi les jeux Java qui utilisent des polices d'images, les jeux du fabricant de jeux DigitalChocolate sont les plus simples. Généralement, le jeu DigitalChocolate est modifié. Le jeu Chocolat est une initiation à l'apprentissage. La méthode de modification du jeu de ce constructeur est une formule fixe et n'est pas très compliquée. Prenons l'exemple de " My Pet Shop My Pet Store". Après avoir décompressé le jeu, utilisez la décompilation Mocha pour décompiler les fichiers de classe qu'il contient et parcourez-les brièvement pour trouver les méthodes suivantes : public ? (Image image, DataInputStreamdatainputstream, Font font, int ?, int ?) {} Nous avons constaté que c'est dans i. En classe, de manière générale, les fichiers de cette méthode sont en fichiers classes de 3 à 4K. Donnez donc la priorité à l'ouverture des fichiers de 3 à 4K pour la navigation, et vous les retrouverez rapidement. public i (image image, DataInputStreamdataInputStream, police de police, inti1, int j1) {int k; entier i2 ; entier j2; char ch; if (image ! = null) (omis...) Ce que nous devons faire est d'ajouter image = null ci-dessus if (image ! = null). N'y pense pas en moi. L'ajouter en Java ne fonctionnera pas. En raison de confusion ou pour des raisons d'outils, le fichier Java décompilé ne peut pas être compilé à nouveau dans un fichier de classe. L'objectif peut être atteint en modifiant le bytecode. Créez d'abord de nouveaux dossiers "1" et "2", et placez i. Mettez la classe dedans, ouvrez le logiciel Disassembler2Jasmin, et il y a deux boîtes d'adresse. Remplissez le premier, E:/1/i. Remplissez le deuxième champ de la classe, E:/2/Cliquez sur "Unshell" dans la touche programmable de gauche et modifiez i. La classe est décompilée en bytecode, ce qui générera i. j fichier. Ouvrez-le avec l'éditeur de texte. j, qui est ce qu'on appelle le bytecode, trouvé au début : Invoquerspecial java/lang/Object/ () Vaload_1ifnull Label216 Ce que nous devons faire est d'ajouter aconst_null
astore_1 avant aload_1 et enfin : Invoquer spécial java/lang/Object/() Vaconst_nullastore_1aload_1ifnull Label216 D'accord, enregistrez les modifications, mettez maintenant i. j recompile en i. classe, ouvrez Jasmin, il y a deux boîtes d'adresse. Remplissez le premier, E:/2/i. j Remplissez le deuxième, E:/2/Cliquez sur "Compile" dans la touche programmable gauche. Une fois la compilation réussie, elle sera pré-auditée. Le fichier de classe compilé doit passer la vérification de l'auditeur avant de pouvoir être réintégré dans le logiciel pour utilisation. Ouvrez l'auditeur Preverifier, remplissez les deux cases de chemin avec E:/2/ et démarrez l'audit. Vérifions s'il a été ajouté correctement, en utilisant le i modifié et révisé dans le dossier Mocha Reverse 2. classe, voir si image=null est ajouté à la ligne de code if (image ! = null) ? Eh bien, si l'ajout réussit, remplacez simplement le i d'origine. classez, reconditionnez, installez et exécutez le jeu pour voir l'effet. La police ressemble à ceci avant modification : La police ressemble à ceci après modification : Regardez, la police a changé et est la même que la police du système de téléphonie mobile. En plus des outils ci-dessus, vous pouvez également utiliser l'éditeur de bytecode BytecodeEditor pour apporter des modifications sans décompiler, ce qui est de plus en plus rapide. Logiciel qui peut être utilisé pour afficher et modifier le pool de constantes, les champs, les méthodes, etc. d'une classe et modifier directement le bytecode. Le processus consiste à ouvrir le logiciel - recherchez et ouvrez i. class--method-"init", voyez-vous du code familier ? invocatespecial java/lang/Object/() Vaload_1ifnull Label216 Modifiez et ajoutez aconst_null
astore_1, puis enregistrez-le et révisez-le, ce qui est beaucoup plus pratique. -------------Le processus de fonctionnement de base est comme ceci, pourquoi avez-vous besoin de le modifier comme ça ? Parlons du principe ci-dessous. En moi. On voit cette méthode en java : public void a (Graphics graphiques, String string, int i1, int j1, int k1) {if (a! = null) {... graphiques. setClip(i5, j5, k5 - i5, i6 - j5); graphique. drawImage(a, i1 - (a[i4] & 255), j1 - a[i4] - b2, 20);}i1 += b1 + c;}graphiques. setClip(i2, k2, i3, j3); return;} Remarque : De nombreux jeux utilisent la méthode public void a (Graphics graphiques, String string, int i1, int j1, int k1...) pour dessiner des chaînes. Dans la section if, nous voyons la méthode setClip pour couper des images. Le principe de la méthode setClip est de n'afficher qu'une partie du contenu à l'écran afin que le contenu de l'image exactement située dans cette partie soit affiché. drawImage est une méthode utilisée pour dessiner des images spécifiées. Il est facile d'imaginer que la méthode if est utilisée pour afficher des mots illustrés. graphique. setFont(a); int j2 = graphiques. getColor();if (a){......graphiques. setColor(b); graphique. drawString(chaîne, i1, j1 - 1, k1); graphique. drawString(chaîne, i1 - 1, j1, k1); graphique. drawString(chaîne, i1 + 1, j1, k1); graphique. drawString(string, i1, j1 + 1, k1);} graphiques. setColor(a); graphique. drawString(chaîne, i1, j1, k1); graphique. setColor(j2);} Remarque : La partie située sous le if est la partie clé. Nous avons vu la méthode drawString pour dessiner des chaînes, nous savons donc que ce que nous devons faire est de faire en sorte que cette méthode n'exécute pas la partie à l'intérieur du if, mais accède directement à la partie du mot système ci-dessous. (Supplément : si les déclarations de divergence conditionnelle sont converties en différents processus selon différentes conditions. Ensuite, regardez au début si (a! = null), nous voyons qu'elle est jugée en jugeant la variable a. Et où cette variable est-elle définie ? Plus tôt, nous avons parlé de la méthode publique c (Image image, DataInputStreamdatainputstream, Font font, int i, int j), nous pourrions aussi bien couper et jeter un œil. public i (Image image, DataInputStreamdataInputStream, Police police, int i1, int j1) {int k; int int j2; if (image ! = null) {a = image;b = j1 ; une = j1 ! = -1 ; } Remarque : Vous pouvez voir que cette méthode implique la variable a, et la responsabilité de cette variable est de déterminer si la quantité d'image est nulle. Ensuite, j'ai vu a = font dans else; cette phrase signifie attribuer la quantité de police à a (variable de police), ce qui peut être compris comme attribuer la police système à a. Nous espérons donc essayer de faire en sorte que cette méthode s'exécute toujours else, afin que nous puissions ajouter image = null avant if (image ! = null); De cette façon, la valeur de image est nulle au début et la partie else sera exécutée. Dans le bytecode : aload_1ifnull Label216 correspond à if (image! = null). (En raison de l'outil, il est plus difficile de modifier le positionnement sur le téléphone mobile que sur l'ordinateur.) aload_1 consiste à charger le premier (1) objet référencé par la variable locale et à le pousser sur la pile. La première variable locale correspond à l'image en première position du nom de la méthode. Ajoutez image=null ici pour créer un montant nul pour l'image. aconst_nullastore_1 Si vous souhaitez en savoir plus sur le principe, vous pouvez jeter un œil à Java Bytecode Revealed. Il convient de noter que le "1" dans astore_1 est basé sur le if précédent (image ! = null). Nous voyons que la troisième ligne est aload_1, ici c'est 1, alors astore_1 doit également être 1. À son tour, si c'est aload_2, alors ce devrait être astore_2 et ainsi de suite. aconst_null
astore_1 Ce segment de code est relativement mécanique, vous pouvez donc vous en souvenir. Les jeux produits par Digital Chocolate sont relativement fixes, et tous ceux qui souhaitent localiser leurs jeux devraient les modifier de cette manière. Les modifications de jeu de DC sont essentiellement la base de nombreuses modifications de jeu. Il est donc recommandé à chacun de bien le maîtriser. Les jeux d'autres fabricants ne sont pas si simples, et même les jeux du même fabricant peuvent avoir des méthodes de modification différentes. Ce qu'il faut, c'est un apprentissage et une pratique continus, une accumulation d'expérience et une compréhension approfondie de Java.

-------------------Version chinoise du texte du jeu Digital Chocolate. Après avoir réussi à transformer les caractères de l'image en caractères système, vous pouvez directement Chineseiser le texte. Les fichiers de langue sont essentiellement l0_0, l0_1, l0_2 et ainsi de suite. Dans « Mon animalerie », choisissez généralement le chinois l0_0 (anglais). Utilisez le plug-in présent dans le dossier SUMEA de l'outil informatique Halo pour l'ouvrir et le modifier directement. Sur le téléphone mobile, vous devez utiliser l'hexadécimal. Ouvrez l0_0 en hexadécimal. 00 00 3c 75 représente le nombre total d'octets 15477, 00 00 01 6c représente le nombre total d'octets de départ 364, 00 00 05 b8, 00 00 05 c1... représente l'octet de départ du champ. Quel est l'octet de début du champ ? Touche programmable gauche - Modifier - Accédez à l'adresse, entrez l'adresse 0x5b8 ou la décimale 1464. Après confirmation, vous constaterez qu'elle va à l'octet numéro 00 06 de l'anglais. Saisissez ensuite le deuxième 0x5c1 pour accéder au 00 02 de Ok ci-dessous. Chaque octet de départ correspond tour à tour aux champs suivants. Pour parler franchement, 5b8 est le nombre total d'octets avant 00 06. Le nombre d'octets changera lorsque nous le localiserons, et ceux-ci doivent être modifiés, ce qui est assez compliqué et gênant.
répondre 🤍 0 📤 partager collecter
C'est trop profond !
Sommet…………
C'est ça qui est vraiment difficile…
Au-dessus est à peine acceptable, mais celui-ci, je ne comprends vraiment pas.
Si vous ouvrez avec BE, il n'y aura à l'intérieur que invokespecial java/lang/Object/()V et rien d'autre par la suite, que faire ?
— Toutes les réponses chargées —

Laisser une réponse