예제 #1
0
        internal async Task SaveEncounterData(IEnumerable <EncounterWild> encounters, ReferencedGarc garcEncounters)
        {
            var array = encounters.ToArray();
            var files = await garcEncounters.GetFiles();

            var zoneDataFileIndex = garcEncounters.Garc.FileCount - this.ZoneDataPositionFromEnd;

            Assertions.AssertLength(zoneDataFileIndex, array, exact: true);

            for (var i = 0; i < array.Length; i++)
            {
                if (!array[i].HasEntries)
                {
                    continue;
                }

                var encounterBuffer = array[i].Write();

                if (this.Version.IsORAS())                   // Have to write encounter zone data to DexNav database too
                {
                    // Last file is dexNavData
                    const int Offset       = 0xE;
                    var       dexNavData   = files[files.Length - 1];
                    var       entryPointer = BitConverter.ToInt32(dexNavData, (i + 1) * sizeof(int)) + Offset;

                    var dataPointer = BitConverter.ToInt32(encounterBuffer, EncounterWild.DataOffset);
                    dataPointer += array[i].DataStart;
                    var dataLength = array[i].GetAllEntries().Count() * EncounterWild.Entry.Size;

                    Array.Copy(encounterBuffer, dataPointer, dexNavData, entryPointer, dataLength);
                }

                files[i] = encounterBuffer;
            }

            await garcEncounters.SetFiles(files);
        }
예제 #2
0
        internal void SaveTmsHms(TmsHms tmsHms, CodeBin codeBin)
        {
            Assertions.AssertVersion(this.Version, tmsHms.GameVersion);

            codeBin.WriteStructure(tmsHms);
        }