示例#1
0
        private byte[] GetLevelData(Level level)
        {
            MemoryStream ms     = new MemoryStream();
            LevelWriter  writer = new LevelWriter(ms);

            writer.Write(level, LevelWriter.DefaultFileVersion);
            return(ms.ToArray());
        }
示例#2
0
        /// <summary>
        /// Configures the logging of error messages.
        /// </summary>
        private static void CreateErrorLogger()
        {
            string directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            ArchiveWriter archiveWriter = new ArchiveWriter(directory + @"\logs", "error");
            LevelWriter levelWriter = new LevelWriter(archiveWriter, new[] {Logger.eLEVEL.ERROR});
            FormatWriter formatWriter = new FormatWriter(levelWriter, new DetailFormat());

            Logger.Add(formatWriter);
        }
        private void mnuLevelExport_Click(object sender, EventArgs e)
        {
            Level          level  = SelectedNode.Tag as Level;
            SaveFileDialog dialog = new SaveFileDialog();

            dialog.Title  = "Export level";
            dialog.Filter = "Peggle Level Files (*.dat)|*.dat";
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                LevelWriter writer = new LevelWriter(dialog.FileName);
                writer.Write(level, LevelWriter.DefaultFileVersion);
            }
        }
示例#4
0
    public static bool SaveLevel(Level level, bool isUserPath)
    {
        string directory = Application.streamingAssetsPath;

        if (isUserPath)
        {
            directory += "/User";
        }
        directory += levelFilesPath;
        LevelWriter writer = new LevelWriter(level, directory + level.name + levelFilesEnding);

        try {
            writer.WriteLevel();
        } catch (Exception ex) {
            Debug.LogError(ex.ToString());
            return(false);
        }
        return(true);
    }
示例#5
0
    private void OnGUISave()
    {
        EditorGUILayout.Space();
        EditorGUILayout.LabelField("SAVE LEVELS", EditorStyles.boldLabel);
        EditorGUILayout.LabelField("Levels read method", EditorStyles.label);
        levelReadMethod     = GUILayout.SelectionGrid(levelReadMethod, readingMethodDesc, 3);
        createdLevelsFolder = EditorGUILayout.ObjectField(new GUIContent("Created levels folder ", createdLevelsFolderDesc), createdLevelsFolder, typeof(Object), true);
        savedLevelsFileName = EditorGUILayout.TextField(new GUIContent("Levels file name", savedLevelsFileNameDesc), savedLevelsFileName);
        tileContainerName   = EditorGUILayout.TextField(new GUIContent("Tile container name", tileContainerNameDesc), tileContainerName);

        GUI.enabled = createdLevelsFolder != null && savedLevelsFileName != "" && tileContainerName != "";
        if (GUILayout.Button("SAVE"))
        {
            string currentScenePath = SceneManager.GetActiveScene().path;
            EditorSceneManager.SaveScene(SceneManager.GetActiveScene());

            LevelWriter.SaveLevelsToFile(createdLevelsFolder, savedLevelsFileName, tileContainerName, levelReadMethod, currentScenePath);
        }
        GUI.enabled = true;
    }
        public void ReadLevel(int level, LevelWriter writer, CancellationToken ct)
        {
            Contract.Requires(level >= 0 && writer != null);
            ct.ThrowIfCancellationRequested();

            if (!m_hasJumpTable)
            {
                throw new InvalidOperationException("Cannot read a level without reading the Jump Table first!");
            }

            int itemCount = checked (1 << level);

            var address = m_jumpTable[level];

            if (address.Offset < m_dataStart || address.Offset > m_dataEnd)
            {
                throw ParseError("Level {0} offset ({1}) is invalid", level, address.Offset);
            }
            if (checked (address.Offset + address.PaddedSize) > m_dataEnd)
            {
                throw ParseError("Level {0} size ({1}) is invalid", level, address.PaddedSize);
            }

            var reader = m_file.CreateReader(address.Offset, address.PaddedSize);

            // "LVL_"
            var signature = reader.ReadFixed32();
            // Level Flags
            var flags = reader.ReadFixed32();
            // Level ID
            int levelId = (int)reader.ReadFixed32();
            // Item count (always 2^level)
            int levelCount = (int)reader.ReadFixed32();

            if (signature != SnapshotFormat.LEVEL_MAGIC_NUMBER)
            {
                throw ParseError("Page does not appear to be a valid Level header");
            }
            //TODO: check flags
            if (levelId != level)
            {
                throw ParseError("Page contains the header of a different Level ({0} != {1})", levelId, level);
            }
            if (levelCount != itemCount)
            {
                throw ParseError("Item count ({0}) in level {1} header is not valid", levelCount, level);
            }

            for (int i = 0; i < levelCount; i++)
            {
                // read the key
                uint keySize = reader.ReadVarint32();
                if (keySize > MemoryDatabaseHandler.MAX_KEY_SIZE)
                {
                    throw ParseError("Key size ({0}) is too big", keySize);
                }
                USlice key = keySize == 0 ? USlice.Nil : reader.ReadBytes(keySize);

                // read the sequence
                ulong sequence = reader.ReadVarint64();

                // read the value
                uint valueSize = reader.ReadVarint32();
                if (valueSize > MemoryDatabaseHandler.MAX_VALUE_SIZE)
                {
                    throw ParseError("Value size ({0) is too big", valueSize);
                }
                USlice value = valueSize == 0 ? USlice.Nil : reader.ReadBytes(valueSize);

                writer.Add(sequence, key, value);
            }

            if (reader.ReadFixed32() != uint.MaxValue)
            {
                throw ParseError("Invalid end marker in level");
            }
            //TODO: check end marker, CRC, ... ?
            uint checksum = reader.ReadFixed32();
            //TODO: verify checksum!
        }
示例#7
0
        public void WriteGenericData(BinaryWriter bw, int version)
        {
            //Set flags
            FlagGroup f = new FlagGroup();

            f[0]  = (mRolly != 0.0f);
            f[1]  = (mBouncy != 0.0f);
            f[2]  = HasPegInfo;
            f[3]  = HasMovementInfo;
            f[5]  = mCollision;
            f[6]  = mVisible;
            f[7]  = mCanMove;
            f[8]  = (mSolidColour != Color.Black);
            f[9]  = (mOutlineColour != Color.Black);
            f[10] = !String.IsNullOrEmpty(mImageFilename);
            f[11] = (mImageDX != 0.0f);
            f[12] = (mImageDY != 0.0f);
            f[13] = (mImageRotation != 0.0f);
            f[14] = mBackground;
            f[15] = mBaseObject;
            f[17] = !String.IsNullOrEmpty(mID);
            f[19] = (mSound != 0);
            f[20] = mBallStopReset;
            f[21] = !String.IsNullOrEmpty(mLogic);
            f[22] = mForeground;
            f[23] = (mMaxBounceVelocity != 0.0f);
            f[24] = mDrawSort;
            f[25] = mForeground2;
            f[26] = (mSubID != 0);
            f[27] = (mFlipperFlags != 0);
            f[28] = mDrawFloat;
            f[30] = (mShadow && version >= 0x50);

            //Write data
            bw.Write(f.Int32);

            if (f[0])
            {
                bw.Write(mRolly);
            }
            if (f[1])
            {
                bw.Write(mBouncy);
            }
            if (f[8])
            {
                bw.Write(mSolidColour.ToArgb());
            }
            if (f[9])
            {
                bw.Write(mOutlineColour.ToArgb());
            }
            if (f[10])
            {
                LevelWriter.WritePopcapString(bw, mImageFilename);
            }
            if (f[11])
            {
                bw.Write(mImageDX);
            }
            if (f[12])
            {
                bw.Write(mImageDY);
            }
            if (f[13])
            {
                bw.Write(MathExt.ToRadians(mImageRotation));
            }
            if (f[17])
            {
                LevelWriter.WritePopcapString(bw, mID);
            }
            if (f[19])
            {
                bw.Write(mSolidColour.ToArgb());
            }
            if (f[21])
            {
                LevelWriter.WritePopcapString(bw, mLogic);
            }
            if (f[23])
            {
                bw.Write(mMaxBounceVelocity);
            }
            if (f[26])
            {
                bw.Write(mSubID);
            }
            if (f[27])
            {
                bw.Write(mFlipperFlags);
            }
            if (f[2])
            {
                mPegInfo.WriteData(bw, version);
            }
            if (f[3])
            {
                mMovement.WriteData(bw, version);
            }
        }
示例#8
0
        public override void WriteData(BinaryWriter bw, int version)
        {
            FlagGroup fA = new FlagGroup();

            fA[2] = mTransparancy;
            fA[4] = mRandomStartPosition;

            if (!HasMovementInfo)
            {
                fA[5] = true;
            }

            fA[6]  = mChangeUnknown;
            fA[7]  = mChangeScale;
            fA[8]  = mChangeColour;
            fA[9]  = mChangeOpacity;
            fA[10] = mChangeVelocity;
            fA[11] = mChangeDirection;
            fA[12] = mChangeRotation;

            fA[14] = true;                      //Needed to make it visible?

            bw.Write(mMainVar);

            bw.Write(fA.Int16);

            LevelWriter.WritePopcapString(bw, mImage);
            bw.Write(mWidth);
            bw.Write(mHeight);

            if (mMainVar == 2)
            {
                bw.Write(mMainVar0);
                bw.Write(mMainVar1);
                LevelWriter.WritePopcapString(bw, mMainVar2);
                bw.Write(mMainVar3);

                if (fA[13])
                {
                    mUnknown0.WriteData(bw);
                    mUnknown1.WriteData(bw);
                }
            }

            if (fA[5])
            {
                bw.Write(X);
                bw.Write(Y);
            }

            LevelWriter.WritePopcapString(bw, mEmitImage);
            bw.Write(mUnknownEmitRate);
            bw.Write(mUnknown2);
            bw.Write(mRotation);
            bw.Write(mMaxQuantity);

            bw.Write(mTimeBeforeFadeOut);
            bw.Write(mFadeInTime);
            bw.Write(mLifeDuration);

            mEmitRate.WriteData(bw);
            mEmitAreaMultiplier.WriteData(bw);

            if (fA[12])
            {
                mInitialRotation.WriteData(bw);
                mRotationVelocity.WriteData(bw);
                bw.Write(mRotationUnknown);
            }

            if (fA[7])
            {
                mMinScale.WriteData(bw);
                mScaleVelocity.WriteData(bw);
                bw.Write(mMaxRandScale);
            }

            if (fA[8])
            {
                mColourRed.WriteData(bw);
                mColourGreen.WriteData(bw);
                mColourBlue.WriteData(bw);
            }

            if (fA[9])
            {
                mOpacity.WriteData(bw);
            }

            if (fA[10])
            {
                mMinVelocityX.WriteData(bw);
                mMinVelocityY.WriteData(bw);

                bw.Write(mMaxVelocityX);
                bw.Write(mMaxVelocityY);
                bw.Write(mAccelerationX);
                bw.Write(mAccelerationY);
            }

            if (fA[11])
            {
                bw.Write(mDirectionSpeed);
                bw.Write(mDirectionRandomSpeed);
                bw.Write(mDirectionAcceleration);
                bw.Write(mDirectionAngle);
                bw.Write(mDirectionRandomAngle);
            }

            if (fA[6])
            {
                bw.Write(mUnknownA);
                bw.Write(mUnknownB);
            }
        }