Public Class RotationTile

    Inherits Entity

    Public Enum RotationTypes
        StartSpin
        StopSpin
    End Enum

    Dim RotationType As RotationTypes
    Dim RotateTo As Integer = 0

    Public Overrides Sub Initialize()
        MyBase.Initialize()

        Select Case Me.ActionValue
            Case 0
                Me.RotationType = RotationTypes.StartSpin
            Case 1
                Me.RotationType = RotationTypes.StopSpin
        End Select

        Me.RotateTo = CInt(Me.AdditionalValue)
        Me.NeedsUpdate = True
    End Sub

    Public Overrides Sub Update()
        If Me.RotationType = RotationTypes.StartSpin Then
            If Core.CurrentScreen.Identification = Screen.Identifications.OverworldScreen Then
                If CType(Core.CurrentScreen, OverworldScreen).ActionScript.IsReady = True Then
                    If Me.Position.X = Screen.Camera.Position.X And CInt(Me.Position.Y) = CInt(Screen.Camera.Position.Y) And Me.Position.Z = Screen.Camera.Position.Z Then
                        Dim steps As Integer = GetSteps()

                        Dim s As String = "version=2" & Environment.NewLine &
                       "@player.move(0)" & Environment.NewLine &
                       "@player.turnto(" & Me.RotateTo.ToString() & ")" & Environment.NewLine &
                       "@player.move(" & steps & ")" & Environment.NewLine &
                       ":end"

                        CType(Core.CurrentScreen, OverworldScreen).ActionScript.StartScript(s, 2)
                    End If
                End If
            End If
        End If
    End Sub

    Private Function GetSteps() As Integer
        Dim steps As Integer = 0
        Dim direction As Vector2 = New Vector2(0)
        Select Case Me.RotateTo
            Case 0
                direction.Y = -1
            Case 1
                direction.X = -1
            Case 2
                direction.Y = 1
            Case 3
                direction.X = 1
        End Select

        Dim stepY As Integer = CInt(direction.Y)
        If stepY = 0 Then
            stepY = 1
        End If

        For x = 0 To direction.X * 100 Step direction.X
            For y = 0 To direction.Y * 100 Step stepY
                Dim p As Vector3 = New Vector3(x, 0, y) + Me.Position
                For Each e As Entity In Screen.Level.Entities
                    If e.Equals(Me) = False Then
                        If e.EntityID.ToLower() = "rotationtile" Then
                            If CInt(e.Position.X) = CInt(p.X) And CInt(e.Position.Y) = CInt(p.Y) And CInt(e.Position.Z) = CInt(p.Z) Then
                                GoTo theend
                            End If
                        End If
                    End If
                Next
                steps += 1
            Next
        Next

theend:

        Return steps
    End Function

    Public Overrides Sub Render()
        If Me.Model Is Nothing Then
            Me.Draw(Me.BaseModel, Textures, False)
        Else
            UpdateModel()
            Draw(Me.BaseModel, Me.Textures, True, Me.Model)
        End If
    End Sub

    Public Overrides Function LetPlayerMove() As Boolean
        Return Me.RotationType = RotationTypes.StopSpin
    End Function

    Public Overrides Function WalkIntoFunction() As Boolean
        If Me.RotationType = RotationTypes.StartSpin Then
            CType(Screen.Camera, OverworldCamera).YawLocked = True
        End If
        Return False
    End Function

End Class