Elementos e Resistências
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
' Esclarecimentos '
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
[/center]':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
' Esclarecimentos '
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
Do que se trata esse Sistema/Tutorial?
> Ao adicionar isto em seu jogo, você terá a base de um sistema de elementos/resistências setados nos equipamentos de Jogadores.
Mas como isso irá agir?
> Serão variáveis que intervirão no combate. Inicialmente colocado no PvP (Player vs Player)
Caso eu tenha um bom retorno e pedidos neste post, poderei estender o tutorial para incrementar no PvE (Player versus Environment) - Nada mais que Jogadores contra Monstros.
Será bom adicionar isso ao meu Jogo?
> É uma boa adição pela questão da "diversidade", poderia ser aplicado para diversas áreas e modalidades, como biomas, monstros, locais, armas, e todo o ululu que resta.
Pode me dar exemplos?
> Claro ~ Você poderá adicionar diversos elementos como :
- Dano de Fogo
- Dano de Gelo
- Dano de Raio
- Dano Sombrio
- Dano Verdadeiro
- Resistência a Fogo
- Resistência ~~~
Cabe a você, nomear e decidir como irá fazer o uso, da variável.
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
' Ficha Técnica '
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
0.4 - Pondo as coisas para funcionar, e salvar valores no Editor.
Server-Side
0.1 - Adicionando as Variaveis no Servidor
> Ao adicionar isto em seu jogo, você terá a base de um sistema de elementos/resistências setados nos equipamentos de Jogadores.
Mas como isso irá agir?
> Serão variáveis que intervirão no combate. Inicialmente colocado no PvP (Player vs Player)
Caso eu tenha um bom retorno e pedidos neste post, poderei estender o tutorial para incrementar no PvE (Player versus Environment) - Nada mais que Jogadores contra Monstros.
Será bom adicionar isso ao meu Jogo?
> É uma boa adição pela questão da "diversidade", poderia ser aplicado para diversas áreas e modalidades, como biomas, monstros, locais, armas, e todo o ululu que resta.
Pode me dar exemplos?
> Claro ~ Você poderá adicionar diversos elementos como :
- Dano de Fogo
- Dano de Gelo
- Dano de Raio
- Dano Sombrio
- Dano Verdadeiro
- Resistência a Fogo
- Resistência ~~~
Cabe a você, nomear e decidir como irá fazer o uso, da variável.
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
' Ficha Técnica '
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
-> Nível de Programação: Básico
-> Programas necessários: Visual Basic 6
-> Engine Base: EO 2.0 (Eclipse Origins 2.0)
-> Compatibilidade com outras Engines? [X] Total [X] Sim [ ] Não
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
' Ao Tutorial '
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
- Client Side
0.1 - Criando nossa nova Classe; E nossos futuros Elementos.
0.2 - Adicionando as Variáveis nos Itens.
0.3 - Editor de Itens, adicionando a barra de elementos.
-> Programas necessários: Visual Basic 6
-> Engine Base: EO 2.0 (Eclipse Origins 2.0)
-> Compatibilidade com outras Engines? [X] Total [X] Sim [ ] Não
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
' Ao Tutorial '
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
- Client Side
0.1 - Criando nossa nova Classe; E nossos futuros Elementos.
- Spoiler:
- Bom, para inicio, eu estarei criando uma base, usando este tutorial você será capaz de criar qualquer outro elemento. Bastando analisar como se é feito. Iniciarei com 1 Elemento Base;
Será o Elemento Fogo.
Estarei tentando deixar da forma mais simples para que entendam a lógica. Normalmente faríamos de outras maneiras, buscando economizar o máximo de memória, mas o gasto em si é mínimo.
0.2 - Adicionando as Variáveis nos Itens.
- Spoiler:
- Aqui vamos adicionar a capacidade dos itens guardarem nossos valores de elemento. Vamos ao trabalho.
Ainda no ModTypes, procure por:
- Código:
Private Type ItemRec
Dentro dele, abaixo de:
- Código:
instaCast As Byte
Adicione:
- Código:
'Elements - Prof ~
FogoAtk As Long
FogoDef As Long
0.3 - Editor de Itens, adicionando a barra de elementos.
- Spoiler:
- Aqui modificaremos o Editor de Itens, para que ele possa dar valores as Variaveis dos Itens/Equips.
Vá ao FrmEditor_Item ; Abra ele e vamos criar alguns componentes.
Vamos deixar as coisinhas bonitinhas, como eu sempre gosto.
Crie os seguintes componentes:- 1 Frame (Coloque o Name: frmElements)
- 2 HScrollsBar (Coloque o Name: scrlFogoAtk // scrlFogoDef)
- 2 Label (Coloque o Name: lblFogoAtk // lblFogoDef)
Em meu projeto, deixei da seguinte forma:
[center]
https://i.imgur.com/G2Ztxr1.png
Feito isso, vamos a parte da programaçãozinha e mecânicas ><! - 1 Frame (Coloque o Name: frmElements)
0.4 - Pondo as coisas para funcionar, e salvar valores no Editor.
- Spoiler:
Clique duas vezes no ScrlFogoAtk, seria o Scroll que está em cima; E adicione isto:
- Código:
' If debug mode, handle error then exit out
If Options.Debug = 1 Then On Error GoTo errorhandler
If EditorIndex = 0 Then Exit Sub
lblFogoAtk.Caption = " Fogo Atk: " & scrlFogoAtk
Item(EditorIndex).FogoAtk = scrlFogoAtk.Value
' Error handler
Exit Sub
errorhandler:
HandleError "scrlFogoAtk_Change", "frmEditor_Item", Err.Number, Err.Description, Err.Source, Err.HelpContext
Err.Clear
Exit Sub
Dentro do Scroll de Def, no caso o scrlFogoDef; Clique duas vezes nele e adicione isto:
- Código:
' If debug mode, handle error then exit out
If Options.Debug = 1 Then On Error GoTo errorhandler
If EditorIndex = 0 Then Exit Sub
lblFogoDef.Caption = " Fogo Def: " & scrlFogoDef
Item(EditorIndex).FogoDef = scrlFogoDef.Value
' Error handler
Exit Sub
errorhandler:
HandleError "scrlFogoDef_Change", "frmEditor_Item", Err.Number, Err.Description, Err.Source, Err.HelpContext
Err.Clear
Exit Sub
Fique atento a mudança nos nomes. Quando você for regerar ou criar novos elementos, mude todos os nomes bases para o nome a qual você adicionou. Caso não tenha feito exatamente igual ao nome das Classes e Variáveis a qual adicionou no ModTypes, você terá problemas.
Procure o Componente: cmbType
É um ComboList, que ao clicar você seleciona qual o tipo de Item aquele item será;
Procure por Isso aqui:
- Código:
If (cmbType.ListIndex >= ITEM_TYPE_WEAPON) And (cmbType.ListIndex <= ITEM_TYPE_SHIELD) Then
fraEquipment.Visible = True
'scrlDamage_Change
Else
fraEquipment.Visible = False
End If
Substitua por isso aqui:
- Código:
If (cmbType.ListIndex >= ITEM_TYPE_WEAPON) And (cmbType.ListIndex <= ITEM_TYPE_SHIELD) Then
fraEquipment.Visible = True
frmElements.Visible = True
'scrlDamage_Change
Else
fraEquipment.Visible = False
frmElements.Visible = False
End If
Apenas adicionei para que nossa Frame de Elements aparece apenas quando o Item em questão for um Equipamento. Vamos continuar.
Agora ~ Vá ao ModGameEditors; Procure por:
- Código:
Public Sub ItemEditorInit()
Dentro dele procure por:
- Código:
' Type specific settings
If (frmEditor_Item.cmbType.ListIndex >= ITEM_TYPE_WEAPON) And (frmEditor_Item.cmbType.ListIndex <= ITEM_TYPE_SHIELD) Then
frmEditor_Item.fraEquipment.Visible = True
frmEditor_Item.scrlDamage.Value = .Data2
frmEditor_Item.cmbTool.ListIndex = .Data3
If .Speed < 100 Then .Speed = 100
frmEditor_Item.scrlSpeed.Value = .Speed
' loop for stats
For i = 1 To Stats.Stat_Count - 1
frmEditor_Item.scrlStatBonus(i).Value = .Add_Stat(i)
Next
frmEditor_Item.scrlPaperdoll = .Paperdoll
Else
frmEditor_Item.fraEquipment.Visible = False
End If
Essas linhas cuidam da leitura de caso o item seja um Equipamento. Abaixo do :
- Código:
frmEditor_Item.cmbTool.ListIndex = .Data3
Adicionem:
- Código:
frmEditor_Item.scrlFogoAtk.Value = .FogoAtk
frmEditor_Item.scrlFogoDef.Value = .FogoDef
Pronto. Agora nosso editor na área do client, já irá ao abrir o item, adicionar os valores das variáveis ao nosso equipamento.
Server-Side
0.1 - Adicionando as Variaveis no Servidor
- Spoiler:
- Vá ao ModTypes, dentro do seu Server. Procure por :
Vamos aos Itens:
no ModTypes, procure por:
- Código:
Private Type ItemRec
Dentro dele, abaixo de:
- Código:
instaCast As Byte
Adicione:
- Código:
'Elements - Prof ~
FogoAtk As Long
FogoDef As Long
Variáveis prontas. Agora, vamos a parte de programar a batalha.
0.2 - Alteração em Combate - ATK
- Spoiler:
Vá ao ModCombat, obvio que dentro do Server; Procure por:
- Código:
Function GetPlayerDamage(ByVal index As Long) As Long
Abaixo dessa function, após o End Fuction dela, vamos criar uma Duas Funções, elas serão responsáveis por Lerem o Dano Adicional Elemental e por Resistir ao Dano Elemental adicional.
Adicione isso:
- Código:
Function GetPlayerElementAtk(ByVal index As Long) As Long
Dim weaponNum As Long
Dim FogoAtk As Long
GetPlayerElementAtk = 0
FogoAtk = 0
' Check for subscript out of range
If IsPlaying(index) = False Or index <= 0 Or index > MAX_PLAYERS Then
Exit Function
End If
'Verifica se o Player está usando Arma
If GetPlayerEquipment(index, Weapon) > 0 Then
weaponNum = GetPlayerEquipment(index, Weapon) 'da o valor da Arma para o Jogador
If Item(weaponNum).FogoAtk > 0 Then 'Verifica se tem adicional de Dano Elemental de Fogo
FogoAtk = Item(weaponNum).FogoAtk
End If
End If
If FogoAtk > 0 Then
GetPlayerElementAtk = FogoAtk 'Da o valor da Function para o Dano de Fogo Atk.
End If
End Function
Essa Function eh feita de forma única. Para adicionar mais variaveis dentro dela, você terá de fazer algumas modificações. Isso eu poderei mostrar em um pós-bonus ao tutorial.
Ainda dentro do ModCombat procure por:
- Código:
Public Sub TryPlayerAttackPlayer(ByVal attacker As Long, ByVal victim As Long)
Eh a Sub responsável por calcular o dano do Player, em cima de outro jogador ;c
Vamos lá.
Dentro dela procure por:
- Código:
Damage = GetPlayerDamage(attacker)
Substitua por :
- Código:
Damage = GetPlayerDamage(attacker) + GetPlayerElementAtk(attacker)
Assim, ele adicionará o valor elemental ao dano do jogador contra outro jogador.
0.3 - Alterando Combate - Def
- Spoiler:
Em nosso ModCombat, vamos criar outra Function. De preferência abaixo da GetPlayerElementAtk.
Procure por:
- Código:
Function GetPlayerDamage(ByVal index As Long) As Long
Abaixo do End Function, adicione isto:
- Código:
Function GetPlayerElementDef(ByVal index As Long) As Long
Dim weaponNum As Long
Dim FogoDef As Long
GetPlayerElementDef = 0
FogoDef = 0
' Check for subscript out of range
If IsPlaying(index) = False Or index <= 0 Or index > MAX_PLAYERS Then
Exit Function
End If
'Verifica se o Player está usando Arma
If GetPlayerEquipment(index, Weapon) > 0 Then
weaponNum = GetPlayerEquipment(index, Weapon) 'da o valor da Arma para o Jogador
If Item(weaponNum).FogoDef > 0 Then 'Verifica se tem adicional de Def Elemental de Fogo
FogoDef = Item(weaponNum).FogoDef
End If
End If
If FogoDef > 0 Then
GetPlayerElementDef = FogoDef 'Da o valor da Function para Fogo Def.
End If
End Function
No ModCombat procure por:
- Código:
Public Sub TryPlayerAttackPlayer(ByVal attacker As Long, ByVal victim As Long)
Dentro dele, procure por:
- Código:
Damage = GetPlayerDamage(attacker)
Abaixo adicione:
- Código:
If GetPlayerElementAtk(attacker) > 0 Then 'Analisa se o Atacante tem dano elemental
Damage = Damage - GetPlayerElementDef(victim) 'adiciona a Resistência elemental contra o ataque
End If
Pronto.
Com isso, você tem elementos em seu combate PVP. Com uma pequena modificação, você pode adicionar isso a monstros xD use sua criatividade.
Caso tenham problemas, me informem; Tópico tendo um bom retorno em uso, eu aprimoro. Aqueles que tiverem vontade de maiores modificações postem ou mandem PM que ajudo.
Isso é apenas algo infimo, e que pode ser trabalhado para se tornar um monstro de sistema.
Testem, modifiquem, aprendam, vão conseguir fazer o que desejarem.
Última edição por Profane ~ em Sex maio 20, 2016 5:39 pm, editado 1 vez(es)