Subversion Repositories AndroidProjects

Rev

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

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

namespace BurutaruEditor.file.enemies
{
    public class CoreTurretEnemySpawner : EnemySpawner
    {
        public const float ENEMY_WIDTH = 40;
        public const float ENEMY_HEIGHT = ENEMY_WIDTH;

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

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

        [Category("Placement")]
        public float Angle { get; set; }

        [Category("Placement")]
        public string ReferenceObject { get; set; }

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

        public CoreTurretEnemySpawner(Document doc, string name)
            : base(doc, name)
        {
            Position = new Vector2();
            Angle = 0.0f;
            ReferenceObject = "";
        }

        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.CoreTurretEnemySprite.getSpriteTransform();
            t.x = triggerX + SpawnPosition.x;
            t.y = triggerY + SpawnPosition.y;
            t.w = ENEMY_WIDTH;
            t.h = ENEMY_HEIGHT;
            t.centerPivot();
            DocumentView.Resources.CoreTurretEnemySprite.getSpriteInstance().color.setFrom(mMultiplyColor);
            DocumentView.Resources.CoreTurretEnemySprite.getSpriteInstance().color.w = mMultiplyFactor;
            DocumentView.Resources.CoreTurretEnemySprite.getSpriteInstance().fogColor.setFrom(mLerpColor);
            DocumentView.Resources.CoreTurretEnemySprite.getSpriteInstance().fogColor.w = mLerpFactor;
            DocumentView.Resources.CoreTurretEnemySprite.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);*/


            LevelElement e = Doc.FindLevelElement(ReferenceObject);
            if ((e != null) && (e is StaticElement))
            {
                StaticElement se = (StaticElement)e;

                SpriteTransform tse = se.GetTransformed();

                float px = tse.x;
                float py = tse.y;

                Vector2 tPos = tse.spriteToWorld(Position.x + se.Transform.pivotX, Position.y + se.Transform.pivotY);

                /*float tx = px + Position.x;
                float ty = py + Position.y;*/

                float tx = tPos.x;
                float ty = tPos.y;

                SpriteTransform t = DocumentView.Resources.CoreTurretEnemySprite.getSpriteTransform();
                t.x = tx;
                t.y = ty;
                t.w = ENEMY_WIDTH;
                t.h = ENEMY_HEIGHT;
                /*t.pivotX = t.w / 2;
                t.pivotY = t.h * (2/3);*/

                t.angle = tse.angle + Angle;
                t.centerPivot();
                DocumentView.Resources.CoreTurretEnemySprite.getSpriteInstance().color.setFrom(mMultiplyColor);
                DocumentView.Resources.CoreTurretEnemySprite.getSpriteInstance().color.w = mMultiplyFactor;
                DocumentView.Resources.CoreTurretEnemySprite.getSpriteInstance().fogColor.setFrom(mLerpColor);
                DocumentView.Resources.CoreTurretEnemySprite.getSpriteInstance().fogColor.w = mLerpFactor;
                DocumentView.Resources.CoreTurretEnemySprite.render();

                RenderUtil.drawArrow(MainForm.App.getGraphics(), triggerX, triggerY, px, py, ARROW_COLOR);
                RenderUtil.drawArrow(MainForm.App.getGraphics(), px, py, tx, ty, ARROW_COLOR);
            }

            //RenderUtil.drawArrow(MainForm.App.getGraphics(), t.x, t.y, t.x + PointA.x, t.y + PointA.y, ARROW_COLOR);
            //RenderUtil.drawArrow(MainForm.App.getGraphics(), t.x, t.y, t.x + PointB.x, t.y + PointB.y, ARROW_COLOR);
        }

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

            LevelElement e = Doc.FindLevelElement(ReferenceObject);
            if ((e != null) && (e is StaticElement))
            {
                StaticElement se = (StaticElement)e;

                SpriteTransform tse = se.GetTransformed();

                float px = tse.x;
                float py = tse.y;

                Vector2 tPos = tse.spriteToWorld(Position.x + se.Transform.pivotX, Position.y + se.Transform.pivotY);

                float halfWidth = ENEMY_WIDTH / 2 + DocumentView.SELECTION_FRAME_OFFSET;
                float halfHeight = ENEMY_HEIGHT / 2 + DocumentView.SELECTION_FRAME_OFFSET;
               
                if (forHover)
                    Doc.View.RenderSelectionFrame(tPos.x - halfWidth, tPos.y - halfHeight, tPos.x + halfWidth, tPos.y + halfHeight, DocumentView.SELECTION_FRAME_HOVER_ALPHA);
                else
                    Doc.View.RenderSelectionFrame(tPos.x - halfWidth, tPos.y - halfHeight, tPos.x + halfWidth, tPos.y + halfHeight);
            }


            /*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;

            LevelElement e = Doc.FindLevelElement(ReferenceObject);
            if ((e != null) && (e is StaticElement))
            {
                StaticElement se = (StaticElement)e;

                SpriteTransform tse = se.GetTransformed();

                float px = tse.x;
                float py = tse.y;

                Vector2 tPos = tse.spriteToWorld(Position.x + se.Transform.pivotX, Position.y + se.Transform.pivotY);

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

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

                if (forHover)
                    Doc.View.RenderSelectionFrame(tPos.x - halfWidth, tPos.y - halfHeight, tPos.x + halfWidth, tPos.y + halfHeight, DocumentView.SELECTION_FRAME_HOVER_ALPHA);
                else
                    Doc.View.RenderSelectionFrame(tPos.x - halfWidth, tPos.y - halfHeight, tPos.x + halfWidth, tPos.y + halfHeight);*/

            }


            /*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);

                LevelElement e = Doc.FindLevelElement(ReferenceObject);
                if ((e != null) && (e is StaticElement))
                {
                    StaticElement se = (StaticElement)e;
                    SpriteTransform tse = se.GetTransformed();

                    Vector2 tPos = tse.spriteToWorld(Position.x + se.Transform.pivotX, Position.y + se.Transform.pivotY);

                    tPos.x += dx/ Doc.View.ZoomFactor;
                    tPos.y += dy/ Doc.View.ZoomFactor;

                    Vector2 spriteMove = tse.worldToSprite(tPos.x, tPos.y);    

                    Position.x = (spriteMove.x - se.Transform.pivotX);
                    Position.y = (spriteMove.y - se.Transform.pivotY);
                }
            }
            else
            {
                SpawnTrigger.x += (dx / Doc.View.ZoomFactor);
                SpawnTrigger.y += (dy / Doc.View.ZoomFactor);
            }
        }

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

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

            //tw.WriteLine("\tmoveSpeed " + MoveSpeed + ";");
            tw.WriteLine("\tposition " + Position.x + ", " + Position.y + ";");
            tw.WriteLine("\tangle " + Angle + ";");
            tw.WriteLine("\trefObject \"" + ReferenceObject + "\";");
        }

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

            s.Write("position"); s.Write(Position);
            s.Write("angle"); s.Write(Angle);
            s.Write("refObject"); s.Write(ReferenceObject);
        }

        public override bool ReadParameter(Tokenizer t, String id)
        {
            if (id.Equals("position", StringComparison.OrdinalIgnoreCase))
            {
                Position = ParseUtil.readVector2(t);
            }
            else if (id.Equals("angle", StringComparison.OrdinalIgnoreCase))
            {
                Angle = t.readNumber();
            }
            else if (id.Equals("refObject", StringComparison.OrdinalIgnoreCase))
            {
                ReferenceObject = t.readString();
            }
            else
            {
                return base.ReadParameter(t, id);
            }

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