static string FontChar(uint moji1, uint moji2, PatchUtil.PRIORITY_CODE priorityCode) { SystemTextEncoder encoder = Program.SystemTextEncoder; if (priorityCode == PatchUtil.PRIORITY_CODE.SJIS) { if (U.isSJIS1stCode((byte)moji1) && U.isSJIS2ndCode((byte)moji2)) { byte[] str = new byte[3]; str[0] = (byte)moji1; str[1] = (byte)moji2; str[2] = 0; return(encoder.Decode(str, 0, 2)); } } if (moji1 == 0) { byte[] str = new byte[2]; str[0] = (byte)moji2; str[1] = 0; return(encoder.Decode(str, 0, 1)); } //意味不明な文字 return(U.ToCharOneHex((byte)moji1) + "_" + U.ToCharOneHex((byte)moji2)); }
public FETextDecode() { this.ROM = Program.ROM; this.SystemTextEncoder = Program.SystemTextEncoder; this.PriorityCode = PatchUtil.SearchPriorityCode(); this.HasAutoNewLine = PatchUtil.SearchAutoNewLinePatch(); }
string ConvertASCII(byte[] byte16) { PatchUtil.PRIORITY_CODE priorityCode = PatchUtil.SearchPriorityCode(); SystemTextEncoder encoder = Program.SystemTextEncoder; StringBuilder sb = new StringBuilder(); for (int i = 0; i < 16; i++) { if (i >= byte16.Length) { break; } if (priorityCode == PatchUtil.PRIORITY_CODE.UTF8) { sb.Append((char)byte16[i]); continue; } else if (i < 15 && U.isSJIS1stCode(byte16[i]) && U.isSJIS2ndCode(byte16[i + 1])) { if (priorityCode == PatchUtil.PRIORITY_CODE.LAT1) { //SJISと 1バイトUnicodeは範囲が重複するので、どちらかを優先しないといけない. if (byte16[i] >= 0x81 && byte16[i] < 0xFE) { //英語版FEにはUnicodeの1バイトだけ表記があるらしい. sb.Append((char)byte16[i]); sb.Append((char)byte16[i + 1]); i++; continue; } } sb.Append(encoder.Decode(byte16, i, 2)); i++; continue; } if (U.isAscii(byte16[i])) { sb.Append((char)byte16[i]); continue; } if (byte16[i] >= 0x81 && byte16[i] < 0xFE) {//FE独自フォントの可能性. if (priorityCode == PatchUtil.PRIORITY_CODE.LAT1) { sb.Append((char)byte16[i]); continue; } } //不明なコード sb.Append('.'); } return(sb.ToString()); }
public FETextDecode(ROM rom, SystemTextEncoder encoder) { this.ROM = rom; this.SystemTextEncoder = encoder; if (rom == Program.ROM) { this.PriorityCode = PatchUtil.SearchPriorityCode(); } else { this.PriorityCode = PatchUtil.SearchPriorityCode(rom); } }
//翻訳用のよくあるテキスト集の作成. public static Dictionary <string, string> LoadTranslateDic(string from, string to, string rom_from, string rom_to) { Dictionary <string, string> dic = new Dictionary <string, string>(); ROM rom_f = new ROM(); string version; if (!rom_f.Load(rom_from, out version)) { return(dic); } ROM rom_t = new ROM(); if (!rom_t.Load(rom_to, out version)) { return(dic); } if (rom_f.RomInfo.version() != rom_t.RomInfo.version()) { return(dic); } SystemTextEncoder from_tbl, to_tbl; int from_n; bool trimEnd1F = true; if (from == "ja") { from_n = 0; from_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.Shift_JIS, rom_f); } else if (from == "en") { from_n = 1; if (rom_f.RomInfo.version() == 6) { from_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.EN_TBL, rom_f); } else { from_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.Shift_JIS, rom_f); } trimEnd1F = false; } else if (from == "zh" || from == "zh-CN") { from_n = 0; from_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.ZH_TBL, rom_f); } else if (from == "ko" || from == "ko-KR") { from_n = 0; from_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.KO_TBL, rom_f); } else {//fromが対応外. return(dic); } int to_n; if (to == "ja") { to_n = 0; to_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.Shift_JIS, rom_t); } else if (to == "en") { to_n = 1; if (rom_t.RomInfo.version() == 6) { to_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.EN_TBL, rom_t); } else { to_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.Shift_JIS, rom_t); } } else if (to == "zh" || to == "zh-CN") { to_n = 0; to_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.ZH_TBL, rom_t); } else if (to == "ko" || to == "ko-KR") { to_n = 0; to_tbl = new SystemTextEncoder(OptionForm.textencoding_enum.KO_TBL, rom_t); } else {//toが対応外. return(dic); } //FE8は、日本語版と英語版で顔画像の並びが違うので補正するかどうかのチェック FE8FaceCode48Fix fe8faceCode48Fix = is_FE8FaceCode48Fix(rom_f, rom_t); string filename = U.ConfigDataFilename("translate_textid_", rom_f); string[] lines = File.ReadAllLines(filename); FETextDecode from_decoder = new FETextDecode(rom_f, from_tbl); FETextDecode to_decoder = new FETextDecode(rom_t, to_tbl); for (int i = 0; i < lines.Length; i++) { if (U.IsComment(lines[i])) { continue; } string line = U.ClipComment(lines[i]); string[] sp = line.Split('\t'); if (sp.Length < 2) { continue; } string from_string, to_string; uint from_key = U.atoh(sp[from_n]); uint orignal_from_key = from_key; if (from_key <= 0) { continue; } if (U.isSafetyPointer(from_key, rom_f)) {//ポインタの場合、実アドレスを求める. from_key = rom_f.u32(U.toOffset(from_key)); if (!U.isSafetyPointer(from_key, rom_f)) { continue; } } from_string = from_decoder.Decode(from_key); from_string = from_string.ToUpper(); uint to_key = U.atoh(sp[to_n]); int change_string_pos = sp[to_n].IndexOf('|'); if (change_string_pos < 0) { if (to_key <= 0) { dic[U.ToHexString(orignal_from_key) + "#NOTFOUND#" + from_string] = ""; continue; } if (U.isSafetyPointer(to_key, rom_t)) {//ポインタの場合、実アドレスを求める. to_key = rom_t.u32(U.toOffset(to_key)); if (!U.isSafetyPointer(to_key, rom_t)) { dic[U.ToHexString(orignal_from_key) + "#NOTFOUND#" + from_string] = ""; continue; } } to_string = to_decoder.Decode(to_key); } else {//長さ当の問題で置換できないものは、代替えテキストを入れます. to_string = sp[to_n].Substring(change_string_pos + 1); } //FE8顔画像の修正. if (fe8faceCode48Fix != FE8FaceCode48Fix.NONE) { to_string = FE8SkipFace48(to_string, fe8faceCode48Fix); } if (trimEnd1F) { //末尾の001Fを消す to_string = Trim001F(to_string); } dic[from_string] = to_string; dic[U.ToHexString(orignal_from_key) + "|" + from_string] = to_string; } return(dic); }
static void ReBuildSystemTextEncoder() { SystemTextEncoder = new SystemTextEncoder(); }