Nhờ cái bài này đi kiếm cái trò cũ ngày trước chơi, trò First Queen - Ornic Senki! Hồi đó nhỏ xíu chơi về nước rồi, với lại không biết tiếng Nhật toàn mò đại mà chơi thôi. Giờ chơi lại kẹt map rồi, làm sao mà vào được lâu đài này?
^ Chơi lâu quá rồi không nhớ rõ. Có phải lâu đài của bọn Elf không? Nếu là nó thì phải đi giải cứu Vương tử Elf đang bị lũ quạ bắt đã rồi quay lại đây.
Không bác ạ! Vua Elf thì vào được rồi, còn thành bên phải gần biển của Camelot thì nó đóng cổng, hình như phải có ai đó trong đội ngũ mới vào thành được! Chơi lâu quá không nhớ nổi cần ai!
[spoil]Dump thì được rồi nhưng kiến thức vẫn còn mù mịt lắm, phải có người hướng dẫn trực tiếp hay xem người khác làm mới biết chứ giờ vẫn làm kiểu thủ công thôi. Pointer cũng không hiểu lắm, như làm sao để tạo ra 1 Pointer để chỉ đến 1 địa chỉ trống trong Game. Trong cái Game này thì chẳng có lũ Contan nào cả từ コンタン cũng dùng duy nhất trong câu bọn điên này nói. Trong Game chỉ có mỗi 1 nhân vật tên コンスタンティン thôi nhưng cũng chẳng có lý do gì để bọn này nhắc đến nhân vật ấy. Cái này có vẻ như 1 câu chửi "Lũ てめえらのコンタン chúng mày, bọn tao đã nghe Catherine-sama nói rồi." [youtube]V069VbW2e8A[/youtube][/spoil] [spoil]Đoạn này thì phải thu phục lão già này: Team của lão đi riêng, có 2 thằng lính hộ tống, không cho vào đội hình của mình được. Điều khiển lão vào thành chiêu hàng bọn kia, nhưng nếu thế thì phải đánh với thành Elf. Nếu lấy quân Elf thì cho lão già này vào thành Camelot nhưng đừng nói chuyện với tên vua mà chạy quanh khoắng sạch đồ đạc của nó đã, vì sau khi thu phục thành Elf thì không vào được nữa.[/spoil]
Contan là tên riêng thôi.てめえら nghĩa là lũ, đám tụi mày, tụi bây. Pointer thì trong game nó tự có sẵn rồi, chỉ cần xác định nó nằm chỗ nào thôi. Pointer là dữ liệu chỉ nơi bắt đầu của 1 câu thoại. Có thể là 2 hay 3 byte. Tìm được nó để dịch tốt hơn thôi, vì câu trước có kéo dài cũng không ảnh hưởng tới câu sau.
[spoil]Tiếc là trong Game chả có ai tên Contan mới đau, tui sợ là do tụi nó phát âm ngọng hay gì đó. Bác cho ví dụ 1 Game nào đó mà bác đã dịch, cách tìm Pointer của nó và cách sử dụng được không? Trong Topic hướng dẫn của bác hình ảnh Die cả rồi, mà cũng không có hướng dẫn cách tìm.[/spoil]
2 con đầu ko nhảm đâu, 1 con có trò trượt nhanh tránh đạn, một con vừa có kiếm rất mạnh lại khả năng bay vô hạn. Cân bằng hết đấy. Game đấy làm lại thành 3D, thêm mục chơi online khéo lại ăn tiền
Ah nhầm, vì nó viết bằng chữ cứng nên tưởng Contan là địa danh, nhưng vừa tra lại thì không phải. Kontan là chữ này 魂胆, nghĩa là suy tính, kế sách. Câu trên là tụi cá chửi đám Richard là nó đã biết kế sách của Richard rồi, do nghe từ Catharin. Vd về Pointer trong FE 4 Việt ngữ. Câu này nằm ở $F841 (Rom có 200 byte header), pointer nằm ở $DFE82. Giá trị của pointer chỉ thẳng tới vị trí của câu ở $F841.
[spoil]Tuyệt chiêu chém kiếm là chiêu yếu thứ nhì trong Game (nhưng ngang ngửa chiêu chọt chọt của con nhện, con nhện mạnh hơn tí vì có tơ nhiện hỗ trợ), vì sát thương không cao mà phải đánh cận. Nếu so với đòn phun lửa (cận chiến) thì thua xa. Con trượt nhanh là con phế nhất, quăng móc xích cứ như gãi ngứa (đánh tay đôi với thằng kiếm là thua), được cái đạn nó mạnh hơn thằng kiếm.[/spoil]
[spoil]Làm gì có bản tiếng Anh, chẳng qua trò này tui chơi đi chơi lại cả chục lần rồi nên nhớ thôi, hướng dẫn thì trên Gamefags có đó.[/spoil] [spoil]Cái đó đọc trong hướng dẫn của bác thì tui cũng biết rồi. Ví dụ từ vị trí $DFE82 có các Hex: FD5841F600FD5AFD5110027001FD582FF900FD5AFD515001E001FD587EF900FD 5AFD51A0007001FD5B01343200FD5840FA00FD343200FD5AFD5190004002FD5B Không biết các Hex còn lại có ý nghĩa gì, nhưng đối chiếu với Rom tiếng Nhật thì thấy các Hex kia không thay đổi, chỉ có 3 Byte màu đỏ là thay đổi, mà chúng luôn đứng sau Hex FD58, vậy có phải các Hex màu đỏ kia là giá trị của Pointer? Cái mà tui không hiểu là cách tìm và áp dụng cơ. Ví dụ làm sao để nhận biết nó là Pointer, tìm ra được Pointer rồi phải tính giá trị thế nào. Như bản của bác 41F600 dẫn đến $F841, còn bản Rom tiếng Nhật nó là 00809D vậy làm sao biết giá trị này dẫn đến địa chỉ nào (tính kiểu đổi giá trị ra thập phân?). Rồi áp dụng kiểu gì? Rom nó có sẵn Pointer như vậy, mình chỉ sửa được giá trị (tức là sửa vị trí câu sẽ xuất hiện), nhưng lỡ nó không có Pointer thì phải làm sao? Hay tất cả các lời thoại trong Game đều có Pointer của riêng nó? Bác có hướng dẫn về Pointer không? Tiếng Anh cũng được. Hướng dẫn của bác chỉ giải thích nó là cái gì chứ không hướng dẫn cách sử dụng.[/spoil]
Hướng dẫn về Pointer thì tài liệu trên Rom hacking có nhiều lắm. Trong trường hợp FE4 thì pointer là 3 byte (24 bit) và nằm lung tung, giữa các pointer là code event, dữ liệu khác... Thông thường các game khác thì các pointer nằm cụm thành 1 khu nên rất dễ nhận biết qua giá trị của nó, tăng dần đều. Vì pointer chỉ thẳng tới địa chỉ của câu thoại, mà câu sau có địa chỉ lớn hơn câu trước cho nên giá trị của các pointer nằm trong bảng sẽ là n, n+a, n+a+b, n+a+b+c,.... Nói cách khác, giá trị pointer sau trừ giá trị pointer trước = chính địa chỉ câu sau trừ địa chỉ câu trước. Đó là đối với đa số game có pointer nằm chung 1 cụm. Trong trường hợp FE4, giá trị địa chỉ của câu thoại phải cộng thêm 1 hằng số mới thành giá trị của pointer. Vì pointer của FE4 có 3 byte nên nó có thể trỏ tới bất kỳ chỗ nào trong khoảng từ 00 00 00 cho tới FF FF FF (nghĩa là từ đầu đến cuối kho dữ liệu của game). Còn đối với đa số game Snes thì pointer có 2 byte, chỉ trong khoảng 0000 đến FFFF. Để xác định được pointer thì có nhiều cách, mà 2 cách phổ biến là dùng debugger để tra (set break point tại địa chỉ câu thoại, khi emulator đọc tới đó nó sẽ dừng, từ đó ta kiểm tra xem các thông tin gì được đọc/ghi tại địa chỉ này, lần mò ra pointer) hoặc mở Rom bằng hex editor, áp dụng cách dò tìm bằng mắt như kể trên. Có thể nói gần 100% game trên mọi hệ máy, dù mới dù cũ đều dùng pointer để nhận biết vị trí bắt đầu câu thoại. Kể đại khái thì game nó nhận biết câu nói nào bắt đầu ở đâu qua 1 trong 3 cách sau 1. Chuỗi có độ dài cố định: trường hợp này không dùng pointer mà mỗi câu được cấp cho 1 độ dài nhất định. Chẳng hạn như cứ hết 50 byte thì tự động nhảy sang câu khác. Nhưng cách này không dùng cho lời thoại trong game vì độ dài của lời thoại đâu có câu nào giống câu nào. Cách này thường dùng cho tên nhân vật, tên Item... 2. Dùng Pointer: đây là cách linh động nhất. 3. Phương pháp đặc biệt: khác 2 loại trên. Như Tear Ring Saga nó không dùng Pointer mà dùng phần khai báo độ dài của block hội thoại. (Đa số dữ liệu pointer trong game đều rất dễ tìm, nhưng cũng có game mã hóa nên không tìm được) P/s: nếu đã lập table của FQ rồi thì ném lên đây để tìm thử xem. - - - Updated - - - Trong ví dụ FE4 trên: khối thoại đầu game nằm ở $F841. Nhưng vì Rom có 200 header nên địa chỉ thực của nó là F841-200=F641. Vì FE4 là game encode theo kiểu little endian nên đảo ngược giá trị F641 thành 41F6, và đây là giá trị của pointer chỉ đến câu đó. Nhưng vì FE4 dùng pointer 3 byte nên giá trị F841-200=F641 phải là 00F641, đảo lại thành 41F600. Ta dò tìm giá trị 41F600 trong khắp Rom thì có thể được nhiều kết quả, thử thay đổi từng cái 1 thì chỉ có 1 địa chỉ tại DFE82 dẫn tới thay đổi trong game. Còn vị trí hội thoại của bản Nhật, bản Việt không giống nhau là đương nhiên, vì đã thay đổi rồi. Chỉ có địa chỉ pointer là giống nhau. Nhưng giá trị của pointer tại cùng địa chỉ của 2 bản là khác nhau vì nó dẫn tới vị trí khối thoại khác nhau mà.
[spoil]Cái so sánh đối chiếu Việt/Nhật là tui dùng để nhận biết giá trị của Pointer thôi, vì nếu chỉ đưa ra 1 dãy Hex thì tui không thể nhận ra đâu là Pointer. FD5841F600FD5AFD5110027001FD582FF900FD5AFD515001E001FD587EF900FD Nhờ đối chiếu, tui thấy Hex 41F600 nó khác Rom gốc, tức là bác đã thay đổi giá trị này. Đối chiếu tiếp tui lại thấy tương tự ở 2FF900, nên tui xác định được bộ 3 byte nằm sau FD58 là những giá trị của Pointer thôi. Theo bác giải thích, ví dụ Pointer tiếp theo là 2FF900, đảo lại 00F92F, cộng với 200 là ra địa chỉ $00FB2F là địa chỉ đoạn Text phải không? Nhưng Rom Nhật (không có 200 Header) thì ở vị trí $DFE82-200 = $DFC82 gồm có: FD58008090FD5AFD51... Vậy giá trị của Pointer là 008090, đảo lại 908000, mà cái Rom này Max là 3FFFFF rồi, thế nghĩa là sao? Bảng Table chưa có hoàn chỉnh vì mấy cái Kanji của nó rất khó nhìn (với 1 người không quen Kanji như tui thì tra còn khó hơn). Không biết bác có xài được không. Mà Upload lên phiền lắm nên bác Copy lại cho nhanh:[/spoil] [spoil]00=[END]\n\n 01=[LINE1]\r 02=[LINE2]\r 03=[SLOW] 06=オルニック 07=キャサリン 08=リッチモンド 09=ドワーフ 0A=カーディック 0B=ソフィア 0C=ペリーズ 0D=エルフ王ロイ 0E=ケンタウロス 0F=半魚人 13= 34=あ 11=い 23=う 48=え 2F=お 1F=か 3F=き 2C=く 40=け 25=こ 3A=さ 1A=し 31=す 52=せ 50=そ 14=た 42=ち 3C=つ 16=て 32=と 15=な 18=に 9A=ぬ 55=ね 10=の 17=は A8=ひ B4=ふ 7F=へ C2=ほ 28=ま 56=み 72=む 58=め 33=も 4D=や B5=ゆ 37=よ 22=ら 41=り 21=る 20=れ 60=ろ 2E=わ 2B=を 27=ん 1E=が 046D=ぎ A9=ぐ 86=げ 6F=ご 8A=ざ 46=じ 5C=ず 6B=ぜ 67=ぞ 26=だ 04F7=ぢ 0425=づ 29=で 44=ど 5A=ば 0448=び B6=ぶ A3=べ B7=ぼ 04F8=ぱ 04F9=ぴ 04AD=ぷ 04FA=ぺ 04FB=ぽ A1=ぁ 0426=ぃ AA=ぅ D7=ぇ 04FC=ぁ 4C=ゃ D8=ゅ 61=ょ 1B=っ 51=ア 64=イ 68=ウ 62=エ 49=オ 78=カ 4E=キ 3D=ク 79=ケ 8B=コ 4F=サ A4=シ 47=ス 04FD=セ 73=ソ 80=タ 76=チ 0449=ツ F8=テ 5D=ト 044A=ナ 53=ニ 04FE=ヌ 8F=ネ 0427=ノ DE=ハ 04AE=ヒ 45=フ 04FF=ヘ 04AF=ホ 5B=マ BF=ミ C3=ム 90=メ 7D=モ E8=ヤ CC=ユ F9=ヨ 5E=ラ 38=リ 3B=ル 7E=レ 3E=ロ 77=ワ 0501=ヲ 30=ン 7B=ガ 046E=ギ 70=グ E9=ゲ 9B=ゴ C0=ザ 8C=ジ 74=ズ 0511=ゼ 81=ゾ D9=ダ 0512=ヂ 05=ヅ 94=デ 43=ド 82=バ EA=ビ DF=ブ AF=ベ 0428=ボ 046F=パ 04B0=ピ 044B=プ 87=ペ 0514=ポ FA=ァ 5F=ィ 0515=ゥ 8D=ェ CD=ォ 54=ャ FB=ュ CE=ョ 39=ッ 2A=ー 0516=― 12=、 19=。 2D=! 59=? 1C=「 1D=」 4B=・ 35=[ 36=] 24=: 044C=( 044D=) 04B1=A 0517=B 0518=X 0519=Y 051A=L 051B=R 6C=城 0429=砦 E0=町 E1=南 DA=西 C4=北 FC=東 A5=海 0470=岸 04B2=草 04B3=原 DB=森 051C=林 044E=丘 051D=谷 EB=沼 0471=館 04B4=茎 AB=地 051E=湖 B8=山 AC=道 044F=洞 051F=穴 042A=雪 91=塔 B9=神 0450=殿 71=戦 0472=記 0473=多 69=様 83=村 FD=族 042B=住 0474=二 B0=国 CF=分 57=王 0475=治 FE=支 D0=配 0476=従 B1=中 0477=央 0478=防 FF=々 92=一 04B5=流 6A=士 AD=生 0451=土 0479=具 4A=人 04B6=貧 EC=活 04B7=送 65=事 042C=発 047A=備 047B=即 047C=位 04B8=彼 9C=女 047D=欲 04B9=権 88=力 0410=求 8E=手 0411=始 0520=服 0452=息 97=子 04BA=質 047E=老 7A=兵 0453=集 042D=連 63=行 0454=度 047F=店 89=下 04BB=民 0455=利 C5=武 6D=者 ED=命 0412=逃 0456=領 98=主 0457=伯 C6=知 0480=正 04BC=病 04BD=農 0481=身 042E=場 0482=門 0483=運 04BE=実 E2=今 04BF=侵 04C0= 042F=開 0413=元 BA=所 0458=相 0484=棒 0414=声 B2=死 04C1= 0430=落 6E=魔 BB=物 C7=強 0431=光 04C2= 04C3= 0415=会 0485= DC=自 0486=打 99=気 0521= 0522= 0459= 0487= 0488= 04C4= E3=待 045A=騎 C8=向 0432=況 E4=協 0433=立 D1=父 0489=容 0434=体 0416=思 A6=早 045B=我 0417=最 048A=後 EE=守 0418=無 9D=何 0435=宿 EF=屋 9E=敵 0436=全 75=来 048B=放 045C=回 048C=世 0437=争 04C5= 048D=形 0419=水 0438=導 D2=話 D3=聞 045D=用 0439=意 B3=勇 F0=修 AE=出 DD=夫 C9=先 93=半 95=魚 C1=見 D4=悪 043A=妻 7C=隊 D5=器 9F=持 045E=岩 043B=近 84=仲 BC=助 F1=私 66=間 A2=石 F2=宝 04C6= 04C7=夜 043C=化 04C8=男 045F= 04C9= BD=使 04CA= 048E=以 96=前 048F=潮 04CB= 0460=月 F3=動 041A=妖 043D=精 E5=味 A0=方 CA=大 0490=太 0491= 0461= 041B=昔 F4=心 0492=泉 0493= 041C=帰 0494=関 0495=係 0523= 04CC=皮 0496= 041D=法 04CD=研 04CE=究 04CF=矢 04D0=弓 043E=長 0497= F5=必 041E=要 0498= 04D1= 043F=牢 A7=時 04D2= 0499=顔 04D3= 0440=金 041F=当 0462= 0441=和 0420=泥 04D4= 0524= 04D5=代 049A=牧 0442=師 0463=剣 0421=勝 0525= 04D6=弟 049B=作 0464=軍 049C=外 04D7= 04D8=期 E6=殺 049D= E7=入 04D9= 049E= 04DA= 0443=信 04DB= D6=通 049F= 0422=本 04DC= 04A0= 04A1= 0423=引 CB=上 0526= 04A2= 0465= 04A3=変 04DD= 0466= 0467= 04DE= 04A4=古 0468=数 04A5=食 0444=負 0469=聖 04A6=仕 04A7=合 04DF=考 F6=番 04E0=感 04E1=覚 0424=橋 0527= 04E2= BE=言 04E3= 04E4= F7=(c) 04E5= 04E6= 04E7= 04E8= 0445=決 04E9=名 0528= 85=部 046A=苦 0529= 0446=少 04A8= 04EA= 04EB= 04A9=広 04EC= 0447=日 04AA= 04ED= 04EE= 046B= 04AB= 046C= 04EF= 04F0= 052A= 04AC=進 04F1= 04F2= 04F3= 04F4= 052B= 052C=輪 052D=炎 04F5= 04F6=弱[/spoil]
Toàn bộ về Pointer của FQ trong bức hình này. Như vậy, chỉ cần giải quyết thêm các vấn đề sau nữa là hoàn chỉnh: - Font chữ Variable width, tức là điều chỉnh độ rộng của từng chữ. - Nén text lại. Làm sao để tiết kiệm chỗ trống vì kho hội thoại của FQ khá hẹp, từ $12FEC cho đến $1818A (20894 bytes, mỗi byte là 1 ký tự, nghĩa là ta phải dịch sao cho số chữ hạn chế trong vòng 20894 ký tự. Đây là việc rất dở và sẽ làm giảm chất lượng bản dịch). Text của FQ không nhiều, nhắm chừng 1 vài tuần là dịch hết, kể cả hack.
To asm65816: [spoil]Theo những dữ liệu có sẵn của bác thì tui biết cách tính ra giá trị từng Pointer rồi. Tuy nhiên phải có giá trị nghi ngờ thì mới tính ra được giá trị Base của Pointer, và không có giá trị nghi ngờ thì cũng không tìm được địa chỉ Pointer nghi ngờ. Giả sử bây giờ tui dò ra được 1 đoạn Text bất kỳ, ví dụ là đoạn No.6, tui dùng mắt để dò các dòng chữ có nghĩa cho đến 半魚人 là hết, về sau là をを「.じつねリロ.キ王サよお.よリカげおど.ど戦わ人.チ, những cái này rời rạc vô nghĩa nên không phải là Text hội thoại. Rồi tui lập danh sách ngược lại từ 半魚人 (với 00 là Control Hex, Rom của tui không có 200 Byte Header): $17F13=「みんなは下がって!! わたしはもう少し、海に近づいてみよう!」 $17F37=「水がふかいぞ!! この先に進むのはキケンだ!!」 $17F53=オルニック $17F59=キャサリン $17F5F=リッチモンド $17F66=ドワーフ $17F6B=カーディック $17F72=ソフィア $17F77=ペリーズ $17F7C=エルフ王ロイ $17F83=ケンタウロス $17F8A=半魚人 Thì ở đây tui chỉ biết địa chỉ Text thôi, chưa có cơ sở gì để tính giá trị Base của Pointer. Ở đây bác cho biết giá trị Base là 2A00 nên tui tính được từ $17F8A=半魚人, lấy 2 byte sau là 7F8A - 2A00 = 558A. Tui dùng phầm mềm Hex Editor để tìm và đổi các giá trị 558A cho đến khi tìm được đúng địa chỉ của Pointer là $12DE6 (vì không có 200 Byte Header). Hoặc đơn giản hơn là tính luôn Pointer của $17F83=ケンタウロス, lấy 7F83 - 2A00 = 5583, khi có 4 Byte này thì Search sẽ nhanh hơn (trong trường hợp tất cả Pointer nằm kề nhau, tui không biết có trường hợp Pointer nằm ở vị trí khác nhau hay không). Search 5583558A là ra ngay địa chỉ chính xác. Vậy chỉ cần biết giá trị Base là có thể tính ra hết tất cả Pointer, nhưng vấn đề là tính cách nào (cái này tui tìm hiểu thêm để sau này có thể áp dụng cho Game khác)? Giờ đã biết giá trị của Pointer rồi, sang bước thay đổi lời thoại. 90% các đoạn Text trong Game này nếu chuyển sang tiếng Anh thì sẽ không đủ. Ví dụ 半魚人 chỉ có 3 Byte không thể dịch là Merman được, vậy phải viết lại ra chỗ trống rồi hướng Pointer ở $12DE6 ra vị trí khác, ví dụ từ $BED8 tới $BF45 là khoảng trống (áp dụng cho Rom không có 200 Byte Header), nếu tui viết chữ Merman bắt đầu từ $BED9, rồi lấy BED9 - 2A00 = A4D9, vậy là tui sẽ thay 558A bằng A4D9? Nếu đúng là làm như vậy thì chắc chắn sẽ không đủ khoảng trống, vậy là mình vẫn phải tính toán đoạn nào thật sự cần thì chuyển chứ không thể viết thoải mái. Với lại tui cũng không biết có đoạn trống nào không được đụng vào hay tất cả các khoảng trống đều có thể sử dụng? Mà cái Header để làm gì vậy, tui thấy hầu hết nó trống không, thỉnh thoảng mới có vài Code gì gì đó. Với cả bác tìm giúp chỗ nào quy định độ dài của Font, bác rành rồi thì sẽ tìm nhanh hơn. PS: Dịch đối với bác thì rất nhanh, vì bác biết tiếng Nhật, lại có kỹ năng. Trong khi tui dịch rất mất thời gian. Vì Hex không đủ, phải nghĩ ra câu thế nào cho nó vừa, nhiều khi phải dùng ít byte cho nhiều ký tự, ví dụ 046D044804F8=KARDICK, 5C6B=DWARF. Khi dịch thì phải gõ từng Code vào, lại không căn xuống dòng được, phải mà biết dùng Atlas để Add và không lo giới hạn Hex thì soạn ra bằng Notepad hay EmEditor thì dễ căn hàng hơn. Chứ giờ tui dịch mỗi đoạn là mỗi phải vào Game để Test.[/spoil]
Header là thông tin cho các emulator đọc. Bản thân Rom không có header. Để cho tiện thì xóa luôn cũng được, vì các emu sau này đọc Rom không cần header rồi. Tìm Pointer trong ví dụ trên: câu đầu tiên ông vua nói trong game, và là câu dễ tìm, dễ test nhất (vì nó nằm ngay đầu game). Search trong Rom thì sẽ thấy ngay ở 13E0B. Trước nó và sau nó thấy có rất nhiều câu khác. Kéo lên trên block hội thoại sẽ thấy 1 vùng dữ liệu dạng n, n+a, n+a+b, n+a+b+c,.... Nhiều khả năng đó là Pointer. Vì như đã giải thích ở trên, địa chỉ câu sau sẽ lớn hơn địa chỉ câu trước, cho nên giá trị của Pointer đứng trước sẽ nhỏ hơn giá trị của Pointer đứng sau. Thông thường kho Pointer luôn đứng ngay trước kho text, vì nó chỉ có thể chỉ từ vị trí của nó trở xuống chứ không thể chỉ ngược lên trên. Trừ trường hợp game Snes Hirom thì có thể chỉ ngược lên. Game Snes có 2 loại là Hirom và Lorom. Như vậy ta chỉ mới nghi ngờ vùng dữ liệu đứng trước khối thoại (bắt đầu từ $12FEC cho đến $1818A) là Pointer. Nhưng chưa chắc lắm. Từ đây có nhiều cách để xác định. Xem thử câu đầu tiên của khối text là gì. Rồi nhảy tới Pointer đầu tiên trong khu dữ liệu đó, chỉnh sửa và xem câu (đầu tiên của khối text) trong game có thay đổi không. Nếu có, thì là ta đã tìm đúng và từ đó tính ra giá trị base như trong file excel trên. Còn cách thử trong ví dụ ở file Excel trên là lấy các pointer đứng cuối kho dữ liệu pointer trừ cho nhau, giả dụ được x, y, z. Đoạn, lấy giá trị địa chỉ của các câu text đứng cuối cùng trong kho dữ liệu text trừ cho nhau, giả dụ cũng được x, y, z thì nghĩa là các pointer ta trừ ứng với địa chỉ các câu đã trừ. Đơn giản vậy thôi. - - - Updated - - - Còn về chỗ trống thì giải quyết bằng 1 trong 3 cách sau. 1. Viết ngắn, dịch gọn cho đủ bao nhiêu ký tự đó. Đây là cách làm dở nhất vì bản dịch sẽ không hay được. Kiểu như nói tiếng bồi ấy, câu cú không đủ độ văn chương. 2. Viết lại code thể hiện chữ: 1 byte có thể hiển thị nhiều ký tự hoặc 1 từ, cụm từ... Hình như FQ đã có sẵn code này rồi, chỉ việc chỉnh lại theo ý mình thôi. Cách này gọi là DTE (Dual Tile Encoding) hay MTE (Multi Tile Encoding). 3. Mở rộng Rom, code lại 1 chút và dời đoạn hội thoại ra chỗ mới. Game Snes được phép tối đa tới 6M, trong khi FQ chỉ chừng 1.5Mb nên khi mở rộng thì sẽ được rất nhiều chỗ trống.
Thấy mấy thím nói về việt hóa nhức đầu và phức tạp nhỉ , thật lắm công phu có game nào việt hóa dễ như chỉ thay đoạn tiếng anh bằng tiếng việt như dịch sub phim không nhỉ
[spoil]Có, Game làm bằng RPG Maker nếu nó đưa nguyên Source (thật ra nghe nói cũng có phần mềm giải Source nhưng không rảnh để tìm hiểu). Ngoài ra có một số Game nổi tiếng có vài đứa rảnh Pro đến mức lập trình nên phần mềm Hack Source luôn, mình chỉ việc mở ra, sửa Text, lưu. Ví dụ như vài Game Illusion Final Fantasy VIII. Còn không thì đầu quân vào các hãng Game Online Việt Nam, tụi nó mua Source về rồi mình chỉ việc ngồi dịch thôi. Cái Game Harvest Moon mình cũng tính dịch tiếng Việt có dấu nhưng mà tiếc là trình cùi quá nên không sửa Font được. Có mỗi cái Tales of Phantasia là dịch có dấu được nhưng lúc đó lại không rảnh. [/spoil]