[IDEA] - Evento automático delegado.

Ir abajo

[IDEA] - Evento automático delegado.

Mensaje por Toyz el 3/8/2016, 4:53 am

5vs5 con Delegados.


El juego consiste en:

Hay dos equipos, el equipo rojo y el equipo azul, estos están conformados por una cantidad de cinco usuarios. Cada uno de ellos tiene un represetante, delegado, que peleará en sentido contrario al resto de su equipo. ¿Sentido contrario?:



Ambos delegados son inmunes y pueden atacar con (hechizos o flechas) al equipo contrario.
Es a 3 rounds. El equipo ganador es aquel que llega primero a sacar más de 2 puntos de diferencia al equipo enemigo.

Un poco de código (bien codeado, tiene solo algunas fallas):

Las fallas son:

Mal cálculo en 2 bucles.
Mal uso del bucle for, usen for - step en la parte de repartir los equipos.

El código no está completo, pero tiene partes importantes:

* Iniciar el evento.
* Iniciar coordenadas del evento.
* Poder anotarse.
* Llevar a los usuarios a las arenas.
* Repartirlos en los equipos.
* Llevar a cada uno a su área correspondiente.
* Elegir el delegado (puro azar).
* Llevar a los delegados a su área correspondiente.
* Restar oro al entrar.
* Chequeos para iniciar el evento mediante una función.
* Sacar a un usuario por si se desconecta (no está al 100% pero está aplicada la lógica)
* Otras cosas no terminadas pero al menos están iniciadas un 10%.
* Cuenta regresiva para iniciar la batalla.

Código: (Está todo comentado para que entiendan para que sirve cada cosa)

Código:
Option Explicit

'@@ Autor: G Toyz
'@@ Evento Delegado _

Private Type tTeams

    UsersInTeam()       As Integer
    WinPoints           As Byte
    DeathTeam           As Byte
    WinRounds           As Byte
    Delegate_X          As Byte
    Delegate_Y          As Byte
    X                   As Byte
    Y                   As Byte
    
End Type

Private Type tUsersEvent

    ID                  As Integer
    LastPosition        As WorldPos

End Type

Type tDelegateEvent

    Quotas              As Byte
    Rounds              As Byte
    Points              As Byte
    UsersInEvent        As Byte
    Active              As Boolean
    Delegates(1 To 2)   As Integer
    Teams(1 To 2)       As tTeams
    Users()             As tUsersEvent
    Countdown           As Byte
    Prize               As Long
    
End Type

Private Const MAP_EVENT As Integer = 200

Private Const GLD_EVENT As Long = 450000
Private Const ELV_EVENT As Byte = 40

Private Const POS_DEATH_X As Byte = 60
Private Const POS_DEATH_Y As Byte = 60

Private EventDelegate   As tDelegateEvent
'_

Public Sub Load_Coordinates()

    '@@ Cargamos las coordenas de los equipos y la del delegado.
    
    With EventDelegate
    
        '@@ EQUIPOS:
        .Teams(1).X = 50
        .Teams(1).Y = 60
        .Teams(2).X = 50
        .Teams(2).Y = 60
        
        '@@ DELEGADOS:
        .Teams(1).Delegate_X = 80
        .Teams(1).Delegate_Y = 80
        .Teams(2).Delegate_X = 60
        .Teams(2).Delegate_Y = 60
        
    End With
End Sub

Public Sub Start_Delegate(ByVal UserIndex As Integer, ByVal Participants As Byte, ByVal Rounds As Byte, ByVal Points As Byte)

    If Not EsGM(UserIndex) Then
        Call WriteConsoleMsg(UserIndex, "Tienes que ser GM para realizar el evento.", FontTypeNames.FONTTYPE_INFOBOLD)
        Exit Sub
    End If
    
    If EventDelegate.Active = True Then
        Call WriteConsoleMsg(UserIndex, "Ya hay un torneo en curso. Espara a que ese termine.", FontTypeNames.FONTTYPE_INFOBOLD)
        Exit Sub
    End If
    
    If Participants < 3 Then Participants = 3
    If Rounds < 1 Then Rounds = 1
    If Points < 1 Then Points = 1

    With EventDelegate
        
        .Quotas = Participants
        .Rounds = Rounds
        .Points = Points
        .Active = True
        .UsersInEvent = 0 '@@ Por las dudas
        
        ReDim .Users(1 To .Quotas) As tUsersEvent
        ReDim .Teams(1).UsersInTeam(1 To .Quotas / 2) As Integer
        ReDim .Teams(2).UsersInTeam(1 To .Quotas / 2) As Integer
        
        Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Evento delegado para " & .Quotas & " usuarios, tipee /PARTICIPAR para ingresar al evento.", FontTypeNames.FONTTYPE_INFOBOLD))

    End With

End Sub

Public Sub Access_Quota(ByVal UserIndex As Integer)
    
    ' @@ Lo anotamos en el evento.
    
    If EventDelegate.Active = False Then
        Call WriteConsoleMsg(UserIndex, "No hay evento en curso.", FontTypeNames.FONTTYPE_INFOBOLD)
        Exit Sub
    End If
    
    If Check_Access_Quota(UserIndex) = False Then Exit Sub
    
    UserList(UserIndex).flags.Delegate = 1
    
    With EventDelegate
        
        .UsersInEvent = .UsersInEvent + 1
        .Users(.UsersInEvent).ID = UserIndex
        UserList(UserIndex).Stats.GLD = UserList(UserIndex).Stats.GLD - GLD_EVENT
    
        .Prize = .Prize + GLD_EVENT
    
        Call WriteUpdateGold(UserIndex)
    
        Call WriteConsoleMsg(UserIndex, "Has sido anotado en el evento, eres el participante Nº" & .UsersInEvent & ". Se te han descontado " & GLD_EVENT & " monedas de oro. Si mueres antes de que se completen los cupos, serás denotado del evento y no se te devolverá el oro.", FontTypeNames.FONTTYPE_INFOBOLD)
    
        If .UsersInEvent = .Quotas Then Call Initialize_Event
        
    End With
    
End Sub

Private Sub Initialize_Event()

    '@@ Definir los equipos.
    '@@ Definir los delegados
    '@@ Llevarlos a combate
 
    Dim LoopC As Long
    Dim LoopX As Long
 
    With EventDelegate
    
        Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("El cupo ha sido completado.", FontTypeNames.FONTTYPE_INFOBOLD))
    
    '@@@@@@@ EQUIPOS:
    
        '@@ Cargamos las coordenadas. - Carguenlas en el Sub Main.
        'Call Load_Coordinates
    
        For LoopC = 1 To 2
        
            For LoopX = 0 To .Quotas - 1

                .Teams(LoopC).UsersInTeam(LoopX + 1) = .Users(LoopC + LoopX + LoopX).ID
                
                UserList(.Users(LoopC + LoopX + LoopX).ID).flags.Delegate = 0
                UserList(.Users(LoopC + LoopX + LoopX).ID).flags.DelegateInTeamFight = 1
                
                .Users(.Users(LoopC + LoopX + LoopX).ID).LastPosition = UserList(.Users(LoopC + LoopX + LoopX).ID).Pos
                
                WarpUserChar .Teams(LoopC).UsersInTeam(LoopX + 1), MAP_EVENT, .Teams(LoopC).X, .Teams(LoopC).Y, False
                
            Next LoopX
        
        Next LoopC


    '@@@@@@@ DELEGADOS Y LLEVARLOS A SU POSICIÓN:

        .Delegates(1) = .Teams(1).UsersInTeam(RandomNumber(1, UBound(.Teams(1).UsersInTeam)))
        .Delegates(2) = .Teams(2).UsersInTeam(RandomNumber(1, UBound(.Teams(2).UsersInTeam)))

        WarpUserChar .Delegates(1), MAP_EVENT, .Teams(1).Delegate_X, .Teams(1).Delegate_X, False
        WarpUserChar .Delegates(2), MAP_EVENT, .Teams(2).Delegate_X, .Teams(2).Delegate_X, False
    
        Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Delegado del equipo rojo: " & UserList(.Delegates(1)).name, FontTypeNames.FONTTYPE_INFOBOLD))
        Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Delegado del equipo azul: " & UserList(.Delegates(2)).name, FontTypeNames.FONTTYPE_INFOBOLD))
  
        '@@ Tiempo para que empiece la batalla
        .Countdown = 30
        Countdown_Event
        
    End With

End Sub


Public Sub Countdown_Event()

'@@ Cuenta regresiva.

    With EventDelegate

        If .Countdown > 0 Then
    
            .Countdown = .Countdown - 1
            
        End If
    
        Select Case EventDelegate.Countdown
    
    
            Case 20
                Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Delegado» CONTEO» " & .Countdown, FontTypeNames.FONTTYPE_INFOBOLD))
    
            Case 10
                Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Delegado» CONTEO» " & .Countdown, FontTypeNames.FONTTYPE_INFOBOLD))
            
            Case 5
                Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Delegado» CONTEO» " & .Countdown, FontTypeNames.FONTTYPE_INFOBOLD))
            
            Case 4
                Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Delegado» CONTEO» " & .Countdown, FontTypeNames.FONTTYPE_INFOBOLD))
            
            Case 3
                Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Delegado» CONTEO» " & .Countdown, FontTypeNames.FONTTYPE_INFOBOLD))
            
            Case 2
                Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Delegado» CONTEO» " & .Countdown, FontTypeNames.FONTTYPE_INFOBOLD))
            
            Case 1
                Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Delegado» CONTEO» " & .Countdown, FontTypeNames.FONTTYPE_INFOBOLD))
            
            Case 0
                Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Delegado» PELEEN!", FontTypeNames.FONTTYPE_FIGHT))
    
        End Select
    
    End With
    
End Sub

Private Sub Death_User(ByVal UserIndex As Integer)

    '@@ Para cuando un usuario muere, chequea si todo el equipo murió _
        si es así, le suma un round.

    Dim TeamLoss As Byte
    Dim TeamWin As Byte
    Dim LoopC As Long
    Dim LoopX As Long
    
    With EventDelegate

        For LoopC = 1 To 2
        
            For LoopX = 1 To (.UsersInEvent / 2)
            
                If UserIndex = .Teams(LoopX).UsersInTeam(LoopX) Then
                
                    TeamLoss = LoopC
                    
                End If
                
            Next LoopX
            
        Next LoopC

        .Teams(Team).DeathTeam = .Teams(Team).DeathTeam + 1
        
        Call WarpUserChar(UserIndex, MAP_EVENT, POS_DEATH_X, POS_DEATH_Y, False)
        
        If Check_Death = True Then
            If TeamLoss = 1 Then TeamWin = 2
            If TeamLoss = 2 Then TeamWin = 1
            
            Call Round(TeamWin)
        End If
        
    End With

End Sub

Private Sub Round(ByVal Team As Byte)

    '@@ Chequeamos si ganó lo suficiente como para ganar un punto _
        si es así llevo al equipo perdedor a ullathorpe y hago una _
        nueva búsqueda de combatientes.
        
    With EventDelegate
    
        .Teams(Team).WinRounds = .Teams(Team).WinRounds + 1
        
        If .Teams(Team).WinRounds = .Rounds Then _
        Call Win_Point(Team)
    
    End With

End Sub

Private Sub Win_Point(ByVal Team As Byte)

    '@@ Ganamos un punto, lo vamos acumulando.
    
    With EventDelegate
    
        .Teams(Team).WinPoints = .Teams(Team).WinPoints + 1
    
        If .Teams(Team).WinPoints = 3 Then _
            Call Win_Event(Team)
    
    End With
    
End Sub

Private Sub Win_Event(ByVal Team As Byte)

    '@@ Ganaron el evento!
    
    Dim LoopC As Long
    Dim dUser As Byte
    
    With EventDelegate
        
        dUser = .UsersInEvent * 0.5
    
        '@@ Para un team:
            
        .Prize = .Prize / dUser
    
        '@@ Le damos los premios:
        
        For LoopC = 1 To dUser
        
            .Teams(Team).UsersInTeam (1)
    
        Next LoopC
    
        Call Clean_Event
    
    End With

End Sub

Private Function Check_Death(ByVal Team As Byte) As Boolean

    Death_User = False
    
    If EventDelegate.Teams(Team).DeathTeam < 4 Then Exit Sub

    Death_User = True
    
End Function

Private Sub Clean_Event()

    '@@ Limpiamos todas las variables.
    '@@ Le sacamos el flag a los users.
    
    Dim LoopC As Long
    Dim LoopX As Long
    Dim LoopZ As Long

    With EventDelegate
    
        .Active = False
        .Countdown = 0
        .Points = 0
        .Prize = 0
        .Quotas = 0
        .Rounds = 0
        
        '@@ Limpio flags y algunas cosas más:
        
        For LoopX = 1 To .UsersInEvent

            UserList(.Users(LoopX).ID).flags.Delegate = 0
            UserList(.Users(LoopX).ID).flags.DelegateInTeamFight = 0
            .Users(LoopX).ID = 0
            .Users(LoopX).LastPosition = 0
        
        Next LoopX
        
        '@@ Equipos y delegados:
        
        For LoopC = 1 To 2
        
            .Delegates(LoopC) = 0
            .Teams(LoopC).DeathTeam = 0
            .Teams(LoopC).WinPoints = 0
            .Teams(LoopC).WinRounds = 0
            
            For LoopZ = 1 To (.UsersInEvent / 2)
            
                .Teams(LoopC).UsersInTeam(LoopZ) = 0
            
            Next LoopZ
            
        Next LoopC

        .UsersInEvent = 0
    
    End With
    
End Sub

Private Function Check_Access_Quota(ByVal UserIndex As Integer) As Boolean

    '@@ Esta función sirve para poner todas las restricciones que quieren hacerle al _
        usuario cuando va a ANOTARSE, por ejemplo si está en otro evento o si está retando, o algo por el estilo.

    Check_Access_Quota = False
    
    If Not EsGM(UserIndex) Then Exit Function
    
    With UserList(UserIndex)
    
        If .Stats.GLD < GLD_EVENT Then
            Call WriteConsoleMsg(UserIndex, "No tienes suficiente oro para ingresar al evento", FontTypeNames.FONTTYPE_INFOBOLD)
            Exit Function
        End If
        
        If .Stats.ELV < ELV_EVENT Then
            Call WriteConsoleMsg(UserIndex, "No tienes suficiente nivel para ingresar al evento", FontTypeNames.FONTTYPE_INFOBOLD)
            Exit Function
        End If
        
        If .flags.Delegate = 1 Then
            Call WriteConsoleMsg(UserIndex, "Ya estás en el evento.", FontTypeNames.FONTTYPE_INFOBOLD)
            Exit Function
        End If
        
        If .flags.Muerto = 1 Then
            Call WriteConsoleMsg(UserIndex, "Tienes que estar vivo para anotarte en el evento.", FontTypeNames.FONTTYPE_INFOBOLD)
            Exit Function
        End If
        
        If .Pos.Map <> 1 Then
            Call WriteConsoleMsg(UserIndex, "Tienes que estar en la ciudad principal para anotarte en el evento.", FontTypeNames.FONTTYPE_INFOBOLD)
            Exit Function
        End If
        
    End With
    
    Check_Access_Quota = True

End Function

Public Sub Remove_User(ByVal UserIndex As Integer)

'@@ Por si se desconecta

    Dim LoopX  As Long
    Dim LoopC  As Long

    UserList(UserIndex).flags.Delegate = 0

    '@@ A su anterior pos

    With EventDelegate

        For LoopX = 1 To .Quotas

            If .Users(LoopX).ID = UserIndex Then

                WarpUserChar _
                            .Users(LoopX).ID , _
                            .Users(LoopX).LastPosition.Map, _
                            .Users(LoopX).LastPosition.X, _
                            .Users(LoopX).LastPosition.Y, False

                For LoopC = LoopX To (.UsersInEvent - 1)

                    .Users(LoopC).ID = .Users(LoopC + 1).ID

                Next LoopC

                .UsersInEvent = .UsersInEvent - 1

                Exit For

            End If

        Next LoopX

    End With

End Sub
avatar
Toyz
Administrador
Administrador

¿BANEADO? : No.
Premios :
[1er puesto] Usuario del año 2016
Cantidad de envíos : 5046
Edad : 17
Localización : Global.
Fecha de inscripción : 28/09/2014

Ver perfil de usuario

Volver arriba Ir abajo

Re: [IDEA] - Evento automático delegado.

Mensaje por ^^Shak^^ el 3/8/2016, 7:22 pm

  If Participants < 3 Then Participants = 3


1 delegado pk, 1 delegado ciuda , 1 en el campo crimi 1 en el campo ciuda


la logica donde esta? xD

^^Shak^^
Nivel 5
Nivel 5

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 223
Localización : Luján
Fecha de inscripción : 23/04/2011

Ver perfil de usuario

Volver arriba Ir abajo

Re: [IDEA] - Evento automático delegado.

Mensaje por Toyz el 3/8/2016, 7:30 pm

Cosas mínimas:

Código:
      ReDim .Teams(1).UsersInTeam(1 To .Quotas / 2) As Integer
        ReDim .Teams(2).UsersInTeam(1 To .Quotas / 2) As Integer

Por esto:

Código:
      ReDim .Teams(1).UsersInTeam(1 To .Quotas) As Integer
        ReDim .Teams(2).UsersInTeam(1 To .Quotas) As Integer

Esa era la idea principal (participantes por equipo, quizá haya que hacer más de un cambio).

la logica donde esta? xD

En los bucles.


_______________

Como saben yo aporto bastante en Servers-Argentum y les quiero decir que todos tienen derecho de usar y de aportar en otra comunidad mis aportes pero sólo con un requisito y es tan simple que dejar los créditos. Gracias.
Si conocen otra comunidad y en esa misma mis aportes no están aportados, si tenés tiempo y ganas, aportalo! A mucha gente le puede servir. No te olvides del requisito Razz

MIS MEJORES APORTES:

Compra/venta de personajes:
https://goo.gl/A44Av0

Juegos del Hambre:
https://goo.gl/u6aNUG

Deathmatch automático:
https://goo.gl/GQF4fK

Sistema de retos vía MMR con búsqueda, emparejamiento, etc:
https://goo.gl/40uP0f

Sistemas de eventos automáticos de 1vs1 hasta 10vs10:
https://goo.gl/XYKygc

1VS1 - AIM - MELEE - Gana Sigue (Se liberan cupos)
https://goo.gl/qq83wx

Retos 3vs3 - [Items, 2 rounds, múltiples arenas, oro]
https://goo.gl/x8SMnV

Eliminar sistema de Skill (COMPLETO)
https://goo.gl/mKxHzC
avatar
Toyz
Administrador
Administrador

¿BANEADO? : No.
Premios :
[1er puesto] Usuario del año 2016
Cantidad de envíos : 5046
Edad : 17
Localización : Global.
Fecha de inscripción : 28/09/2014

Ver perfil de usuario

Volver arriba Ir abajo

Re: [IDEA] - Evento automático delegado.

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.