Subversion Repositories AndroidProjects

Rev

Rev 1546 | 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.IO;
using System.ComponentModel;

using BauzoidNET.parser;
using BauzoidNET.graphics.sprite;
using BauzoidNET.graphics;
using BauzoidNET.math;

using BurutaruEditor.view;

namespace BurutaruEditor.file.enemies
{
    public class CoreMechEnemySpawner : EnemySpawner
    {
        public const float ENEMY_WIDTH = 50;
        public const float ENEMY_HEIGHT = 2*ENEMY_WIDTH;

        public const float MOVE_SPEED = 150;
       
        //=================================================================================================================================


        [Category("Formation")]
        public float MoveSpeed { get; set; }

        [Category("Formation")]
        public float Phase1StartTime { get; set; }

        private Vector2 mPhase1Direction = new Vector2();
        [Category("Formation")]
        [TypeConverter(typeof(ExpandableObjectConverter))]
        public Vector2 Phase1Direction { get { return mPhase1Direction; } set { mPhase1Direction = value; } }
       
        [Category("Formation")]
        public float Phase2StartTime { get; set; }

        private Vector2 mPhase2Direction = new Vector2();
        [Category("Formation")]
        [TypeConverter(typeof(ExpandableObjectConverter))]
        public Vector2 Phase2Direction { get { return mPhase2Direction; } set { mPhase2Direction = value; } }

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

        public CoreMechEnemySpawner(Document doc, string name)
            : base(doc, name)
        {
            MoveSpeed = MOVE_SPEED;
            Phase1StartTime = 1.3f;
            Phase1Direction.set(-1.0f, 1.0f);
            Phase2StartTime = 3.0f;
            Phase2Direction.set(-1.0f, -1.0f);
        }

        public override void Render()
        {
            base.Render();

            float triggerX = SpawnTrigger.x + Doc.View.CurrentPosition.x;
            float triggerY = SpawnTrigger.y + Doc.View.CurrentPosition.y;

            SpriteTransform t = DocumentView.Resources.CoreMechEnemySprite.getSpriteTransform();
            t.x = triggerX + SpawnPosition.x;
            t.y = triggerY + SpawnPosition.y;
            t.w = ENEMY_WIDTH;
            t.h = ENEMY_HEIGHT;
            t.centerPivot();
            DocumentView.Resources.CoreMechEnemySprite.getSpriteInstance().color.setFrom(mMultiplyColor);
            DocumentView.Resources.CoreMechEnemySprite.getSpriteInstance().color.w = mMultiplyFactor;
            DocumentView.Resources.CoreMechEnemySprite.getSpriteInstance().fogColor.setFrom(mLerpColor);
            DocumentView.Resources.CoreMechEnemySprite.getSpriteInstance().fogColor.w = mLerpFactor;
            DocumentView.Resources.CoreMechEnemySprite.render();

            float w = MainForm.App.getGraphics().getFont().getTextWidth(this.Name, Document.TEXT_SCALE);
            MainForm.App.getGraphics().getFont().drawTextDirect(this.Name, t.x - w / 2, t.y + ENEMY_HEIGHT / 2, Document.TEXT_COLOR, Document.TEXT_SCALE);

            RenderUtil.drawArrow(MainForm.App.getGraphics(), triggerX, triggerY, t.x, t.y, ARROW_COLOR);
        }

        public override void RenderSelected(int selectedPart, bool forHover = false)
        {
            if (selectedPart != PART_SPAWN_POSITION)
            {
                base.RenderSelected(selectedPart, forHover);
            }

            float posX = SpawnTrigger.x + SpawnPosition.x + Doc.View.CurrentPosition.x;
            float posY = SpawnTrigger.y + SpawnPosition.y + Doc.View.CurrentPosition.y;

            float halfWidth = ENEMY_WIDTH / 2 + DocumentView.SELECTION_FRAME_OFFSET;
            float halfHeight = ENEMY_HEIGHT / 2 + DocumentView.SELECTION_FRAME_OFFSET;

            if (forHover)
                Doc.View.RenderSelectionFrame(posX - halfWidth, posY - halfHeight, posX + halfWidth, posY + halfHeight, DocumentView.SELECTION_FRAME_HOVER_ALPHA);
            else
                Doc.View.RenderSelectionFrame(posX - halfWidth, posY - halfHeight, posX + halfWidth, posY + halfHeight);
        }

        public override bool IsInside(float x, float y, out int selectedPart)
        {
            if (base.IsInside(x, y, out selectedPart))
                return true;

            float px = SpawnTrigger.x + SpawnPosition.x + Doc.View.CurrentPosition.x;
            float py = SpawnTrigger.y + SpawnPosition.y + Doc.View.CurrentPosition.y;

            if ((Math.Abs(px - x) <= (ENEMY_WIDTH / 2)) && (Math.Abs(py - y) < (ENEMY_HEIGHT / 2)))
            {
                selectedPart = PART_SPAWN_POSITION;
                return true;
            }

            return false;
        }

        public override void MoveBy(float dx, float dy, int selectedPart)
        {
            if (selectedPart == PART_SPAWN_POSITION)
            {
                SpawnPosition.x += (dx / Doc.View.ZoomFactor);
                SpawnPosition.y += (dy / Doc.View.ZoomFactor);
            }
            else
            {
                SpawnTrigger.x += (dx / Doc.View.ZoomFactor);
                SpawnTrigger.y += (dy / Doc.View.ZoomFactor);
            }
        }

        public override string GetPropertiesType()
        {
            return "CoreMechEnemy";
        }

        public override void WriteData(TextWriter tw)
        {
            base.WriteData(tw);

            tw.WriteLine("\tmoveSpeed " + MoveSpeed + ";");
            tw.WriteLine("\tstartPhase1 " + Phase1StartTime + ";");
            tw.WriteLine("\tdirectionPhase1 " + mPhase1Direction.x + ", " + mPhase1Direction.y + ";");
            tw.WriteLine("\tstartPhase2 " + Phase2StartTime + ";");
            tw.WriteLine("\tdirectionPhase2 " + mPhase2Direction.x + ", " + mPhase2Direction.y + ";");
        }

        public override void WriteData(Serializer s)
        {
            base.WriteData(s);

            s.Write("moveSpeed"); s.Write(MoveSpeed);
            s.Write("startPhase1"); s.Write(Phase1StartTime);
            s.Write("directionPhase1"); s.Write(mPhase1Direction);
            s.Write("startPhase2"); s.Write(Phase2StartTime);
            s.Write("directionPhase2"); s.Write(mPhase2Direction);
        }

        public override bool ReadParameter(Tokenizer t, String id)
                {
            if (id.Equals("moveSpeed", StringComparison.OrdinalIgnoreCase))
                    {
                MoveSpeed = t.readNumber();
                    }
            else if (id.Equals("startPhase1", StringComparison.OrdinalIgnoreCase))
            {
                Phase1StartTime = t.readNumber();
            }
            else if (id.Equals("directionPhase1", StringComparison.OrdinalIgnoreCase))
            {
                mPhase1Direction = ParseUtil.readVector2(t);
            }
            else if (id.Equals("startPhase2", StringComparison.OrdinalIgnoreCase))
            {
                Phase2StartTime = t.readNumber();
            }
            else if (id.Equals("directionPhase2", StringComparison.OrdinalIgnoreCase))
            {
                mPhase2Direction = ParseUtil.readVector2(t);
            }
            else
            {
                return base.ReadParameter(t, id);
            }

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