static InputFormRef Init(Form self) { return(new InputFormRef(self , "" , Program.ROM.RomInfo.mask_pointer() , 4 , (int i, uint addr) => { return Program.ROM.u8(addr) != 255; } , (int i, uint addr) => { uint c = Program.ROM.u16(addr); string str = Program.ROM.getString(addr, 2); if (!Program.ROM.RomInfo.is_multibyte()) { if (c >= 0x82 && c <= 0xFF) { //英語版FEにはUnicodeの1バイトだけ表記があるらしい. str = "@00" + c.ToString("X02"); } } str = FETextDecode.ConvertSPMoji(Program.ROM, str); return i.ToString("X04") + " " + c.ToString("X04") + " " + str; } )); }
private void SEARCH_COUNT_BUTTON_Click(object sender, EventArgs e) { Dictionary <uint, FETextDecode.huffman_count_st> dic = new Dictionary <uint, FETextDecode.huffman_count_st>(); //初期値を入れる. uint addr = (uint)InputFormRef.BaseAddress; int limitsize = (int)InputFormRef.DataCount; for (int i = 0; i < limitsize; i++) { FETextDecode.huffman_count_st st = new FETextDecode.huffman_count_st(); st.code_number = i; dic[Program.ROM.u16(addr)] = st; addr += InputFormRef.BlockSize; } //テキスト探索. FETextDecode textdecoder = new FETextDecode(); List <U.AddrResult> list = TextForm.MakeItemList(); for (int i = 0; i < list.Count; i++) { uint textaddr = Program.ROM.p32(list[i].addr); textdecoder.huffman_count(textaddr, ref dic); } SEARCH_COUNT_LIST.Items.Clear(); uint minimaumCount = (uint)SEARCH_COUNT.Value; foreach (var pair in dic) { if (pair.Key == 0) { continue; } if (pair.Value.count > minimaumCount) { continue; } string line = pair.Value.code_number.ToString(); line = line + "," + U.ConvertUnitToMojiChar((uint)pair.Key); line = line + "," + pair.Value.count.ToString(); for (int n = 0; n < pair.Value.unsing_text_addr.Count; n++) { for (int i = 0; i < list.Count; i++) { uint textaddr = Program.ROM.p32(list[i].addr); if (pair.Value.unsing_text_addr[n] == textaddr) { line = line + "," + i.ToString("X"); break; } } } SEARCH_COUNT_LIST.Items.Add(line); } }
public static void CheckText(uint textid, string arg1, List <ErrorSt> errors, Type cond, uint addr, uint tag = U.NOT_FOUND) { string text = FETextDecode.Direct(textid); string errorMessage = TextForm.GetErrorMessage(text, textid, arg1); if (errorMessage != "") { errors.Add(new FELint.ErrorSt(cond, U.toOffset(addr) , R._("TextID:{0}\r\n{1}", U.To0xHexString(textid), errorMessage), tag)); } }
public static void DeathQuoteTextMessage(uint textid, List <ErrorSt> errors, Type cond, uint addr, uint tag = U.NOT_FOUND) { string text = FETextDecode.Direct(textid); string errorMessage = TextForm.CheckConversationTextMessage(text, TextForm.MAX_DEATH_QUOTE_WIDTH); if (errorMessage != "") { errors.Add(new FELint.ErrorSt(cond, U.toOffset(addr) , R._("TextID:{0}\r\n{1}", U.To0xHexString(textid), errorMessage), tag)); } }
public static string GetName(uint id) { InputFormRef InputFormRef = Init(null); uint addr = InputFormRef.IDToAddr(id); if (!U.isSafetyOffset(addr)) { return(""); } uint text_id = Program.ROM.u16(addr); return(FETextDecode.Direct(text_id)); }
public static void MakeCheckError(List <FELint.ErrorSt> errors) { InputFormRef InputFormRef = Init(null); if (InputFormRef.DataCount < 10) { errors.Add(new FELint.ErrorSt(FELint.Type.ITEM, U.NOT_FOUND , R._("アイテムデータが極端に少ないです。破損している可能性があります。"))); } Dictionary <uint, U.AddrResult> itemWeaponEffectDic = ItemWeaponEffectForm.MakeDic(); uint item_addr = InputFormRef.BaseAddress; for (uint i = 0; i < InputFormRef.DataCount; i++, item_addr += InputFormRef.BlockSize) { uint name = Program.ROM.u16(item_addr + 0); FELint.CheckText(name, "NAME1", errors, FELint.Type.ITEM, item_addr, i); uint id = Program.ROM.u8(item_addr + 6); if (id == 0) {//ただの使っていないデータ continue; } if (i > 0) { uint info = Program.ROM.u16(item_addr + 2); uint info2 = Program.ROM.u16(item_addr + 4); uint type = Program.ROM.u8(item_addr + 7); uint attr1 = Program.ROM.u8(item_addr + 8); bool isEquip = (attr1 & 0x01) == 0x01; string errorMessage = ChcekTextItem1ErrorMessage(id, FETextDecode.Direct(info), info, type, isEquip); if (errorMessage != "") { errors.Add(new FELint.ErrorSt(FELint.Type.ITEM, U.toOffset(item_addr) , R._("TextID:{0}\r\n{1}", U.To0xHexString(info), errorMessage), i)); } errorMessage = ChcekTextItem2ErrorMessage(id, FETextDecode.Direct(info2), info2, type, isEquip); if (errorMessage != "") { errors.Add(new FELint.ErrorSt(FELint.Type.ITEM, U.toOffset(item_addr) , R._("TextID:{0}\r\n{1}", U.To0xHexString(info2), errorMessage), i)); } } //武器攻撃範囲のチェック MakeCheckErrorWeaponRange(itemWeaponEffectDic, item_addr, i, errors); } }
public static void ConversationTextMessage(uint textid, List <ErrorSt> errors, Type cond, uint addr, uint tag = U.NOT_FOUND) { string text = FETextDecode.Direct(textid); string errorMessage = TextForm.CheckConversationTextMessage(text, textid, TextForm.MAX_SERIF_WIDTH); if (errorMessage != "") { if (IsVanillaGlitchForConversationTextMessage(text, textid, cond)) { return; } errors.Add(new FELint.ErrorSt(cond, U.toOffset(addr) , R._("TextID:{0}\r\n{1}", U.To0xHexString(textid), errorMessage), tag)); } }
public void JumpToSerif(uint value) { if (!Program.ROM.RomInfo.is_multibyte()) {//英語版は2バイトではないので、最初の1バイトのみ評価. value = value & 0xff; } byte[] str = new byte[2]; U.write_u16(str, 0, value); FETextDecode decoder = new FETextDecode(); this.SearchChar.Text = decoder.listbyte_to_string(str, str.Length); this.FontType.SelectedIndex = 1; SearchButton_Click(null, null); }
static InputFormRef Init(Form self) { return(new InputFormRef(self , "" , Program.ROM.p32(Program.ROM.RomInfo.unit_pointer()) , 52 , (int i, uint addr) => { //個数が固定できまっている return i < Program.ROM.RomInfo.unit_maxcount(); } , (int i, uint addr) => { uint id = Program.ROM.u16(addr); return U.ToHexString(i + 1) + " " + FETextDecode.Direct(id); } )); }
static void AppendDicTextID(Dictionary <string, string> transDic, uint id, string text) { if (id <= 0) { return; } string to_string = U.substr(text, 0, text.Length - 2); to_string = TextForm.ConvertFEditorToEscape(to_string); FETextDecode decode = new FETextDecode(); string from_string = decode.Decode(id); from_string = from_string.ToUpper(); transDic[from_string] = to_string; transDic[U.ToHexString(id) + "|" + from_string] = to_string; }
public static String GetMapNameWhereAddr(uint addr) { uint id; if (Program.ROM.RomInfo.version() == 6) {//FE6 id = Program.ROM.u16(addr + 56); return(FETextDecode.Direct(id)); } String map_cp = ""; uint chaptere = Program.ROM.u8(addr + 128); if (chaptere > 0) { map_cp = ChaptereToString(chaptere); } id = Program.ROM.u16(addr + 112); return(map_cp + " " + TextForm.Direct(id)); }
//翻訳用のよくあるテキスト集の作成. 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); }
//ワンライナー public static String Direct(uint id) { FETextDecode d = new FETextDecode(); return(d.Decode(id)); }
public void ImportFont(Form self, string FontROMTextBox, bool FontAutoGenelateCheckBox, Font ttf) { string filename = FontROMTextBox; this.YourROM = new ROM(); this.ProcessedFont = new Dictionary <string, bool>(); this.MyselfPriorityCode = PatchUtil.SearchPriorityCode(); string version; if (this.YourROM.Load(filename, out version)) {//フォントを取るようのROM this.YourPriorityCode = PatchUtil.SearchPriorityCode(this.YourROM); } else { this.YourROM = null; } if (FontAutoGenelateCheckBox) {//自動生成する this.UseAutoGenFont = ttf; } else {//自動生成しない this.UseAutoGenFont = null; } FETextDecode decode = new FETextDecode(); //少し時間がかかるので、しばらくお待ちください表示. using (InputFormRef.AutoPleaseWait pleaseWait = new InputFormRef.AutoPleaseWait(self)) { this.UndoData = Program.Undo.NewUndoData("FONT Import"); //文字列からフォントを探索 { List <U.AddrResult> list = TextForm.MakeItemList(); for (int i = 0; i < list.Count; i++) { string text = decode.Decode((uint)i); pleaseWait.DoEvents("String:" + U.To0xHexString((uint)i)); FontImporter(text); } } //メニュー1 if (Program.ROM.RomInfo.is_multibyte()) { List <U.AddrResult> menuDefineList = MenuDefinitionForm.MakeListAll(); for (int n = 0; n < menuDefineList.Count; n++) { if (!U.isSafetyOffset(menuDefineList[n].addr + 8)) { continue; } uint p = menuDefineList[n].addr + 8; if (!U.isSafetyOffset(Program.ROM.p32(p))) { continue; } List <U.AddrResult> list = MenuCommandForm.MakeListPointer(p); for (int i = 0; i < list.Count; i++) { if (!U.isSafetyOffset(list[i].addr)) { continue; } uint textid = Program.ROM.u32(list[i].addr + 0); string str = FETextDecode.Direct(textid); pleaseWait.DoEvents("Menu:" + U.To0xHexString(textid)); FontImporter(str); } } } //地形 if (Program.ROM.RomInfo.is_multibyte()) { List <U.AddrResult> list = MapTerrainNameForm.MakeList(); for (int i = 0; i < list.Count; i++) { if (!U.isSafetyOffset(list[i].addr)) { continue; } uint textid = Program.ROM.u32(list[i].addr + 0); string str = FETextDecode.Direct(textid); pleaseWait.DoEvents("Terrain:" + U.To0xHexString(textid)); FontImporter(str); } } //サウンドルーム //FE7のサウンドルームは、日本語直地 if (Program.ROM.RomInfo.is_multibyte() && Program.ROM.RomInfo.version() == 7) { List <U.AddrResult> list = SoundRoomForm.MakeList(); for (int i = 0; i < list.Count; i++) { if (!U.isSafetyOffset(list[i].addr)) { continue; } uint textid = Program.ROM.u32(list[i].addr + 12); string str = FETextDecode.Direct(textid); pleaseWait.DoEvents("SoundRoom:" + U.To0xHexString(textid)); FontImporter(str); } } //その他文字列 { List <U.AddrResult> list = OtherTextForm.MakeList(); for (int i = 0; i < list.Count; i++) { if (!U.isSafetyOffset(list[i].addr)) { continue; } uint p_str = Program.ROM.p32(list[i].addr); string str = Program.ROM.getString(p_str); pleaseWait.DoEvents("Other:" + U.To0xHexString(p_str)); FontImporter(str); } } Program.Undo.Push(this.UndoData); } }
public void ExportallText(Form self , string writeTextFileName , string tralnslate_from, string tralnslate_to , string rom_from, string rom_to , bool isModifiedTextOnly , bool isOneLiner ) { //少し時間がかかるので、しばらくお待ちください表示. using (InputFormRef.AutoPleaseWait pleaseWait = new InputFormRef.AutoPleaseWait(self)) { FETextDecode decode = new FETextDecode(); Dictionary <string, string> transDic = TranslateTextUtil.MakeFixedDic(tralnslate_from, tralnslate_to, rom_from, rom_to); if (ExportFilterArray != null) { using (StreamWriter writer = new StreamWriter(writeTextFileName)) { List <U.AddrResult> list = TextForm.MakeItemList(); for (int i = 0; i < list.Count; i++) { if (!ExportFilterArray.ContainsKey(i)) { continue; } string text = decode.Decode((uint)i); pleaseWait.DoEvents("Text:" + U.To0xHexString((uint)i)); ExportText(writer, (uint)i, text, tralnslate_from, tralnslate_to, transDic, isModifiedTextOnly, isOneLiner); } } return; } using (StreamWriter writer = new StreamWriter(writeTextFileName)) { //テキスト { List <U.AddrResult> list = TextForm.MakeItemList(); for (int i = 0; i < list.Count; i++) { if (ExportFilterArray != null && ExportFilterArray[i] != false) { continue; } string text = decode.Decode((uint)i); pleaseWait.DoEvents("Text:" + U.To0xHexString((uint)i)); ExportText(writer, (uint)i, text, tralnslate_from, tralnslate_to, transDic, isModifiedTextOnly, isOneLiner); } } //メニュー1 if (Program.ROM.RomInfo.is_multibyte) { List <U.AddrResult> menuDefineList = MenuDefinitionForm.MakeListAll(); for (int n = 0; n < menuDefineList.Count; n++) { if (!U.isSafetyOffset(menuDefineList[n].addr + 8)) { continue; } uint p = menuDefineList[n].addr + 8; if (!U.isSafetyOffset(Program.ROM.p32(p))) { continue; } List <U.AddrResult> list = MenuCommandForm.MakeListPointer(p); for (int i = 0; i < list.Count; i++) { if (!U.isSafetyOffset(list[i].addr)) { continue; } uint text_pointer = list[i].addr + 0; uint textid = Program.ROM.u32(text_pointer); string str = FETextDecode.Direct(textid); if (str.Trim() == "") { continue; } pleaseWait.DoEvents("Menu:" + U.To0xHexString(textid)); ExportText(writer, U.toPointer(text_pointer), str, tralnslate_from, tralnslate_to, transDic, isModifiedTextOnly, isOneLiner); } } } //地形 if (Program.ROM.RomInfo.is_multibyte) { List <U.AddrResult> list = MapTerrainNameForm.MakeList(); for (int i = 0; i < list.Count; i++) { if (!U.isSafetyOffset(list[i].addr)) { continue; } uint text_pointer = list[i].addr + 0; uint textid = Program.ROM.u32(text_pointer); string str = FETextDecode.Direct(textid); if (str.Trim() == "") { continue; } pleaseWait.DoEvents("Terrain:" + U.To0xHexString(textid)); ExportText(writer, U.toPointer(text_pointer), str, tralnslate_from, tralnslate_to, transDic, isModifiedTextOnly, isOneLiner); } } //サウンドルーム //FE7のサウンドルームは、日本語直地 if (Program.ROM.RomInfo.is_multibyte && Program.ROM.RomInfo.version == 7) { List <U.AddrResult> list = SoundRoomForm.MakeList(); for (int i = 0; i < list.Count; i++) { if (!U.isSafetyOffset(list[i].addr)) { continue; } uint text_pointer = list[i].addr + 12; uint textid = Program.ROM.u32(text_pointer); string str = FETextDecode.Direct(textid); if (str.Trim() == "") { continue; } pleaseWait.DoEvents("SoundRoom:" + U.To0xHexString(textid)); ExportText(writer, U.toPointer(text_pointer), str, tralnslate_from, tralnslate_to, transDic, isModifiedTextOnly, isOneLiner); } } //その他文字列 { List <U.AddrResult> list = OtherTextForm.MakeList(); for (int i = 0; i < list.Count; i++) { if (!U.isSafetyOffset(list[i].addr)) { continue; } uint text_pointer = list[i].addr + 0; uint p_str = Program.ROM.p32(text_pointer); string str = Program.ROM.getString(p_str); if (str.Trim() == "") { continue; } pleaseWait.DoEvents("Other:" + U.To0xHexString(p_str)); ExportText(writer, U.toPointer(text_pointer), str, tralnslate_from, tralnslate_to, transDic, isModifiedTextOnly, isOneLiner); } } } } }