public Arte(byte[] Bytes, uint Location, uint Size, uint refStringStart) { Data = new uint[Size / 4]; for (int i = 0; i < Data.Length; ++i) { Data[i] = BitConverter.ToUInt32(Bytes, (int)(Location + i * 4)).SwapEndian(); } ID = Data[1]; InGameID = Data[2]; uint refStringLocaton = Data[3]; // seems to be identical with Data[4] RefString = Util.GetTextAscii(Bytes, (int)(refStringStart + refStringLocaton)); NameStringDicId = Data[5]; DescStringDicId = Data[6]; Type = (ArteType)Data[7]; TPUsage = Data[8]; ElementFire = Data[10]; ElementEarth = Data[11]; ElementWind = Data[12]; ElementWater = Data[13]; ElementLight = Data[14]; ElementDarkness = Data[15]; // for some reason the data order different between versions? if (Size == 876) { LearnRequirementsOtherArtesType = new uint[6]; for (int i = 0; i < LearnRequirementsOtherArtesType.Length; ++i) { LearnRequirementsOtherArtesType[i] = Data[128 + 22 + i]; } LearnRequirementsOtherArtesId = new uint[6]; for (int i = 0; i < LearnRequirementsOtherArtesId.Length; ++i) { LearnRequirementsOtherArtesId[i] = Data[128 + 28 + i]; } LearnRequirementsOtherArtesUsageCount = new uint[6]; for (int i = 0; i < LearnRequirementsOtherArtesUsageCount.Length; ++i) { LearnRequirementsOtherArtesUsageCount[i] = Data[128 + 34 + i]; } AlteredArteRequirementType = new uint[5]; for (int i = 0; i < AlteredArteRequirementType.Length; ++i) { AlteredArteRequirementType[i] = Data[127 + 69 + i]; } AlteredArteRequirementId = new uint[5]; for (int i = 0; i < AlteredArteRequirementId.Length; ++i) { AlteredArteRequirementId[i] = Data[127 + 74 + i]; } //CharacterRelatedField = Data[?]; Character = Data[21]; FatalStrikeType = Data[210]; UsableInMenu = Data[128 + 44]; } else { LearnRequirementsOtherArtesType = new uint[6]; for (int i = 0; i < LearnRequirementsOtherArtesType.Length; ++i) { LearnRequirementsOtherArtesType[i] = Data[22 + i]; } LearnRequirementsOtherArtesId = new uint[6]; for (int i = 0; i < LearnRequirementsOtherArtesId.Length; ++i) { LearnRequirementsOtherArtesId[i] = Data[28 + i]; } LearnRequirementsOtherArtesUsageCount = new uint[6]; for (int i = 0; i < LearnRequirementsOtherArtesUsageCount.Length; ++i) { LearnRequirementsOtherArtesUsageCount[i] = Data[34 + i]; } AlteredArteRequirementType = new uint[5]; for (int i = 0; i < AlteredArteRequirementType.Length; ++i) { AlteredArteRequirementType[i] = Data[69 + i]; } AlteredArteRequirementId = new uint[5]; for (int i = 0; i < AlteredArteRequirementId.Length; ++i) { AlteredArteRequirementId[i] = Data[74 + i]; } CharacterRelatedField = Data[95]; Character = Data[96]; FatalStrikeType = Data[83]; UsableInMenu = Data[44]; } // always identical: 16, 17 // 59 is some sort of status effect field }
public Arte( byte[] Bytes, uint Location, uint Size, uint refStringStart ) { Data = new uint[Size / 4]; for ( int i = 0; i < Data.Length; ++i ) { Data[i] = BitConverter.ToUInt32( Bytes, (int)( Location + i * 4 ) ).SwapEndian(); } ID = Data[1]; InGameID = Data[2]; uint refStringLocaton = Data[3]; // seems to be identical with Data[4] RefString = Util.GetTextAscii( Bytes, (int)( refStringStart + refStringLocaton ) ); NameStringDicId = Data[5]; DescStringDicId = Data[6]; Type = (ArteType)Data[7]; TPUsage = Data[8]; ElementFire = Data[10]; ElementEarth = Data[11]; ElementWind = Data[12]; ElementWater = Data[13]; ElementLight = Data[14]; ElementDarkness = Data[15]; // for some reason the data order different between versions? if ( Size == 876 ) { LearnRequirementsOtherArtesType = new uint[6]; for ( int i = 0; i < LearnRequirementsOtherArtesType.Length; ++i ) { LearnRequirementsOtherArtesType[i] = Data[128 + 22 + i]; } LearnRequirementsOtherArtesId = new uint[6]; for ( int i = 0; i < LearnRequirementsOtherArtesId.Length; ++i ) { LearnRequirementsOtherArtesId[i] = Data[128 + 28 + i]; } LearnRequirementsOtherArtesUsageCount = new uint[6]; for ( int i = 0; i < LearnRequirementsOtherArtesUsageCount.Length; ++i ) { LearnRequirementsOtherArtesUsageCount[i] = Data[128 + 34 + i]; } AlteredArteRequirementType = new uint[5]; for ( int i = 0; i < AlteredArteRequirementType.Length; ++i ) { AlteredArteRequirementType[i] = Data[127 + 69 + i]; } AlteredArteRequirementId = new uint[5]; for ( int i = 0; i < AlteredArteRequirementId.Length; ++i ) { AlteredArteRequirementId[i] = Data[127 + 74 + i]; } //CharacterRelatedField = Data[?]; Character = Data[21]; FatalStrikeType = Data[210]; UsableInMenu = Data[128 + 44]; } else { LearnRequirementsOtherArtesType = new uint[6]; for ( int i = 0; i < LearnRequirementsOtherArtesType.Length; ++i ) { LearnRequirementsOtherArtesType[i] = Data[22 + i]; } LearnRequirementsOtherArtesId = new uint[6]; for ( int i = 0; i < LearnRequirementsOtherArtesId.Length; ++i ) { LearnRequirementsOtherArtesId[i] = Data[28 + i]; } LearnRequirementsOtherArtesUsageCount = new uint[6]; for ( int i = 0; i < LearnRequirementsOtherArtesUsageCount.Length; ++i ) { LearnRequirementsOtherArtesUsageCount[i] = Data[34 + i]; } AlteredArteRequirementType = new uint[5]; for ( int i = 0; i < AlteredArteRequirementType.Length; ++i ) { AlteredArteRequirementType[i] = Data[69 + i]; } AlteredArteRequirementId = new uint[5]; for ( int i = 0; i < AlteredArteRequirementId.Length; ++i ) { AlteredArteRequirementId[i] = Data[74 + i]; } CharacterRelatedField = Data[95]; Character = Data[96]; FatalStrikeType = Data[83]; UsableInMenu = Data[44]; } // always identical: 16, 17 // 59 is some sort of status effect field }
public Arte(System.IO.Stream stream, uint refStringStart, EndianUtils.Endianness endian, BitUtils.Bitness bits) { uint Size = stream.PeekUInt32().FromEndian(endian); if ((Size % 4) != 0) { throw new Exception("Arte data size not divisble by 4."); } Size -= (bits.NumberOfBytes() - 4) * 2; // just hack this so i don't have to rewrite this mess... Data = new uint[Size / 4]; for (int i = 0; i < Data.Length; ++i) { if (i == 3 || i == 4) { Data[i] = (uint)stream.ReadUInt(bits, endian); // just hack this so i don't have to rewrite this mess... } else { Data[i] = stream.ReadUInt32().FromEndian(endian); } } ID = Data[1]; InGameID = Data[2]; uint refStringLocaton = Data[3]; // seems to be identical with Data[4] RefString = stream.ReadAsciiNulltermFromLocationAndReset(refStringStart + refStringLocaton); NameStringDicId = Data[5]; DescStringDicId = Data[6]; Type = (ArteType)Data[7]; TPUsage = Data[8]; ElementFire = Data[10]; ElementEarth = Data[11]; ElementWind = Data[12]; ElementWater = Data[13]; ElementLight = Data[14]; ElementDarkness = Data[15]; // for some reason the data order different between versions? if (Size == 876) { LearnRequirementsOtherArtesType = new uint[6]; for (int i = 0; i < LearnRequirementsOtherArtesType.Length; ++i) { LearnRequirementsOtherArtesType[i] = Data[128 + 22 + i]; } LearnRequirementsOtherArtesId = new uint[6]; for (int i = 0; i < LearnRequirementsOtherArtesId.Length; ++i) { LearnRequirementsOtherArtesId[i] = Data[128 + 28 + i]; } LearnRequirementsOtherArtesUsageCount = new uint[6]; for (int i = 0; i < LearnRequirementsOtherArtesUsageCount.Length; ++i) { LearnRequirementsOtherArtesUsageCount[i] = Data[128 + 34 + i]; } AlteredArteRequirementType = new uint[5]; for (int i = 0; i < AlteredArteRequirementType.Length; ++i) { AlteredArteRequirementType[i] = Data[127 + 69 + i]; } AlteredArteRequirementId = new uint[5]; for (int i = 0; i < AlteredArteRequirementId.Length; ++i) { AlteredArteRequirementId[i] = Data[127 + 74 + i]; } //CharacterRelatedField = Data[?]; Character = Data[21]; FatalStrikeType = Data[210]; UsableInMenu = Data[128 + 44]; } else { LearnRequirementsOtherArtesType = new uint[6]; for (int i = 0; i < LearnRequirementsOtherArtesType.Length; ++i) { LearnRequirementsOtherArtesType[i] = Data[22 + i]; } LearnRequirementsOtherArtesId = new uint[6]; for (int i = 0; i < LearnRequirementsOtherArtesId.Length; ++i) { LearnRequirementsOtherArtesId[i] = Data[28 + i]; } LearnRequirementsOtherArtesUsageCount = new uint[6]; for (int i = 0; i < LearnRequirementsOtherArtesUsageCount.Length; ++i) { LearnRequirementsOtherArtesUsageCount[i] = Data[34 + i]; } AlteredArteRequirementType = new uint[5]; for (int i = 0; i < AlteredArteRequirementType.Length; ++i) { AlteredArteRequirementType[i] = Data[69 + i]; } AlteredArteRequirementId = new uint[5]; for (int i = 0; i < AlteredArteRequirementId.Length; ++i) { AlteredArteRequirementId[i] = Data[74 + i]; } CharacterRelatedField = Data[95]; Character = Data[96]; FatalStrikeType = Data[83]; UsableInMenu = Data[44]; } // always identical: 16, 17 // 59 is some sort of status effect field }