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;
}
}
}