Public Class BattleAnimation3D

    Inherits Entity
    Public Enum AnchorTypes
        Top
        Left
        Right
        Bottom
    End Enum
    Public Enum AnimationTypes
        [Nothing]
        Move
        Transition
        Size
        Rotation
        Texture
        Sound
        Background
        Camera
    End Enum

    Public AnimationType As AnimationTypes = AnimationTypes.Nothing
    Public CanRemove As Boolean = False
    Public Ready As Boolean = False
    Public startDelay As Date
    Public endDelay As Date
    Public SpawnedEntity As Boolean = False
    Public Started As Boolean = False
    Private DelayDivide As Single = 6.0F
    Private StartDelayWhole As Single
    Private StartDelayFraction As Single
    Private EndDelayWhole As Single
    Private EndDelayFraction As Single
    Private hasStartedEndDelay As Boolean = False

    Public Sub New(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal startDelay As Single, ByVal endDelay As Single, Optional SpawnedEntity As Boolean = False)
        MyBase.New(Position.X, Position.Y, Position.Z, "BattleAnimation", {Texture}, {0, 0}, False, 0, Scale, BaseModel.BillModel, 0, "", New Vector3(1.0F))

        StartDelayWhole = CSng(Math.Truncate(CDbl(startDelay / DelayDivide)))
        StartDelayFraction = startDelay / DelayDivide - StartDelayWhole
        EndDelayWhole = CSng(Math.Truncate(CDbl(endDelay / DelayDivide)))
        EndDelayFraction = endDelay / DelayDivide - EndDelayWhole

        Me.SpawnedEntity = SpawnedEntity

        Me.CreateWorldEveryFrame = True
        Me.DropUpdateUnlessDrawn = False
    End Sub

    Public Overrides Sub Update()

        If Started = False Then
            Me.startDelay = Date.Now + New TimeSpan(0, 0, 0, CInt(StartDelayWhole), CInt(StartDelayFraction * 1000))
            hasStartedEndDelay = False
            Started = True
        End If
        If CanRemove = False Then
            If Ready = True Then
                If hasStartedEndDelay = False Then
                    Me.endDelay = Date.Now + New TimeSpan(0, 0, 0, CInt(EndDelayWhole), CInt(EndDelayFraction * 1000))
                    hasStartedEndDelay = True
                End If
                If Date.Now >= endDelay Then
                    DoRemoveEntity()
                    CanRemove = True
                End If
            Else
                If Date.Now >= startDelay Then
                    If SpawnedEntity = True Then
                        Ready = True
                    Else
                        Me.Visible = True
                    End If
                    DoActionActive()
                End If
            End If
        End If
    End Sub

    Public Overrides Sub UpdateEntity()
        If Me.Rotation.Y <> Screen.Camera.Yaw Then
            Me.Rotation.Y = Screen.Camera.Yaw
        End If

        DoActionUpdate()

        MyBase.UpdateEntity()
    End Sub

    Public Overridable Sub DoActionUpdate()
        'Insert code in Inherits class for every update here.
    End Sub

    Public Overridable Sub DoActionActive()
        'Insert code in Inherits class here.
    End Sub
    Public Overridable Sub DoRemoveEntity()
        'Insert code in Inherits class here.
    End Sub

    Public Overrides Sub Render()
        If Date.Now >= startDelay Then
            If CanRemove = False Then
                If Me.Model Is Nothing Then
                    Draw(Me.BaseModel, Me.Textures, True)
                Else
                    UpdateModel()
                    Draw(Me.BaseModel, Me.Textures, True, Me.Model)
                End If
            End If
        End If
    End Sub

End Class