Subversion Repositories AndroidProjects

Rev

Rev 1604 | 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.math;
using BauzoidNET.parser;
using BauzoidNET.graphics.sprite;
using BauzoidNET.graphics;


using BurutaruEditor.view;

namespace BurutaruEditor.file.enemies
{
    public class SpaceMineEnemySpawner : EnemySpawner
    {
        public const float ENEMY_SIZE = 100;

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

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

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

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

        [Category("Formation")]
        [TypeConverter(typeof(ExpandableObjectConverter))]
        public Vector2 MoveDir { get; set; }

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

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

        public SpaceMineEnemySpawner(Document doc, string name)
            : base(doc, name)
        {
            ShootInterval = 1.0f;
            RotationSpeed = 70;
            MoveDir = new Vector2(-1, 1);
            MoveSpeed = 30;
            InitialAngle = 0.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.SpaceMineEnemySprite.getSpriteTransform();
            t.x = triggerX + SpawnPosition.x;
            t.y = triggerY + SpawnPosition.y;
            t.w = ENEMY_SIZE;
            t.h = ENEMY_SIZE;
            t.centerPivot();
            t.angle = InitialAngle;
            DocumentView.Resources.SpaceMineEnemySprite.getSpriteInstance().color.setFrom(mMultiplyColor);
            DocumentView.Resources.SpaceMineEnemySprite.getSpriteInstance().color.w = mMultiplyFactor;
            DocumentView.Resources.SpaceMineEnemySprite.getSpriteInstance().fogColor.setFrom(mLerpColor);
            DocumentView.Resources.SpaceMineEnemySprite.getSpriteInstance().fogColor.w = mLerpFactor;
            DocumentView.Resources.SpaceMineEnemySprite.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_SIZE/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 halfSize = ENEMY_SIZE / 2 + DocumentView.SELECTION_FRAME_OFFSET;

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

        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_SIZE / 2)) && (Math.Abs(py - y) < (ENEMY_SIZE / 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 "SpaceMineEnemy";
        }

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

            tw.WriteLine("\tshootInterval " + ShootInterval + ";");
            tw.WriteLine("\trotationSpeed " + RotationSpeed + ";");
            tw.WriteLine("\tmoveSpeed " + MoveSpeed + ";");
            tw.WriteLine("\tmoveDir " + MoveDir.x + ", " + MoveDir.y + ";");
            tw.WriteLine("\tinitialAngle " + InitialAngle + ";");
        }

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

            s.Write("shootInterval"); s.Write(ShootInterval);
            s.Write("rotationSpeed"); s.Write(RotationSpeed);
            s.Write("moveSpeed"); s.Write(MoveSpeed);
            s.Write("moveDir"); s.Write(MoveDir);
            s.Write("initialAngle"); s.Write(InitialAngle);
        }

        public override bool ReadParameter(Tokenizer t, String id)
                {
            if (id.Equals("shootInterval", StringComparison.OrdinalIgnoreCase))
            {
                ShootInterval = t.readNumber();
            }
            else if (id.Equals("initialAngle", StringComparison.OrdinalIgnoreCase))
            {
                InitialAngle = t.readNumber();
            }                
            else if (id.Equals("rotationSpeed", StringComparison.OrdinalIgnoreCase))
            {
                RotationSpeed = t.readNumber();
            }
            else if (id.Equals("moveSpeed", StringComparison.OrdinalIgnoreCase))
            {
                MoveSpeed = t.readNumber();
            }
            else if (id.Equals("moveDir", StringComparison.OrdinalIgnoreCase))
            {
                MoveDir = ParseUtil.readVector2(t);
            }
            else
            {
                return base.ReadParameter(t, id);
            }

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