Subversion Repositories AndroidProjects

Rev

Rev 1461 | Rev 1478 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;

using BurutaruEditor.file.elements;
using BurutaruEditor.file.enemies;
using BurutaruEditor.view;

using BauzoidNET.math;
using BauzoidNET.parser;

namespace BurutaruEditor.file
{
    public class Document
    {
        //=================================================================================================================================

        public const float VIRTUAL_WIDTH = 800;
        public const float VIRTUAL_HEIGHT = 480;

        public static readonly Vector4 TEXT_COLOR = new Vector4(1, 1, 1, 1);
        public const float TEXT_SCALE = 0.8f;

        //=================================================================================================================================

        private MainForm mOwner = null;
        [Browsable(false)]
        public MainForm Owner { get { return mOwner; } }

        [Browsable(false)]
        public DocumentView View { get { return Owner.View; } }

        private bool mIsDirty = false;
        private String mFilename = null;

        private List<CheckPoint> mCheckPoints = new List<CheckPoint>();
        [Browsable(false)]
        public List<CheckPoint> CheckPoints { get { return mCheckPoints; } }

        private List<EnemySpawner> mSpawners = new List<EnemySpawner>();
        [Browsable(false)]
        public List<EnemySpawner> Spawners { get { return mSpawners; } }
       
        private List<LevelElement> mLevelElements = new List<LevelElement>();
        [Browsable(false)]
        public List<LevelElement> LevelElements { get { return mLevelElements; } }

        public string LevelTitle { get; set; }

        public Vector2 mStartPosition = new Vector2();
        [TypeConverter(typeof(ExpandableObjectConverter))]
        public Vector2 StartPosition { get { return mStartPosition; } }

        //=================================================================================================================================

        public Document(MainForm owner)
        {
            mOwner = owner;
            ResetDocument();
        }

        public void Init()
        {
            ResetDocument();
        }

        public void Exit()
        {
            ResetDocument();
        }

        public void ResetDocument()
        {
            mFilename = null;

            LevelTitle = "Level Title";

            mIsDirty = false;

            mSpawners.Clear();

            for (int i = 0; i < mLevelElements.Count; i++)
                mLevelElements.ElementAt(i).Exit();
            mLevelElements.Clear();

            mCheckPoints.Clear();
        }

        public bool NewDocument()
        {
            ResetDocument();

            return true;
        }

        public bool LoadDocument(String filename)
        {
            ResetDocument();

            mFilename = filename;

            // fill mLevelElements from file
            if (!LevelUtil.LoadLevel(mFilename, this))
                return false;

            Owner.GlView.Refresh();

            return true;
        }

        public bool SaveDocument()
        {
            // save mLevelElements
            return LevelUtil.SaveLevel(mFilename, this);
        }

        public bool SaveDocument(String filename)
        {
            mFilename = filename;
            return SaveDocument();
        }

        public void CreateCheckPoint(float x, float y)
        {
            float tx = x;
            float ty = y;

            tx -= MainForm.App.getGraphics().getWidth() / 2;
            ty -= MainForm.App.getGraphics().getHeight() / 2;

            tx /= View.ZoomFactor;
            ty /= View.ZoomFactor;

            tx -= View.CurrentPosition.x;
            ty -= View.CurrentPosition.y;

            CheckPoint cp = new CheckPoint(this, "NewCheckPoint");
            cp.Position.x = tx;
            cp.Position.y = ty;

            AddCheckPoint(cp);
        }

        public void AddCheckPoint(CheckPoint checkPoint)
        {
            mCheckPoints.Add(checkPoint);
            Owner.CheckPoints.Items.Add(checkPoint);
            Owner.CheckPoints.SelectedIndex = Owner.CheckPoints.Items.Count - 1;
        }

        public void AddEnemySpawner(EnemySpawner spawner)
        {
            mSpawners.Add(spawner);
            Owner.Spawners.Items.Add(spawner);
            Owner.Spawners.SelectedIndex = Owner.Spawners.Items.Count - 1;
        }

        public void AddLevelElement(LevelElement element)
        {
            mLevelElements.Add(element);
            Owner.LevelElements.Items.Add(element);
            Owner.LevelElements.SelectedIndex = Owner.LevelElements.Items.Count - 1;
        }

        public void MoveObjectTo<T>(List<T> objList, System.Windows.Forms.ListBox lb, int fromIndex, int toIndex)
        {
            if ((fromIndex < 0) || (fromIndex >= objList.Count) ||
                (toIndex < 0) || (toIndex >= objList.Count))
                return;

            T cp = objList.ElementAt(fromIndex);
            objList.RemoveAt(fromIndex);
            objList.Insert(toIndex, cp);
            lb.Items.RemoveAt(fromIndex);
            lb.Items.Insert(toIndex, cp);
            lb.SelectedIndex = toIndex;
        }

        public void MoveObjectUp()
        {
            switch (Owner.CurrentObjectMode)
            {
                case MainForm.ObjectMode.CHECKPOINTS:
                    MoveObjectTo(mCheckPoints, Owner.CheckPoints, Owner.CheckPoints.SelectedIndex, Owner.CheckPoints.SelectedIndex - 1);
                    break;
                case MainForm.ObjectMode.SPAWNERS:
                    MoveObjectTo(mSpawners, Owner.Spawners, Owner.Spawners.SelectedIndex, Owner.Spawners.SelectedIndex - 1);
                    break;
                case MainForm.ObjectMode.ELEMENTS:
                    MoveObjectTo(mLevelElements, Owner.LevelElements, Owner.LevelElements.SelectedIndex, Owner.LevelElements.SelectedIndex - 1);
                    break;
            }
        }

        public void MoveObjectDown()
        {
            switch (Owner.CurrentObjectMode)
            {
                case MainForm.ObjectMode.CHECKPOINTS:
                    MoveObjectTo(mCheckPoints, Owner.CheckPoints, Owner.CheckPoints.SelectedIndex, Owner.CheckPoints.SelectedIndex + 1);
                    break;
                case MainForm.ObjectMode.SPAWNERS:
                    MoveObjectTo(mSpawners, Owner.Spawners, Owner.Spawners.SelectedIndex, Owner.Spawners.SelectedIndex + 1);
                    break;
                case MainForm.ObjectMode.ELEMENTS:
                    MoveObjectTo(mLevelElements, Owner.LevelElements, Owner.LevelElements.SelectedIndex, Owner.LevelElements.SelectedIndex + 1);
                    break;
            }
        }

        //=================================================================================================================================


        public void SetDirty(bool dirty)
        {
            mIsDirty = dirty;
        }

        public bool IsDirty()
        {
            return mIsDirty;
        }

        public String GetFilename()
        {
            return mFilename;
        }

        public void SetFilename(String filename)
        {
            mFilename = filename;
        }

        public bool IsFilenameSet()
        {
            return (mFilename != null);
        }

       

        public bool ReadParameter(Tokenizer t, string id)
        {
            if (id.Equals("name", StringComparison.OrdinalIgnoreCase))
            {
                LevelTitle = t.readString();
            }
            else if (id.Equals("startPosition", StringComparison.OrdinalIgnoreCase))
            {
                mStartPosition = ParseUtil.readVector2(t);
            }
            else
            {
                // unsupported id
                return false;
            }

            t.readToken(";");
            return true;
        }
    }
}