Traduction du jeu

Répondre
Partager Rechercher
[Modification du post au 21/08/2009]

Bonjour,

J'ai aprés pas mal d'heures de galèrer réussi à exporter et reimporter des fichiers dans le jeu. Cela nous ouvre donc les portes de la traduction, mais pour cela je vais avoir besoin d'aide car vu le nombre de choses à traduire tout seul j'aurais pas fini quand le jeu sortira en europe ^^. De plus certains talents de graphistes seront requis pour pouvoir modifier les images (en effet la plus grande partie de l'interface se décompose en image)

Voici comment cela va s'organiser :

Si vous avez du temps et l'envie d'y mettre la main à la pâte ben faites vous plaisir, certains fichiers ne nécessite pas forcement de connaissance en coréen, par exemple :

C9MsgInventoryFull = "창고의 공간이 부족합니다."
C9MsgNotEnoughMana = "마나가 부족합니다."

Il est evident qu'il suffit de lire l'entête du message pour en comprendre le sens. De plus comme je l'ai dit plus haut si certaines personnes ont de connaissances en photoshop ils peuvent aussi aider, un traducteur s'occupant de traduire le texte de l'image et le graphiste s'occupant de la modifier par la suite.

Donc toutes les personnes intéresses envoyer moi vos emails par mp je ferais surement un suivi par email pour être mieux organiser et ne pas flooder le forum avec cela.

Voici ce qui me doit être traduit dans l'ordre de priorité

1 - Interface et Messages IG
2 - Quêtes et Scripts de NPC (Boutique, SkillLearner, etc...)
3 - Skills / Items
(4 - Nom des NPC) : vraiment pas le plus important.

Je ferais des mise à jours du fichier du jeu selon l'avancement de la traduction et les patchs de C9.

Listing des personnes travaillant sur le projet :

- Brouznouf
- Sullay

Bonne idée
Mais je parle pas un mot de coréen désolé
Mais bon courage
Par contre avant de passé beaucoup de temps, essaye de voire si tu peut modifié le fiché, et lancé le jeux sans problème avant ^^
Histoire de pas avoir de mauvaise surprise après avoir tous fait
Bon aprés pas mal de recherche voila ce qu'il est possible de traduire :

-Interface
-Quêtes
-Items
-Nom des PNJ
-Skills

Donc a peu prés tout excépté tout ce qui concerne la géographie mais je pense pouvoir trouver cela autre part.
Comme dit dans les messages privés, j'aimerais bien être avec joie sur ce projet.
Au fil du cours de ce sujet, penses à éditer le 1er post en mettant les traducteurs ainsi que leurs "tâche".
C'est un très bon projet! Je ne peux pas y participer, je ne connais pas le Coréen.

Mais Attention ! Lors de la modification de fichier. Certain jeu ne l'accepte pas donc il soit bannis les comptes pour triche ou il ne fonctionne pas. Je ne penses pas trop que cela arrivera pour une modification de texte, mais bon, rester sur vos garde.

Bonne chance
selon la manière dont le jeu est fait, ça peut être n importe quel fichiers ou seulement les fichiers sensibles; il est fort probable que le jeu vérifie les CRC32 de ses archives zip
Pour info tu veux pas nous expliquer comment tu as extraits les fichiers ?

Merci
EDIT : finalement voila :

Enfin pour faire simple les fichiers csf sont des fichiers zip legerement modifié. Il suffit donc de les transformer en zip les réparer avec winrar. Aprés il y a un mot de passe, ca c'est le truc le plus chiant, en faite il faut y faire une attaque plaintext, vu qu'on voie la liste des fichiers contenant le zip mais que leur contenu sont cryptée avec la clé, il suffit d'avoir un des fichiers présent dans le zip en clair aprés avec un certain programme qui va comparé le zip et ton fichier il va retrouvé le mot de passe utilisé.

Une fois que tu as le mot de passe tu peux donc dezippé ton fichier tranquille et avoir accés à toutes les ressources.

Voila le mot de passe actuel : 66b4427013838ceb5b275d5ba884b0ed9df353e0dc6220955e008d9d
sympa
pour les fichiers c est tous des archives zip, suffit d en copier une et de la réparer, extraire le fichier avec un certain password (*tousse* onrpg *tousse*) et de remettre le fichier dans l archive originale
Bonjour, je poste ça dans le post traduction mais je suis pas sur. Je suis a la recherche d'un guide concernant le passage du lvl 10-11. Je suis actuellement lvl10, je peux rentrer dans aucune instance, et je sais pas trop ce qu'il faut faire
Au final, as-tu réussi à réimplanter les fichiers et te connecter au jeu ? En espérant qu'il ne partira pas avec les patchs...

Tiens moi au courant, et si possible fais un screen.
Je suis plus trés loin mais comme je suis au boulot je peux pas y passer tout mon temps. La je suis en train de faire un programme en C# pour faire l'effet inverse : passer du zip au csf. (Pour le moment le jeu se lance mais il y a encore quelques petites erreurs dans le fichier et comme j'y vais a coup de comparaison hexadecimal ca peut prendre un peu de temps)
Je bug sur un truc, sans avoir rien modifié si je fais l'operation inverse le jeu se lance sans aucun problème, mais dés que je modifie un peu le jeu plante au lancement. Donc doit y avoir quelques trucs encore que je doit modifié mais ca avance.
Bon désole pour le double post la je bute un peu je verrais demain mais si y a des personnes qui s'y connaissent pas mal en info / prog voici comment ca marche :

Tous les fichiers csf de c9 sont des zip modifiés pour obtenir les fichiers il suffit donc de transformer un .csf en .zip et de le reparer avec winrar

Une fois cela fait vous avez besoin d'un mot de passe qui est disponible plus haut (j'explique pas la technique pour le récupèrer on vera quand il changera)

Ensuite il suffit donc de modifier les fichiers.

Maintenant il faut reimporter les ressources dans le jeu pour cela on a donc notre archive avec les fichiers modifiés. Il faut maintenant modifier cette archive pour qu'elle est la même architecture que celle voulu par le jeu pour cela j'ai fais un petit programme en c# dont vous trouverez le source plus bas, pour le moment le programme est spécifique au GameData.csf je verrais plus tard pour les autres fichiers si il y a moyen de généraliser le bousin.

Voici les differences entre un .zip et un .csf

Les headers de certains fichiers ont les informations suivantes à 0 :

-crc32
-size compressed
-size uncompressed

Ensuite dans la définition de la structure certains fichiers ont commes attributs externes : 0x81B40002

Puis il y a le descripteur de la structure du csf a la fin qui a pas mal de modif et ou j'ai du copié en brut les données de l'ancien.

Pour le moment j'ai une erreur lors du lancement de c9, donc si y en a qui ont des idées allez y et tenez moi au courant si vous avancez.

Pour info le problème pour moi viens de la fin du fichier, voici une page expliquant la description d'un fichier zip :

http://www.pkware.com/documents/casestudies/APPNOTE.TXT


Voila les sources :

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ZipToCSF
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] headerByte;

            bool readEnd = false;
            int i = 0;
            Int16 fileNameLength;
            Int16 extraFileNameLength;
            Int16 commentLength;
            Int32 fileLength;

            FileStream zipFile = File.Open("GameData.zip", FileMode.Open);
            FileStream csfFile = File.Open("GameData.cfs", FileMode.Create);

            BinaryReader zipReader = new BinaryReader(zipFile);
            BinaryWriter csfWriter = new BinaryWriter(csfFile);

            while (zipReader.BaseStream.Position < zipReader.BaseStream.Length)
            {

                headerByte = zipReader.ReadBytes(4);
                csfWriter.Write(headerByte);

                if (headerByte[0] == 0x50 && headerByte[1] == 0x4B && headerByte[2] == 0x03 && headerByte[3] == 0x04)
                {
                    //Les infos
                    csfWriter.Write(zipReader.ReadBytes(10));
                    //CRC32
                    zipReader.ReadBytes(4);
                    //data length (compressed)
                    fileLength = zipReader.ReadInt32();
                    //data length (uncompressed)
                    zipReader.ReadBytes(4);
                    //Set crc and the data length to null
                    csfWriter.Write(0x00000000);
                    csfWriter.Write(0x00000000);
                    csfWriter.Write(0x00000000);
                    //Get the file name length
                    fileNameLength = zipReader.ReadInt16();
                    extraFileNameLength = zipReader.ReadInt16();
                    //Write them
                    csfWriter.Write(fileNameLength);
                    csfWriter.Write(extraFileNameLength);
                    
                    String fileName = new String(zipReader.ReadChars(fileNameLength));
                    String extraFileName = new String(zipReader.ReadChars(extraFileNameLength));

                    csfWriter.Write(fileName.ToCharArray());
                    csfWriter.Write(extraFileName.ToCharArray());

                    csfWriter.Write(zipReader.ReadBytes(fileLength));
                    csfWriter.Write(zipReader.ReadBytes(12));

                    Console.WriteLine(fileName + " done...");

                }

                if (headerByte[0] == 0x50 && headerByte[1] == 0x4B && headerByte[2] == 0x06 && headerByte[3] == 0x08)
                {
                    fileLength = fileLength = zipReader.ReadInt32();
                    csfWriter.Write(fileLength);
                    csfWriter.Write(zipReader.ReadBytes(fileLength));
                }

                if (headerByte[0] == 0x50 && headerByte[1] == 0x4B && headerByte[2] == 0x01 && headerByte[3] == 0x02)
                {
                    csfWriter.Write(zipReader.ReadBytes(24));
                    fileNameLength = zipReader.ReadInt16();
                    extraFileNameLength = zipReader.ReadInt16();
                    commentLength = zipReader.ReadInt16();

                    csfWriter.Write(fileNameLength);
                    csfWriter.Write(extraFileNameLength);
                    csfWriter.Write(commentLength);

                    csfWriter.Write(zipReader.ReadBytes(4));
                    //On remplace les attributs
                    zipReader.ReadBytes(4);
                    csfWriter.Write((byte)0x20);
                    csfWriter.Write((byte)0x00);
                    csfWriter.Write((byte)0xB4);
                    csfWriter.Write((byte)0x81);

                    csfWriter.Write(zipReader.ReadBytes(4));
                    csfWriter.Write(zipReader.ReadBytes(fileNameLength));
                    csfWriter.Write(zipReader.ReadBytes(extraFileNameLength));
                    csfWriter.Write(zipReader.ReadBytes(commentLength));

                }

                if (headerByte[0] == 0x50 && headerByte[1] == 0x4B && headerByte[2] == 0x05 && headerByte[3] == 0x05)
                {
                    fileNameLength = zipReader.ReadInt16();
                    csfWriter.Write(fileNameLength);
                    csfWriter.Write(zipReader.ReadBytes(fileNameLength));
                }

                if (headerByte[0] == 0x50 && headerByte[1] == 0x4B && headerByte[2] == 0x05 && headerByte[3] == 0x06)
                {
                    readEnd = true;
                    break;
                }
                

            }

            if (!readEnd)
            {
                csfWriter.Write((byte)0x50);
                csfWriter.Write((byte)0x4B);
                csfWriter.Write((byte)0x05);
                csfWriter.Write((byte)0x06);
                
            }
            csfWriter.Write((Int16)0x5423);
            csfWriter.Write((Int16)0x5423);
            csfWriter.Write((Int16)0x5DA8);
            csfWriter.Write((Int16)0x5DA8);
//            csfWriter.Write((Int16)0x7ED0);
//            csfWriter.Write((Int16)0x0003);
            zipReader.ReadBytes(8);
            csfWriter.Write(zipReader.ReadBytes(8));
            csfWriter.Write((Int16)0x5423);

            System.Console.WriteLine("Enter to finish...");
            System.Console.ReadLine();
        }
    }
}
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés