static InputFormRef N_Init(Form self) { return(new InputFormRef(self , "N_" , Program.ROM.RomInfo.event_ballte_talk2_pointer() , 16 , (int i, uint addr) => { //読込最大値検索 uint unit = Program.ROM.u16(addr); if (unit == 0x0 || unit == 0xFFFF) { return false; } if (i > 10 && Program.ROM.IsEmpty(addr, 16 * 10)) { //終端符号を無視して 0x00等を利用している人がいるため return false; } return true; } , (int i, uint addr) => { uint unit_id = (uint)Program.ROM.u8(addr); return U.ToHexString(unit_id) + " " + UnitForm.GetUnitName(unit_id); } )); }
static InputFormRef Init(Form self) { return(new InputFormRef(self , "" , Program.ROM.RomInfo.support_talk_pointer() , 16 , (int i, uint addr) => { //とりあえず 0x00 00 まで読む. if (Program.ROM.u16(addr) == 0x0000) { return false; } if (i > 10 && Program.ROM.IsEmpty(addr, 16 * 10)) { return false; } return true; } , (int i, uint addr) => { uint uid1 = Program.ROM.u8(addr + 0); uint uid2 = Program.ROM.u8(addr + 1); return U.ToHexString(uid1) + " " + UnitForm.GetUnitName(uid1) + " & " + U.ToHexString(uid2) + " " + UnitForm.GetUnitName(uid2) ; } )); }
static InputFormRef Init(Form self) { return(new InputFormRef(self , "" , Program.ROM.RomInfo.event_haiku_pointer , 16 , (int i, uint addr) => { //読込最大値検索 if (Program.ROM.u8(addr) == 0x0) { return false; } if (i > 10 && Program.ROM.IsEmpty(addr, 16 * 10)) { //終端符号を無視して 0x00等を利用している人がいるため return false; } return true; } , (int i, uint addr) => { uint unit_id = (uint)Program.ROM.u8(addr); return U.ToHexString(unit_id) + " " + UnitForm.GetUnitName(unit_id); } )); }
static InputFormRef Init(EventUnitFE7Form self) { return(new InputFormRef(self , "" , 0 , Program.ROM.RomInfo.eventunit_data_size , (int i, uint addr) => { //読込最大値検索 //00まで検索 return Program.ROM.u8(addr) != 0; } , (int i, uint addr) => { uint unit_id = Program.ROM.u8(addr); if (unit_id == 0) { return null; } uint class_id = Program.ROM.u8(addr + 1); uint unitgrow = Program.ROM.u16(addr + 3); if (class_id == 0) { //クラスIDが0だったらユーザIDで補完する class_id = UnitForm.GetClassID(unit_id); } String unit_name = UnitForm.GetUnitName(unit_id); String class_name = ClassForm.GetClassName(class_id); uint level = U.ParseUnitGrowLV(unitgrow); return unit_name + "(" + class_name + ")" + " " + "Lv:" + level.ToString(); } )); }
public static void MakeVarsIDArray(List <UseValsID> list) { string infobase = R._("死亡セリフ"); InputFormRef InputFormRef = Init(null); List <uint> tracelist = new List <uint>(); uint haiku_addr = InputFormRef.BaseAddress; for (uint i = 0; i < InputFormRef.DataCount; i++, haiku_addr += InputFormRef.BlockSize) { uint unitid = Program.ROM.u8(haiku_addr + 0); string info = infobase + " " + UnitForm.GetUnitName(unitid); uint textid = Program.ROM.u16(haiku_addr + 6); if (textid <= 0) { uint event_addr = Program.ROM.p32(haiku_addr + 8); EventCondForm.MakeVarsIDArrayByEventAddress(list, event_addr, info, tracelist); } else { UseValsID.AppendTextID(list, FELint.Type.HAIKU, haiku_addr, info, textid, i); } } // UseValsID.AppendTextID(list, FELint.Type.HAIKU, InputFormRef, new uint[] { 6 }); }
static InputFormRef Init(Form self) { return(new InputFormRef(self , "" , Program.ROM.RomInfo.sound_boss_bgm_pointer , 8 , (int i, uint addr) => { //0xFFまで if (Program.ROM.u16(addr) == 0xFFFF) { return false; } if (i > 10 && Program.ROM.IsEmpty(addr, 8 * 10)) { return false; } return true; } , (int i, uint addr) => { uint unit_id = (uint)Program.ROM.u8(addr); uint song_id = (uint)Program.ROM.u32(addr + 4); return U.ToHexString(unit_id) + " " + UnitForm.GetUnitName(unit_id) + " : " + U.ToHexString(song_id) + SongTableForm.GetSongName(song_id); } )); }
static InputFormRef Init(Form self) { return(new InputFormRef(self , "" , Program.ROM.RomInfo.summons_demon_king_pointer , 20 , (int i, uint addr) => { uint max = Program.ROM.u8(Program.ROM.RomInfo.summons_demon_king_count_address); return i <= max; } , (int i, uint addr) => { uint unit_id = Program.ROM.u8(addr); if (unit_id == 0) { return "-EMPTY-"; } uint class_id = Program.ROM.u8(addr + 1); uint unitgrow = Program.ROM.u16(addr + 3); if (class_id == 0) { //クラスIDが0だったらユーザIDで補完する class_id = UnitForm.GetClassID(unit_id); } String unit_name = UnitForm.GetUnitName(unit_id); String class_name = ClassForm.GetClassName(class_id); uint level = U.ParseUnitGrowLV(unitgrow); return unit_name + "(" + class_name + ")" + " " + "Lv:" + level.ToString(); } )); }
//全データの取得 public static void MakeAllDataLength(List <Address> list) { InputFormRef InputFormRef = Init(null); FEBuilderGBA.Address.AddAddress(list, InputFormRef, "Haiku", new uint[] { 8 }); List <uint> tracelist = new List <uint>(); uint addr = InputFormRef.BaseAddress; for (int i = 0; i < InputFormRef.DataCount; i++, addr += InputFormRef.BlockSize) { // uint textid = Program.ROM.u16(addr + 6); // if (textid <= 0) // { // continue; // } uint spEventP = Program.ROM.u32(addr + 8); if (!U.isSafetyPointer(spEventP)) { continue; } uint unitid = Program.ROM.u8(addr + 0); string event_name = "Haiku" + " " + U.ToHexString(unitid) + " " + UnitForm.GetUnitName(unitid); EventScriptForm.ScanScript(list, addr + 8, true, false, event_name, tracelist); } }
static InputFormRef Init(Form self) { uint typeID = 0; return(new InputFormRef(self , "" , 0 , 1 , (int i, uint addr) => { if (i == 0) { return true; } return Program.ROM.u8(addr) != 0x00; } , (int i, uint addr) => { uint id = Program.ROM.u8(addr + 0); if (i == 0) { typeID = id; return TypeIDToString(id); } if (typeID <= 1) { return U.ToHexString(id) + " " + UnitForm.GetUnitName(id); } else { return U.ToHexString(id) + " " + ClassForm.GetClassName(id); } } )); }
static InputFormRef N2_Init(Form self) { return(new InputFormRef(self , "N2_" , Program.ROM.RomInfo.ed_3a_pointer() , 8 , (int i, uint addr) => { return Program.ROM.u32(addr) != 0x00; } , (int i, uint addr) => { uint flag = Program.ROM.u8(addr + 0); uint uid1 = Program.ROM.u8(addr + 1); uint uid2 = Program.ROM.u8(addr + 2); if (flag == 1) { return U.ToHexString(uid1) + " " + UnitForm.GetUnitName(uid1); } if (flag == 2) { return U.ToHexString(uid1) + " " + UnitForm.GetUnitName(uid1) + " & " + U.ToHexString(uid2) + " " + UnitForm.GetUnitName(uid2); } return U.ToHexString(uid1) + " " + UnitForm.GetUnitName(uid1) + " ?? " + U.ToHexString(uid2) + " " + UnitForm.GetUnitName(uid2); } )); }
public static string GetUnitNameAndANY(uint uid) { if (uid == 0) { return(R._("ANY")); } return(UnitForm.GetUnitName(uid)); }
void MakeClassList(uint selectindex) { if (Program.ROM.RomInfo.version() >= 8) {//FE8の場合キャラパレット指定が別途用意されている uint unit_palette_color_pointer = Program.ROM.p32(Program.ROM.RomInfo.unit_palette_color_pointer()); uint unit_palette_class_pointer = Program.ROM.p32(Program.ROM.RomInfo.unit_palette_class_pointer()); List <U.AddrResult> list = new List <U.AddrResult>(); for (int i = 0; i < Program.ROM.RomInfo.unit_maxcount(); i++) { for (uint n = 0; n < 7; n++) { uint paletteid = Program.ROM.u8(unit_palette_color_pointer + n); if (paletteid <= 0) { continue; } if (paletteid - 1 != selectindex) { continue; } uint uid = (uint)i + 1; uint cid = Program.ROM.u8(unit_palette_class_pointer + n); string name = U.ToHexString(uid) + " " + UnitForm.GetUnitName(uid) + " -> " + U.ToHexString(cid) + " " + ClassForm.GetClassName(cid); list.Add(new U.AddrResult(cid, name, uid)); } unit_palette_color_pointer += 7; unit_palette_class_pointer += 7; } U.ConvertListBox(list, ref UNITCLASS_LIST); } else {//FE7 , FE6 はユニットの部分に色指定がある List <U.AddrResult> list = new List <U.AddrResult>(); for (int i = 0; i < Program.ROM.RomInfo.unit_maxcount(); i++) { uint uid = (uint)i; uint paletteid1 = UnitForm.GetPaletteLowClass(uid); uint paletteid2 = UnitForm.GetPaletteHighClass(uid); if (paletteid1 > 0 && paletteid1 - 1 == selectindex) { uint cid = UnitForm.GetClassID(uid); string name = U.ToHexString(uid) + " " + UnitForm.GetUnitName(uid) + " -> " + U.ToHexString(cid) + " " + ClassForm.GetClassName(cid); list.Add(new U.AddrResult(cid, name, uid)); } else if (paletteid2 > 0 && paletteid2 - 1 == selectindex) { uint cid = UnitForm.GetHighClass(uid); string name = U.ToHexString(uid) + " " + UnitForm.GetUnitName(uid) + " -> " + U.ToHexString(cid) + " " + ClassForm.GetClassName(cid); list.Add(new U.AddrResult(cid, name, uid)); } } U.ConvertListBox(list, ref UNITCLASS_LIST); } }
//全データの取得 public static void MakeAllDataLength(List <Address> list) { InputFormRef InputFormRef = Init(null); FEBuilderGBA.Address.AddAddress(list, InputFormRef, "Haiku", new uint[] { 8 }); List <uint> tracelist = new List <uint>(); uint addr = InputFormRef.BaseAddress; for (int i = 0; i < InputFormRef.DataCount; i++, addr += InputFormRef.BlockSize) { // uint textid = Program.ROM.u16(addr + 6); // if (textid <= 0) // { // continue; // } uint spEventP = Program.ROM.u32(addr + 8); if (!U.isSafetyPointer(spEventP)) { continue; } uint unitid = Program.ROM.u8(addr + 0); string event_name = "Haiku" + " " + U.ToHexString(unitid) + " " + UnitForm.GetUnitName(unitid); EventScriptForm.ScanScript(list, addr + 8, true, false, event_name, tracelist); } InputFormRef N1_InputFormRef = N1_Init(null); uint[] pointers = new uint[] { Program.ROM.RomInfo.event_haiku_tutorial_1_pointer(), Program.ROM.RomInfo.event_haiku_tutorial_2_pointer() }; for (int n = 0; n < pointers.Length; n++) { N1_InputFormRef.ReInitPointer(pointers[n]); string name = "Haiku tutorial_" + n; FEBuilderGBA.Address.AddAddress(list, InputFormRef, name, new uint[] { 4 }); addr = N1_InputFormRef.BaseAddress; for (int i = 0; i < N1_InputFormRef.DataCount; i++, addr += N1_InputFormRef.BlockSize) { uint spEventP = Program.ROM.u32(addr + 4); if (!U.isSafetyPointer(spEventP)) { continue; } uint unitid = Program.ROM.u8(addr + 0); string event_name = name + " " + U.ToHexString(unitid) + " " + UnitForm.GetUnitName(unitid); EventScriptForm.ScanScript(list, addr + 4, true, false, event_name, tracelist); } } }
public static string GetUnit2Preview(uint v) { uint addr = U.toOffset(v); if (!U.isSafetyOffset(addr + 1)) { return(""); } uint from = Program.ROM.u8(addr + 0); uint to = Program.ROM.u8(addr + 1); return(U.ToHexString(from) + ": " + UnitForm.GetUnitName(from) + " -> " + U.ToHexString(to) + ": " + UnitForm.GetUnitName(to)); }
static InputFormRef N_Init(Form self) { return(new InputFormRef(self , "N_" , Program.ROM.RomInfo.unit_palette_class_pointer , 7 , (int i, uint addr) => { //個数が固定できまっている return i < Program.ROM.RomInfo.unit_maxcount; } , (int i, uint addr) => { //リストボックスに乗せる項目 return U.ToHexString(i + 1) + " " + UnitForm.GetUnitName((uint)i + 1); } )); }
static InputFormRef Init(Form self) { return(new InputFormRef(self , "" , Program.ROM.RomInfo.summon_unit_pointer() , 2 , (int i, uint addr) => { return Program.ROM.u8(addr) != 0x00; } , (int i, uint addr) => { uint unitid = Program.ROM.u8(addr + 0); return U.ToHexString(unitid) + " " + UnitForm.GetUnitName(unitid); } )); }
static InputFormRef Init(Form self) { return(new InputFormRef(self , "" , 0 , 2 , (int i, uint addr) => { return i < DATAMAX; } , (int i, uint addr) => { uint unitid = (uint)i; return U.ToHexString(unitid) + " " + UnitForm.GetUnitName(unitid); } )); }
static InputFormRef Init(Form self) { return(new InputFormRef(self , "" , Program.ROM.RomInfo.event_final_serif_pointer , 8 , (int i, uint addr) => { uint unit_id = Program.ROM.u32(addr + 0); return unit_id <= 0xff && unit_id >= 0x1; } , (int i, uint addr) => { uint unit_id = Program.ROM.u32(addr + 0); return U.ToHexString(unit_id) + " " + UnitForm.GetUnitName(unit_id); } )); }
static InputFormRef Init(Form self, uint assignLevelUpP) { InputFormRef ifr = new InputFormRef(self , "" , assignLevelUpP , 4 , (int i, uint addr) => { //読込最大値検索 return(i < 0xFF); } , (int i, uint addr) => { return(U.ToHexString(i) + " " + UnitForm.GetUnitName((uint)i)); } ); return(ifr); }
static InputFormRef N1_Init(Form self) { return(new InputFormRef(self , "N1_" , Program.ROM.RomInfo.ed_2_pointer() , 8 , (int i, uint addr) => { return Program.ROM.u8(addr) != 0x00; } , (int i, uint addr) => { uint uid = Program.ROM.u8(addr + 0); uint tourina = Program.ROM.u32(addr + 4); return U.ToHexString(uid) + " " + UnitForm.GetUnitName(uid) + " " + TextForm.Direct(tourina); } )); }
static InputFormRef Init(Form self) { return(new InputFormRef(self , "" , Program.ROM.RomInfo.ed_1_pointer() , 4 , (int i, uint addr) => { return Program.ROM.u32(addr) != 0x00; } , (int i, uint addr) => { uint uid = Program.ROM.u8(addr + 0); uint flag = Program.ROM.u8(addr + 1); return U.ToHexString(uid) + " " + UnitForm.GetUnitName(uid); } )); }
static InputFormRef N_Init(Form self) { return(new InputFormRef(self , "N_" , 0 , 4 , (int i, uint addr) => { //00 または D1 で終端 uint id = Program.ROM.u8(addr); uint term = Program.ROM.u8(addr + 3); return (id != 0x00 && term != 0xD1); } , (int i, uint addr) => { uint uid = Program.ROM.u8(addr); return U.ToHexString(uid) + " " + UnitForm.GetUnitName(uid); } )); }
static InputFormRef Init(Form self) { return(new InputFormRef(self , "" , Program.ROM.RomInfo.senseki_comment_pointer() , 16 , (int i, uint addr) => { //終端 return Program.ROM.u16(addr) != 0x0; } , (int i, uint addr) => { uint uid = Program.ROM.u32(addr + 0); return U.ToHexString(uid) + " " + UnitForm.GetUnitName(uid) ; } )); }
static InputFormRef N3_Init(Form self) { InputFormRef ifr = new InputFormRef(self , "N3_" , 0 //ポインタ指定ができない... , 12 , (int i, uint addr) => { return(Program.ROM.u32(addr) != 0x00); } , (int i, uint addr) => { uint uid = Program.ROM.u32(addr); return(U.ToHexString(uid) + " " + UnitForm.GetUnitName(uid)); } ); ifr.ReInit(Program.ROM.RomInfo.ed_3c_pointer()); return(ifr); }
static InputFormRef Init(Form self, uint assignUnit) { uint unitDataCount = UnitForm.DataCount(); InputFormRef ifr = new InputFormRef(self , "" , assignUnit , 1 , (int i, uint addr) => { //読込最大値検索 return(i < unitDataCount); } , (int i, uint addr) => { return(U.ToHexString(i) + " " + UnitForm.GetUnitName((uint)i)); } ); return(ifr); }
static InputFormRef Init(Form self) { InputFormRef ifr = new InputFormRef(self , "" , 0x37D88 , 0x8 , (int i, uint addr) => { return(U.isSafetyPointer(Program.ROM.u32(addr + 4))); } , (int i, uint addr) => { uint flag_id = Program.ROM.u32(addr + 0); uint unitsAddr = Program.ROM.p32(addr + 4); uint unit_id = Program.ROM.u8(unitsAddr); return(U.ToHexString(unit_id) + " " + UnitForm.GetUnitName(unit_id) + " (" + R._("フラグ") + ":" + U.ToHexString(flag_id) + ")"); } ); return(ifr); }
static InputFormRef N2_Init(Form self) { return(new InputFormRef(self , "N2_" , Program.ROM.RomInfo.ed_3a_pointer , 8 , (int i, uint addr) => { if (i == 0) { return true; } return Program.ROM.u16(addr) != 0x00; } , (int i, uint addr) => { uint uid1 = (uint)i; return U.ToHexString(uid1) + " " + UnitForm.GetUnitName(uid1); } )); }
static InputFormRef Init(Form self) { return(new InputFormRef(self , "" , Program.ROM.RomInfo.support_unit_pointer , 24 , (int i, uint addr) => { //とりあえず 00 00 まで読む. if (Program.ROM.u16(addr) != 0) { //0ではないのでまだデータがある. return true; } //飛び地になっていることがあるらしい. //4ブロックほど検索してみる. uint found_addr = addr; for (int n = 0; n < 4; n++, found_addr += 24) { uint uid = UnitForm.GetUnitIDWhereSupportAddr(found_addr); if (uid != U.NOT_FOUND) { //発見! return true; } } //見つからない. return false; } , (int i, uint addr) => { uint uid = UnitForm.GetUnitIDWhereSupportAddr(addr); if (uid == U.NOT_FOUND) { return "-EMPTY-"; } return U.ToHexString(uid + 1) + " " + UnitForm.GetUnitName(uid + 1); } )); }
static InputFormRef N1_Init(Form self) { return(new InputFormRef(self , "N1_" , 0 , 1 , (int i, uint addr) => { //読込最大値検索 uint a = Program.ROM.u8(addr); if (a == 0) { return false; } return true; } , (int i, uint addr) => { uint unitid = Program.ROM.u8(addr); return U.ToHexString(unitid) + " " + UnitForm.GetUnitName(unitid); } )); }
public static string GetUnit4Preview(uint v) { uint addr = U.toOffset(v); if (!U.isSafetyOffset(addr + 1)) { return(""); } StringBuilder sb = new StringBuilder(); for (uint i = 0; i < 4; i++) { uint uid = Program.ROM.u8(addr + i); if (uid == 0) { continue; } string str = U.ToHexString(uid) + ": " + UnitForm.GetUnitName(uid) + " "; sb.Append(str); } return(sb.ToString()); }