Attribute VB_Name = "ModVariablesKhonquista"
'**************************************************************
'   Variables de configuración
'**************************************************************
Global NumJugadores As Byte
Global NumPlanetasNeutrales As Byte
Global NombreJugador As String
Global HayMusica As Byte

'**************************************************************
'   Variables utilizadas para definir el juego
'**************************************************************
Public Enum EnumJugadores
    CstNeutral = 0
    cstplayer1 = 1
    CstComp1 = 2
    CstComp2 = 3
    CstComp3 = 4
    CstComp4 = 5
    CstComp5 = 6
    CstComp6 = 7
    CstComp7 = 8
    CstComp8 = 9
End Enum

Public Type TipoPlaneta
    Propietario As Byte
    Produccion As Long
    Poder As Integer
    PoderBase As Integer
    Naves As Long
    PosX As Integer
    Posy As Integer
    Cristales As Integer
    BonoCristales As Integer
    BonoPoder As Integer
    BonoProduccion As Integer
End Type

Public Type TipoFlota
    Propietario As Byte
    Naves As Long
    Poder As Integer
    Destino As Integer
    Origen As Integer
    TurnoArribo As Integer
    TurnoInicio As Integer
End Type

Public Type TipoEstadisticas
    Planetas As Integer
    Naves As Double
    PlanetasConquistados As Integer
    PlanetasPerdidos As Integer
    NavesCreadas As Double
    NavesPerdidas As Double
    Agresividad As Integer
    Cristales As Long
End Type

'Tipo para retornar ganador y flota sobreviviente de un combate
Private Type ResultadoCombate
    Ganador As Byte
    Perdedor As Byte
    Flota As Long
    Conquistado As Boolean
End Type

'Planeta contiene la información de cada planeta del juego
'con Planeta(Jugador dueño del planeta, ...
'... Producción turno, Poder ataque, Flota actual, PosX, PosY)
Global Planeta(44) As TipoPlaneta
'Flotas mantiene la información de las flotas que han sido enviadas
'Con el formato Flotas(Jugador dueño de la flota, Destino, Número, Poder, Turno arribo,Origen, Turno Inicio)
Global Flotas(1024) As TipoFlota
'Grilla de 16*16 que contiene el indice de cada planeta en el universo
Global Universo2D(255) As Integer

'array que contiene la información estadisticas de los jugadores
Global NPC(10) As TipoEstadisticas

'Informa el turno actual en que esta el juego
Public NumTurno As Integer
'Informa del estado de espera en que se encuentra el juego
Public Estado As Byte
'Almacena planeta marcado como Origen
Public PlanetaOrigen As Integer
'Almacena planeta marcado como destino
Public PlanetaDestino As Integer
'Almacena cantidad de flota enviada
Public FlotaEnviada As Long
Public AuxFlotaEnviada As String
'Almacena ID de último planeta que toco el puntero
Public UltimoPlaneta As Integer
'Alamcena el puntero de inicio al Frame planetas para variar aleatoriamente el frame del planeta 0
Public PlanetaCero As Integer
'Almacena el valor de la propiedad ocultar grilla
Public OcultarGrilla As Boolean
'Almacena el valor de dificultad del juego
Public NivelDificultad As Integer


'**************************************************************
'   Variables temporales
'**************************************************************
Public Sonido_Habilitado As Boolean
Public ScrollNumJugadores As Boolean
Public ScrollNumPlanetasNeutrales As Boolean
Public ScrollDificultad As Boolean

Public MediaNaves As Double
Public DENaves As Double
Public MatrizDeseo(44, 2) As Double
Public Const FactorAgresividad As Double = 5
Public Const FactorDistancia  As Double = 0.2
Public Const FactorNaves As Double = 10
Public Const FactorCristales As Double = 20
Public Const FactorPoder As Double = 500



'Función que llena las variables de juego al azar para crear un universo único
Public Sub CrearUniverso()
Dim i As Integer
Dim Universo(255) As Boolean 'Auxiliar para evitar colocar 2 planetas en el mismo lugar


Randomize 'Inicializar semilla con el reloj

'Limpiar variables
For i = 0 To 255
    Universo2D(i) = 0
Next
For i = 0 To 1024
    Flotas(i).Propietario = 0
    Flotas(i).TurnoArribo = 0
    Flotas(i).Naves = 0
Next
For i = 0 To 44
    Planeta(i).Propietario = 0
Next
Estado = 0
FlotaEnviada = 0
AuxFlotaEnviada = "0"
NumTurno = 0

'Llenar valores de planetas de jugadores
For i = 0 To NumJugadores - 1
    Planeta(i).Propietario = i + 1  'propietario del planeta
    Planeta(i).Produccion = 10      'Producción
    Planeta(i).PoderBase = 400      'Poder
    Planeta(i).Naves = 10           'Flota
    Planeta(i).Cristales = 10       'Producción de cristales
    Planeta(i).BonoCristales = 0
    Planeta(i).BonoPoder = 0
    Planeta(i).BonoProduccion = 0
    
    NPC(i).Planetas = 1             'Num planetas para estadisticas
    NPC(i).PlanetasConquistados = 0 'Num planetas conquistados para estadistica
    NPC(i).PlanetasPerdidos = 0
    NPC(i).Naves = 10               'Num Naves Para estadistica
    NPC(i).NavesCreadas = 10        'Num Naves Creadas para estadistica
    NPC(i).NavesPerdidas = 0
    NPC(i).Agresividad = Round(Rnd() * 99 + 1)     '% de agresividad
Next

'Llenar Valores de planetas Neutrales
For i = NumJugadores To NumJugadores + NumPlanetasNeutrales - 1
    Planeta(i).Propietario = 0
    Planeta(i).Produccion = CInt((Rnd() * 10) + 5)
    Planeta(i).PoderBase = Int((Rnd() * 600 + 300))
    Planeta(i).Naves = Planeta(i).Produccion
    Planeta(i).Cristales = CInt(Rnd() * 20)
    If (Rnd() * 100) <= 10 Then Planeta(i).BonoCristales = 1
    If (Rnd() * 100) <= 10 Then Planeta(i).BonoPoder = 1
    If (Rnd() * 100) <= 10 Then Planeta(i).BonoProduccion = 1
    If (Rnd() * 100) <= 5 Then Planeta(i).BonoCristales = 2 + Planeta(i).BonoCristales
    If (Rnd() * 100) <= 5 Then Planeta(i).BonoPoder = 2 + Planeta(i).BonoPoder
    If (Rnd() * 100) <= 5 Then Planeta(i).BonoProduccion = 2 + Planeta(i).BonoProduccion
    
Next

'"Repartir" planetas en el universo
Dim PosicionAbsoluta As Integer
For i = 0 To NumJugadores + NumPlanetasNeutrales - 1
    Do 'Buscar al azar hasta encontrar una posición libre
        PosicionAbsoluta = CInt(Rnd() * 255)
    Loop Until Universo(PosicionAbsoluta) = False
    Planeta(i).PosX = PosicionAbsoluta Mod 16 'encontrar posición X
    Planeta(i).Posy = Int(PosicionAbsoluta / 16) 'encontrar posición Y
    Universo2D(PosicionAbsoluta) = i + 1 'Almacena el indice de cada planeta en la grilla del universo
    Universo(PosicionAbsoluta) = True 'Marcar como ocupada la posición en el universo
    'Debug.Print Universo2D(I)
Next

'Designar imagen al planeta 0
PlanetaCero = Int(Rnd() * 43)

End Sub

Public Function ActualizarProduccion()
For i = 0 To NumJugadores + NumPlanetasNeutrales - 1
    If Planeta(i).Propietario = 0 Then
        'si planeta es neutral incrementar flota en 1 unidad por cada nivel de dificultad
        Planeta(i).Naves = Planeta(i).Naves + NivelDificultad + Round(Planeta(i).Produccion * (0.1 * Planeta(i).BonoProduccion))
    ElseIf Planeta(i).Propietario = 1 Then
        'si planeta tiene propitario y es el jugador incrementar flota según producción
        Planeta(i).Naves = Planeta(i).Naves + Planeta(i).Produccion + Round(Planeta(i).Produccion * (0.1 * Planeta(i).BonoProduccion))
        'Incrementar número de naves en la estadistica
        NPC((Planeta(i).Propietario)).Naves = NPC((Planeta(i).Propietario)).Naves + Planeta(i).Produccion + Round(Planeta(i).Produccion * (0.1 * Planeta(i).BonoProduccion))
        NPC((Planeta(i).Propietario)).NavesCreadas = NPC((Planeta(i).Propietario)).NavesCreadas + Planeta(i).Produccion + Round(Planeta(i).Produccion * (0.1 * Planeta(i).BonoProduccion))
    Else
        'si planeta tiene propitario incrementar flota según producción
        Planeta(i).Naves = Planeta(i).Naves + Planeta(i).Produccion + Round(Planeta(i).Produccion * (0.1 * Planeta(i).BonoProduccion)) + 2 ^ (NivelDificultad - 1)
        'Incrementar número de naves en la estadistica
        NPC((Planeta(i).Propietario)).Naves = NPC((Planeta(i).Propietario)).Naves + Planeta(i).Produccion + Round(Planeta(i).Produccion * (0.1 * Planeta(i).BonoProduccion)) + 2 ^ (NivelDificultad - 1)
        NPC((Planeta(i).Propietario)).NavesCreadas = NPC((Planeta(i).Propietario)).NavesCreadas + Planeta(i).Produccion + Round(Planeta(i).Produccion * (0.1 * Planeta(i).BonoProduccion)) + 2 ^ (NivelDificultad - 1)
    
    End If
    Planeta(i).Poder = Planeta(i).PoderBase + Round(Planeta(i).PoderBase * (0.1 * Planeta(i).BonoPoder))
    
    'sumar cristales a jugador si corresponde
    If Planeta(i).Propietario = cstplayer1 Then NPC(1).Cristales = NPC(1).Cristales + Planeta(i).Cristales + Round(Planeta(i).Cristales * (0.1 * Planeta(i).BonoCristales))
Next
End Function

Public Function ComprobarFlota()
Dim AuxCombate As ResultadoCombate
Dim i As Integer

For i = 0 To 1024
    'comprobar flota solo si estamos en el turno de arribo de la misma
    If Flotas(i).TurnoArribo = NumTurno Then
        'Detectar acción de flota según el arribo sea a planeta amigo o hostil
        If Flotas(i).Propietario = Planeta(Flotas(i).Destino).Propietario Then
            'si es planeta amigo, reforzar planeta
        
            Planeta(Flotas(i).Destino).Naves = Planeta(Flotas(i).Destino).Naves + Flotas(i).Naves
            If (Planeta(Flotas(i).Destino).Propietario = cstplayer1 Or Flotas(i).Propietario = cstplayer1) Then
                Form1.MsgPrincipal.AddItem "Han llegado " & Flotas(i).Naves & " refuerzos al planeta " & ObtenerNombrePlaneta(Flotas(i).Destino)
                Form1.MsgPrincipal.Visible = True
            End If
            'Agregar mensaje a lista de eventos
            Form1.List1.AddItem "Han llegado " & Flotas(i).Naves & " refuerzos al planeta " & ObtenerNombrePlaneta(Flotas(i).Destino)
        Else
            'Si es planeta hostil, iniciar combate
            AuxCombate = Combatir(Flotas(i).Destino, i)
            Planeta(Flotas(i).Destino).Propietario = AuxCombate.Ganador
            Planeta(Flotas(i).Destino).Naves = AuxCombate.Flota
            'determinar si el planeta fue conquistado para determinar mensaje mostrado solo si el jugador esta involucrado
            If (AuxCombate.Ganador = 1 Or AuxCombate.Perdedor = 1 Or Flotas(i).Propietario = 1) Then
                If AuxCombate.Conquistado Then
                    Form1.MsgPrincipal.AddItem "El planeta " & ObtenerNombrePlaneta(Flotas(i).Destino) & " conquistado por " & ObtenerNombre(AuxCombate.Ganador)
                Else
                    Form1.MsgPrincipal.AddItem "El planeta " & ObtenerNombrePlaneta(Flotas(i).Destino) & " rechazó ataque de " & ObtenerNombre(AuxCombate.Perdedor)
                End If
                Form1.MsgPrincipal.Visible = True
            End If
            'Agregar mensaje a lista de eventos
            If AuxCombate.Conquistado Then
                Form1.List1.AddItem "Planeta " & ObtenerNombrePlaneta(Flotas(i).Destino) & " conquistado por " & ObtenerNombre(AuxCombate.Ganador)
            Else
                Form1.List1.AddItem "Planeta " & ObtenerNombrePlaneta(Flotas(i).Destino) & " rechazó ataque de " & ObtenerNombre(AuxCombate.Perdedor)
            End If
            
        End If
    
    'limpiar lista de flotas que arribaron
    Flotas(i).Propietario = 0 'Propietario Flota
    Flotas(i).Destino = 0 'Destino de la flota
    Flotas(i).Naves = 0 'Numero de naves en la flota
    Flotas(i).Poder = 0 'Poder de la flota
    Flotas(i).TurnoArribo = 0 'Turno de arribo
    ElseIf Flotas(i).TurnoArribo > 0 And Flotas(i).TurnoArribo < NumTurno Then
        'limpiar Flota perdida
        Flotas(i).Propietario = 0 'Propietario Flota
        Flotas(i).Destino = 0 'Destino de la flota
        Flotas(i).Naves = 0 'Numero de naves en la flota
        Flotas(i).Poder = 0 'Poder de la flota
        Flotas(i).TurnoArribo = 0 'Turno de arribo
    
    End If
Next
End Function

Private Function Combatir(IDPlaneta As Integer, IDFlota As Integer) As ResultadoCombate
'***********************************************************************
'***********************************************************************
'Primer algoritmo de combate
'***********************************************************************
'***********************************************************************

If ((Planeta(IDPlaneta).Naves) * (Planeta(IDPlaneta).PoderBase)) > ((Flotas(IDFlota).Naves) * (Flotas(IDFlota).Poder)) Then
    'Si gana la defensa del planeta
    Combatir.Conquistado = False
    Combatir.Ganador = Planeta(IDPlaneta).Propietario
    Combatir.Perdedor = Flotas(IDFlota).Propietario
    Combatir.Flota = (CDbl(Planeta(IDPlaneta).Naves) * (((Planeta(IDPlaneta).Naves) * (Planeta(IDPlaneta).PoderBase)) - ((Flotas(IDFlota).Naves) * (Flotas(IDFlota).Poder)))) / ((Planeta(IDPlaneta).Naves) * (Planeta(IDPlaneta).PoderBase))
    
    '**************************************************************
    'Rellenar estadisticas
    'dueño planeta
    NPC(Planeta(IDPlaneta).Propietario).Naves = NPC(Planeta(IDPlaneta).Propietario).Naves - (Planeta(IDPlaneta).Naves) + Combatir.Flota
    NPC(Planeta(IDPlaneta).Propietario).NavesPerdidas = (Planeta(IDPlaneta).Naves) - Combatir.Flota
    'dueño flota
    NPC(Flotas(IDFlota).Propietario).Naves = NPC(Flotas(IDFlota).Propietario).Naves - (Flotas(IDFlota).Naves)
    NPC(Flotas(IDFlota).Propietario).NavesPerdidas = (Flotas(IDFlota).Naves)
    '***************************************************************
Else
    'Si gana el atacante
    Combatir.Conquistado = True
    Combatir.Ganador = Flotas(IDFlota).Propietario
    Combatir.Perdedor = Planeta(IDPlaneta).Propietario
    Combatir.Flota = (CDbl(Flotas(IDFlota).Naves) * (((Flotas(IDFlota).Naves) * (Flotas(IDFlota).Poder)) - ((Planeta(IDPlaneta).Naves) * (Planeta(IDPlaneta).PoderBase)))) / ((Flotas(IDFlota).Naves) * (Flotas(IDFlota).Poder))
    
    '**************************************************************
    'Rellenar estadisticas
    'Dueño Planeta
    NPC(Planeta(IDPlaneta).Propietario).Naves = NPC(Planeta(IDPlaneta).Propietario).Naves - (Planeta(IDPlaneta).Naves)
    NPC(Planeta(IDPlaneta).Propietario).NavesPerdidas = (Planeta(IDPlaneta).Naves)
    NPC(Planeta(IDPlaneta).Propietario).Planetas = NPC(Planeta(IDPlaneta).Propietario).Planetas - 1
    NPC(Planeta(IDPlaneta).Propietario).PlanetasPerdidos = NPC(Planeta(IDPlaneta).Propietario).PlanetasPerdidos + 1
    'Dueño Flota
    NPC(Flotas(IDFlota).Propietario).Naves = NPC(Flotas(IDFlota).Propietario).Naves - (Flotas(IDFlota).Naves) + Combatir.Flota
    NPC(Flotas(IDFlota).Propietario).NavesPerdidas = NPC(Flotas(IDFlota).Propietario).NavesPerdidas + (Flotas(IDFlota).Naves) - Combatir.Flota
    NPC(Flotas(IDFlota).Propietario).Planetas = NPC(Flotas(IDFlota).Propietario).Planetas + 1
    NPC(Flotas(IDFlota).Propietario).PlanetasConquistados = NPC(Flotas(IDFlota).Propietario).PlanetasConquistados + 1
    '***************************************************************
End If

End Function


Public Function ColorJugador(IDJugador As Byte) As Long
Select Case IDJugador
    Case 0: ColorJugador = &HFFC0C0C0
    Case 1: ColorJugador = &HFFFF0000
    Case 2: ColorJugador = &HFF0000FF
    Case 3: ColorJugador = &HFF00FF00
    Case 4: ColorJugador = &HFF00FFFF
    Case 5: ColorJugador = &HFF0080FF
    Case 6: ColorJugador = &HFFFF00FF
    Case 7: ColorJugador = &HFFFFFF00
    Case 8: ColorJugador = &HFFFFC0C0
    Case 9: ColorJugador = &HFFFFC0FF
End Select
End Function

Public Function ListaFlota_ADD(ByVal IDJugador As Byte, ByVal IDOrigen As Integer, ByVal IDDestino As Integer, ByVal Naves As Long)
Dim PosLibre As Integer
'Buscar primer campo libre en la lista de flotas
PosLibre = ListaFlota_PrimerLibre()
Flotas(PosLibre).Propietario = IDJugador 'Propietario Flota
Flotas(PosLibre).Destino = IDDestino 'Destino de la flota
Flotas(PosLibre).Naves = Naves  'Numero de naves en la flota
Flotas(PosLibre).Poder = Planeta(IDOrigen).Poder  'Poder de la flota
Flotas(PosLibre).TurnoArribo = Distancia(IDOrigen, IDDestino) + NumTurno 'Turno de arribo
Flotas(PosLibre).Origen = IDOrigen 'Planeta de origen de la flota
Flotas(PosLibre).TurnoInicio = NumTurno  'Turno en el cual fue lanzada la flota

End Function

Public Function Distancia(IDOrigen As Integer, IDDestino As Integer) As Integer
Dim DeltaX, DeltaY As Integer
Dim Max As Integer
 
DeltaX = Abs((Planeta(IDDestino).PosX - Planeta(IDOrigen).PosX))
DeltaY = Abs((Planeta(IDDestino).Posy - Planeta(IDOrigen).Posy))
Max = DeltaY 'por defecto asignar distancia maxima a delta Y
If DeltaX >= DeltaY Then Max = DeltaX 'Si delta X es mayor que delta Y, reescribir valor máximo

Distancia = 0
Select Case Max
    Case 1: Distancia = 1
    Case 2: Distancia = 2
    Case 3: Distancia = 3
    Case 4: Distancia = 4
    Case 5: Distancia = 4
    Case 6: Distancia = 5
    Case 7: Distancia = 5
    Case 8: Distancia = 6
    Case 9: Distancia = 6
    Case 10: Distancia = 7
    Case 11: Distancia = 7
    Case 12: Distancia = 8
    Case 13: Distancia = 8
    Case 14: Distancia = 9
    Case 15: Distancia = 9
End Select

End Function

Public Function ObtenerNombre(IDJugador As Byte) As String
    Select Case IDJugador
        Case CstNeutral: ObtenerNombre = "Neutral"
        Case cstplayer1: ObtenerNombre = NombreJugador
        Case CstComp1: ObtenerNombre = "Comp1"
        Case CstComp2: ObtenerNombre = "Comp2"
        Case CstComp3: ObtenerNombre = "Comp3"
        Case CstComp4: ObtenerNombre = "Comp4"
        Case CstComp5: ObtenerNombre = "Comp5"
        Case CstComp6: ObtenerNombre = "Comp6"
        Case CstComp7: ObtenerNombre = "Comp7"
        Case CstComp8: ObtenerNombre = "Comp8"
    End Select
End Function

Public Function ObtenerNombrePlaneta(ByVal IDPlaneta As Integer) As String
IDPlaneta = (IDPlaneta + PlanetaCero) Mod 47
    Select Case IDPlaneta
        Case 0 To 8: ObtenerNombrePlaneta = CStr(IDPlaneta + 1)
        Case 9 To 22: ObtenerNombrePlaneta = Chr(IDPlaneta + 56)
        Case 23: ObtenerNombrePlaneta = "Ñ"
        Case 24 To 35: ObtenerNombrePlaneta = Chr(IDPlaneta + 55)
        Case 36: ObtenerNombrePlaneta = "A0"
        Case 37: ObtenerNombrePlaneta = "A1"
        Case 38: ObtenerNombrePlaneta = "A2"
        Case 39: ObtenerNombrePlaneta = "A3"
        Case 40: ObtenerNombrePlaneta = "A4"
        Case 41: ObtenerNombrePlaneta = "A5"
        Case 42: ObtenerNombrePlaneta = "A6"
        Case 43: ObtenerNombrePlaneta = "A7"
        Case 44: ObtenerNombrePlaneta = "A8"
        Case 45: ObtenerNombrePlaneta = "A9"
        Case 46: ObtenerNombrePlaneta = "AA"
        Case Else: Call Log_Error("Idplaneta sobrepaso la lista de referencia con el valor " & IDPlaneta)
    End Select
End Function

Public Sub Calcular_Descriptores()
Dim SumaNaves As Double
Dim SumaCuadrados As Double

For i = 0 To (NumJugadores + NumPlanetasNeutrales - 1)
    SumaNaves = SumaNaves + (Planeta(i).Naves * Planeta(i).PoderBase)
    SumaCuadrados = SumaCuadrados + (CDbl((Planeta(i).Naves * Planeta(i).PoderBase)) * CDbl((Planeta(i).Naves * Planeta(i).PoderBase)))
Next

MediaNaves = SumaNaves / (NumJugadores + NumPlanetasNeutrales)
DENaves = (SumaCuadrados - (NumJugadores + NumPlanetasNeutrales) * SumaNaves * SumaNaves) / ((NumJugadores + NumPlanetasNeutrales) - 1)

'For i = 0 To (NumJugadores + NumPlanetasNeutrales - 1)
'MatrizDeseo(i, 0) = ((Planeta(i).Naves * Planeta(i).PoderBase) - MediaNaves) / DENaves
'Next
End Sub


Public Sub MovimientoComputador(ByVal IDJugador As Integer)
Dim i As Integer
Dim e As Integer
Dim MasDebil As Integer
Dim PoderDebil As Double

Dim Flotadisponible As Long



'Buscar planetas del jugador
For i = 0 To (NumJugadores + NumPlanetasNeutrales - 1)
    If Planeta(i).Propietario = IDJugador Then
        'modificar matriz de deseo con corrección por distancia
        Flotadisponible = Planeta(i).Naves - (MediaNaves / (500 + (NPC(IDJugador).Agresividad) * FactorAgresividad))
        MasDebil = 0
        PoderDebil = 999999
        For e = 0 To (NumJugadores + NumPlanetasNeutrales - 1)
            If e <> i Then
                If Planeta(e).Propietario = 0 And PoderDebil > ((Planeta(e).Naves + Distancia(i, e)) * Planeta(e).PoderBase) Then
                    MasDebil = e
                    PoderDebil = ((Planeta(e).Naves + (Distancia(i, e)) * Planeta(e).PoderBase))
                ElseIf Planeta(e).Propietario = IDJugador And Planeta(e).PoderBase > 700 Then
                    MasDebil = e
                    PoderDebil = 750
                ElseIf PoderDebil > ((Planeta(e).Naves + Planeta(e).Produccion * Distancia(i, e)) * Planeta(e).PoderBase) Then
                    If Rnd() < 0.5 Then
                        MasDebil = e
                        PoderDebil = ((Planeta(e).Naves + Planeta(e).Produccion * Distancia(i, e)) * Planeta(e).PoderBase)
                    End If
                End If
                
            End If
        Next

        If Flotadisponible > 0 And Flotadisponible < (Planeta(i).Naves * 0.9) Then
            If Planeta(MasDebil).Propietario = IDJugador Then 'si planeta es aliado y necesita refuerzos
                Call ListaFlota_ADD(CByte(IDJugador), i, MasDebil, Flotadisponible)
                Planeta(i).Naves = Planeta(i).Naves - Flotadisponible
            'si planeta es hostil tener la seguridad que se puede conquistar si no ocurre nada externo
            ElseIf (Flotadisponible * Planeta(i).PoderBase) > ((Planeta(MasDebil).Naves + Planeta(MasDebil).Produccion * Distancia(i, MasDebil)) * Planeta(MasDebil).PoderBase) Then
                Call ListaFlota_ADD(CByte(IDJugador), i, MasDebil, Flotadisponible)
                Planeta(i).Naves = Planeta(i).Naves - Flotadisponible
            End If
            
        
        End If

        
        
    End If
Next

End Sub


Public Function GameOver() As Integer
Dim i As Integer
Dim NumPlanetasJugador As Integer
Dim NumFlotasJugador As Integer
Dim NumFlotasMaquina As Integer

NumPlanetasJugador = 0
NumFlotasJugador = 0
NumFlotasMaquina = 0
GameOver = 0 'Por defecto asignar valor de que juego aun no termina

'Contar cantidad de planetas y flotas del jugador y de la maquina
For i = 0 To 44
    If Planeta(i).Propietario = cstplayer1 Then NumPlanetasJugador = NumPlanetasJugador + 1
Next

For i = 0 To 1024
    If Flotas(i).Propietario = cstplayer1 Then NumFlotasJugador = NumFlotasJugador + 1
    If Flotas(i).Propietario > 1 Then NumFlotasMaquina = NumFlotasMaquina + 1
Next

'si jugador posee el total de planeta del universo y no quedan flotas enemigas entonces gana
If ((NumJugadores + NumPlanetasNeutrales) = NumPlanetasJugador) And (NumFlotasMaquina = 0) Then GameOver = 1

'Si jugador no posee planetas ni flotas pierde
If NumPlanetasJugador = 0 And NumFlotasJugador = 0 Then GameOver = 2

End Function

Private Function ListaFlota_PrimerLibre() As Integer
Dim i As Integer
'Buscar primer campo de la lista de flotas que no tenga registrado un jugador (que este libre)
On Error GoTo Solucion
i = 0
Do While Flotas(i).Propietario <> 0
    i = i + 1
Loop
ListaFlota_PrimerLibre = i

GoTo Fin
Solucion:
MsgBox "Número Máximo de flotas alcanzado", vbCritical, "ERROR"
ListaFlota_PrimerLibre = 1024
Fin:
End Function

Public Function Saturacion(Valor As Double, Maximo As Double, Minimo As Double) As Double

Saturacion = Valor
If Valor > Maximo Then
    Saturacion = Maximo
ElseIf Valor < Minimo Then
    Saturacion = Minimo
End If

End Function


Public Sub Log_Error(Mensaje As String)
Dim Linea As String

Linea = Format(Now, "YYYY/MM/DD HH:MM") & " - " & Mensaje
Open App.Path & "\Log_Error.txt" For Append As #1
    Print #1, Linea
Close #1
End Sub
