Originalmente publicado por DarkBlood.-

hice este thread para saber como funciona el daño que hace a cualquier otra cosa que no sea un dragon.


(para el que todavia no sabe: al golpear dragon efectivamente con una/s matadragones mata al dragon de una y desaparece 1 sola matadragones del inv.)


---------
al pegarle a un usuario o NPC(menos dragon) con la matadragones HACE:
siendo guerrero, drogado 38fz y golpe 99/99




CalcularDaño = CInt(UserList(UserIndex).Stats.MaxHIT / 5)


(The CInt function converts an expression to type Integer.) , luego


CalcularDaño = (((3 * 1) + ((1 / 5) * Maximo 0, AtributoFuerza - 15))) + DañoUsuario) * 1.1)


(((3 + 0,2 * 23)) + ¿99 o 20?) * 1.1 = 190 o 103 [Daño final sera?]




Código:
Public Function CalcularDaño(ByVal UserIndex As Integer, Optional ByVal NpcIndex As Integer = 0) As Long
Dim DañoArma As Long, DañoUsuario As Long, Arma As ObjData, ModifClase As Single
Dim proyectil As ObjData
Dim DañoMaxArma As Long


''sacar esto si no queremos q la matadracos mate el dragon si o si
Dim matodragon As Boolean
matodragon = False




If UserList(UserIndex).Invent.WeaponEqpObjIndex > 0 Then
Arma = ObjData(UserList(UserIndex).Invent.WeaponEqpObjIndex)




' Ataca a un npc?
If NpcIndex > 0 Then


        'Usa la mata dragones?
If Arma.SubTipo = MATADRAGONES Then ' Usa la matadragones?
ModifClase = ModicadorDañoClaseArmas(UserList(UserIndex).Clase)
If Npclist(NpcIndex).NPCtype = DRAGON Then 'Ataca dragon?
DañoArma = RandomNumber(Arma.MinHIT, Arma.MaxHIT)
DañoMaxArma = Arma.MaxHIT
matodragon = True ''sacar esto si no queremos q la matadracos mate el dragon si o si
Else ' Sino es dragon daño es 1
DañoArma = 1
DañoMaxArma = 1
End If
Else ' daño comun
If Arma.proyectil = 1 Then
ModifClase = ModicadorDañoClaseProyectiles(UserList(UserIndex).Clase)
DañoArma = RandomNumber(Arma.MinHIT, Arma.MaxHIT)
DañoMaxArma = Arma.MaxHIT
If Arma.Municion = 1 Then
proyectil = ObjData(UserList(UserIndex).Invent.MunicionEqpObjIndex)
DañoArma = DañoArma + RandomNumber(proyectil.MinHIT, proyectil.MaxHIT)
DañoMaxArma = Arma.MaxHIT
End If
Else
ModifClase = ModicadorDañoClaseArmas(UserList(UserIndex).Clase)
DañoArma = RandomNumber(Arma.MinHIT, Arma.MaxHIT)
DañoMaxArma = Arma.MaxHIT
End If
End If


    Else ' Ataca usuario
If Arma.SubTipo = MATADRAGONES Then
ModifClase = ModicadorDañoClaseArmas(UserList(UserIndex).Clase)
DañoArma = 1 ' Si usa la espada matadragones daño es 1
DañoMaxArma = 1
Else
If Arma.proyectil = 1 Then
ModifClase = ModicadorDañoClaseProyectiles(UserList(UserIndex).Clase)
DañoArma = RandomNumber(Arma.MinHIT, Arma.MaxHIT)
DañoMaxArma = Arma.MaxHIT
If Arma.Municion = 1 Then
proyectil = ObjData(UserList(UserIndex).Invent.MunicionEqpObjIndex)
DañoArma = DañoArma + RandomNumber(proyectil.MinHIT, proyectil.MaxHIT)
DañoMaxArma = Arma.MaxHIT
End If
Else
ModifClase = ModicadorDañoClaseArmas(UserList(UserIndex).Clase)
DañoArma = RandomNumber(Arma.MinHIT, Arma.MaxHIT)
DañoMaxArma = Arma.MaxHIT
End If
End If
End If
Else
CalcularDaño = CInt(UserList(UserIndex).Stats.MaxHIT / 5)
Exit Function
End If


DañoUsuario = RandomNumber(UserList(UserIndex).Stats.MinHIT, UserList(UserIndex).Stats.MaxHIT)


''sacar esto si no queremos q la matadracos mate el dragon si o si
If matodragon Then
CalcularDaño = Npclist(NpcIndex).Stats.MinHP + Npclist(NpcIndex).Stats.Def
Else
  CalcularDaño = (((3 * DañoArma) + ((DañoMaxArma / 5) * Maximo(0, (UserList(UserIndex).Stats.UserAtributos(Fuerza) - 15))) + DañoUsuario) * ModifClase)
End If


End Function


---------------------------




Function Maximo(ByVal A As Single, ByVal b As Single) As Single
If A > b Then
    Maximo = A
    Else: Maximo = b
End If
End Function
----------------- ----------------- ----------------- ----------------- ----------------- ----------------- ----------------- ----------------- --------
Originalmente publicado por Integer.-

Bueno, paso a explicar este código:
La parte que realmente nos interesa es la que señalo en negrita.


Código:
Public Function CalcularDaño(ByVal UserIndex As Integer, Optional ByVal NpcIndex As Integer = 0) As Long
Dim DañoArma As Long, DañoUsuario As Long, Arma As ObjData, ModifClase As Single
Dim proyectil As ObjData
Dim DañoMaxArma As Long


''sacar esto si no queremos q la matadracos mate el dragon si o si
Dim matodragon As Boolean
matodragon = False




If UserList(UserIndex).Invent.WeaponEqpObjIndex > 0 Then
    Arma = ObjData(UserList(UserIndex).Invent.WeaponEqpObjIndex)
    
    
    ' Ataca a un npc?
    If NpcIndex > 0 Then
        
        'Usa la mata dragones?
        If Arma.SubTipo = MATADRAGONES Then ' Usa la matadragones?
            ModifClase = ModicadorDañoClaseArmas(UserList(UserIndex).Clase)
            If Npclist(NpcIndex).NPCtype = DRAGON Then 'Ataca dragon?
                DañoArma = RandomNumber(Arma.MinHIT, Arma.MaxHIT)
                DañoMaxArma = Arma.MaxHIT
                matodragon = True ''sacar esto si no queremos q la matadracos mate el dragon si o si
            Else ' Sino es dragon daño es 1
                DañoArma = 1
                DañoMaxArma = 1
            End If
        Else ' daño comun
           If Arma.proyectil = 1 Then
                ModifClase = ModicadorDañoClaseProyectiles(UserList(UserIndex).Clase)
                    DañoArma = RandomNumber(Arma.MinHIT, Arma.MaxHIT)
                DañoMaxArma = Arma.MaxHIT
                If Arma.Municion = 1 Then
                    proyectil = ObjData(UserList(UserIndex).Invent.MunicionEqpObjIndex)
                    DañoArma = DañoArma + RandomNumber(proyectil.MinHIT, proyectil.MaxHIT)
                    DañoMaxArma = Arma.MaxHIT
                End If
           Else
                ModifClase = ModicadorDañoClaseArmas(UserList(UserIndex).Clase)
                    DañoArma = RandomNumber(Arma.MinHIT, Arma.MaxHIT)
                DañoMaxArma = Arma.MaxHIT
           End If
        End If
    
    Else ' Ataca usuario
        If Arma.SubTipo = MATADRAGONES Then
            ModifClase = ModicadorDañoClaseArmas(UserList(UserIndex).Clase)
                DañoArma = 1 ' Si usa la espada matadragones daño es 1
                DañoMaxArma = 1
        Else
           If Arma.proyectil = 1 Then
                ModifClase = ModicadorDañoClaseProyectiles(UserList(UserIndex).Clase)
                    DañoArma = RandomNumber(Arma.MinHIT, Arma.MaxHIT)
                    DañoMaxArma = Arma.MaxHIT
                If Arma.Municion = 1 Then
                    proyectil = ObjData(UserList(UserIndex).Invent.MunicionEqpObjIndex)
                    DañoArma = DañoArma + RandomNumber(proyectil.MinHIT, proyectil.MaxHIT)
                    DañoMaxArma = Arma.MaxHIT
                End If
           Else
                ModifClase = ModicadorDañoClaseArmas(UserList(UserIndex).Clase)
                    DañoArma = RandomNumber(Arma.MinHIT, Arma.MaxHIT)
                DañoMaxArma = Arma.MaxHIT
           End If
        End If
    End If
Else
    CalcularDaño = CInt(UserList(UserIndex).Stats.MaxHIT / 5)
    Exit Function
End If


DañoUsuario = RandomNumber(UserList(UserIndex).Stats.MinHIT, UserList(UserIndex).Stats.MaxHIT)


''sacar esto si no queremos q la matadracos mate el dragon si o si
If matodragon Then
    CalcularDaño = Npclist(NpcIndex).Stats.MinHP + Npclist(NpcIndex).Stats.Def
Else
    CalcularDaño = (((3 * DañoArma) + ((DañoMaxArma / 5) * Maximo(0, (UserList(UserIndex).Stats.UserAtributos(Fuerza) - 15))) + DañoUsuario) * ModifClase)
End If

End Function

Bueno, la primera parte:






Esto es cuando se le pega a un user con la matadracos.








Es decir, con el guerre drogado en 38 de fuerza sacaría 8 de daño.


La función Maximo elige el valor más alto entre los dos que se dieron.
Por ejemplo Maximo(A,B) donde A = 5, B = 7.


Código:
Function Maximo(ByVal A As Single, ByVal B As Single) As Single
If A > B Then 'Si A (5) es mayor a B (7)...
    Maximo = A
    Else: Maximo = B 'Si A no es mayor a B, entonces B es mayor a A, por lo tanto Maximo es B.
End If
End Function
Entonces en nuestro ejemplo Maximo va a dar B, es decir 7.


Espero que halla sido de ayuda,
Nacho