设为首页收藏本站
机战Z2破界篇 星组汉化 下载

星组游戏论坛

 找回密码
 注册(QQ注册+邀请注册)

QQ登录

只需一步,快速开始

查看: 1104|回复: 5

[原创] 1782.-.龙珠大冒险ADV(J)日文文本导出软件源代码(c#) [复制链接]

Rank: 12Rank: 12Rank: 12

UID
95345
星币
84
积分
60
阅读权限
90
注册时间
2012-12-14
最后登录
2013-8-17
发表于 2013-3-10 13:29:56 |显示全部楼层
本帖最后由 青龍 于 2013-3-10 13:34 编辑

  1782.-.龙珠大冒险ADV是TGB汉化组2006年的作品,近期逛贴吧时收到反馈说原项目有BUG,遂项目重开,修复死机BUG,顺带重新润色下文本
  手上备份的文本不是按指针格式导出的,并且我不知道死神导出软件的格式,只能重新导出文本,所以写了个简单C#的控制台程序

2楼是源代码,语言是C#,语法特点是过程C(在大学里面学过C语言的人,再研习下C#的语法,都能看得懂)


导出文本效果一览:


指针:00DA11B0 文本:00A821F0 长度:029
===============
次のドラゴヲボ-ルをめざして
出發したのも【0151】【000A】つかの間…
===============
在悟空一行潜入深海洞窟,
准备出发去寻找下一颗
龙珠之时……
===============


指针:00DA11B4 文本:00A8222A 长度:030
===============
なんとドラゴヲレ-ダ-が
こわれてしまい悟空は
大ヨワり!
===============
不料一伙恶徒尾随而来,
企图抢夺悟空手上的龙珠和雷达!
===============


指针:00DA11B8 文本:00A82266 长度:038
===============
さっそくブルマに
修理してもらい【0151】【000A】いっしょに
海底洞窟へとむかうことに!
===============
此时布尔玛正在抢修潜艇,
以便按原计划和悟空一起
进入海底洞窟寻宝!
===============


指针:00DA11BC 文本:00A822B2 长度:028
===============
はてさて【0151】【000A】どんなトラブルが
まっているのであろうか?
===============
邪恶的气息正蠢蠢欲动,
悟空一行能逃过此劫吗?
===============

Rank: 12Rank: 12Rank: 12

UID
95345
星币
84
积分
60
阅读权限
90
注册时间
2012-12-14
最后登录
2013-8-17
发表于 2013-3-10 13:36:12 |显示全部楼层
/*
* 本软件由SharpDevelop创建。
* 作者:青龍
* 日期:2013-2-14
* 时间:10:13
*
* 本软件用于GBA游戏1782.-.Dragonball Advance(J)
* 1782.-.龙珠大冒险ADV日文文本导出
*
* 本软件导出的文本格式为:紫部翻译流专用格式
* 该格式可减轻后期校译、修译文本的工作量,方便直观
*
* 这种格式是配合后期一键导入软件,方便导入测试
* 导出的模式是搜索指针,按ROM的指针存储导出文本
*
* 版权:TGB汉化工作室
* 状态:开源共享
*/
using System;
using System.IO;

namespace TxtOut_1782_
{
    class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("1782.-.Dragonball Advance(J)日文文本导出软件,程序启动!");
            #region 文件操作
            FileStream rom = new FileStream(@"E:\汉化项目\龙珠汉化项目\1782.-.Dragonball Advance(J).gba",FileMode.Open,FileAccess.Read);
            BinaryReader romData = new BinaryReader(rom);
            
            FileStream tbl = new FileStream(@"E:\汉化项目\龙珠汉化项目\1782.-.Dragonball Advance(J)_tbl.txt",FileMode.Open,FileAccess.Read);
            StreamReader tblData = new StreamReader(tbl);

            FileStream txt = new FileStream(@"E:\汉化项目\龙珠汉化项目\1782.-.Dragonball Advance(C)_txtout.txt",FileMode.Create,FileAccess.Write);
            StreamWriter txtData = new StreamWriter(txt);
            #endregion
            
            string[] mabiao = new string[600];
            int Rom_pianyiliang = 0;
            int Rom_pianyiliang2 = 0;
            uint Rom_bin = 0;
            uint Rom_bin2 = 0;
            
            #region 读取日文码表
            //注:码表需要保存成UTF-8格式,否则导出的文本是乱码
            //由于日文版龙珠大冒险ADV字库不大,所以懒得用链表,直接写个500的循环读取,这个是我偷懒……
            for (int i = 0; i < 500; i++)
            {
                string tbl_wb = tblData.ReadLine();
                if (tbl_wb!=null&&tbl_wb.Length>3)
                {
                    string bianhao = tbl_wb.Substring(0,3);
                    uint bianhao_16 = Convert.ToUInt16(bianhao,16);
                    mabiao[bianhao_16] = tbl_wb.Substring(4,1);
                }
            }
            #endregion
            
            rom.Seek(Rom_pianyiliang,SeekOrigin.Begin);
            Rom_bin = romData.ReadUInt32();
            
            Rom_pianyiliang2 = Rom_pianyiliang + 4;
            rom.Seek(Rom_pianyiliang2,SeekOrigin.Begin);
            Rom_bin2 = romData.ReadUInt32();
            //  通过对比前后两组数据,判断是否是指针,并且是否是一个指针段
            //  这个写法是因为我跟踪的时候已经知道文本是按照指针读取,并且每个章节的文本是按指针表进行保存的
            //只要能通过判断找到指针段,即可通过指针表找到文本区,防止文本错导、漏导的情况。导出的文本也是按游
            //戏的顺序连续显示,方便翻译和后期校译、修译、润色。
            while (Rom_pianyiliang<0xFFFFF0)
            {
                if (Rom_bin>0x8000000&&Rom_bin<0x8FFFFFF&&Rom_bin2>0x8000000&&Rom_bin2<0x8FFFFFF)
                {
                    //上面的条件判断是为了找到指针表
                    while (Rom_bin>0x8000000&&Rom_bin<0x8FFFFFF)
                    {
                        //当指针表找到后,开始导出文本
                        Rom_bin = Rom_bin - 0x8000000;
                        uint Rom_wenbendizhi = Rom_bin;
                        rom.Seek(Rom_bin,SeekOrigin.Begin);
                        uint zhima = romData.ReadUInt16();
                        int changdu = 0;
                        for (int i = 0; i < 100; i++)
                        {
                            if (zhima>0x200)
                            {
                                break;
                            }
                            if (zhima<0x200)
                            {
                                changdu++;
                            }
                            if (zhima == 0x155)
                            {
                                //0x155是句子结束的控制符
                                txtData.WriteLine("指针:{0:X8} 文本:{1:X8} 长度:{2:D3}",Rom_pianyiliang,Rom_wenbendizhi,changdu);
                                txtData.WriteLine("===============");
                                for (int y = 0; y < changdu; y++)
                                {
                                    rom.Seek(Rom_wenbendizhi,SeekOrigin.Begin);
                                    zhima = romData.ReadUInt16();
                                    //下面的这部分是文本控制符
                                    switch (zhima)
                                    {
                                        case 0x151:
                                            txtData.Write("【0151】");//这个是空格符
                                            Rom_wenbendizhi = Rom_wenbendizhi + 2;
                                            rom.Seek(Rom_wenbendizhi,SeekOrigin.Begin);
                                            zhima = romData.ReadUInt16();
                                            txtData.Write("【{0:X4}】",zhima);
                                            y++;
                                            break;
                                        case 0x152:
                                            txtData.Write("【0152】");//这个是延时停顿符
                                            Rom_wenbendizhi = Rom_wenbendizhi + 2;
                                            rom.Seek(Rom_wenbendizhi,SeekOrigin.Begin);
                                            zhima = romData.ReadUInt16();
                                            txtData.Write("【{0:X4}】",zhima);
                                            y++;
                                            break;
                                        case 0x153:
                                            txtData.WriteLine("");//这个是换行符
                                            break;
                                        case 0x154:
                                            txtData.Write("【0154】");//这个是换页符
                                            break;
                                        case 0x155:
                                            break;
                                        case 0x156:
                                            txtData.Write("【0156】");//这个是文本显示居中符
                                            Rom_wenbendizhi = Rom_wenbendizhi + 2;
                                            rom.Seek(Rom_wenbendizhi,SeekOrigin.Begin);
                                            zhima = romData.ReadUInt16();
                                            txtData.Write("【{0:X4}】",zhima);
                                            y++;
                                            break;
                                        case 0x157:
                                            txtData.Write("【0157】");
                                            break;
                                        case 0x158:
                                            txtData.Write("【0158】");
                                            break;
                                        case 0x159:
                                            txtData.Write("【0159】");
                                            break;
                                        default:
                                            txtData.Write("{0}",mabiao[zhima]);
                                            break;
                                    }
                                    Rom_wenbendizhi = Rom_wenbendizhi + 2;
                                }
                                txtData.WriteLine("");
                                txtData.WriteLine("===============");
                                txtData.WriteLine("");
                                txtData.WriteLine("===============");
                                txtData.WriteLine("");
                                Console.Write("·");//这个是显示成功导出一个文本
                                break;
                            }
                            Rom_bin = Rom_bin + 2;
                            rom.Seek(Rom_bin,SeekOrigin.Begin);
                            zhima = romData.ReadUInt16();
                        }
                        Rom_pianyiliang = Rom_pianyiliang + 4;
                        rom.Seek(Rom_pianyiliang,SeekOrigin.Begin);
                        Rom_bin = romData.ReadUInt32();
                    }
                }
                Rom_pianyiliang++;
                Rom_pianyiliang2 = Rom_pianyiliang + 4;
                rom.Seek(Rom_pianyiliang,SeekOrigin.Begin);
                Rom_bin = romData.ReadUInt32();
                rom.Seek(Rom_pianyiliang2,SeekOrigin.Begin);
                Rom_bin2 = romData.ReadUInt32();
            }
            
            romData.Close();
            rom.Close();
            tblData.Close();
            tbl.Close();
            txtData.Close();
            txt.Close();
            
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }
}

Rank: 3Rank: 3

UID
66048
星币
175
积分
151
阅读权限
30
注册时间
2011-2-9
最后登录
2016-1-31

STS-X-001 七芒星勋章

发表于 2013-3-10 17:57:08 |显示全部楼层
发帖际遇:xdkshu 发帖时在路边捡到 1 星币,偷偷放进了口袋.幸运榜 / 衰神榜
懒得写

Rank: 4

UID
97095
星币
580
积分
422
阅读权限
40
注册时间
2013-2-17
最后登录
2014-4-12
发表于 2013-3-10 20:53:29 |显示全部楼层
我擦、都通关几遍了、有BUG?

Rank: 7Rank: 7Rank: 7

UID
34667
星币
3629
积分
2589
阅读权限
70
注册时间
2009-3-9
最后登录
2017-11-22

STS-X-001 七芒星勋章

发表于 2013-3-10 22:57:45 |显示全部楼层
都不知有这项游戏,要尝试下了
头像被屏蔽

禁止发言

UID
115225
星币
59
积分
350
阅读权限
0
注册时间
2016-7-25
最后登录
2017-10-24
发表于 2016-9-14 22:37:22 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

Archiver|星组游戏论坛 ( 京公网安备110403080002 )  

GMT+8, 2017-11-22 15:18

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部