From 89526730d8ca243912e15dc4b881f97c719db4a0 Mon Sep 17 00:00:00 2001 From: Recox <5874806+RecoX@users.noreply.github.com> Date: Thu, 4 Apr 2019 17:40:17 +1300 Subject: [PATCH] Added all files, prepared repository to just clone and develop --- AOSetup.exe | Bin 0 -> 360448 bytes Balance/Oficial 1.0.dat | 419 ++++ Balance/Oficial 13.0.dat | 419 ++++ CODIGO/Application.bas | 42 + CODIGO/Declares.bas | 1068 ++++++++++ CODIGO/GameIni.bas | 111 + CODIGO/General.bas | 2796 ++++++++++++++++++++++++++ CODIGO/MainTimer.cls | 249 +++ CODIGO/ModAreas.bas | 70 + CODIGO/Protocol.bas | 2683 ++++++++++++++++++++++++ CODIGO/ProtocolCmdParse.bas | 262 +++ CODIGO/Resolution.bas | 159 ++ CODIGO/SecurityIp.bas | 306 +++ CODIGO/TCP.bas | 289 +++ CODIGO/TileEngine.bas | 2238 +++++++++++++++++++++ CODIGO/cDIBSection.cls | 467 +++++ CODIGO/clsAudio.cls | 1154 +++++++++++ CODIGO/clsByteQueue.cls | 1234 ++++++++++++ CODIGO/clsCustomKeys.cls | 407 ++++ CODIGO/clsCustomMessages.cls | 244 +++ CODIGO/clsDialogs.cls | 408 ++++ CODIGO/clsFormMovementManager.cls | 84 + CODIGO/clsGrapchicalInventory.cls | 653 ++++++ CODIGO/clsGraphicalButton.cls | 174 ++ CODIGO/clsIniReader.cls | 445 ++++ CODIGO/clsSurfaceManDyn.cls | 311 +++ CODIGO/clsSurfaceManStatic.cls | 230 +++ CODIGO/clsSurfaceManager.cls | 62 + CODIGO/frmCustomKeys.frm | 397 ++++ CODIGO/frmCustomKeys.frx | Bin 0 -> 48883 bytes CODIGO/frmLogin.frm | 90 + CODIGO/frmLogin.frx | Bin 0 -> 61810 bytes CODIGO/frmMain.frm | 1454 ++++++++++++++ CODIGO/frmMain.frx | Bin 0 -> 63964 bytes CODIGO/frmPersonaje.frm | 289 +++ CODIGO/frmPersonaje.frx | Bin 0 -> 61810 bytes CODIGO/frmStart.frm | 508 +++++ CODIGO/frmStart.frx | Bin 0 -> 61810 bytes CODIGO/modBot.bas | 1786 ++++++++++++++++ CODIGO/modCombate.bas | 351 ++++ CODIGO/modCompression.bas | 1425 +++++++++++++ CODIGO/modSendData.bas | 95 + CODIGO/wskapiAO.bas | 537 +++++ CODIGO/wsksock.bas | 953 +++++++++ Client.vbp | 83 + Client.vbw | 36 + Graficos/._principal bot.jpg | Bin 0 -> 4096 bytes Graficos/Boton_Combatir_Click.jpg | Bin 0 -> 14319 bytes Graficos/Boton_Combatir_Hover.jpg | Bin 0 -> 14954 bytes Graficos/Boton_Combatir_Normal.jpg | Bin 0 -> 14592 bytes Graficos/CruzCerrar.jpg | Bin 0 -> 12732 bytes Graficos/CruzCerrarClick.jpg | Bin 0 -> 12487 bytes Graficos/CruzCerrarHover.jpg | Bin 0 -> 12915 bytes Graficos/FlechaHechizos.jpg | Bin 0 -> 13510 bytes Graficos/FlechaHechizos2.jpg | Bin 0 -> 12720 bytes Graficos/FlechaHechizos2Click.jpg | Bin 0 -> 12357 bytes Graficos/FlechaHechizos2Hover.jpg | Bin 0 -> 12264 bytes Graficos/FlechaHechizosClick.jpg | Bin 0 -> 13150 bytes Graficos/FlechaHechizosHover.jpg | Bin 0 -> 13287 bytes Graficos/Graphics.AO | Bin 0 -> 580076 bytes Graficos/MenosMinimizar.jpg | Bin 0 -> 12966 bytes Graficos/MenosMinimizarClick.jpg | Bin 0 -> 12694 bytes Graficos/MenosMinimizarHover.jpg | Bin 0 -> 13058 bytes Graficos/Thumbs.db | Bin 0 -> 5632 bytes Graficos/VentanaConfigurarTeclas.jpg | Bin 0 -> 292059 bytes Graficos/barramana.jpg | Bin 0 -> 13533 bytes Graficos/barranegra.jpg | Bin 0 -> 11969 bytes Graficos/barravida.jpg | Bin 0 -> 13974 bytes Graficos/confibot.jpg | Bin 0 -> 48871 bytes Graficos/configuracion_click.jpg | Bin 0 -> 16596 bytes Graficos/configuracion_hover.jpg | Bin 0 -> 17961 bytes Graficos/configuracion_normal.jpg | Bin 0 -> 17322 bytes Graficos/configurarbot.jpg | Bin 0 -> 20039 bytes Graficos/configurarteclas_click.jpg | Bin 0 -> 17707 bytes Graficos/configurarteclas_hover.jpg | Bin 0 -> 20425 bytes Graficos/configurarteclas_normal.jpg | Bin 0 -> 18507 bytes Graficos/fronbot.ico | Bin 0 -> 61798 bytes Graficos/inventariobot.jpg | Bin 0 -> 35472 bytes Graficos/magiabot.jpg | Bin 0 -> 40287 bytes Graficos/principal bot.jpg | Bin 0 -> 123133 bytes INIT/AO.dat | Bin 0 -> 38 bytes INIT/Armas.dat | 26 + INIT/BindKeys.bin | Bin 0 -> 18 bytes INIT/Body.ini | 59 + INIT/Cabezas.ind | Bin 0 -> 353 bytes INIT/Cascos.ind | Bin 0 -> 305 bytes INIT/Escudos.dat | 17 + INIT/Fxs.ind | Bin 0 -> 289 bytes INIT/Graficos3.ind | Bin 0 -> 11334 bytes INIT/Head.ini | 68 + INIT/Inicio.con | Bin 0 -> 328 bytes INIT/Personajes.ind | Bin 0 -> 349 bytes INIT/Tips.ayu | 0 INIT/Ver.bin | Bin 0 -> 18 bytes INIT/colores.dat | 283 +++ INIT/dsa.ini | 576 ++++++ Mapas/Mapa2.map | 0 Mapas/mapa1.map | Bin 0 -> 30273 bytes WAV/10.wav | Bin 0 -> 18572 bytes WAV/11.wav | Bin 0 -> 90272 bytes WAV/110.wav | Bin 0 -> 17578 bytes WAV/113.wav | Bin 0 -> 40292 bytes WAV/16.wav | Bin 0 -> 8230 bytes WAV/2.wav | Bin 0 -> 1318 bytes WAV/20.wav | Bin 0 -> 43372 bytes WAV/23.wav | Bin 0 -> 2492 bytes WAV/24.wav | Bin 0 -> 3068 bytes WAV/25.wav | Bin 0 -> 115258 bytes WAV/27.wav | Bin 0 -> 97172 bytes WAV/37.wav | Bin 0 -> 93740 bytes WAV/46.wav | Bin 0 -> 90732 bytes WAV/74.wav | Bin 0 -> 38858 bytes WAV/click.wav | Bin 0 -> 3622 bytes WAV/click2.wav | Bin 0 -> 3622 bytes aamd532.dll | Bin 0 -> 10752 bytes changelog.txt | 46 + dx7vb.dll | Bin 0 -> 619008 bytes ijl11.dll | Bin 0 -> 180224 bytes quartz.dll | Bin 0 -> 1297920 bytes vbabdx.dll | Bin 0 -> 45056 bytes zlib.dll | Bin 0 -> 53248 bytes 121 files changed, 26063 insertions(+) create mode 100644 AOSetup.exe create mode 100644 Balance/Oficial 1.0.dat create mode 100644 Balance/Oficial 13.0.dat create mode 100644 CODIGO/Application.bas create mode 100644 CODIGO/Declares.bas create mode 100644 CODIGO/GameIni.bas create mode 100644 CODIGO/General.bas create mode 100644 CODIGO/MainTimer.cls create mode 100644 CODIGO/ModAreas.bas create mode 100644 CODIGO/Protocol.bas create mode 100644 CODIGO/ProtocolCmdParse.bas create mode 100644 CODIGO/Resolution.bas create mode 100644 CODIGO/SecurityIp.bas create mode 100644 CODIGO/TCP.bas create mode 100644 CODIGO/TileEngine.bas create mode 100644 CODIGO/cDIBSection.cls create mode 100644 CODIGO/clsAudio.cls create mode 100644 CODIGO/clsByteQueue.cls create mode 100644 CODIGO/clsCustomKeys.cls create mode 100644 CODIGO/clsCustomMessages.cls create mode 100644 CODIGO/clsDialogs.cls create mode 100644 CODIGO/clsFormMovementManager.cls create mode 100644 CODIGO/clsGrapchicalInventory.cls create mode 100644 CODIGO/clsGraphicalButton.cls create mode 100644 CODIGO/clsIniReader.cls create mode 100644 CODIGO/clsSurfaceManDyn.cls create mode 100644 CODIGO/clsSurfaceManStatic.cls create mode 100644 CODIGO/clsSurfaceManager.cls create mode 100644 CODIGO/frmCustomKeys.frm create mode 100644 CODIGO/frmCustomKeys.frx create mode 100644 CODIGO/frmLogin.frm create mode 100644 CODIGO/frmLogin.frx create mode 100644 CODIGO/frmMain.frm create mode 100644 CODIGO/frmMain.frx create mode 100644 CODIGO/frmPersonaje.frm create mode 100644 CODIGO/frmPersonaje.frx create mode 100644 CODIGO/frmStart.frm create mode 100644 CODIGO/frmStart.frx create mode 100644 CODIGO/modBot.bas create mode 100644 CODIGO/modCombate.bas create mode 100644 CODIGO/modCompression.bas create mode 100644 CODIGO/modSendData.bas create mode 100644 CODIGO/wskapiAO.bas create mode 100644 CODIGO/wsksock.bas create mode 100644 Client.vbp create mode 100644 Client.vbw create mode 100644 Graficos/._principal bot.jpg create mode 100644 Graficos/Boton_Combatir_Click.jpg create mode 100644 Graficos/Boton_Combatir_Hover.jpg create mode 100644 Graficos/Boton_Combatir_Normal.jpg create mode 100644 Graficos/CruzCerrar.jpg create mode 100644 Graficos/CruzCerrarClick.jpg create mode 100644 Graficos/CruzCerrarHover.jpg create mode 100644 Graficos/FlechaHechizos.jpg create mode 100644 Graficos/FlechaHechizos2.jpg create mode 100644 Graficos/FlechaHechizos2Click.jpg create mode 100644 Graficos/FlechaHechizos2Hover.jpg create mode 100644 Graficos/FlechaHechizosClick.jpg create mode 100644 Graficos/FlechaHechizosHover.jpg create mode 100644 Graficos/Graphics.AO create mode 100644 Graficos/MenosMinimizar.jpg create mode 100644 Graficos/MenosMinimizarClick.jpg create mode 100644 Graficos/MenosMinimizarHover.jpg create mode 100644 Graficos/Thumbs.db create mode 100644 Graficos/VentanaConfigurarTeclas.jpg create mode 100644 Graficos/barramana.jpg create mode 100644 Graficos/barranegra.jpg create mode 100644 Graficos/barravida.jpg create mode 100644 Graficos/confibot.jpg create mode 100644 Graficos/configuracion_click.jpg create mode 100644 Graficos/configuracion_hover.jpg create mode 100644 Graficos/configuracion_normal.jpg create mode 100644 Graficos/configurarbot.jpg create mode 100644 Graficos/configurarteclas_click.jpg create mode 100644 Graficos/configurarteclas_hover.jpg create mode 100644 Graficos/configurarteclas_normal.jpg create mode 100644 Graficos/fronbot.ico create mode 100644 Graficos/inventariobot.jpg create mode 100644 Graficos/magiabot.jpg create mode 100644 Graficos/principal bot.jpg create mode 100644 INIT/AO.dat create mode 100644 INIT/Armas.dat create mode 100644 INIT/BindKeys.bin create mode 100644 INIT/Body.ini create mode 100644 INIT/Cabezas.ind create mode 100644 INIT/Cascos.ind create mode 100644 INIT/Escudos.dat create mode 100644 INIT/Fxs.ind create mode 100644 INIT/Graficos3.ind create mode 100644 INIT/Head.ini create mode 100644 INIT/Inicio.con create mode 100644 INIT/Personajes.ind create mode 100644 INIT/Tips.ayu create mode 100644 INIT/Ver.bin create mode 100644 INIT/colores.dat create mode 100644 INIT/dsa.ini create mode 100644 Mapas/Mapa2.map create mode 100644 Mapas/mapa1.map create mode 100644 WAV/10.wav create mode 100644 WAV/11.wav create mode 100644 WAV/110.wav create mode 100644 WAV/113.wav create mode 100644 WAV/16.wav create mode 100644 WAV/2.wav create mode 100644 WAV/20.wav create mode 100644 WAV/23.wav create mode 100644 WAV/24.wav create mode 100644 WAV/25.wav create mode 100644 WAV/27.wav create mode 100644 WAV/37.wav create mode 100644 WAV/46.wav create mode 100644 WAV/74.wav create mode 100644 WAV/click.wav create mode 100644 WAV/click2.wav create mode 100644 aamd532.dll create mode 100644 changelog.txt create mode 100644 dx7vb.dll create mode 100644 ijl11.dll create mode 100644 quartz.dll create mode 100644 vbabdx.dll create mode 100644 zlib.dll diff --git a/AOSetup.exe b/AOSetup.exe new file mode 100644 index 0000000000000000000000000000000000000000..7b959e40be59064c18c7dc9b59eb606ac14109e4 GIT binary patch literal 360448 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
    yt1$FA4sh8hgD&|lyXGzv~2FX+8{&Ot;s|hb} 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 }6yACa%(McXs{usm~y<%H(xA}?inQO_wA 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࠳IDdQh#5?$z)Tzf4&*C9!(68K$Y+a}XUejg?> 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
    i>6A$Da&d|4F^|PkKFn((nINyX`+LUVi4-^Y!M} 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¬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 Y)y}0$Zd6v?P<7j5?=D;WLjKMF2Gn1;dH?_b literal 0 HcmV?d00001 diff --git a/Graficos/MenosMinimizarClick.jpg b/Graficos/MenosMinimizarClick.jpg new file mode 100644 index 0000000000000000000000000000000000000000..74a25c7593c949739593e525c6628834d950d76d GIT binary patch literal 12694 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 literal 0 HcmV?d00001 diff --git a/Graficos/MenosMinimizarHover.jpg b/Graficos/MenosMinimizarHover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..791d26f22bf1263b3e5c707eba3c0ad428d9d113 GIT binary patch literal 13058 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 D?^NbS literal 0 HcmV?d00001 diff --git a/Graficos/Thumbs.db b/Graficos/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..f84e5be2e029466d5193c00806386c87b1b77e96 GIT binary patch literal 5632 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 TLG$2Z?!)oTNEiIq^TYlPM+n1x literal 0 HcmV?d00001 diff --git a/Graficos/VentanaConfigurarTeclas.jpg b/Graficos/VentanaConfigurarTeclas.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e2872ad1047930ace86b9d9631d17e21779e8e3 GIT binary patch literal 292059 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

    (3KZK9gI&m9^2_v|)j;S4YT2tc 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

V)-wyy$B3zcy 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 0) +End Function diff --git a/CODIGO/Declares.bas b/CODIGO/Declares.bas new file mode 100644 index 0000000..db566bd --- /dev/null +++ b/CODIGO/Declares.bas @@ -0,0 +1,1068 @@ +Attribute VB_Name = "Mod_Declaraciones" +'Argentum Online 0.11.6 +' +'Copyright (C) 2002 Márquez Pablo Ignacio +'Copyright (C) 2002 Otto Perez +'Copyright (C) 2002 Aaron Perkins +' +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +' +'Argentum Online is based on Baronsoft's VB6 Online RPG +'You can contact the original creator of ORE at aaron@baronsoft.com +'for more information about ORE please visit http://www.baronsoft.com/ +' +' +'You can contact me at: +'morgolock@speedy.com.ar +'www.geocities.com/gmorgolock +'Calle 3 número 983 piso 7 dto A +'La Plata - Pcia, Buenos Aires - Republica Argentina +'Código Postal 1900 +'Pablo Ignacio Márquez + + +Option Explicit + +Public Const MaxUsers As Byte = 10 +Public LastUser As Integer + +Public Type tPrioridad + Char As Integer + Probabilidad As Byte +End Type + +Public Prioridad1(1 To 5) As tPrioridad 'Prioridad de ser targeteado del equipo del usuario +Public Prioridad2(1 To 5) As tPrioridad 'Prioridad de ser targeteado del equipo enemigo + +Public SinResu As Byte +Public ResuNoVida As Byte + +Public Enum eRazaAi + Humano = 0 + Gnomo = 1 + Elfo = 2 + Enano = 3 + Drow = 4 +End Enum + +Public Enum eBotAi + Mago = 0 + Paladin = 1 + Clerigo = 2 + Asesino = 3 + Bardo = 4 + Druida = 5 + Guerrero = 6 + Cazador = 7 + Bandido = 8 + Pirata = 9 +End Enum + +Public RandomBots As Byte + +Public Type tItemData + MinHit As Byte + MaxHit As Byte + DM As Single + MinRM As Byte + MaxRM As Byte + Refuerzo As Byte +End Type + +Public Type tTeamData + Nombre As String + Clase As eBotAi + Raza As eRazaAi + Nivel As Byte + Genero As Byte + Bot As Byte + index As Integer +End Type + +Public TeamData1(1 To 5) As tTeamData +Public TeamData2(1 To 5) As tTeamData + +Public Team1() As Integer +Public Team2() As Integer + +Public PathBalance As String + +Public ModBalance As Byte '1=13.0 2=1.0 +Public ItemData(1 To 4) As tItemData +Public StaClase(0 To 6) As Byte +Public PrioridadClase(0 To 6) As Byte +Public PrioridadRaza(0 To 4) As Byte +Public VidaClase(0 To 6) As Single +Public VidaRaza(0 To 4) As Single +Public ManaBaseClaseRaza(0 To 6, 0 To 4) As Byte +Public ManaBaseModifClase(0 To 6) As Single +Public ManaStartClase(0 To 6) As Byte +Public MinHitClase(0 To 6) As Byte +Public MaxHitClase(0 To 6) As Byte +Public FuerzaRaza(0 To 4) As Byte +Public AgilidadRaza(0 To 4) As Byte +Public BodyClaseRaza(0 To 6, 0 To 4) As Byte +Public HeadRazaGenero(0 To 4, 0 To 1) As Byte +Public ArmaClase(0 To 6) As Byte +Public EscudoClase(0 To 6) As Byte +Public CascoClase(0 To 6) As Byte +Public MinArmaClase(0 To 6) As Byte +Public MaxArmaClase(0 To 6) As Byte +Public MinDefBClase(0 To 6) As Byte +Public MaxDefBClase(0 To 6) As Byte +Public MinDefHClase(0 To 6) As Byte +Public MaxDefHClase(0 To 6) As Byte +Public MinRMClase(0 To 6) As Byte +Public MaxRMClase(0 To 6) As Byte +Public MinDMClase(0 To 6) As Byte +Public MaxDMClase(0 To 6) As Byte +Public ModEvasionClase(0 To 6) As Single +Public ModAtaqueArmaClase(0 To 6) As Single +Public ModAtaqueProyectilClase(0 To 6) As Single +Public ModDañoArmaClase(0 To 6) As Single +Public ModDañoProyectilClase(0 To 6) As Single +Public ModEscudoClase(0 To 6) As Single +Public ModDMClase(0 To 6) As Single + +Public BotMatados As Byte + +Public CuentaR As Byte +Public EnCuenta As Boolean + +Public ModoDebug As Byte + +Public Dificultad As Byte + +Public DGanados As Integer +Public DPerdidos As Integer + +Public CFalla As Integer +Public CPega As Integer + +Public MySpell As String + +Public Type tHechizos + name As String + MinHP As Integer + MaxHP As Integer + Mana As Integer + Sta As Integer + Palabras As String + WAV As Byte + FX As Byte +End Type + +Public Hechizo(1 To 6) As tHechizos + +'Objetos públicos +Public Dialogos As New clsDialogs +Public Audio As New clsAudio +Public Inventario As New clsGrapchicalInventory +Public InvBanco(1) As New clsGrapchicalInventory + +'Inventarios de comercio con usuario +Public InvComUsu As New clsGrapchicalInventory ' Inventario del usuario visible en el comercio +Public InvOroComUsu(2) As New clsGrapchicalInventory ' Inventarios de oro (ambos usuarios) +Public InvOfferComUsu(1) As New clsGrapchicalInventory ' Inventarios de ofertas (ambos usuarios) + +Public InvComNpc As New clsGrapchicalInventory ' Inventario con los items que ofrece el npc + +'Inventarios de herreria +Public Const MAX_LIST_ITEMS As Byte = 4 +Public InvLingosHerreria(1 To MAX_LIST_ITEMS) As New clsGrapchicalInventory +Public InvMaderasCarpinteria(1 To MAX_LIST_ITEMS) As New clsGrapchicalInventory + +Public SurfaceDB As clsSurfaceManager 'No va new porque es una interfaz, el new se pone al decidir que clase de objeto es +Public CustomKeys As New clsCustomKeys +Public CustomMessages As New clsCustomMessages + +Public incomingData As New clsByteQueue +Public outgoingData As New clsByteQueue + +'' +'The main timer of the game. +Public MainTimer As New clsTimer +Public CharTimer() As New clsTimer + +#If SeguridadAlkon Then +Public md5 As New clsMD5 +#End If + +'Sonidos +Public Const SND_CLICK As String = "click.Wav" +Public Const SND_PASOS1 As String = "23.Wav" +Public Const SND_PASOS2 As String = "24.Wav" +Public Const SND_NAVEGANDO As String = "50.wav" +Public Const SND_OVER As String = "click2.Wav" +Public Const SND_DICE As String = "cupdice.Wav" +Public Const SND_LLUVIAINEND As String = "lluviainend.wav" +Public Const SND_LLUVIAOUTEND As String = "lluviaoutend.wav" + +' Head index of the casper. Used to know if a char is killed + +' Constantes de intervalo +Public Const INT_MACRO_HECHIS As Integer = 2788 +Public Const INT_MACRO_TRABAJO As Integer = 900 + +Public Const INT_ATTACK As Integer = 1500 +Public Const INT_ARROWS As Integer = 1400 +Public Const INT_CAST_SPELL As Integer = 1400 +Public Const INT_CAST_ATTACK As Integer = 1000 +Public Const INT_ATTACK_CAST As Integer = 1000 +Public Const INT_WORK As Integer = 700 +Public Const INT_USEITEMU As Integer = 450 +Public Const INT_USEITEMDCK As Integer = 200 +Public Const INT_MINU As Integer = 200 +Public Const INT_SENTRPU As Integer = 2000 +Public Const INT_GOLPEU As Integer = 1200 +Public Const INT_PASOIH As Integer = 1200 +Public Const INT_REMO As Integer = 500 +Public Const INT_REMOOTRO As Integer = 1000 +Public Const INT_RESU As Integer = 1000 +Public Const INT_LAN As Integer = 300 + +Public MacroBltIndex As Integer + +Public Const CASPER_HEAD As Integer = 500 +Public Const FRAGATA_FANTASMAL As Integer = 87 + +Public Const NUMATRIBUTES As Byte = 5 + +Public Const HUMANO_H_PRIMER_CABEZA As Integer = 1 +Public Const HUMANO_H_ULTIMA_CABEZA As Integer = 40 'En verdad es hasta la 51, pero como son muchas estas las dejamos no seleccionables +Public Const HUMANO_H_CUERPO_DESNUDO As Integer = 21 + +Public Const ELFO_H_PRIMER_CABEZA As Integer = 101 +Public Const ELFO_H_ULTIMA_CABEZA As Integer = 122 +Public Const ELFO_H_CUERPO_DESNUDO As Integer = 210 + +Public Const DROW_H_PRIMER_CABEZA As Integer = 201 +Public Const DROW_H_ULTIMA_CABEZA As Integer = 221 +Public Const DROW_H_CUERPO_DESNUDO As Integer = 32 + +Public Const ENANO_H_PRIMER_CABEZA As Integer = 301 +Public Const ENANO_H_ULTIMA_CABEZA As Integer = 319 +Public Const ENANO_H_CUERPO_DESNUDO As Integer = 53 + +Public Const GNOMO_H_PRIMER_CABEZA As Integer = 401 +Public Const GNOMO_H_ULTIMA_CABEZA As Integer = 416 +Public Const GNOMO_H_CUERPO_DESNUDO As Integer = 222 +'************************************************** +Public Const HUMANO_M_PRIMER_CABEZA As Integer = 70 +Public Const HUMANO_M_ULTIMA_CABEZA As Integer = 89 +Public Const HUMANO_M_CUERPO_DESNUDO As Integer = 39 + +Public Const ELFO_M_PRIMER_CABEZA As Integer = 170 +Public Const ELFO_M_ULTIMA_CABEZA As Integer = 188 +Public Const ELFO_M_CUERPO_DESNUDO As Integer = 259 + +Public Const DROW_M_PRIMER_CABEZA As Integer = 270 +Public Const DROW_M_ULTIMA_CABEZA As Integer = 288 +Public Const DROW_M_CUERPO_DESNUDO As Integer = 40 + +Public Const ENANO_M_PRIMER_CABEZA As Integer = 370 +Public Const ENANO_M_ULTIMA_CABEZA As Integer = 384 +Public Const ENANO_M_CUERPO_DESNUDO As Integer = 60 + +Public Const GNOMO_M_PRIMER_CABEZA As Integer = 470 +Public Const GNOMO_M_ULTIMA_CABEZA As Integer = 484 +Public Const GNOMO_M_CUERPO_DESNUDO As Integer = 260 + +'Musica +Public Const MP3_Inicio As Byte = 101 + +Public RawServersList As String + +Public Type tColor + r As Byte + g As Byte + b As Byte +End Type + +Public ColoresPJ(0 To 50) As tColor + + +Public Type tServerInfo + ip As String + Puerto As Integer + desc As String + PassRecPort As Integer +End Type + +Public ServersLst() As tServerInfo +Public ServersRecibidos As Boolean + +Public CurServer As Integer + +Public CreandoClan As Boolean +Public ClanName As String +Public Site As String + +Public UserCiego As Boolean +Public UserEstupido As Boolean + +Public NoRes As Boolean 'no cambiar la resolucion +Public GraphicsFile As String 'Que graficos.ind usamos + +Public RainBufferIndex As Long +Public FogataBufferIndex As Long + +Public Const bCabeza = 1 +Public Const bPiernaIzquierda = 2 +Public Const bPiernaDerecha = 3 +Public Const bBrazoDerecho = 4 +Public Const bBrazoIzquierdo = 5 +Public Const bTorso = 6 + +'Timers de GetTickCount +Public Const tAt = 2000 +Public Const tUs = 600 + +Public Const PrimerBodyBarco = 84 +Public Const UltimoBodyBarco = 87 + +Public NumEscudosAnims As Integer + +Public ArmasHerrero() As tItemsConstruibles +Public ArmadurasHerrero() As tItemsConstruibles +Public ObjCarpintero() As tItemsConstruibles +Public CarpinteroMejorar() As tItemsConstruibles +Public HerreroMejorar() As tItemsConstruibles + +Public UsaMacro As Boolean +Public CnTd As Byte + + +Public Const MAX_BANCOINVENTORY_SLOTS As Byte = 40 +Public UserBancoInventory(1 To MAX_BANCOINVENTORY_SLOTS) As Inventory + +Public TradingUserName As String + +Public Tips() As String * 255 +Public Const LoopAdEternum As Integer = 999 + +'Direcciones +Public Enum E_Heading + NORTH = 1 + EAST = 2 + SOUTH = 3 + WEST = 4 +End Enum + +'Objetos +Public Const MAX_INVENTORY_OBJS As Integer = 10000 +Public Const MAX_INVENTORY_SLOTS As Byte = 30 +Public Const MAX_NORMAL_INVENTORY_SLOTS As Byte = 20 +Public Const MAX_NPC_INVENTORY_SLOTS As Byte = 50 +Public Const MAXHECHI As Byte = 35 + +Public Const INV_OFFER_SLOTS As Byte = 20 +Public Const INV_GOLD_SLOTS As Byte = 1 + +Public Const MAXSKILLPOINTS As Byte = 100 + +Public Const MAXATRIBUTOS As Byte = 38 + +Public Const FLAGORO As Integer = MAX_INVENTORY_SLOTS + 1 +Public Const GOLD_OFFER_SLOT As Integer = INV_OFFER_SLOTS + 1 + +Public Const FOgata As Integer = 1521 + + +Public Enum eClass + Mage = 1 'Mago + Cleric 'Clérigo + Warrior 'Guerrero + Assasin 'Asesino + Thief 'Ladrón + Bard 'Bardo + Druid 'Druida + Bandit 'Bandido + Paladin 'Paladín + Hunter 'Cazador + Worker 'Trabajador + Pirat 'Pirata +End Enum + +Public Enum eCiudad + cUllathorpe = 1 + cNix + cBanderbill + cLindos + cArghal +End Enum + +Enum eRaza + Humano = 1 + Elfo + ElfoOscuro + Gnomo + Enano +End Enum + +Public Enum eSkill + Magia = 1 + Robar = 2 + Tacticas = 3 + Armas = 4 + Meditar = 5 + Apuñalar = 6 + Ocultarse = 7 + Supervivencia = 8 + Talar = 9 + Comerciar = 10 + Defensa = 11 + Pesca = 12 + Mineria = 13 + Carpinteria = 14 + Herreria = 15 + Liderazgo = 16 + Domar = 17 + Proyectiles = 18 + Wrestling = 19 + Navegacion = 20 +End Enum + +Public Enum eAtributos + Fuerza = 1 + Agilidad = 2 + Inteligencia = 3 + Carisma = 4 + Constitucion = 5 +End Enum + +Enum eGenero + Hombre = 1 + Mujer +End Enum + +Public Enum PlayerType + User = &H1 + Consejero = &H2 + SemiDios = &H4 + Dios = &H8 + Admin = &H10 + RoleMaster = &H20 + ChaosCouncil = &H40 + RoyalCouncil = &H80 +End Enum + +Public Enum eObjType + otUseOnce = 1 + otWeapon = 2 + otArmadura = 3 + otArboles = 4 + otGuita = 5 + otPuertas = 6 + otContenedores = 7 + otCarteles = 8 + otLlaves = 9 + otForos = 10 + otPociones = 11 + otBebidas = 13 + otLeña = 14 + otFogata = 15 + otescudo = 16 + otcasco = 17 + otAnillo = 18 + otTeleport = 19 + otYacimiento = 22 + otMinerales = 23 + otPergaminos = 24 + otInstrumentos = 26 + otYunque = 27 + otFragua = 28 + otBarcos = 31 + otFlechas = 32 + otBotellaVacia = 33 + otBotellaLlena = 34 + otManchas = 35 'No se usa + otArbolElfico = 36 + otMochilas = 37 + otCualquiera = 1000 +End Enum + +Public Enum eMochilas + Mediana = 1 + GRANDE = 2 +End Enum + +Public MaxInventorySlots As Byte + +Public Const FundirMetal As Integer = 88 + +' Determina el color del nick +Public Enum eNickColor + ieCriminal = &H1 + ieCiudadano = &H2 + ieAtacable = &H4 +End Enum + +Public Enum eGMCommands + GMMessage = 1 '/GMSG + showName '/SHOWNAME + OnlineRoyalArmy '/ONLINEREAL + OnlineChaosLegion '/ONLINECAOS + GoNearby '/IRCERCA + Comment '/REM + serverTime '/HORA + Where '/DONDE + CreaturesInMap '/NENE + WarpMeToTarget '/TELEPLOC + WarpChar '/TELEP + Silence '/SILENCIAR + SOSShowList '/SHOW SOS + SOSRemove 'SOSDONE + GoToChar '/IRA + invisible '/INVISIBLE + GMPanel '/PANELGM + RequestUserList 'LISTUSU + Working '/TRABAJANDO + Hiding '/OCULTANDO + Jail '/CARCEL + KillNPC '/RMATA + WarnUser '/ADVERTENCIA + EditChar '/MOD + RequestCharInfo '/INFO + RequestCharStats '/STAT + RequestCharGold '/BAL + RequestCharInventory '/INV + RequestCharBank '/BOV + RequestCharSkills '/SKILLS + ReviveChar '/REVIVIR + OnlineGM '/ONLINEGM + OnlineMap '/ONLINEMAP + Forgive '/PERDON + Kick '/ECHAR + Execute '/EJECUTAR + banChar '/BAN + UnbanChar '/UNBAN + NPCFollow '/SEGUIR + SummonChar '/SUM + SpawnListRequest '/CC + SpawnCreature 'SPA + ResetNPCInventory '/RESETINV + CleanWorld '/LIMPIAR + ServerMessage '/RMSG + nickToIP '/NICK2IP + IPToNick '/IP2NICK + GuildOnlineMembers '/ONCLAN + TeleportCreate '/CT + TeleportDestroy '/DT + RainToggle '/LLUVIA + SetCharDescription '/SETDESC + ForceMIDIToMap '/FORCEMIDIMAP + ForceWAVEToMap '/FORCEWAVMAP + RoyalArmyMessage '/REALMSG + ChaosLegionMessage '/CAOSMSG + CitizenMessage '/CIUMSG + CriminalMessage '/CRIMSG + TalkAsNPC '/TALKAS + DestroyAllItemsInArea '/MASSDEST + AcceptRoyalCouncilMember '/ACEPTCONSE + AcceptChaosCouncilMember '/ACEPTCONSECAOS + ItemsInTheFloor '/PISO + MakeDumb '/ESTUPIDO + MakeDumbNoMore '/NOESTUPIDO + dumpIPTables '/DUMPSECURITY + CouncilKick '/KICKCONSE + SetTrigger '/TRIGGER + AskTrigger '/TRIGGER with no args + BannedIPList '/BANIPLIST + BannedIPReload '/BANIPRELOAD + GuildMemberList '/MIEMBROSCLAN + GuildBan '/BANCLAN + BanIP '/BANIP + UnbanIP '/UNBANIP + CreateItem '/CI + DestroyItems '/DEST + ChaosLegionKick '/NOCAOS + RoyalArmyKick '/NOREAL + ForceMIDIAll '/FORCEMIDI + ForceWAVEAll '/FORCEWAV + RemovePunishment '/BORRARPENA + TileBlockedToggle '/BLOQ + KillNPCNoRespawn '/MATA + KillAllNearbyNPCs '/MASSKILL + LastIP '/LASTIP + ChangeMOTD '/MOTDCAMBIA + SetMOTD 'ZMOTD + SystemMessage '/SMSG + CreateNPC '/ACC + CreateNPCWithRespawn '/RACC + ImperialArmour '/AI1 - 4 + ChaosArmour '/AC1 - 4 + NavigateToggle '/NAVE + ServerOpenToUsersToggle '/HABILITAR + TurnOffServer '/APAGAR + TurnCriminal '/CONDEN + ResetFactions '/RAJAR + RemoveCharFromGuild '/RAJARCLAN + RequestCharMail '/LASTEMAIL + AlterPassword '/APASS + AlterMail '/AEMAIL + AlterName '/ANAME + ToggleCentinelActivated '/CENTINELAACTIVADO + DoBackUp '/DOBACKUP + ShowGuildMessages '/SHOWCMSG + SaveMap '/GUARDAMAPA + ChangeMapInfoPK '/MODMAPINFO PK + ChangeMapInfoBackup '/MODMAPINFO BACKUP + ChangeMapInfoRestricted '/MODMAPINFO RESTRINGIR + ChangeMapInfoNoMagic '/MODMAPINFO MAGIASINEFECTO + ChangeMapInfoNoInvi '/MODMAPINFO INVISINEFECTO + ChangeMapInfoNoResu '/MODMAPINFO RESUSINEFECTO + ChangeMapInfoLand '/MODMAPINFO TERRENO + ChangeMapInfoZone '/MODMAPINFO ZONA + SaveChars '/GRABAR + CleanSOS '/BORRAR SOS + ShowServerForm '/SHOW INT + night '/NOCHE + KickAllChars '/ECHARTODOSPJS + ReloadNPCs '/RELOADNPCS + ReloadServerIni '/RELOADSINI + ReloadSpells '/RELOADHECHIZOS + ReloadObjects '/RELOADOBJ + Restart '/REINICIAR + ResetAutoUpdate '/AUTOUPDATE + ChatColor '/CHATCOLOR + Ignored '/IGNORADO + CheckSlot '/SLOT + SetIniVar '/SETINIVAR LLAVE CLAVE VALOR +End Enum + +' +' Mensajes +' +' MENSAJE_* --> Mensajes de texto que se muestran en el cuadro de texto +' + +Public Const MENSAJE_CRIATURA_FALLA_GOLPE As String = "¡¡¡La criatura falló el golpe!!!" +Public Const MENSAJE_CRIATURA_MATADO As String = "¡¡¡La criatura te ha matado!!!" +Public Const MENSAJE_RECHAZO_ATAQUE_ESCUDO As String = "¡¡¡Has rechazado el ataque con el escudo!!!" +Public Const MENSAJE_USUARIO_RECHAZO_ATAQUE_ESCUDO As String = "¡¡¡El usuario rechazó el ataque con su escudo!!!" +Public Const MENSAJE_FALLADO_GOLPE As String = "¡¡¡Has fallado el golpe!!!" +Public Const MENSAJE_SEGURO_ACTIVADO As String = ">>SEGURO ACTIVADO<<" +Public Const MENSAJE_SEGURO_DESACTIVADO As String = ">>SEGURO DESACTIVADO<<" +Public Const MENSAJE_PIERDE_NOBLEZA As String = "¡¡Has perdido puntaje de nobleza y ganado puntaje de criminalidad!! Si sigues ayudando a criminales te convertirás en uno de ellos y serás perseguido por las tropas de las ciudades." +Public Const MENSAJE_USAR_MEDITANDO As String = "¡Estás meditando! Debes dejar de meditar para usar objetos." + +Public Const MENSAJE_SEGURO_RESU_ON As String = "SEGURO DE RESURRECCION ACTIVADO" +Public Const MENSAJE_SEGURO_RESU_OFF As String = "SEGURO DE RESURRECCION DESACTIVADO" + +Public Const MENSAJE_GOLPE_CABEZA As String = "¡¡La criatura te ha pegado en la cabeza por " +Public Const MENSAJE_GOLPE_BRAZO_IZQ As String = "¡¡La criatura te ha pegado el brazo izquierdo por " +Public Const MENSAJE_GOLPE_BRAZO_DER As String = "¡¡La criatura te ha pegado el brazo derecho por " +Public Const MENSAJE_GOLPE_PIERNA_IZQ As String = "¡¡La criatura te ha pegado la pierna izquierda por " +Public Const MENSAJE_GOLPE_PIERNA_DER As String = "¡¡La criatura te ha pegado la pierna derecha por " +Public Const MENSAJE_GOLPE_TORSO As String = "¡¡La criatura te ha pegado en el torso por " + +' MENSAJE_[12]: Aparecen antes y despues del valor de los mensajes anteriores (MENSAJE_GOLPE_*) +Public Const MENSAJE_1 As String = "¡¡" +Public Const MENSAJE_2 As String = "!!" +Public Const MENSAJE_11 As String = "¡" +Public Const MENSAJE_22 As String = "!" + +Public Const MENSAJE_GOLPE_CRIATURA_1 As String = "¡¡Le has pegado a la criatura por " + +Public Const MENSAJE_ATAQUE_FALLO As String = " te atacó y falló!!" + +Public Const MENSAJE_RECIVE_IMPACTO_CABEZA As String = " te ha pegado en la cabeza por " +Public Const MENSAJE_RECIVE_IMPACTO_BRAZO_IZQ As String = " te ha pegado el brazo izquierdo por " +Public Const MENSAJE_RECIVE_IMPACTO_BRAZO_DER As String = " te ha pegado el brazo derecho por " +Public Const MENSAJE_RECIVE_IMPACTO_PIERNA_IZQ As String = " te ha pegado la pierna izquierda por " +Public Const MENSAJE_RECIVE_IMPACTO_PIERNA_DER As String = " te ha pegado la pierna derecha por " +Public Const MENSAJE_RECIVE_IMPACTO_TORSO As String = " te ha pegado en el torso por " + +Public Const MENSAJE_PRODUCE_IMPACTO_1 As String = "¡¡Le has pegado a " +Public Const MENSAJE_PRODUCE_IMPACTO_CABEZA As String = " en la cabeza por " +Public Const MENSAJE_PRODUCE_IMPACTO_BRAZO_IZQ As String = " en el brazo izquierdo por " +Public Const MENSAJE_PRODUCE_IMPACTO_BRAZO_DER As String = " en el brazo derecho por " +Public Const MENSAJE_PRODUCE_IMPACTO_PIERNA_IZQ As String = " en la pierna izquierda por " +Public Const MENSAJE_PRODUCE_IMPACTO_PIERNA_DER As String = " en la pierna derecha por " +Public Const MENSAJE_PRODUCE_IMPACTO_TORSO As String = " en el torso por " + +Public Const MENSAJE_TRABAJO_MAGIA As String = "Haz click sobre el objetivo..." +Public Const MENSAJE_TRABAJO_PESCA As String = "Haz click sobre el sitio donde quieres pescar..." +Public Const MENSAJE_TRABAJO_ROBAR As String = "Haz click sobre la víctima..." +Public Const MENSAJE_TRABAJO_TALAR As String = "Haz click sobre el árbol..." +Public Const MENSAJE_TRABAJO_MINERIA As String = "Haz click sobre el yacimiento..." +Public Const MENSAJE_TRABAJO_FUNDIRMETAL As String = "Haz click sobre la fragua..." +Public Const MENSAJE_TRABAJO_PROYECTILES As String = "Haz click sobre la victima..." + +Public Const MENSAJE_ENTRAR_PARTY_1 As String = "Si deseas entrar en una party con " +Public Const MENSAJE_ENTRAR_PARTY_2 As String = ", escribe /entrarparty" + +Public Const MENSAJE_NENE As String = "Cantidad de NPCs: " + +Public Const MENSAJE_FRAGSHOOTER_TE_HA_MATADO As String = "te ha matado!" +Public Const MENSAJE_FRAGSHOOTER_HAS_MATADO As String = "Has matado a" +Public Const MENSAJE_FRAGSHOOTER_HAS_GANADO As String = "Has ganado " +Public Const MENSAJE_FRAGSHOOTER_PUNTOS_DE_EXPERIENCIA As String = "puntos de experiencia." + +Public Const MENSAJE_NO_VES_NADA_INTERESANTE As String = "No ves nada interesante." +Public Const MENSAJE_HAS_MATADO_A As String = "Has matado a " +Public Const MENSAJE_HAS_GANADO_EXPE_1 As String = "Has ganado " +Public Const MENSAJE_HAS_GANADO_EXPE_2 As String = " puntos de experiencia." +Public Const MENSAJE_TE_HA_MATADO As String = " te ha matado!" + +Public Const MENSAJE_HOGAR As String = "Has llegado a tu hogar. El viaje ha finalizado." +Public Const MENSAJE_HOGAR_CANCEL As String = "Tu viaje ha sido cancelado." + +Public Enum eMessages + DontSeeAnything + NPCSwing + NPCKillUser + BlockedWithShieldUser + BlockedWithShieldOther + UserSwing + SafeModeOn + SafeModeOff + ResuscitationSafeOff + ResuscitationSafeOn + NobilityLost + CantUseWhileMeditating + NPCHitUser + UserHitNPC + UserAttackedSwing + UserHittedByUser + UserHittedUser + WorkRequestTarget + HaveKilledUser + UserKill + EarnExp + goHome + CancelGoHome + FinishHome +End Enum + +'Inventario +Type Inventory + OBJIndex As Integer + name As String + GrhIndex As Integer + '[Alejo]: tipo de datos ahora es Long + Amount As Long + '[/Alejo] + Equipped As Byte + Valor As Single + OBJType As Integer + MaxDef As Integer + MinDef As Integer 'Budi + MaxHit As Integer + MinHit As Integer +End Type + +Type NpCinV + OBJIndex As Integer + name As String + GrhIndex As Integer + Amount As Integer + Valor As Single + OBJType As Integer + MaxDef As Integer + MinDef As Integer + MaxHit As Integer + MinHit As Integer + C1 As String + C2 As String + C3 As String + C4 As String + C5 As String + C6 As String + C7 As String +End Type + +Type tReputacion 'Fama del usuario + NobleRep As Long + BurguesRep As Long + PlebeRep As Long + LadronesRep As Long + BandidoRep As Long + AsesinoRep As Long + + Promedio As Long +End Type + +Type tEstadisticasUsu + CiudadanosMatados As Long + CriminalesMatados As Long + UsuariosMatados As Long + NpcsMatados As Long + Clase As String + PenaCarcel As Long +End Type + +Type tItemsConstruibles + name As String + OBJIndex As Integer + GrhIndex As Integer + LinH As Integer + LinP As Integer + LinO As Integer + Madera As Integer + MaderaElfica As Integer + Upgrade As Integer + UpgradeName As String + UpgradeGrhIndex As Integer +End Type + +Public Nombres As Boolean + +'User status vars +Global OtroInventario(1 To MAX_INVENTORY_SLOTS) As Inventory + +Public UserHechizos(1 To MAXHECHI) As Integer + +Public NPCInventory(1 To MAX_NPC_INVENTORY_SLOTS) As NpCinV +Public UserMeditar As Boolean +Public UserName As String +Public UserPassword As String +Public UserMaxHO As Integer +Public UserMinHP As Integer +Public UserMaxMAN As Integer +Public UserMinMAN As Integer +Public UserMaxSTA As Integer +Public UserMinSTA As Integer +Public UserMaxAGU As Byte +Public UserMinAGU As Byte +Public UserMaxHAM As Byte +Public UserMinHAM As Byte +Public UserGLD As Long +Public UserLvl As Integer +Public UserPort As Integer +Public UserServerIP As String +Public UserEstado As Byte '0 = Vivo & 1 = Muerto +Public UserPasarNivel As Long +Public UserExp As Long +Public UserReputacion As tReputacion +Public UserEstadisticas As tEstadisticasUsu +Public UserDescansar As Boolean +Public tipf As String +Public PrimeraVez As Boolean +Public bShowTutorial As Boolean +Public FPSFLAG As Boolean +Public pausa As Boolean +Public UserParalizado As Boolean +Public UserNavegando As Boolean +Public UserHogar As eCiudad + +Public UserFuerza As Byte +Public UserAgilidad As Byte + +Public UserWeaponEqpSlot As Byte +Public UserArmourEqpSlot As Byte +Public UserHelmEqpSlot As Byte +Public UserShieldEqpSlot As Byte + +'<-------------------------NUEVO--------------------------> +Public Comerciando As Boolean +Public MirandoForo As Boolean +Public MirandoAsignarSkills As Boolean +Public MirandoEstadisticas As Boolean +Public MirandoParty As Boolean +'<-------------------------NUEVO--------------------------> + +Public UserClase As eClass +Public UserSexo As eGenero +Public UserRaza As eRaza +Public UserGenero As Byte +Public UserTeam As Byte +Public UserEmail As String + +Public Const NUMCIUDADES As Byte = 5 +Public Const NUMSKILLS As Byte = 20 +Public Const NUMATRIBUTOS As Byte = 5 +Public Const NUMCLASES As Byte = 12 +Public Const NUMRAZAS As Byte = 5 + +Public UserSkills(1 To NUMSKILLS) As Byte +Public PorcentajeSkills(1 To NUMSKILLS) As Byte +Public SkillsNames(1 To NUMSKILLS) As String + +Public UserAtributos(1 To NUMATRIBUTOS) As Byte +Public AtributosNames(1 To NUMATRIBUTOS) As String + +Public Ciudades(1 To NUMCIUDADES) As String + +Public ListaRazas(1 To NUMRAZAS) As String +Public ListaClases(0 To NUMCLASES) As String + +Public SkillPoints As Integer +Public Alocados As Integer +Public flags() As Integer +Public Oscuridad As Integer +'Public logged As Boolean ' www.gs-zone.org + +Public UsingSkill As Integer + +Public MD5HushYo As String * 16 + +Public pingTime As Long + +Public EsPartyLeader As Boolean + +Public Enum E_MODO + Normal = 1 + CrearNuevoPj = 2 + Dados = 3 +End Enum + +Public EstadoLogin As E_MODO + +Public Enum FxMeditar + CHICO = 4 + MEDIANO = 5 + GRANDE = 6 + XGRANDE = 16 + XXGRANDE = 34 +End Enum + +Public Enum eClanType + ct_RoyalArmy + ct_Evil + ct_Neutral + ct_GM + ct_Legal + ct_Criminal +End Enum + +Public Enum eEditOptions + eo_Gold = 1 + eo_Experience + eo_Body + eo_Head + eo_CiticensKilled + eo_CriminalsKilled + eo_Level + eo_Class + eo_Skills + eo_SkillPointsLeft + eo_Nobleza + eo_Asesino + eo_Sex + eo_Raza + eo_addGold +End Enum + +'' +' TRIGGERS +' +' @param NADA nada +' @param BAJOTECHO bajo techo +' @param trigger_2 ??? +' @param POSINVALIDA los npcs no pueden pisar tiles con este trigger +' @param ZONASEGURA no se puede robar o pelear desde este trigger +' @param ANTIPIQUETE +' @param ZONAPELEA al pelear en este trigger no se caen las cosas y no cambia el estado de ciuda o crimi +' +Public Enum eTrigger + NADA = 0 + BAJOTECHO = 1 + trigger_2 = 2 + POSINVALIDA = 3 + ZONASEGURA = 4 + ANTIPIQUETE = 5 + ZONAPELEA = 6 +End Enum + +'Server stuff +Public RequestPosTimer As Integer 'Used in main loop +Public stxtbuffer As String 'Holds temp raw data from server +Public stxtbuffercmsg As String 'Holds temp raw data from server +Public SendNewChar As Boolean 'Used during login +Public Connected As Boolean 'True when connected to server +Public DownloadingMap As Boolean 'Currently downloading a map from server +Public UserMap As Integer + +'Control +Public prgRun As Boolean 'When true the program ends + +Public IPdelServidor As String +Public PuertoDelServidor As String + +' +'********** FUNCIONES API *********** +' + +Public Declare Function GetTickCount Lib "kernel32" () As Long + +'para escribir y leer variables +Public Declare Function writeprivateprofilestring Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationname As String, ByVal lpKeyname As Any, ByVal lpString As String, ByVal lpFileName As String) As Long +Public Declare Function getprivateprofilestring Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationname As String, ByVal lpKeyname As Any, ByVal lpdefault As String, ByVal lpreturnedstring As String, ByVal nsize As Long, ByVal lpFileName As String) As Long + +'Teclado +Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer +Public Declare Function GetAsyncKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer + +Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) + +'Para ejecutar el browser y programas externos +Public Const SW_SHOWNORMAL As Long = 1 +Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long + +'Lista de cabezas +Public Type tIndiceCabeza + Head(1 To 4) As Integer +End Type + +Public Type tIndiceCuerpo + body(1 To 4) As Integer + HeadOffsetX As Integer + HeadOffsetY As Integer +End Type + +Public Type tIndiceFx + Animacion As Integer + OffsetX As Integer + OffsetY As Integer +End Type + +Public EsperandoLevel As Boolean + +Public isCapturePending As Boolean +Public Traveling As Boolean + +Public GuildNames() As String +Public GuildMembers() As String + +Public Const OFFSET_HEAD As Integer = -34 + +Public Enum eSMType + sResucitation + sSafemode + mSpells + mWork +End Enum + +Public Const SM_CANT As Byte = 4 +Public SMStatus(SM_CANT) As Boolean + +'Hardcoded grhs and items +Public Const GRH_INI_SM As Integer = 4978 + +Public Const ORO_INDEX As Integer = 12 +Public Const ORO_GRH As Integer = 511 + +Public Const GRH_HALF_STAR As Integer = 5357 +Public Const GRH_FULL_STAR As Integer = 5358 +Public Const GRH_GLOW_STAR As Integer = 5359 + +Public Const LH_GRH As Integer = 724 +Public Const LP_GRH As Integer = 725 +Public Const LO_GRH As Integer = 723 + +Public Const MADERA_GRH As Integer = 550 +Public Const MADERA_ELFICA_GRH As Integer = 1999 + +Public picMouseIcon As Picture diff --git a/CODIGO/GameIni.bas b/CODIGO/GameIni.bas new file mode 100644 index 0000000..6d5eb12 --- /dev/null +++ b/CODIGO/GameIni.bas @@ -0,0 +1,111 @@ +Attribute VB_Name = "GameIni" +'Argentum Online 0.11.6 +' +'Copyright (C) 2002 Márquez Pablo Ignacio +'Copyright (C) 2002 Otto Perez +'Copyright (C) 2002 Aaron Perkins +'Copyright (C) 2002 Matías Fernando Pequeño +' +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +' +'Argentum Online is based on Baronsoft's VB6 Online RPG +'You can contact the original creator of ORE at aaron@baronsoft.com +'for more information about ORE please visit http://www.baronsoft.com/ +' +' +'You can contact me at: +'morgolock@speedy.com.ar +'www.geocities.com/gmorgolock +'Calle 3 número 983 piso 7 dto A +'La Plata - Pcia, Buenos Aires - Republica Argentina +'Código Postal 1900 +'Pablo Ignacio Márquez + + + +Option Explicit + +Public Type tCabecera 'Cabecera de los con + Desc As String * 255 + CRC As Long + MagicWord As Long +End Type + +Public Type tGameIni + Puerto As Long + Musica As Byte + fX As Byte + tip As Byte + Password As String + Name As String + DirGraficos As String + DirSonidos As String + DirMusica As String + DirMapas As String + NumeroDeBMPs As Long + NumeroMapas As Integer +End Type + +Public Type tSetupMods + bDinamic As Boolean + byMemory As Byte + bUseVideo As Boolean + bNoMusic As Boolean + bNoSound As Boolean + bNoRes As Boolean ' 24/06/2006 - ^[GS]^ + bNoSoundEffects As Boolean + sGraficos As String * 13 + bGuildNews As Boolean ' 11/19/09 + bDie As Boolean ' 11/23/09 - FragShooter + bKill As Boolean ' 11/23/09 - FragShooter + byMurderedLevel As Byte ' 11/23/09 - FragShooter + bActive As Boolean + bGldMsgConsole As Boolean + bCantMsgs As Byte +End Type + +Public ClientSetup As tSetupMods + +Public MiCabecera As tCabecera +Public Config_Inicio As tGameIni + +Public Sub IniciarCabecera(ByRef Cabecera As tCabecera) + Cabecera.Desc = "Argentum Online by Noland Studios. Copyright Noland-Studios 2001, pablomarquez@noland-studios.com.ar" + Cabecera.CRC = Rnd * 100 + Cabecera.MagicWord = Rnd * 10 +End Sub + +Public Function LeerGameIni() As tGameIni + Dim N As Integer + Dim GameIni As tGameIni + N = FreeFile + Open App.path & "\init\Inicio.con" For Binary As #N + Get #N, , MiCabecera + + Get #N, , GameIni + + Close #N + LeerGameIni = GameIni +End Function + +Public Sub EscribirGameIni(ByRef GameIniConfiguration As tGameIni) +On Local Error Resume Next + +Dim N As Integer +N = FreeFile +Open App.path & "\init\Inicio.con" For Binary As #N +Put #N, , MiCabecera +Put #N, , GameIniConfiguration +Close #N +End Sub + diff --git a/CODIGO/General.bas b/CODIGO/General.bas new file mode 100644 index 0000000..d762110 --- /dev/null +++ b/CODIGO/General.bas @@ -0,0 +1,2796 @@ +Attribute VB_Name = "Mod_General" +'Argentum Online 0.11.6 +' +'Copyright (C) 2002 Márquez Pablo Ignacio +'Copyright (C) 2002 Otto Perez +'Copyright (C) 2002 Aaron Perkins +'Copyright (C) 2002 Matías Fernando Pequeño +' +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +' +'Argentum Online is based on Baronsoft's VB6 Online RPG +'You can contact the original creator of ORE at aaron@baronsoft.com +'for more information about ORE please visit http://www.baronsoft.com/ +' +' +'You can contact me at: +'morgolock@speedy.com.ar +'www.geocities.com/gmorgolock +'Calle 3 número 983 piso 7 dto A +'La Plata - Pcia, Buenos Aires - Republica Argentina +'Código Postal 1900 +'Pablo Ignacio Márquez + +Option Explicit + +Public iplst As String + +Public bFogata As Boolean + +Public bLluvia() As Byte ' Array para determinar si +'debemos mostrar la animacion de la lluvia + +Private lFrameTimer As Long + +Public Function DirGraficos() As String + DirGraficos = App.path & "\" & Config_Inicio.DirGraficos & "\" +End Function + +Public Function DirSound() As String + DirSound = App.path & "\" & Config_Inicio.DirSonidos & "\" +End Function + +Public Function DirMidi() As String + DirMidi = App.path & "\" & Config_Inicio.DirMusica & "\" +End Function + +Public Function DirMapas() As String + DirMapas = App.path & "\" & Config_Inicio.DirMapas & "\" +End Function + +Public Function DirExtras() As String + DirExtras = App.path & "\EXTRAS\" +End Function + +Public Function RandomNumber(ByVal LowerBound As Long, ByVal UpperBound As Long) As Long + 'Initialize randomizer + Randomize Timer + + 'Generate random number + RandomNumber = (UpperBound - LowerBound) * Rnd + LowerBound +End Function + +Public Function GetRawName(ByRef sName As String) As String +'*************************************************** +'Author: ZaMa +'Last Modify Date: 13/01/2010 +'Last Modified By: - +'Returns the char name without the clan name (if it has it). +'*************************************************** + + Dim Pos As Integer + + Pos = InStr(1, sName, "<") + + If Pos > 0 Then + GetRawName = Trim(Left(sName, Pos - 1)) + Else + GetRawName = sName + End If + +End Function + +Sub CargarAnimArmas() +On Error Resume Next + + Dim LoopC As Long + Dim arch As String + + arch = App.path & "\init\" & "armas.dat" + + NumWeaponAnims = Val(GetVar(arch, "INIT", "NumArmas")) + + ReDim WeaponAnimData(1 To NumWeaponAnims) As WeaponAnimData + + For LoopC = 1 To NumWeaponAnims + InitGrh WeaponAnimData(LoopC).WeaponWalk(1), Val(GetVar(arch, "ARMA" & LoopC, "Dir1")), 0 + InitGrh WeaponAnimData(LoopC).WeaponWalk(2), Val(GetVar(arch, "ARMA" & LoopC, "Dir2")), 0 + InitGrh WeaponAnimData(LoopC).WeaponWalk(3), Val(GetVar(arch, "ARMA" & LoopC, "Dir3")), 0 + InitGrh WeaponAnimData(LoopC).WeaponWalk(4), Val(GetVar(arch, "ARMA" & LoopC, "Dir4")), 0 + Next LoopC +End Sub + +Sub CargarColores() +On Error Resume Next + Dim archivoC As String + + archivoC = App.path & "\init\colores.dat" + + If Not FileExist(archivoC, vbArchive) Then +'TODO : Si hay que reinstalar, porque no cierra??? + Call MsgBox("ERROR: no se ha podido cargar los colores. Falta el archivo colores.dat, reinstale el juego", vbCritical + vbOKOnly) + Exit Sub + End If + + Dim i As Long + + For i = 0 To 48 '49 y 50 reservados para ciudadano y criminal + ColoresPJ(i).r = CByte(GetVar(archivoC, CStr(i), "R")) + ColoresPJ(i).g = CByte(GetVar(archivoC, CStr(i), "G")) + ColoresPJ(i).b = CByte(GetVar(archivoC, CStr(i), "B")) + Next i + + ' Crimi + ColoresPJ(50).r = CByte(GetVar(archivoC, "CR", "R")) + ColoresPJ(50).g = CByte(GetVar(archivoC, "CR", "G")) + ColoresPJ(50).b = CByte(GetVar(archivoC, "CR", "B")) + + ' Ciuda + ColoresPJ(49).r = CByte(GetVar(archivoC, "CI", "R")) + ColoresPJ(49).g = CByte(GetVar(archivoC, "CI", "G")) + ColoresPJ(49).b = CByte(GetVar(archivoC, "CI", "B")) + + ' Atacable + ColoresPJ(48).r = CByte(GetVar(archivoC, "AT", "R")) + ColoresPJ(48).g = CByte(GetVar(archivoC, "AT", "G")) + ColoresPJ(48).b = CByte(GetVar(archivoC, "AT", "B")) +End Sub + +#If SeguridadAlkon Then +Sub InitMI() + Dim alternativos As Integer + Dim CualMITemp As Integer + + alternativos = RandomNumber(1, 7368) + CualMITemp = RandomNumber(1, 1233) + + + Set MI(CualMITemp) = New clsManagerInvisibles + Call MI(CualMITemp).Inicializar(alternativos, 10000) + + If CualMI <> 0 Then + Call MI(CualMITemp).CopyFrom(MI(CualMI)) + Set MI(CualMI) = Nothing + End If + CualMI = CualMITemp +End Sub +#End If + +Sub CargarAnimEscudos() +On Error Resume Next + + Dim LoopC As Long + Dim arch As String + + arch = App.path & "\init\" & "escudos.dat" + + NumEscudosAnims = Val(GetVar(arch, "INIT", "NumEscudos")) + + ReDim ShieldAnimData(1 To NumEscudosAnims) As ShieldAnimData + + For LoopC = 1 To NumEscudosAnims + InitGrh ShieldAnimData(LoopC).ShieldWalk(1), Val(GetVar(arch, "ESC" & LoopC, "Dir1")), 0 + InitGrh ShieldAnimData(LoopC).ShieldWalk(2), Val(GetVar(arch, "ESC" & LoopC, "Dir2")), 0 + InitGrh ShieldAnimData(LoopC).ShieldWalk(3), Val(GetVar(arch, "ESC" & LoopC, "Dir3")), 0 + InitGrh ShieldAnimData(LoopC).ShieldWalk(4), Val(GetVar(arch, "ESC" & LoopC, "Dir4")), 0 + Next LoopC +End Sub + +Sub AddtoRichTextBox(ByRef RichTextBox As RichTextBox, ByVal Text As String, Optional ByVal red As Integer = -1, Optional ByVal green As Integer, Optional ByVal blue As Integer, Optional ByVal bold As Boolean = False, Optional ByVal italic As Boolean = False, Optional ByVal bCrLf As Boolean = True) +'****************************************** +'Adds text to a Richtext box at the bottom. +'Automatically scrolls to new text. +'Text box MUST be multiline and have a 3D +'apperance! +'Pablo (ToxicWaste) 01/26/2007 : Now the list refeshes properly. +'Juan Martín Sotuyo Dodero (Maraxus) 03/29/2007 : Replaced ToxicWaste's code for extra performance. +'******************************************r + With RichTextBox + If Len(.Text) > 1000 Then + 'Get rid of first line + .SelStart = InStr(1, .Text, vbCrLf) + 1 + .SelLength = Len(.Text) - .SelStart + 2 + .TextRTF = .SelRTF + End If + + .SelStart = Len(.Text) + .SelLength = 0 + .SelBold = bold + .SelItalic = italic + + If Not red = -1 Then .SelColor = RGB(red, green, blue) + + If bCrLf And Len(.Text) > 0 Then Text = vbCrLf & Text + .SelText = Text + + RichTextBox.Refresh + End With +End Sub + +'TODO : Never was sure this is really necessary.... +'TODO : 08/03/2006 - (AlejoLp) Esto hay que volarlo... +Public Sub RefreshAllChars() +'***************************************************************** +'Goes through the charlist and replots all the characters on the map +'Used to make sure everyone is visible +'***************************************************************** + Dim LoopC As Long + + For LoopC = 1 To LastChar + If charlist(LoopC).Active = 1 Then + MapData(charlist(LoopC).Pos.X, charlist(LoopC).Pos.Y).CharIndex = LoopC + End If + Next LoopC +End Sub + +Sub SaveGameini() + 'Grabamos los datos del usuario en el Game.ini + Config_Inicio.name = "BetaTester" + Config_Inicio.Password = "DammLamers" + Config_Inicio.Puerto = UserPort + + Call EscribirGameIni(Config_Inicio) +End Sub + +Function AsciiValidos(ByVal cad As String) As Boolean + Dim car As Byte + Dim i As Long + + cad = LCase$(cad) + + For i = 1 To Len(cad) + car = Asc(mid$(cad, i, 1)) + + If ((car < 97 Or car > 122) Or car = Asc("º")) And (car <> 255) And (car <> 32) Then + Exit Function + End If + Next i + + AsciiValidos = True +End Function + +Function CheckUserData(ByVal checkemail As Boolean) As Boolean + 'Validamos los datos del user + Dim LoopC As Long + Dim CharAscii As Integer + + If checkemail And UserEmail = "" Then + MsgBox ("Dirección de email invalida") + Exit Function + End If + + If UserPassword = "" Then + MsgBox ("Ingrese un password.") + Exit Function + End If + + For LoopC = 1 To Len(UserPassword) + CharAscii = Asc(mid$(UserPassword, LoopC, 1)) + If Not LegalCharacter(CharAscii) Then + MsgBox ("Password inválido. El caractér " & Chr$(CharAscii) & " no está permitido.") + Exit Function + End If + Next LoopC + + If UserName = "" Then + MsgBox ("Ingrese un nombre de personaje.") + Exit Function + End If + + If Len(UserName) > 30 Then + MsgBox ("El nombre debe tener menos de 30 letras.") + Exit Function + End If + + For LoopC = 1 To Len(UserName) + CharAscii = Asc(mid$(UserName, LoopC, 1)) + If Not LegalCharacter(CharAscii) Then + MsgBox ("Nombre inválido. El caractér " & Chr$(CharAscii) & " no está permitido.") + Exit Function + End If + Next LoopC + + CheckUserData = True +End Function + +Sub UnloadAllForms() +On Error Resume Next + +#If SeguridadAlkon Then + Call UnprotectForm +#End If + + Dim mifrm As Form + + For Each mifrm In Forms + Unload mifrm + Next +End Sub + +Function LegalCharacter(ByVal KeyAscii As Integer) As Boolean +'***************************************************************** +'Only allow characters that are Win 95 filename compatible +'***************************************************************** + 'if backspace allow + If KeyAscii = 8 Then + LegalCharacter = True + Exit Function + End If + + 'Only allow space, numbers, letters and special characters + If KeyAscii < 32 Or KeyAscii = 44 Then + Exit Function + End If + + If KeyAscii > 126 Then + Exit Function + End If + + 'Check for bad special characters in between + If KeyAscii = 34 Or KeyAscii = 42 Or KeyAscii = 47 Or KeyAscii = 58 Or KeyAscii = 60 Or KeyAscii = 62 Or KeyAscii = 63 Or KeyAscii = 92 Or KeyAscii = 124 Then + Exit Function + End If + + 'else everything is cool + LegalCharacter = True +End Function + +Sub SetConnected() +'***************************************************************** +'Sets the client to "Connect" mode +'***************************************************************** + 'Set Connected + Connected = True + + Call SaveGameini + + frmLogin.Visible = False + frmPersonaje.Visible = False + If frmStart.Visible = True Then Unload frmStart + + FPSFLAG = True + + Call IniClient +End Sub + + +Sub MoveTo(ByVal Direccion As E_Heading) + + Dim LegalOk As Boolean + + Select Case Direccion + Case E_Heading.NORTH + LegalOk = MoveToLegalPos(UserPos.X, UserPos.Y - 1) + Case E_Heading.EAST + LegalOk = MoveToLegalPos(UserPos.X + 1, UserPos.Y) + Case E_Heading.SOUTH + LegalOk = MoveToLegalPos(UserPos.X, UserPos.Y + 1) + Case E_Heading.WEST + LegalOk = MoveToLegalPos(UserPos.X - 1, UserPos.Y) + End Select + + If LegalOk And charlist(UserCharIndex).Inmo = 0 Then + Call WriteWalk(Direccion) + MoveCharbyHead UserCharIndex, Direccion + MoveScreen Direccion + Else + If charlist(UserCharIndex).heading <> Direccion Then + charlist(UserCharIndex).heading = Direccion + Call WriteChangeHeading(Direccion) + End If + End If + + ' Update 3D sounds! + Call Audio.MoveListener(UserPos.X, UserPos.Y) +End Sub + +Sub RandomMove() +'*************************************************** +'Author: Alejandro Santos (AlejoLp) +'Last Modify Date: 06/03/2006 +' 06/03/2006: AlejoLp - Ahora utiliza la funcion MoveTo +'*************************************************** + Call MoveTo(RandomNumber(NORTH, WEST)) +End Sub + +Private Sub CheckKeys() +'***************************************************************** +'Checks keys and respond +'***************************************************************** + Static LastMovement As Long + + 'No input allowed while Argentum is not the active window + If Not Application.IsAppActive() Then Exit Sub + + 'No walking when in commerce or banking. + If Comerciando Then Exit Sub + + 'No walking while writting in the forum. + If MirandoForo Then Exit Sub + + 'If game is paused, abort movement. + If pausa Or EnCuenta Then Exit Sub + + 'TODO: Debería informarle por consola? + If Traveling Then Exit Sub + + 'Don't allow any these keys during movement.. + If UserMoving = 0 Then + If Not UserEstupido Then + 'Move Up + If GetKeyState(CustomKeys.BindedKey(eKeyType.mKeyUp)) < 0 Then + Call MoveTo(NORTH) + charlist(1).Quieto = 0 + Exit Sub + End If + + 'Move Right + If GetKeyState(CustomKeys.BindedKey(eKeyType.mKeyRight)) < 0 Then + Call MoveTo(EAST) + charlist(1).Quieto = 0 + Exit Sub + End If + + 'Move down + If GetKeyState(CustomKeys.BindedKey(eKeyType.mKeyDown)) < 0 Then + Call MoveTo(SOUTH) + charlist(1).Quieto = 0 + Exit Sub + End If + + 'Move left + If GetKeyState(CustomKeys.BindedKey(eKeyType.mKeyLeft)) < 0 Then + Call MoveTo(WEST) + charlist(1).Quieto = 0 + Exit Sub + End If + + ' We haven't moved - Update 3D sounds! + Call Audio.MoveListener(UserPos.X, UserPos.Y) + Else + Dim kp As Boolean + kp = (GetKeyState(CustomKeys.BindedKey(eKeyType.mKeyUp)) < 0) Or _ + GetKeyState(CustomKeys.BindedKey(eKeyType.mKeyRight)) < 0 Or _ + GetKeyState(CustomKeys.BindedKey(eKeyType.mKeyDown)) < 0 Or _ + GetKeyState(CustomKeys.BindedKey(eKeyType.mKeyLeft)) < 0 + + If kp Then + Call RandomMove + Else + ' We haven't moved - Update 3D sounds! + Call Audio.MoveListener(UserPos.X, UserPos.Y) + End If + + End If + End If +End Sub + +'TODO : Si bien nunca estuvo allí, el mapa es algo independiente o a lo sumo dependiente del engine, no va acá!!! +Sub SwitchMap(ByVal Map As Integer) +'************************************************************** +'Formato de mapas optimizado para reducir el espacio que ocupan. +'Diseñado y creado por Juan Martín Sotuyo Dodero (Maraxus) (juansotuyo@hotmail.com) +'************************************************************** + Dim Y As Long + Dim X As Long + Dim TempInt As Integer + Dim ByFlags As Byte + Dim handle As Integer + + handle = FreeFile() + + Open DirMapas & "Mapa" & Map & ".map" For Binary As handle + Seek handle, 1 + + 'map Header + Get handle, , MapInfo.MapVersion + Get handle, , MiCabecera + Get handle, , TempInt + Get handle, , TempInt + Get handle, , TempInt + Get handle, , TempInt + + 'Load arrays + For Y = YMinMapSize To YMaxMapSize + For X = XMinMapSize To XMaxMapSize + Get handle, , ByFlags + + MapData(X, Y).Blocked = (ByFlags And 1) + + Get handle, , MapData(X, Y).Graphic(1).GrhIndex + InitGrh MapData(X, Y).Graphic(1), MapData(X, Y).Graphic(1).GrhIndex + + 'Layer 2 used? + If ByFlags And 2 Then + Get handle, , MapData(X, Y).Graphic(2).GrhIndex + InitGrh MapData(X, Y).Graphic(2), MapData(X, Y).Graphic(2).GrhIndex + Else + MapData(X, Y).Graphic(2).GrhIndex = 0 + End If + + 'Layer 3 used? + If ByFlags And 4 Then + Get handle, , MapData(X, Y).Graphic(3).GrhIndex + InitGrh MapData(X, Y).Graphic(3), MapData(X, Y).Graphic(3).GrhIndex + Else + MapData(X, Y).Graphic(3).GrhIndex = 0 + End If + + 'Layer 4 used? + If ByFlags And 8 Then + Get handle, , MapData(X, Y).Graphic(4).GrhIndex + InitGrh MapData(X, Y).Graphic(4), MapData(X, Y).Graphic(4).GrhIndex + Else + MapData(X, Y).Graphic(4).GrhIndex = 0 + End If + + 'Trigger used? + If ByFlags And 16 Then + Get handle, , MapData(X, Y).Trigger + Else + MapData(X, Y).Trigger = 0 + End If + + 'Erase NPCs + 'If MapData(X, Y).CharIndex > 0 Then + ' Call EraseChar(MapData(X, Y).CharIndex) + 'End If + + 'Erase OBJs + MapData(X, Y).ObjGrh.GrhIndex = 0 + Next X + Next Y + + Close handle + + MapInfo.name = "" + MapInfo.Music = "" + + CurMap = Map +End Sub + +Function ReadField(ByVal Pos As Integer, ByRef Text As String, ByVal SepASCII As Byte) As String +'***************************************************************** +'Gets a field from a delimited string +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 11/15/2004 +'***************************************************************** + Dim i As Long + Dim lastPos As Long + Dim CurrentPos As Long + Dim delimiter As String * 1 + + delimiter = Chr$(SepASCII) + + For i = 1 To Pos + lastPos = CurrentPos + CurrentPos = InStr(lastPos + 1, Text, delimiter, vbBinaryCompare) + Next i + + If CurrentPos = 0 Then + ReadField = mid$(Text, lastPos + 1, Len(Text) - lastPos) + Else + ReadField = mid$(Text, lastPos + 1, CurrentPos - lastPos - 1) + End If +End Function + +Function FieldCount(ByRef Text As String, ByVal SepASCII As Byte) As Long +'***************************************************************** +'Gets the number of fields in a delimited string +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 07/29/2007 +'***************************************************************** + Dim Count As Long + Dim curPos As Long + Dim delimiter As String * 1 + + If LenB(Text) = 0 Then Exit Function + + delimiter = Chr$(SepASCII) + + curPos = 0 + + Do + curPos = InStr(curPos + 1, Text, delimiter) + Count = Count + 1 + Loop While curPos <> 0 + + FieldCount = Count +End Function + +Function FileExist(ByVal file As String, ByVal FileType As VbFileAttribute) As Boolean + FileExist = (Dir$(file, FileType) <> "") +End Function + +Sub Main() + + PathBalance = App.path & "\Balance\" + + 'Load config file + If FileExist(App.path & "\init\Inicio.con", vbNormal) Then + Config_Inicio = LeerGameIni() + End If + + 'Load ao.dat config file + Call LoadClientSetup + + If ClientSetup.bDinamic Then + Set SurfaceDB = New clsSurfaceManDyn + Else + Set SurfaceDB = New clsSurfaceManStatic + End If + + 'Read command line. Do it AFTER config file is loaded to prevent this from + 'canceling the effects of "/nores" option. + Call LeerLineaComandos + + 'usaremos esto para ayudar en los parches + Call SaveSetting("ArgentumOnlineCliente", "Init", "Path", App.path & "\") + + ChDrive App.path + ChDir App.path + +#If SeguridadAlkon Then + 'Obtener el HushMD5 + Dim fMD5HushYo As String * 32 + + fMD5HushYo = md5.GetMD5File(App.path & "\" & App.EXEName & ".exe") + Call md5.MD5Reset + MD5HushYo = txtOffset(hexMd52Asc(fMD5HushYo), 55) + + Debug.Print fMD5HushYo +#Else + MD5HushYo = "0123456789abcdef" 'We aren't using a real MD5 +#End If + + tipf = Config_Inicio.tip + + 'Set resolution BEFORE the loading form is displayed, therefore it will be centered. + Call Resolution.SetResolution + + ' Mouse Pointer (Loaded before opening any form with buttons in it) + If FileExist(DirExtras & "Hand.ico", vbArchive) Then _ + Set picMouseIcon = LoadPicture(DirExtras & "Hand.ico") + +'TODO : esto de ServerRecibidos no se podría sacar??? + ServersRecibidos = True + Call InicializarNombres + + If Not InitTileEngine(frmMain.hWnd, 149, 19, 32, 32, 13, 17, 9, 8, 8, 0.018) Then + Call CloseClient + End If +UserMap = 1 + + Call CargarAnimArmas + Call CargarAnimEscudos + Call CargarColores + 'Inicializamos el sonido + Call Audio.Initialize(DirectX, frmMain.hWnd, App.path & "\" & Config_Inicio.DirSonidos & "\", App.path & "\" & Config_Inicio.DirMusica & "\") + 'Enable / Disable audio + Audio.MusicActivated = Not ClientSetup.bNoMusic + Audio.SoundActivated = Not ClientSetup.bNoSound + Audio.SoundEffectsActivated = Not ClientSetup.bNoSoundEffects + 'Inicializamos el inventario gráfico + Call Inventario.Initialize(DirectDraw, frmMain.picInv, MAX_INVENTORY_SLOTS) + + Call Audio.MusicMP3Play(App.path & "\MP3\" & MP3_Inicio & ".mp3") + + frmMain.Socket1.Startup + + Call Protocol.InitFonts + + 'Inicialización de variables globales + PrimeraVez = True + prgRun = True + pausa = False + + 'Set the intervals of timers + Call MainTimer.SetInterval(TimersIndex.Lan, INT_LAN) + + 'Init timers + Call MainTimer.Start(TimersIndex.Lan) + + 'Set the dialog's font + Dialogos.font = frmMain.font + + lFrameTimer = GetTickCount + + Dim i As Byte + For i = 1 To MaxUsers + charlist(i).ConnID = -1 + charlist(i).ConnIDValida = False + Set charlist(i).incomingData = New clsByteQueue + Set charlist(i).outgoingData = New clsByteQueue + Next i + + ReDim Team1(1 To 1) As Integer + ReDim Team2(1 To 1) As Integer + + frmLogin.Visible = True + + Do While prgRun + 'Sólo dibujamos si la ventana no está minimizada + If frmMain.WindowState <> 1 And frmMain.Visible Then + Call ShowNextFrame(frmMain.Top, frmMain.Left, frmMain.MouseX, frmMain.MouseY) + + 'Play ambient sounds + Call RenderSounds + + Call CheckKeys + End If + +#If SeguridadAlkon Then + Call CheckSecurity +#End If + + ' If there is anything to be sent, we send it + Call FlushBuffer + + DoEvents + Loop + + Call CloseClient +End Sub + +Sub WriteVar(ByVal file As String, ByVal Main As String, ByVal Var As String, ByVal Value As String) +'***************************************************************** +'Writes a var to a text file +'***************************************************************** + writeprivateprofilestring Main, Var, Value, file +End Sub + +Function GetVar(ByVal file As String, ByVal Main As String, ByVal Var As String) As String +'***************************************************************** +'Gets a Var from a text file +'***************************************************************** + Dim sSpaces As String ' This will hold the input that the program will retrieve + + sSpaces = Space$(500) ' This tells the computer how long the longest string can be. If you want, you can change the number 100 to any number you wish + + getprivateprofilestring Main, Var, vbNullString, sSpaces, Len(sSpaces), file + + GetVar = RTrim$(sSpaces) + GetVar = Left$(GetVar, Len(GetVar) - 1) +End Function + +'[CODE 002]:MatuX +' +' Función para chequear el email +' +' Corregida por Maraxus para que reconozca como válidas casillas con puntos antes de la arroba y evitar un chequeo innecesario +Public Function CheckMailString(ByVal sString As String) As Boolean +On Error GoTo errHnd + Dim lPos As Long + Dim lX As Long + Dim iAsc As Integer + + '1er test: Busca un simbolo @ + lPos = InStr(sString, "@") + If (lPos <> 0) Then + '2do test: Busca un simbolo . después de @ + 1 + If Not (InStr(lPos, sString, ".", vbBinaryCompare) > lPos + 1) Then _ + Exit Function + + '3er test: Recorre todos los caracteres y los valída + For lX = 0 To Len(sString) - 1 + If Not (lX = (lPos - 1)) Then 'No chequeamos la '@' + iAsc = Asc(mid$(sString, (lX + 1), 1)) + If Not CMSValidateChar_(iAsc) Then _ + Exit Function + End If + Next lX + + 'Finale + CheckMailString = True + End If +errHnd: +End Function + +' Corregida por Maraxus para que reconozca como válidas casillas con puntos antes de la arroba +Private Function CMSValidateChar_(ByVal iAsc As Integer) As Boolean + CMSValidateChar_ = (iAsc >= 48 And iAsc <= 57) Or _ + (iAsc >= 65 And iAsc <= 90) Or _ + (iAsc >= 97 And iAsc <= 122) Or _ + (iAsc = 95) Or (iAsc = 45) Or (iAsc = 46) +End Function + +'TODO : como todo lo relativo a mapas, no tiene nada que hacer acá.... +Function HayAgua(ByVal X As Integer, ByVal Y As Integer) As Boolean + HayAgua = ((MapData(X, Y).Graphic(1).GrhIndex >= 343 And MapData(X, Y).Graphic(1).GrhIndex <= 405)) + +End Function + +Public Sub ShowSendTxt() + frmMain.SendTxt.Visible = True + frmMain.SendTxt.SetFocus +End Sub + +' Checks the command line parameters, if you are running Ao with /nores command and checks the AoUpdate parameters +' +' + +Public Sub LeerLineaComandos() +'************************************************* +'Author: Unknown +'Last modified: 25/11/2008 (BrianPr) +' +'************************************************* + Dim T() As String + Dim i As Long + + Dim UpToDate As Boolean + Dim Patch As String + + 'Parseo los comandos + T = Split(Command, " ") + For i = LBound(T) To UBound(T) + Select Case UCase$(T(i)) + Case "/NORES" 'no cambiar la resolucion + NoRes = True + Case "/UPTODATE" + UpToDate = True + End Select + Next i + + 'Call AoUpdate(UpToDate, NoRes) ' www.gs-zone.org +End Sub + +'' +' Runs AoUpdate if we haven't updated yet, patches aoupdate and runs Client normally if we are updated. +' +' @param UpToDate Specifies if we have checked for updates or not +' @param NoREs Specifies if we have to set nores arg when running the client once again (if the AoUpdate is executed). + +Private Sub AoUpdate(ByVal UpToDate As Boolean, ByVal NoRes As Boolean) +'************************************************* +'Author: BrianPr +'Created: 25/11/2008 +'Last modified: 25/11/2008 +' +'************************************************* +On Error GoTo error + Dim extraArgs As String + If Not UpToDate Then + 'No recibe update, ejecutar AU + 'Ejecuto el AoUpdate, sino me voy + If Dir(App.path & "\AoUpdate.exe", vbArchive) = vbNullString Then + MsgBox "No se encuentra el archivo de actualización AoUpdate.exe por favor descarguelo y vuelva a intentar", vbCritical + End + Else + FileCopy App.path & "\AoUpdate.exe", App.path & "\AoUpdateTMP.exe" + + If NoRes Then + extraArgs = " /nores" + End If + + Call ShellExecute(0, "Open", App.path & "\AoUpdateTMP.exe", App.EXEName & ".exe" & extraArgs, App.path, SW_SHOWNORMAL) + End + End If + Else + If FileExist(App.path & "\AoUpdateTMP.exe", vbArchive) Then Kill App.path & "\AoUpdateTMP.exe" + End If +Exit Sub + +error: + If Err.Number = 75 Then 'Si el archivo AoUpdateTMP.exe está en uso, entonces esperamos 5 ms y volvemos a intentarlo hasta que nos deje. + Sleep 5 + Resume + Else + MsgBox Err.Description & vbCrLf, vbInformation, "[ " & Err.Number & " ]" & " Error " + End + End If +End Sub + +Private Sub LoadClientSetup() +'************************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 11/19/09 +'11/19/09: Pato - Is optional show the frmGuildNews form +'************************************************************** + Dim fHandle As Integer + + If FileExist(App.path & "\init\ao.dat", vbArchive) Then + fHandle = FreeFile + + Open App.path & "\init\ao.dat" For Binary Access Read Lock Write As fHandle + Get fHandle, , ClientSetup + Close fHandle + Else + 'Use dynamic by default + ClientSetup.bDinamic = True + End If + + NoRes = ClientSetup.bNoRes + + If InStr(1, ClientSetup.sGraficos, "Graficos") Then + GraphicsFile = ClientSetup.sGraficos + Else + GraphicsFile = "Graficos3.ind" + End If + + ClientSetup.bGuildNews = Not ClientSetup.bGuildNews + +End Sub + +Private Sub SaveClientSetup() +'************************************************************** +'Author: Torres Patricio (Pato) +'Last Modify Date: 03/11/10 +' +'************************************************************** + Dim fHandle As Integer + + fHandle = FreeFile + + ClientSetup.bNoMusic = Not Audio.MusicActivated + ClientSetup.bNoSound = Not Audio.SoundActivated + ClientSetup.bNoSoundEffects = Not Audio.SoundEffectsActivated + ClientSetup.bGuildNews = Not ClientSetup.bGuildNews + + Open App.path & "\init\ao.dat" For Binary As fHandle + Put fHandle, , ClientSetup + Close fHandle +End Sub + +Private Sub InicializarNombres() +'************************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 11/27/2005 +'Inicializa los nombres de razas, ciudades, clases, skills, atributos, etc. +'************************************************************** + Ciudades(eCiudad.cUllathorpe) = "Ullathorpe" + Ciudades(eCiudad.cNix) = "Nix" + Ciudades(eCiudad.cBanderbill) = "Banderbill" + Ciudades(eCiudad.cLindos) = "Lindos" + Ciudades(eCiudad.cArghal) = "Arghâl" + + ListaRazas(eRaza.Humano) = "Humano" + ListaRazas(eRaza.Elfo) = "Elfo" + ListaRazas(eRaza.ElfoOscuro) = "Elfo Oscuro" + ListaRazas(eRaza.Gnomo) = "Gnomo" + ListaRazas(eRaza.Enano) = "Enano" + + ListaClases(eBotAi.Mago) = "Mago" + ListaClases(eBotAi.Clerigo) = "Clerigo" + ListaClases(eBotAi.Guerrero) = "Guerrero" + ListaClases(eBotAi.Asesino) = "Asesino" + ListaClases(eBotAi.Pirata) = "Pirata" + ListaClases(eBotAi.Bardo) = "Bardo" + ListaClases(eBotAi.Druida) = "Druida" + ListaClases(eBotAi.Bandido) = "Bandido" + ListaClases(eBotAi.Paladin) = "Paladin" + + SkillsNames(eSkill.Magia) = "Magia" + SkillsNames(eSkill.Robar) = "Robar" + SkillsNames(eSkill.Tacticas) = "Evasión en combate" + SkillsNames(eSkill.Armas) = "Combate cuerpo a cuerpo" + SkillsNames(eSkill.Meditar) = "Meditar" + SkillsNames(eSkill.Apuñalar) = "Apuñalar" + SkillsNames(eSkill.Ocultarse) = "Ocultarse" + SkillsNames(eSkill.Supervivencia) = "Supervivencia" + SkillsNames(eSkill.Talar) = "Talar árboles" + SkillsNames(eSkill.Comerciar) = "Comercio" + SkillsNames(eSkill.Defensa) = "Defensa con escudos" + SkillsNames(eSkill.Pesca) = "Pesca" + SkillsNames(eSkill.Mineria) = "Mineria" + SkillsNames(eSkill.Carpinteria) = "Carpinteria" + SkillsNames(eSkill.Herreria) = "Herreria" + SkillsNames(eSkill.Liderazgo) = "Liderazgo" + SkillsNames(eSkill.Domar) = "Domar animales" + SkillsNames(eSkill.Proyectiles) = "Combate a distancia" + SkillsNames(eSkill.Wrestling) = "Combate sin armas" + SkillsNames(eSkill.Navegacion) = "Navegacion" + + AtributosNames(eAtributos.Fuerza) = "Fuerza" + AtributosNames(eAtributos.Agilidad) = "Agilidad" + AtributosNames(eAtributos.Inteligencia) = "Inteligencia" + AtributosNames(eAtributos.Carisma) = "Carisma" + AtributosNames(eAtributos.Constitucion) = "Constitucion" +End Sub + +'' +' Removes all text from the console and dialogs + +Public Sub CleanDialogs() +'************************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 11/27/2005 +'Removes all text from the console and dialogs +'************************************************************** + 'Clean console and dialogs + frmMain.RecTxt.Text = vbNullString + + Call Dialogos.RemoveAllDialogs +End Sub + +Public Sub CloseClient() +'************************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 8/14/2007 +'Frees all used resources, cleans up and leaves +'************************************************************** + Dim i As Byte + + EngineRun = False + + Call Resolution.ResetResolution + + 'Stop tile engine + Call DeinitTileEngine + + Call SaveClientSetup + + 'Destruimos los objetos públicos creados + Set CustomMessages = Nothing + Set CustomKeys = Nothing + Set SurfaceDB = Nothing + Set Dialogos = Nothing + Set Audio = Nothing + Set Inventario = Nothing + Set MainTimer = Nothing + 'For i = 1 To MaxUsers + 'Set CharTimer(i) = Nothing + 'Next i + Set incomingData = Nothing + Set outgoingData = Nothing + +#If SeguridadAlkon Then + Set md5 = Nothing +#End If + + Call UnloadAllForms + + 'Actualizar tip + Config_Inicio.tip = tipf + Call EscribirGameIni(Config_Inicio) + End +End Sub + +Public Function esGM(CharIndex As Integer) As Boolean +esGM = False +If charlist(CharIndex).priv >= 1 And charlist(CharIndex).priv <= 5 Or charlist(CharIndex).priv = 25 Then _ + esGM = True + +End Function + +Public Function getTagPosition(ByVal Nick As String) As Integer +Dim buf As Integer +buf = InStr(Nick, "<") +If buf > 0 Then + getTagPosition = buf + Exit Function +End If +buf = InStr(Nick, "[") +If buf > 0 Then + getTagPosition = buf + Exit Function +End If +getTagPosition = Len(Nick) + 2 +End Function + + + +Public Function getStrenghtColor() As Long +Dim M As Long +M = 255 / MAXATRIBUTOS +getStrenghtColor = RGB(255 - (M * UserFuerza), (M * UserFuerza), 0) +End Function +Public Function getDexterityColor() As Long +Dim M As Long +M = 255 / MAXATRIBUTOS +getDexterityColor = RGB(255, M * UserAgilidad, 0) +End Function + +Public Function getCharIndexByName(ByVal name As String) As Integer +Dim i As Long +For i = 1 To LastChar + If charlist(i).Nombre = name Then + getCharIndexByName = i + Exit Function + End If +Next i +End Function + +'--------------------------------------------------------------------------------------- +' Procedure : IniBot +' Author : Anagrama +' Date : ??? +' Purpose : Inicializa el juego, los bots, el usuario, etc. +'--------------------------------------------------------------------------------------- +' +Public Sub IniBot(Optional ByVal Balance As String) + + Dim i As Byte + + If UBound(Team1) > 1 Then + For i = 1 To UBound(Team1) - 1 + Team1(i) = i + charlist(i).Ai = TeamData1(i).Clase + charlist(i).Raza = TeamData1(i).Raza + charlist(i).Genero = TeamData1(i).Genero + charlist(i).Lvl = TeamData1(i).Nivel + charlist(i).Bot = 1 + Next i + End If + + For i = 1 To UBound(Team2) + If UBound(Team1) = 1 Then + Team2(i) = Team1(UBound(Team1)) + i + charlist(Team1(UBound(Team1)) + i).Ai = TeamData2(i).Clase + charlist(Team1(UBound(Team1)) + i).Raza = TeamData2(i).Raza + charlist(Team1(UBound(Team1)) + i).Genero = TeamData2(i).Genero + charlist(Team1(UBound(Team1)) + i).Lvl = TeamData2(i).Nivel + charlist(Team1(UBound(Team1)) + i).Bot = 1 + Else + Team2(i) = Team1(UBound(Team1) - 1) + i + charlist(Team1(UBound(Team1) - 1) + i).Ai = TeamData2(i).Clase + charlist(Team1(UBound(Team1) - 1) + i).Raza = TeamData2(i).Raza + charlist(Team1(UBound(Team1) - 1) + i).Genero = TeamData2(i).Genero + charlist(Team1(UBound(Team1) - 1) + i).Lvl = TeamData2(i).Nivel + charlist(Team1(UBound(Team1) - 1) + i).Bot = 1 + End If + Next i + + If Balance <> vbNullString Then + Call LoadBalance(Balance) + End If + + ReDim CharTimer(1 To MaxUsers) As New clsTimer + + pausa = True + + Call CrearChars + + For i = 1 To MaxUsers + Call CharTimer(i).Start(TimersIndex.Attack) + Call CharTimer(i).Start(TimersIndex.Work) + Call CharTimer(i).Start(TimersIndex.UseItemWithU) + Call CharTimer(i).Start(TimersIndex.UseItemWithDblClick) + Call CharTimer(i).Start(TimersIndex.SendRPU) + Call CharTimer(i).Start(TimersIndex.CastSpell) + Call CharTimer(i).Start(TimersIndex.Arrows) + Call CharTimer(i).Start(TimersIndex.CastAttack) + Call CharTimer(i).Start(TimersIndex.AttackCast) + Call CharTimer(i).Start(TimersIndex.UseItem) + Call CharTimer(i).Start(TimersIndex.GolpeU) + Call CharTimer(i).Start(TimersIndex.WaitH) + Call CharTimer(i).Start(TimersIndex.WaitP) + Call CharTimer(i).Start(TimersIndex.Remo) + Call CharTimer(i).Start(TimersIndex.Lan) + Call CharTimer(i).Start(TimersIndex.RemoOtro) + Call CharTimer(i).Start(TimersIndex.Resu) + If Dificultad > 3 Then + Call CharTimer(i).SetInterval(TimersIndex.Work, INT_WORK) + Call CharTimer(i).SetInterval(TimersIndex.SendRPU, INT_SENTRPU) + Call CharTimer(i).SetInterval(TimersIndex.Arrows, INT_ARROWS) + Call CharTimer(i).SetInterval(TimersIndex.UseItem, INT_MINU) + Call CharTimer(i).SetInterval(TimersIndex.GolpeU, INT_GOLPEU) + Call CharTimer(i).SetInterval(TimersIndex.Attack, INT_ATTACK + Dificultad * 50) + Call CharTimer(i).SetInterval(TimersIndex.UseItemWithDblClick, INT_USEITEMDCK + Dificultad * 75) + Call CharTimer(i).SetInterval(TimersIndex.UseItemWithU, INT_USEITEMU + Dificultad * 25) + Call CharTimer(i).SetInterval(TimersIndex.CastSpell, INT_CAST_SPELL + Dificultad * 50) + Call CharTimer(i).SetInterval(TimersIndex.CastAttack, INT_CAST_ATTACK + Dificultad * 50) + Call CharTimer(i).SetInterval(TimersIndex.AttackCast, INT_ATTACK_CAST + Dificultad * 50) + Call CharTimer(i).SetInterval(TimersIndex.WaitH, INT_PASOIH + Dificultad * 100) + Call CharTimer(i).SetInterval(TimersIndex.WaitP, INT_PASOIH + Dificultad * 100) + Call CharTimer(i).SetInterval(TimersIndex.Remo, INT_REMO) + Call CharTimer(i).SetInterval(TimersIndex.Lan, INT_LAN) + ElseIf Dificultad = 3 Then + Call CharTimer(i).SetInterval(TimersIndex.Work, INT_WORK) + Call CharTimer(i).SetInterval(TimersIndex.SendRPU, INT_SENTRPU) + Call CharTimer(i).SetInterval(TimersIndex.Arrows, INT_ARROWS) + Call CharTimer(i).SetInterval(TimersIndex.UseItem, INT_MINU) + Call CharTimer(i).SetInterval(TimersIndex.GolpeU, INT_GOLPEU) + Call CharTimer(i).SetInterval(TimersIndex.Attack, INT_ATTACK) + Call CharTimer(i).SetInterval(TimersIndex.UseItemWithU, INT_USEITEMU) + Call CharTimer(i).SetInterval(TimersIndex.CastSpell, INT_CAST_SPELL) + Call CharTimer(i).SetInterval(TimersIndex.CastAttack, INT_CAST_ATTACK) + Call CharTimer(i).SetInterval(TimersIndex.AttackCast, INT_ATTACK_CAST) + Call CharTimer(i).SetInterval(TimersIndex.WaitH, INT_PASOIH) + Call CharTimer(i).SetInterval(TimersIndex.WaitP, INT_PASOIH) + Call CharTimer(i).SetInterval(TimersIndex.Remo, INT_REMO) + Call CharTimer(i).SetInterval(TimersIndex.UseItemWithDblClick, INT_USEITEMDCK + 100) + Call CharTimer(i).SetInterval(TimersIndex.Lan, INT_LAN) + Call CharTimer(i).SetInterval(TimersIndex.RemoOtro, INT_REMOOTRO) + Call CharTimer(i).SetInterval(TimersIndex.Resu, INT_RESU) + Else + Call CharTimer(i).SetInterval(TimersIndex.Work, INT_WORK) + Call CharTimer(i).SetInterval(TimersIndex.SendRPU, INT_SENTRPU) + Call CharTimer(i).SetInterval(TimersIndex.Arrows, INT_ARROWS) + Call CharTimer(i).SetInterval(TimersIndex.UseItem, INT_MINU) + Call CharTimer(i).SetInterval(TimersIndex.GolpeU, INT_GOLPEU) + Call CharTimer(i).SetInterval(TimersIndex.Attack, INT_ATTACK - Dificultad * 25) + Call CharTimer(i).SetInterval(TimersIndex.UseItemWithDblClick, INT_USEITEMDCK - Dificultad * 33) + Call CharTimer(i).SetInterval(TimersIndex.UseItemWithU, INT_USEITEMU - Dificultad * 12) + Call CharTimer(i).SetInterval(TimersIndex.CastSpell, INT_CAST_SPELL - Dificultad * 25) + Call CharTimer(i).SetInterval(TimersIndex.CastAttack, INT_CAST_ATTACK - Dificultad * 25) + Call CharTimer(i).SetInterval(TimersIndex.AttackCast, INT_ATTACK_CAST - Dificultad * 25) + Call CharTimer(i).SetInterval(TimersIndex.WaitH, INT_PASOIH - Dificultad * 50) + Call CharTimer(i).SetInterval(TimersIndex.WaitP, INT_PASOIH - Dificultad * 50) + Call CharTimer(i).SetInterval(TimersIndex.Remo, INT_REMO) + Call CharTimer(i).SetInterval(TimersIndex.Lan, INT_LAN) + Call CharTimer(i).SetInterval(TimersIndex.RemoOtro, INT_REMOOTRO) + Call CharTimer(i).SetInterval(TimersIndex.Resu, INT_RESU) + End If + Next i + +End Sub + +'--------------------------------------------------------------------------------------- +' Procedure : IniClient +' Author : Anagrama +' Date : ??? +' Purpose : Inicializa el cliente con la información necesaria para funcionar. +'--------------------------------------------------------------------------------------- +' +Public Sub IniClient() + + UserMap = 1 + UserPos.X = charlist(UserCharIndex).Pos.X + UserPos.Y = charlist(UserCharIndex).Pos.Y + UserLvl = charlist(UserCharIndex).Lvl + Nombres = True + MinLimiteX = 10 + MinLimiteY = 10 + MaxLimiteX = 90 + MaxLimiteY = 90 + + UserParalizado = False + + frmMain.hlst.Clear + frmMain.hlst.AddItem "(Nada)" + frmMain.hlst.AddItem "(Nada)" + frmMain.hlst.AddItem "(Nada)" + frmMain.hlst.AddItem "(Nada)" + frmMain.hlst.AddItem "(Nada)" + frmMain.hlst.AddItem "(Nada)" + frmMain.hlst.AddItem "Resucitar" + frmMain.hlst.AddItem "Tormenta de Fuego" + frmMain.hlst.AddItem "Descarga Eléctrica" + frmMain.hlst.AddItem "Apocalípsis" + frmMain.hlst.AddItem "Inmovilizar" + frmMain.hlst.AddItem "Devolver Movilidad" + + frmMain.lblGanados = DGanados + frmMain.lblPerdidos = DPerdidos + If DGanados > 0 Then + frmMain.lblPromedio = Int(DGanados * 100 / (DGanados + DPerdidos)) & "%" + Else: frmMain.lblPromedio = "0%" + End If + + Dim DifName As String + Select Case Dificultad + Case 1: DifName = "Imposible" + Case 2: DifName = "Muy Dificil" + Case 3: DifName = "Dificil" + Case 4: DifName = "Fácil" + Case 5: DifName = "Muy Fácil" + End Select + frmMain.lblDificultad = DifName + + If charlist(UserCharIndex).Ai = eBotAi.Guerrero Then + Call Inventario.SetItem(1, 1, 0, 0, 599, 1, 0, 0, 0, 0, 0, "Poción roja") + Call Inventario.SetItem(3, 3, 0, 1, 601, 1, 0, 0, 0, 0, 0, "Hacha de Guerra Dos Filos") + Call Inventario.SetItem(2, 4, 0, 0, 602, 1, 0, 0, 0, 0, 0, "Arco de Cazador") + Call Inventario.SetItem(5, 4, 0, 0, 602, 1, 0, 0, 0, 0, 0, "Arco de Cazador") + Call Inventario.SetItem(4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") + ElseIf charlist(UserCharIndex).Ai = eBotAi.Bardo Then + Call Inventario.SetItem(1, 1, 0, 0, 599, 1, 0, 0, 0, 0, 0, "Poción roja") + Call Inventario.SetItem(2, 2, 0, 0, 600, 1, 0, 0, 0, 0, 0, "Poción azul") + Call Inventario.SetItem(5, 2, 0, 0, 600, 1, 0, 0, 0, 0, 0, "Poción azul") + Call Inventario.SetItem(3, 5, 0, 1, 603, 1, 0, 0, 0, 0, 0, "Laúd Élfico") + Call Inventario.SetItem(4, 6, 0, 0, 604, 1, 0, 0, 0, 0, 0, "Anillo de Disolución Mágica") + Else + Call Inventario.SetItem(1, 1, 0, 0, 599, 1, 0, 0, 0, 0, 0, "Poción roja") + Call Inventario.SetItem(2, 2, 0, 0, 600, 1, 0, 0, 0, 0, 0, "Poción azul") + Call Inventario.SetItem(5, 2, 0, 0, 600, 1, 0, 0, 0, 0, 0, "Poción azul") + Call Inventario.SetItem(4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") + Call Inventario.SetItem(3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") + End If + + Call SwitchMap(1) + frmMain.Barras.Enabled = True + + If Hosting = 1 Then + pausa = False + frmMain.Bot.Enabled = False + frmMain.Bot.Enabled = True + frmMain.StaRecovery.Enabled = True + EnCuenta = True + CuentaR = 3 + frmMain.Cuenta.Enabled = True + Call DarPrioridadTarget(1) + Call DarPrioridadTarget(2) + Call GetTargetBotTeam(1) + Call GetTargetBotTeam(2) + End If + + frmMain.Visible = True +End Sub + +Public Sub CrearChars() +'--------------------------------------------------------------------------------------- +' Procedure : CrearChars +' Author : Anagrama +' Date : ??? +' Purpose : Crea todos los personajes con la información otorgada. +'--------------------------------------------------------------------------------------- +' + Dim i As Byte + + For i = 1 To MaxUsers + If charlist(i).ConnID <> -1 Or charlist(i).Bot = 1 Then + Call CrearChar(i) + Call ServerSendData(SendTarget.ToAllButIndex, UserCharIndex, PrepareMessageCharacterCreate(charlist(i).iBody, _ + charlist(i).iHead, charlist(i).heading, i, charlist(i).Pos.X, charlist(i).Pos.Y, _ + charlist(i).iArma, charlist(i).iEscudo, charlist(i).iCasco, charlist(i).Nombre, charlist(i).MinHP, EnTeam(i))) + If charlist(i).Bot = 0 Then + Call WritePosUpdate(i) + Call WriteUpdateCharStats(i) + End If + End If + Next i + +End Sub + +Public Sub CrearChar(ByVal CharIndex As Integer) +'--------------------------------------------------------------------------------------- +' Procedure : CrearChar +' Author : Anagrama +' Date : ??? +' Purpose : Crea el personaje especifico. +'--------------------------------------------------------------------------------------- +' + Dim Head As Integer + Dim body As Integer + Dim Arma As Byte + Dim Escudo As Byte + Dim Casco As Byte + Dim X As Byte + Dim Y As Byte + Dim N As Byte + Dim tmpSta As Integer + + If RandomBots Then + If charlist(CharIndex).Bot = 1 Then + charlist(CharIndex).Ai = RandomNumber(0, 6) + charlist(CharIndex).Raza = RandomNumber(0, 4) + End If + End If + + If EnTeam(CharIndex) = 1 Then + charlist(CharIndex).Nombre = TeamData1(GetTeamIndex(CharIndex, 1)).Nombre + Else + charlist(CharIndex).Nombre = TeamData2(GetTeamIndex(CharIndex, 2)).Nombre + End If + charlist(CharIndex).MinHP = (VidaClase(charlist(CharIndex).Ai) + VidaRaza(charlist(CharIndex).Raza)) * charlist(CharIndex).Lvl + charlist(CharIndex).MaxHP = (VidaClase(charlist(CharIndex).Ai) + VidaRaza(charlist(CharIndex).Raza)) * charlist(CharIndex).Lvl + tmpSta = StaClase(charlist(CharIndex).Ai) + charlist(CharIndex).MinSTA = tmpSta * charlist(CharIndex).Lvl + 60 + charlist(CharIndex).MaxSTA = tmpSta * charlist(CharIndex).Lvl + 60 + If charlist(CharIndex).Ai = eBotAi.Mago Then + If ModBalance = 1 Then + charlist(CharIndex).MinMAN = Int(ManaBaseClaseRaza(charlist(CharIndex).Ai, charlist(CharIndex).Raza) * ManaBaseModifClase(charlist(CharIndex).Ai)) * (charlist(CharIndex).Lvl - 1) + ManaBaseClaseRaza(charlist(CharIndex).Ai, charlist(CharIndex).Raza) * 3 + charlist(CharIndex).MaxMAN = Int(ManaBaseClaseRaza(charlist(CharIndex).Ai, charlist(CharIndex).Raza) * ManaBaseModifClase(charlist(CharIndex).Ai)) * (charlist(CharIndex).Lvl - 1) + ManaBaseClaseRaza(charlist(CharIndex).Ai, charlist(CharIndex).Raza) * 3 + ElseIf ModBalance = 2 Then + charlist(CharIndex).MinMAN = (Int(ManaBaseClaseRaza(charlist(CharIndex).Ai, charlist(CharIndex).Raza) * ManaBaseModifClase(charlist(CharIndex).Ai)) - 20) * (charlist(CharIndex).Lvl - 1) + ManaStartClase(charlist(CharIndex).Ai) + charlist(CharIndex).MaxMAN = (Int(ManaBaseClaseRaza(charlist(CharIndex).Ai, charlist(CharIndex).Raza) * ManaBaseModifClase(charlist(CharIndex).Ai)) - 20) * (charlist(CharIndex).Lvl - 1) + ManaStartClase(charlist(CharIndex).Ai) + End If + Else + charlist(CharIndex).MinMAN = ManaBaseClaseRaza(charlist(CharIndex).Ai, charlist(CharIndex).Raza) * ManaBaseModifClase(charlist(CharIndex).Ai) * (charlist(CharIndex).Lvl - 1) + ManaStartClase(charlist(CharIndex).Ai) + charlist(CharIndex).MaxMAN = ManaBaseClaseRaza(charlist(CharIndex).Ai, charlist(CharIndex).Raza) * ManaBaseModifClase(charlist(CharIndex).Ai) * (charlist(CharIndex).Lvl - 1) + ManaStartClase(charlist(CharIndex).Ai) + End If + charlist(CharIndex).Fuerza = FuerzaRaza(charlist(CharIndex).Raza) + charlist(CharIndex).Agilidad = AgilidadRaza(charlist(CharIndex).Raza) + body = BodyClaseRaza(charlist(CharIndex).Ai, charlist(CharIndex).Raza) + Head = HeadRazaGenero(charlist(CharIndex).Raza, charlist(CharIndex).Genero) + Arma = ArmaClase(charlist(CharIndex).Ai) + Escudo = EscudoClase(charlist(CharIndex).Ai) + Casco = CascoClase(charlist(CharIndex).Ai) + charlist(CharIndex).MinRM = MinRMClase(charlist(CharIndex).Ai) + charlist(CharIndex).MaxRM = MaxRMClase(charlist(CharIndex).Ai) + charlist(CharIndex).ModEvasion = ModEvasionClase(charlist(CharIndex).Ai) + charlist(CharIndex).ModAtaqueArma = ModAtaqueArmaClase(charlist(CharIndex).Ai) + charlist(CharIndex).ModAtaqueProyectil = ModAtaqueProyectilClase(charlist(CharIndex).Ai) + charlist(CharIndex).ModDañoArma = ModDañoArmaClase(charlist(CharIndex).Ai) + charlist(CharIndex).ModDañoProyectil = ModDañoProyectilClase(charlist(CharIndex).Ai) + charlist(CharIndex).ModEscudo = ModEscudoClase(charlist(CharIndex).Ai) + charlist(CharIndex).MinDef = MinDefBClase(charlist(CharIndex).Ai) + charlist(CharIndex).MaxDef = MaxDefBClase(charlist(CharIndex).Ai) + charlist(CharIndex).MinDefH = MinDefHClase(charlist(CharIndex).Ai) + charlist(CharIndex).MaxDefH = MaxDefHClase(charlist(CharIndex).Ai) + charlist(CharIndex).ArmaMinHit = MinArmaClase(charlist(CharIndex).Ai) + charlist(CharIndex).ArmaMaxHit = MaxArmaClase(charlist(CharIndex).Ai) + charlist(CharIndex).DM = ModDMClase(charlist(CharIndex).Ai) + If charlist(CharIndex).Ai = eBotAi.Paladin Or charlist(CharIndex).Ai = eBotAi.Asesino Then + charlist(CharIndex).MinHit = 1 + MinHitClase(charlist(CharIndex).Ai) * (charlist(CharIndex).Lvl - 34) + MaxHitClase(charlist(CharIndex).Ai) * 34 + charlist(CharIndex).MaxHit = 2 + MinHitClase(charlist(CharIndex).Ai) * (charlist(CharIndex).Lvl - 34) + MaxHitClase(charlist(CharIndex).Ai) * 34 + charlist(CharIndex).TipoArma = 1 + ElseIf charlist(CharIndex).Ai = eBotAi.Guerrero Then + charlist(CharIndex).MinHit = 1 + MinHitClase(charlist(CharIndex).Ai) * (charlist(CharIndex).Lvl - 34) + MaxHitClase(charlist(CharIndex).Ai) * 34 + charlist(CharIndex).MaxHit = 2 + MinHitClase(charlist(CharIndex).Ai) * (charlist(CharIndex).Lvl - 34) + MaxHitClase(charlist(CharIndex).Ai) * 34 + charlist(CharIndex).Refuerzo = ItemData(2).Refuerzo + charlist(CharIndex).TipoArma = 2 + Else + charlist(CharIndex).MinHit = 1 + MinHitClase(charlist(CharIndex).Ai) * (charlist(CharIndex).Lvl - 1) + charlist(CharIndex).MaxHit = 2 + MinHitClase(charlist(CharIndex).Ai) * (charlist(CharIndex).Lvl - 1) + charlist(CharIndex).TipoArma = 1 + End If + + If EnTeam(CharIndex) = 1 Then + X = 35 + GetTeamIndex(CharIndex, 1) + Y = 36 + Else + X = 61 - GetTeamIndex(CharIndex, 2) + Y = 57 + End If + + If charlist(CharIndex).Bot = 1 Then + If EnTeam(CharIndex) = 2 Then + If UBound(Team2) = 1 Then + charlist(CharIndex).Nombre = "Anagrama" + Else + charlist(CharIndex).Nombre = "Anagrama " & CharIndex + End If + charlist(CharIndex).ComportamientoHechizos = IIf(RandomNumber(1, 10) <= 3, 1, 2) + charlist(CharIndex).ComportamientoPotas = IIf(RandomNumber(1, 10) <= 3, 1, 2) + + If charlist(CharIndex).Ai = eBotAi.Paladin Or charlist(CharIndex).Ai = eBotAi.Druida Or charlist(CharIndex).Ai = eBotAi.Asesino Then + charlist(CharIndex).ComportamientoCombo = 1 + ElseIf charlist(CharIndex).Ai = eBotAi.Bardo Then + charlist(CharIndex).ComportamientoCombo = 2 + ElseIf charlist(CharIndex).Ai = eBotAi.Clerigo Then + charlist(CharIndex).ComportamientoCombo = IIf(RandomNumber(1, 10) > 1, 1, 2) + End If + + If charlist(CharIndex).Ai <> eBotAi.Guerrero Then + charlist(CharIndex).TipoPocion = RandomNumber(1, 2) + charlist(CharIndex).Lanzando = RandomNumber(0, 1) + Else + charlist(CharIndex).TipoPocion = 1 + charlist(CharIndex).Lanzando = 1 + End If + Else + If UBound(Team1) = 1 Then + charlist(CharIndex).Nombre = "Anagrama" + Else + charlist(CharIndex).Nombre = "Anagrama " & CharIndex + End If + charlist(CharIndex).ComportamientoHechizos = IIf(RandomNumber(1, 10) <= 3, 1, 2) + charlist(CharIndex).ComportamientoPotas = IIf(RandomNumber(1, 10) <= 3, 1, 2) + + If charlist(CharIndex).Ai = eBotAi.Paladin Or charlist(CharIndex).Ai = eBotAi.Druida Or charlist(CharIndex).Ai = eBotAi.Asesino Then + charlist(CharIndex).ComportamientoCombo = 1 + ElseIf charlist(CharIndex).Ai = eBotAi.Bardo Then + charlist(CharIndex).ComportamientoCombo = 2 + ElseIf charlist(CharIndex).Ai = eBotAi.Clerigo Then + charlist(CharIndex).ComportamientoCombo = IIf(RandomNumber(1, 10) > 1, 1, 2) + End If + + If charlist(CharIndex).Ai <> eBotAi.Guerrero Then + charlist(CharIndex).TipoPocion = RandomNumber(1, 2) + charlist(CharIndex).Lanzando = RandomNumber(0, 1) + Else + charlist(CharIndex).TipoPocion = 1 + charlist(CharIndex).Lanzando = 1 + End If + End If + End If + + Call MakeChar(CharIndex, body, Head, 3, X, Y, Arma, Escudo, Casco) +End Sub + +'--------------------------------------------------------------------------------------- +' Procedure : LanzarSpell +' Author : Anagrama +' Date : ??? +' Purpose : Intenta lanzar un hechizo a la posición otorgada, en caso de cumplir los requisitos lo realiza. +'--------------------------------------------------------------------------------------- +' +Public Sub LanzarSpell(ByVal CasterIndex As Integer, ByVal index As Byte, ByVal X As Byte, ByVal Y As Byte) + Dim CharIndex As Integer + Dim daño As Integer + Dim i As Byte + + If charlist(CasterIndex).MinHP = 0 Then + Call WriteConsoleMsg(CasterIndex, "¡¡Estás muerto!!.", FontTypeNames.FONTTYPE_INFO) + Exit Sub + End If + + If charlist(CasterIndex).Ai <> eBotAi.Druida Or index = 1 Then + If charlist(CasterIndex).MinMAN < Hechizo(index).Mana Then + Call WriteConsoleMsg(CasterIndex, "No tienes suficiente mana.", FontTypeNames.FONTTYPE_INFO) + Exit Sub + End If + Else + If charlist(CasterIndex).MinMAN < Hechizo(index).Mana * 0.9 Then + Call WriteConsoleMsg(CasterIndex, "No tienes suficiente mana.", FontTypeNames.FONTTYPE_INFO) + Exit Sub + End If + End If + + If charlist(CasterIndex).MinSTA < Hechizo(index).Sta Then + Call WriteConsoleMsg(CasterIndex, "Estás muy cansado.", FontTypeNames.FONTTYPE_INFO) + Exit Sub + End If + + CharIndex = IIf(MapData(X, Y + 1).CharIndex > 0, MapData(X, Y + 1).CharIndex, MapData(X, Y).CharIndex) + + If CharIndex > 0 Then + If CharIndex = CasterIndex Then + If index = 4 Then + If charlist(CasterIndex).Inmo Then + charlist(CasterIndex).MinMAN = charlist(CasterIndex).MinMAN - IIf(charlist(CasterIndex).Ai <> eBotAi.Druida, Hechizo(index).Mana, Hechizo(index).Mana * 0.9) + charlist(CasterIndex).MinSTA = charlist(CasterIndex).MinSTA - Hechizo(index).Sta + charlist(CasterIndex).Inmo = 0 + Call WriteParalizeOK(CharIndex, charlist(CasterIndex).Inmo) + Call WriteConsoleMsg(CasterIndex, "Has lanzado " & Hechizo(index).name & " sobre " & charlist(CharIndex).Nombre, FontTypeNames.FONTTYPE_FIGHT) + Call WriteUpdateCharStats(CasterIndex) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessageChatOverHead(Hechizo(index).Palabras, CasterIndex, vbCyan)) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessagePlayWave(Hechizo(index).WAV, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessageCreateFX(CharIndex, Hechizo(index).FX, 0)) + End If + End If + Else + If EnTeam(CharIndex) = EnTeam(CasterIndex) Then + If index = 4 Then + charlist(CasterIndex).MinMAN = charlist(CasterIndex).MinMAN - IIf(charlist(CasterIndex).Ai <> eBotAi.Druida, Hechizo(index).Mana, Hechizo(index).Mana * 0.9) + charlist(CasterIndex).MinSTA = charlist(CasterIndex).MinSTA - Hechizo(index).Sta + charlist(CharIndex).Inmo = 0 + If charlist(CharIndex).Bot = 0 Then Call WriteParalizeOK(CharIndex, charlist(CharIndex).Inmo) + Call WriteConsoleMsg(CasterIndex, "Has lanzado " & Hechizo(index).name & " sobre " & charlist(CharIndex).Nombre, FontTypeNames.FONTTYPE_FIGHT) + Call WriteUpdateCharStats(CasterIndex) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessageChatOverHead(Hechizo(index).Palabras, CasterIndex, vbCyan)) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessagePlayWave(Hechizo(index).WAV, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessageCreateFX(CharIndex, Hechizo(index).FX, 0)) + Exit Sub + ElseIf index = 6 Then + If SinResu = 0 Then + If charlist(CharIndex).MinHP > 0 Then Exit Sub + charlist(CasterIndex).MinMAN = charlist(CasterIndex).MinMAN - IIf(charlist(CasterIndex).Ai <> eBotAi.Druida, Hechizo(index).Mana, Hechizo(index).Mana * 0.9) + charlist(CasterIndex).MinSTA = charlist(CasterIndex).MinSTA - Hechizo(index).Sta + charlist(CharIndex).MinHP = 1 + charlist(CharIndex).MinMAN = 0 + charlist(CharIndex).body = BodyData(BodyClaseRaza(charlist(CharIndex).Ai, charlist(CharIndex).Raza)) + charlist(CharIndex).Head = HeadData(HeadRazaGenero(charlist(CharIndex).Raza, charlist(CharIndex).Genero)) + charlist(CharIndex).Arma = WeaponAnimData(ArmaClase(charlist(CharIndex).Ai)) + charlist(CharIndex).Escudo = ShieldAnimData(EscudoClase(charlist(CharIndex).Ai)) + charlist(CharIndex).Casco = CascoAnimData(CascoClase(charlist(CharIndex).Ai)) + charlist(CharIndex).ComportamientoPotas = 4 + charlist(CharIndex).Lanzando = 0 + daño = charlist(CasterIndex).MaxHP - charlist(CasterIndex).MinHP * (1 - charlist(CharIndex).Lvl * 0.015) + If ResuNoVida = 0 Then + charlist(CasterIndex).MinHP = charlist(CasterIndex).MinHP - daño + If charlist(CasterIndex).MinHP <= 0 Then + charlist(CasterIndex).MinHP = 0 + Call CharDie(CasterIndex) + End If + End If + If charlist(CharIndex).ComportamientoCombo = 1 And charlist(CharIndex).Ai = eBotAi.Bardo Then charlist(CharIndex).ComportamientoCombo = IIf(RandomNumber(1, 10) > 1, 2, 1) + Call WriteConsoleMsg(CasterIndex, "Has lanzado " & Hechizo(index).name & " sobre " & charlist(CharIndex).Nombre, FontTypeNames.FONTTYPE_FIGHT) + Call WriteUpdateCharStats(CasterIndex) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessageChatOverHead(Hechizo(index).Palabras, CasterIndex, vbCyan)) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessagePlayWave(Hechizo(index).WAV, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessageCreateFX(CharIndex, Hechizo(index).FX, 0)) + Call DarPrioridadTarget(1) + Exit Sub + Else + Call WriteConsoleMsg(CasterIndex, "No está permitido resucitar.", FontTypeNames.FONTTYPE_INFO) + Exit Sub + End If + Else + Call WriteConsoleMsg(CasterIndex, "No puedes atacar a tus compañeros.", FontTypeNames.FONTTYPE_FIGHT) + Exit Sub + End If + End If + If charlist(CharIndex).MinHP = 0 Then Exit Sub + If charlist(CharIndex).Inmo <> 1 Then CPega = CPega + 1 + If index = 3 Then + If charlist(CharIndex).Inmo = 0 Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + If CharTimer(CharIndex).Check(TimersIndex.WaitH, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitH) + End If + charlist(CasterIndex).MinMAN = charlist(CasterIndex).MinMAN - IIf(charlist(CasterIndex).Ai <> eBotAi.Druida, Hechizo(index).Mana, Hechizo(index).Mana * 0.9) + charlist(CasterIndex).MinSTA = charlist(CasterIndex).MinSTA - Hechizo(index).Sta + charlist(CharIndex).Inmo = 1 + If charlist(CharIndex).Bot = 0 Then Call WriteParalizeOK(CharIndex, charlist(CharIndex).Inmo) + Call CharTimer(CharIndex).SetInterval(TimersIndex.Remo, INT_REMO + RandomNumber(100 * Dificultad, 200 * Dificultad)) + Call CharTimer(CharIndex).Restart(TimersIndex.Remo) + For i = 1 To UBound(Team2) + Call CharTimer(Team2(i)).SetInterval(TimersIndex.RemoOtro, INT_REMOOTRO + RandomNumber(100 * Dificultad, 200 * Dificultad)) + Call CharTimer(Team2(i)).Restart(TimersIndex.RemoOtro) + Next i + If charlist(CharIndex).Ai <> eBotAi.Mago Or charlist(CharIndex).Ai <> eBotAi.Druida Then charlist(CharIndex).ComportamientoCombo = 2 + Call WriteConsoleMsg(CasterIndex, "Has lanzado " & Hechizo(index).name & " sobre " & charlist(CharIndex).Nombre, FontTypeNames.FONTTYPE_FIGHT) + Call WriteUpdateCharStats(CasterIndex) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessageChatOverHead(Hechizo(index).Palabras, CasterIndex, vbCyan)) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessagePlayWave(Hechizo(index).WAV, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessageCreateFX(CharIndex, Hechizo(index).FX, 0)) + If UBound(Team1) > 1 Then + Call GetTargetBotTeam(CasterIndex) + End If + End If + ElseIf index = 1 Then + charlist(CasterIndex).MinMAN = charlist(CasterIndex).MinMAN - Hechizo(index).Mana + charlist(CasterIndex).MinSTA = charlist(CasterIndex).MinSTA - Hechizo(index).Sta + daño = RandomNumber(Hechizo(index).MinHP, Hechizo(index).MaxHP) + daño = daño + (daño * 3 * UserLvl) / 100 + daño = daño * charlist(CasterIndex).DM + daño = daño - RandomNumber(charlist(CharIndex).MinRM, charlist(CharIndex).MaxRM) + charlist(CharIndex).MinHP = charlist(CharIndex).MinHP - daño + Call WriteConsoleMsg(CasterIndex, "Has lanzado " & Hechizo(index).name & " sobre " & charlist(CharIndex).Nombre, FontTypeNames.FONTTYPE_FIGHT) + Call WriteConsoleMsg(CasterIndex, "Le has quitado " & daño & " puntos de vida.", FontTypeNames.FONTTYPE_FIGHT) + If charlist(CharIndex).MinHP <= 0 Then + charlist(CharIndex).MinHP = 0 + Call WriteConsoleMsg(CasterIndex, "Has matado a " & charlist(CharIndex).Nombre, FontTypeNames.FONTTYPE_FIGHT) + Call CharDie(CharIndex) + Call ResetDuelo(CasterIndex) + If UBound(Team1) > 1 Then + Call GetTargetBotTeam(CasterIndex) + End If + End If + Call WriteUpdateCharStats(CasterIndex) + If charlist(CharIndex).Bot = 0 Then Call WriteUpdateCharStats(CharIndex) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessageChatOverHead(Hechizo(index).Palabras, CasterIndex, vbCyan)) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessagePlayWave(Hechizo(index).WAV, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessageCreateFX(CharIndex, Hechizo(index).FX, 0)) + ElseIf index = 2 Then + charlist(CasterIndex).MinMAN = charlist(CasterIndex).MinMAN - IIf(charlist(CasterIndex).Ai <> eBotAi.Druida, Hechizo(index).Mana, Hechizo(index).Mana * 0.9) + charlist(CasterIndex).MinSTA = charlist(CasterIndex).MinSTA - Hechizo(index).Sta + daño = RandomNumber(Hechizo(index).MinHP, Hechizo(index).MaxHP) + daño = daño + (daño * 3 * UserLvl) / 100 + daño = daño * charlist(CasterIndex).DM + daño = daño - RandomNumber(charlist(CharIndex).MinRM, charlist(CharIndex).MaxRM) + charlist(CharIndex).MinHP = charlist(CharIndex).MinHP - daño + Call WriteConsoleMsg(CasterIndex, "Has lanzado " & Hechizo(index).name & " sobre " & charlist(CharIndex).Nombre, FontTypeNames.FONTTYPE_FIGHT) + Call WriteConsoleMsg(CasterIndex, "Le has quitado " & daño & " puntos de vida.", FontTypeNames.FONTTYPE_FIGHT) + If charlist(CharIndex).MinHP <= 0 Then + charlist(CharIndex).MinHP = 0 + Call WriteConsoleMsg(CasterIndex, "Has matado a " & charlist(CharIndex).Nombre, FontTypeNames.FONTTYPE_FIGHT) + Call CharDie(CharIndex) + Call ResetDuelo(CasterIndex) + If UBound(Team1) > 1 Then + Call GetTargetBotTeam(CasterIndex) + End If + End If + Call WriteUpdateCharStats(CasterIndex) + If charlist(CharIndex).Bot = 0 Then Call WriteUpdateCharStats(CharIndex) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessageChatOverHead(Hechizo(index).Palabras, CasterIndex, vbCyan)) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessagePlayWave(Hechizo(index).WAV, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessageCreateFX(CharIndex, Hechizo(index).FX, 0)) + ElseIf index = 5 Then + charlist(CasterIndex).MinMAN = charlist(CasterIndex).MinMAN - Hechizo(index).Mana + charlist(CasterIndex).MinSTA = charlist(CasterIndex).MinSTA - Hechizo(index).Sta + daño = RandomNumber(Hechizo(index).MinHP, Hechizo(index).MaxHP) + daño = daño + (daño * 3 * UserLvl) / 100 + daño = daño - RandomNumber(charlist(CharIndex).MinRM, charlist(CharIndex).MaxRM) + charlist(CharIndex).MinHP = charlist(CharIndex).MinHP - daño + Call WriteConsoleMsg(CasterIndex, "Has lanzado " & Hechizo(index).name & " sobre " & charlist(CharIndex).Nombre, FontTypeNames.FONTTYPE_FIGHT) + Call WriteConsoleMsg(CasterIndex, "Le has quitado " & daño & " puntos de vida.", FontTypeNames.FONTTYPE_FIGHT) + If charlist(CharIndex).MinHP <= 0 Then + charlist(CharIndex).MinHP = 0 + Call WriteConsoleMsg(CasterIndex, "Has matado a " & charlist(CharIndex).Nombre, FontTypeNames.FONTTYPE_FIGHT) + Call CharDie(CharIndex) + Call ResetDuelo(CasterIndex) + If UBound(Team1) > 1 Then + Call GetTargetBotTeam(CasterIndex) + End If + End If + Call WriteUpdateCharStats(CasterIndex) + If charlist(CharIndex).Bot = 0 Then Call WriteUpdateCharStats(CharIndex) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessageChatOverHead(Hechizo(index).Palabras, CasterIndex, vbCyan)) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessagePlayWave(Hechizo(index).WAV, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + Call ServerSendData(SendTarget.ToAll, CasterIndex, PrepareMessageCreateFX(CharIndex, Hechizo(index).FX, 0)) + Else: Exit Sub + End If + If (charlist(CharIndex).ComportamientoPotas = 2 Or charlist(CharIndex).MinHP < charlist(CharIndex).MaxHP / 2) And index <> 3 Then + charlist(CharIndex).ComportamientoPotas = 3 + If charlist(CharIndex).Lanzando = 1 Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + End If + End If + If charlist(CharIndex).Ai = eBotAi.Paladin Or charlist(CharIndex).Ai = eBotAi.Asesino Or charlist(CharIndex).Ai = eBotAi.Clerigo Or charlist(CharIndex).Ai = eBotAi.Bardo Or charlist(CharIndex).Ai = eBotAi.Guerrero Then + If UserParalizado And charlist(CharIndex).Inmo = 0 Then + charlist(CharIndex).ComportamientoPotas = 4 + If charlist(CharIndex).Lanzando = 1 Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + End If + ElseIf UserParalizado And charlist(CharIndex).Inmo Then + If charlist(CharIndex).ComportamientoPotas <> 4 And charlist(CharIndex).MinHP < charlist(CharIndex).MaxHP Then + charlist(CharIndex).ComportamientoPotas = 4 + If charlist(CharIndex).Lanzando = 1 Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + End If + End If + End If + End If + End If + End If + +End Sub + +'--------------------------------------------------------------------------------------- +' Procedure : ResetDuelo +' Author : Anagrama +' Date : ??? +' Purpose : Reinicia el combate al morir uno de los lados. +'--------------------------------------------------------------------------------------- +' +Public Sub ResetDuelo(ByVal CharIndex As Integer, Optional ByVal NumTeam1 As Byte, Optional ByVal NumTeam2 As Byte) + Dim i As Byte + + If CharIndex <> -1 Then '-1 significa que se reinicia el duelo desde la configuracion + If EnTeam(CharIndex) = 1 Then + For i = 1 To UBound(Team2) + If charlist(Team2(i)).MinHP > 0 Then + Call DarPrioridadTarget(2) + Exit Sub + End If + Next i + DGanados = DGanados + 1 + Else + For i = 1 To UBound(Team1) + If charlist(Team1(i)).MinHP > 0 Then + Call DarPrioridadTarget(2) + Exit Sub + End If + Next i + DPerdidos = DPerdidos + 1 + End If + Else + If UBound(Team1) > 0 Then + For i = 1 To UBound(Team1) + charlist(Team1(i)).Ai = 0 + charlist(Team1(i)).Raza = 0 + charlist(Team1(i)).Genero = 0 + charlist(Team1(i)).Lvl = 0 + NumChars = NumChars - 1 + charlist(Team1(i)).Bot = 0 + Call ServerSendData(SendTarget.ToAllButIndex, UserCharIndex, PrepareMessageCharacterRemove(Team1(i))) + Call EraseChar(Team1(i)) + Team1(i) = 0 + Next i + End If + If NumTeam1 > 0 Then + ReDim Team1(1 To NumTeam1) As Integer + Else + ReDim Team1(0 To NumTeam1) As Integer + End If + If UBound(Team2) > 0 Then + For i = 1 To UBound(Team2) + charlist(Team2(i)).Ai = 0 + charlist(Team2(i)).Raza = 0 + charlist(Team2(i)).Genero = 0 + charlist(Team2(i)).Lvl = 0 + NumChars = NumChars - 1 + charlist(Team2(i)).Bot = 0 + Call ServerSendData(SendTarget.ToAllButIndex, UserCharIndex, PrepareMessageCharacterRemove(Team2(i))) + Call EraseChar(Team2(i)) + Team2(i) = 0 + Next i + End If + If NumTeam2 > 0 Then + ReDim Team2(1 To NumTeam2) As Integer + Else + ReDim Team2(0 To NumTeam2) As Integer + End If + If UBound(Team1) > 0 Then + For i = 1 To UBound(Team1) + If TeamData1(i).index > 0 Then + Team1(i) = TeamData1(i).index + charlist(Team1(i)).Ai = TeamData1(i).Clase + charlist(Team1(i)).Raza = TeamData1(i).Raza + charlist(Team1(i)).Genero = TeamData1(i).Genero + charlist(Team1(i)).Lvl = TeamData1(i).Nivel + charlist(Team1(i)).Bot = TeamData1(i).Bot + Else + Team1(i) = NextOpenTeamIndex + TeamData1(i).index = Team1(i) + charlist(Team1(i)).Ai = TeamData1(i).Clase + charlist(Team1(i)).Raza = TeamData1(i).Raza + charlist(Team1(i)).Genero = TeamData1(i).Genero + charlist(Team1(i)).Lvl = TeamData1(i).Nivel + charlist(Team1(i)).Bot = TeamData1(i).Bot + End If + Next i + End If + If UBound(Team2) > 0 Then + For i = 1 To UBound(Team2) + If TeamData2(i).index > 0 Then + Team2(i) = TeamData2(i).index + charlist(Team2(i)).Ai = TeamData2(i).Clase + charlist(Team2(i)).Raza = TeamData2(i).Raza + charlist(Team2(i)).Genero = TeamData2(i).Genero + charlist(Team2(i)).Lvl = TeamData2(i).Nivel + charlist(Team2(i)).Bot = TeamData2(i).Bot + Else + Team2(i) = NextOpenTeamIndex + TeamData2(i).index = Team2(i) + charlist(Team2(i)).Ai = TeamData2(i).Clase + charlist(Team2(i)).Raza = TeamData2(i).Raza + charlist(Team2(i)).Genero = TeamData2(i).Genero + charlist(Team2(i)).Lvl = TeamData2(i).Nivel + charlist(Team2(i)).Bot = TeamData2(i).Bot + End If + Next i + End If + End If + + For i = 1 To MaxUsers + If charlist(i).ConnID <> -1 Or charlist(i).Bot = 1 Then + charlist(i).MinMAN = charlist(i).MaxMAN + charlist(i).MinHP = charlist(i).MaxHP + If charlist(i).Bot = 1 Then + charlist(i).ComportamientoHechizos = IIf(RandomNumber(1, 10) <= 3, 1, 2) + charlist(i).ComportamientoPotas = IIf(RandomNumber(1, 10) <= 3, 1, 2) + Else + If charlist(i).Inmo = 1 Then + charlist(i).Inmo = 0 + Call WriteParalizeOK(i, charlist(i).Inmo) + End If + Call WriteUpdateCharStats(i) + End If + + If CharIndex <> -1 Then + Call ServerSendData(SendTarget.ToAllButIndex, UserCharIndex, PrepareMessageCharacterRemove(i)) + Call EraseChar(i) + End If + End If + Next i + Call CrearChars + Call DarPrioridadTarget(1) + Call DarPrioridadTarget(2) + Call GetTargetBotTeam(1) + Call GetTargetBotTeam(2) + + Call ServerSendData(SendTarget.ToAll, UserCharIndex, PrepareMessageCuentaToggle(1)) + EnCuenta = True + CuentaR = 3 + frmMain.Cuenta.Enabled = True +End Sub + +'--------------------------------------------------------------------------------------- +' Procedure : ActualizarStats +' Author : Anagrama +' Date : ??? +' Purpose : Actualiza la vida y la mana en el formulario. +'--------------------------------------------------------------------------------------- +' +Public Sub ActualizarStats() + frmMain.lblMana = charlist(UserCharIndex).MinMAN & "/" & charlist(UserCharIndex).MaxMAN + frmMain.lblVida = charlist(UserCharIndex).MinHP & "/" & charlist(UserCharIndex).MaxHP +End Sub + +'--------------------------------------------------------------------------------------- +' Procedure : EnTeam +' Author : Anagrama +' Date : ??? +' Purpose : Devuelve en que team esta el char solicitado. +'--------------------------------------------------------------------------------------- +' +Public Function EnTeam(ByVal CharIndex As Integer) As Byte + Dim i As Byte + If UBound(Team1) = 0 Then + EnTeam = 2 + Exit Function + End If + For i = 1 To UBound(Team1) + If Team1(i) = CharIndex Then + EnTeam = 1 + Exit Function + End If + Next i + EnTeam = 2 +End Function + +'--------------------------------------------------------------------------------------- +' Procedure : GetTeamIndex +' Author : Anagrama +' Date : ??? +' Purpose : Devuelve el indice que ocupa en el team. +'--------------------------------------------------------------------------------------- +' +Public Function GetTeamIndex(ByVal CharIndex As Integer, ByVal Team As Byte) As Byte + Dim i As Byte + + If Team = 1 Then + For i = 1 To UBound(Team1) + If Team1(i) = CharIndex Then + GetTeamIndex = i + Exit Function + End If + Next i + ElseIf Team = 2 Then + For i = 1 To UBound(Team2) + If Team2(i) = CharIndex Then + GetTeamIndex = i + Exit Function + End If + Next i + End If +End Function + +Public Sub LoadBalance(ByVal file As String) +'--------------------------------------------------------------------------------------- +' Procedure : LoadBalance +' Author : Anagrama +' Date : ??? +' Purpose : Carga el balance seleccionado. +'--------------------------------------------------------------------------------------- + Dim path As String + Dim i As Byte + Dim Leer As New clsIniReader + + path = PathBalance & file & ".dat" + + If Not FileExist(path, vbArchive) Then + MsgBox "Error cargando archivo de balance, el archivo no existe." + Exit Sub + End If + + Call Leer.Initialize(path) + + ModBalance = Val(Leer.GetValue("INIT", "ModBalance")) + + StaClase(eBotAi.Mago) = Val(Leer.GetValue("StaClase", "StaMago")) + StaClase(eBotAi.Paladin) = Val(Leer.GetValue("StaClase", "StaPaladin")) + StaClase(eBotAi.Clerigo) = Val(Leer.GetValue("StaClase", "StaClerigo")) + StaClase(eBotAi.Asesino) = Val(Leer.GetValue("StaClase", "StaAsesino")) + StaClase(eBotAi.Bardo) = Val(Leer.GetValue("StaClase", "StaBardo")) + StaClase(eBotAi.Druida) = Val(Leer.GetValue("StaClase", "StaDruida")) + StaClase(eBotAi.Guerrero) = Val(Leer.GetValue("StaClase", "StaGuerrero")) + + PrioridadClase(eBotAi.Mago) = Val(Leer.GetValue("Prioridad", "PrioridadMago")) + PrioridadClase(eBotAi.Paladin) = Val(Leer.GetValue("Prioridad", "PrioridadPaladin")) + PrioridadClase(eBotAi.Clerigo) = Val(Leer.GetValue("Prioridad", "PrioridadClerigo")) + PrioridadClase(eBotAi.Asesino) = Val(Leer.GetValue("Prioridad", "PrioridadAsesino")) + PrioridadClase(eBotAi.Bardo) = Val(Leer.GetValue("Prioridad", "PrioridadBardo")) + PrioridadClase(eBotAi.Druida) = Val(Leer.GetValue("Prioridad", "PrioridadDruida")) + PrioridadClase(eBotAi.Guerrero) = Val(Leer.GetValue("Prioridad", "PrioridadGuerrero")) + PrioridadRaza(eRazaAi.Humano) = Val(Leer.GetValue("Prioridad", "PrioridadH")) + PrioridadRaza(eRazaAi.Enano) = Val(Leer.GetValue("Prioridad", "PrioridadEN")) + PrioridadRaza(eRazaAi.Gnomo) = Val(Leer.GetValue("Prioridad", "PrioridadG")) + PrioridadRaza(eRazaAi.Elfo) = Val(Leer.GetValue("Prioridad", "PrioridadE")) + PrioridadRaza(eRazaAi.Drow) = Val(Leer.GetValue("Prioridad", "PrioridadEO")) + + VidaClase(eBotAi.Mago) = Val(Leer.GetValue("VidaClase", "Mago")) + VidaClase(eBotAi.Paladin) = Val(Leer.GetValue("VidaClase", "Paladin")) + VidaClase(eBotAi.Clerigo) = Val(Leer.GetValue("VidaClase", "Clerigo")) + VidaClase(eBotAi.Asesino) = Val(Leer.GetValue("VidaClase", "Asesino")) + VidaClase(eBotAi.Bardo) = Val(Leer.GetValue("VidaClase", "Bardo")) + VidaClase(eBotAi.Druida) = Val(Leer.GetValue("VidaClase", "Druida")) + VidaClase(eBotAi.Guerrero) = Val(Leer.GetValue("VidaClase", "Guerrero")) + + VidaRaza(eRazaAi.Humano) = Val(Leer.GetValue("VidaRaza", "Humano")) + VidaRaza(eRazaAi.Enano) = Val(Leer.GetValue("VidaRaza", "Enano")) + VidaRaza(eRazaAi.Gnomo) = Val(Leer.GetValue("VidaRaza", "Gnomo")) + VidaRaza(eRazaAi.Elfo) = Val(Leer.GetValue("VidaRaza", "Elfo")) + VidaRaza(eRazaAi.Drow) = Val(Leer.GetValue("VidaRaza", "ElfoDrow")) + + ManaBaseClaseRaza(eBotAi.Mago, eRazaAi.Humano) = Val(Leer.GetValue("ManaBaseClaseRaza", "MagoH")) + ManaBaseClaseRaza(eBotAi.Mago, eRazaAi.Gnomo) = Val(Leer.GetValue("ManaBaseClaseRaza", "MagoG")) + ManaBaseClaseRaza(eBotAi.Mago, eRazaAi.Elfo) = Val(Leer.GetValue("ManaBaseClaseRaza", "MagoE")) + ManaBaseClaseRaza(eBotAi.Mago, eRazaAi.Enano) = Val(Leer.GetValue("ManaBaseClaseRaza", "MagoEN")) + ManaBaseClaseRaza(eBotAi.Mago, eRazaAi.Drow) = Val(Leer.GetValue("ManaBaseClaseRaza", "MagoEO")) + ManaBaseClaseRaza(eBotAi.Paladin, eRazaAi.Humano) = Val(Leer.GetValue("ManaBaseClaseRaza", "PaladinH")) + ManaBaseClaseRaza(eBotAi.Paladin, eRazaAi.Gnomo) = Val(Leer.GetValue("ManaBaseClaseRaza", "PaladinG")) + ManaBaseClaseRaza(eBotAi.Paladin, eRazaAi.Elfo) = Val(Leer.GetValue("ManaBaseClaseRaza", "PaladinE")) + ManaBaseClaseRaza(eBotAi.Paladin, eRazaAi.Enano) = Val(Leer.GetValue("ManaBaseClaseRaza", "PaladinEN")) + ManaBaseClaseRaza(eBotAi.Paladin, eRazaAi.Drow) = Val(Leer.GetValue("ManaBaseClaseRaza", "PaladinEO")) + ManaBaseClaseRaza(eBotAi.Asesino, eRazaAi.Humano) = Val(Leer.GetValue("ManaBaseClaseRaza", "AsesinoH")) + ManaBaseClaseRaza(eBotAi.Asesino, eRazaAi.Gnomo) = Val(Leer.GetValue("ManaBaseClaseRaza", "AsesinoG")) + ManaBaseClaseRaza(eBotAi.Asesino, eRazaAi.Elfo) = Val(Leer.GetValue("ManaBaseClaseRaza", "AsesinoE")) + ManaBaseClaseRaza(eBotAi.Asesino, eRazaAi.Enano) = Val(Leer.GetValue("ManaBaseClaseRaza", "AsesinoEN")) + ManaBaseClaseRaza(eBotAi.Asesino, eRazaAi.Drow) = Val(Leer.GetValue("ManaBaseClaseRaza", "AsesinoEO")) + ManaBaseClaseRaza(eBotAi.Bardo, eRazaAi.Humano) = Val(Leer.GetValue("ManaBaseClaseRaza", "BardoH")) + ManaBaseClaseRaza(eBotAi.Bardo, eRazaAi.Gnomo) = Val(Leer.GetValue("ManaBaseClaseRaza", "BardoG")) + ManaBaseClaseRaza(eBotAi.Bardo, eRazaAi.Elfo) = Val(Leer.GetValue("ManaBaseClaseRaza", "BardoE")) + ManaBaseClaseRaza(eBotAi.Bardo, eRazaAi.Enano) = Val(Leer.GetValue("ManaBaseClaseRaza", "BardoEN")) + ManaBaseClaseRaza(eBotAi.Bardo, eRazaAi.Drow) = Val(Leer.GetValue("ManaBaseClaseRaza", "BardoEO")) + ManaBaseClaseRaza(eBotAi.Clerigo, eRazaAi.Humano) = Val(Leer.GetValue("ManaBaseClaseRaza", "ClerigoH")) + ManaBaseClaseRaza(eBotAi.Clerigo, eRazaAi.Gnomo) = Val(Leer.GetValue("ManaBaseClaseRaza", "ClerigoG")) + ManaBaseClaseRaza(eBotAi.Clerigo, eRazaAi.Elfo) = Val(Leer.GetValue("ManaBaseClaseRaza", "ClerigoE")) + ManaBaseClaseRaza(eBotAi.Clerigo, eRazaAi.Enano) = Val(Leer.GetValue("ManaBaseClaseRaza", "ClerigoEN")) + ManaBaseClaseRaza(eBotAi.Clerigo, eRazaAi.Drow) = Val(Leer.GetValue("ManaBaseClaseRaza", "ClerigoEO")) + ManaBaseClaseRaza(eBotAi.Druida, eRazaAi.Humano) = Val(Leer.GetValue("ManaBaseClaseRaza", "DruidaH")) + ManaBaseClaseRaza(eBotAi.Druida, eRazaAi.Gnomo) = Val(Leer.GetValue("ManaBaseClaseRaza", "DruidaG")) + ManaBaseClaseRaza(eBotAi.Druida, eRazaAi.Elfo) = Val(Leer.GetValue("ManaBaseClaseRaza", "DruidaE")) + ManaBaseClaseRaza(eBotAi.Druida, eRazaAi.Enano) = Val(Leer.GetValue("ManaBaseClaseRaza", "DruidaEN")) + ManaBaseClaseRaza(eBotAi.Druida, eRazaAi.Drow) = Val(Leer.GetValue("ManaBaseClaseRaza", "DruidaEO")) + ManaBaseClaseRaza(eBotAi.Guerrero, eRazaAi.Humano) = Val(Leer.GetValue("ManaBaseClaseRaza", "GuerreroH")) + ManaBaseClaseRaza(eBotAi.Guerrero, eRazaAi.Gnomo) = Val(Leer.GetValue("ManaBaseClaseRaza", "GuerreroG")) + ManaBaseClaseRaza(eBotAi.Guerrero, eRazaAi.Elfo) = Val(Leer.GetValue("ManaBaseClaseRaza", "GuerreroE")) + ManaBaseClaseRaza(eBotAi.Guerrero, eRazaAi.Enano) = Val(Leer.GetValue("ManaBaseClaseRaza", "GuerreroEN")) + ManaBaseClaseRaza(eBotAi.Guerrero, eRazaAi.Drow) = Val(Leer.GetValue("ManaBaseClaseRaza", "GuerreroEO")) + + ManaBaseModifClase(eBotAi.Mago) = Val(Leer.GetValue("ManaBaseModifClase", "Mago")) + ManaBaseModifClase(eBotAi.Paladin) = Val(Leer.GetValue("ManaBaseModifClase", "Paladin")) + ManaBaseModifClase(eBotAi.Clerigo) = Val(Leer.GetValue("ManaBaseModifClase", "Clerigo")) + ManaBaseModifClase(eBotAi.Asesino) = Val(Leer.GetValue("ManaBaseModifClase", "Asesino")) + ManaBaseModifClase(eBotAi.Bardo) = Val(Leer.GetValue("ManaBaseModifClase", "Bardo")) + ManaBaseModifClase(eBotAi.Druida) = Val(Leer.GetValue("ManaBaseModifClase", "Druida")) + ManaBaseModifClase(eBotAi.Guerrero) = Val(Leer.GetValue("ManaBaseModifClase", "Guerrero")) + + ManaStartClase(eBotAi.Mago) = Val(Leer.GetValue("ManaStartClase", "Mago")) + ManaStartClase(eBotAi.Paladin) = Val(Leer.GetValue("ManaStartClase", "Paladin")) + ManaStartClase(eBotAi.Clerigo) = Val(Leer.GetValue("ManaStartClase", "Clerigo")) + ManaStartClase(eBotAi.Asesino) = Val(Leer.GetValue("ManaStartClase", "Asesino")) + ManaStartClase(eBotAi.Bardo) = Val(Leer.GetValue("ManaStartClase", "Bardo")) + ManaStartClase(eBotAi.Druida) = Val(Leer.GetValue("ManaStartClase", "Druida")) + ManaStartClase(eBotAi.Guerrero) = Val(Leer.GetValue("ManaStartClase", "Guerrero")) + + MinHitClase(eBotAi.Mago) = Val(Leer.GetValue("MinHitClase", "Mago")) + MinHitClase(eBotAi.Paladin) = Val(Leer.GetValue("MinHitClase", "Paladin")) + MinHitClase(eBotAi.Clerigo) = Val(Leer.GetValue("MinHitClase", "Clerigo")) + MinHitClase(eBotAi.Asesino) = Val(Leer.GetValue("MinHitClase", "Asesino")) + MinHitClase(eBotAi.Bardo) = Val(Leer.GetValue("MinHitClase", "Bardo")) + MinHitClase(eBotAi.Druida) = Val(Leer.GetValue("MinHitClase", "Druida")) + MinHitClase(eBotAi.Guerrero) = Val(Leer.GetValue("MinHitClase", "Guerrero")) + + MaxHitClase(eBotAi.Mago) = Val(Leer.GetValue("MaxHitClase", "Mago")) + MaxHitClase(eBotAi.Paladin) = Val(Leer.GetValue("MaxHitClase", "Paladin")) + MaxHitClase(eBotAi.Clerigo) = Val(Leer.GetValue("MaxHitClase", "Clerigo")) + MaxHitClase(eBotAi.Asesino) = Val(Leer.GetValue("MaxHitClase", "Asesino")) + MaxHitClase(eBotAi.Bardo) = Val(Leer.GetValue("MaxHitClase", "Bardo")) + MaxHitClase(eBotAi.Druida) = Val(Leer.GetValue("MaxHitClase", "Druida")) + MaxHitClase(eBotAi.Guerrero) = Val(Leer.GetValue("MaxHitClase", "Guerrero")) + + FuerzaRaza(eRazaAi.Humano) = Val(Leer.GetValue("FuerzaRaza", "Humano")) + FuerzaRaza(eRazaAi.Enano) = Val(Leer.GetValue("FuerzaRaza", "Enano")) + FuerzaRaza(eRazaAi.Gnomo) = Val(Leer.GetValue("FuerzaRaza", "Gnomo")) + FuerzaRaza(eRazaAi.Elfo) = Val(Leer.GetValue("FuerzaRaza", "Elfo")) + FuerzaRaza(eRazaAi.Drow) = Val(Leer.GetValue("FuerzaRaza", "ElfoDrow")) + + AgilidadRaza(eRazaAi.Humano) = Val(Leer.GetValue("AgilidadRaza", "Humano")) + AgilidadRaza(eRazaAi.Enano) = Val(Leer.GetValue("AgilidadRaza", "Enano")) + AgilidadRaza(eRazaAi.Gnomo) = Val(Leer.GetValue("AgilidadRaza", "Gnomo")) + AgilidadRaza(eRazaAi.Elfo) = Val(Leer.GetValue("AgilidadRaza", "Elfo")) + AgilidadRaza(eRazaAi.Drow) = Val(Leer.GetValue("AgilidadRaza", "ElfoDrow")) + + BodyClaseRaza(eBotAi.Mago, eRazaAi.Humano) = Val(Leer.GetValue("BodyClaseRaza", "MagoH")) + BodyClaseRaza(eBotAi.Mago, eRazaAi.Gnomo) = Val(Leer.GetValue("BodyClaseRaza", "MagoG")) + BodyClaseRaza(eBotAi.Mago, eRazaAi.Elfo) = Val(Leer.GetValue("BodyClaseRaza", "MagoE")) + BodyClaseRaza(eBotAi.Mago, eRazaAi.Enano) = Val(Leer.GetValue("BodyClaseRaza", "MagoEN")) + BodyClaseRaza(eBotAi.Mago, eRazaAi.Drow) = Val(Leer.GetValue("BodyClaseRaza", "MagoEO")) + BodyClaseRaza(eBotAi.Paladin, eRazaAi.Humano) = Val(Leer.GetValue("BodyClaseRaza", "PaladinH")) + BodyClaseRaza(eBotAi.Paladin, eRazaAi.Gnomo) = Val(Leer.GetValue("BodyClaseRaza", "PaladinG")) + BodyClaseRaza(eBotAi.Paladin, eRazaAi.Elfo) = Val(Leer.GetValue("BodyClaseRaza", "PaladinE")) + BodyClaseRaza(eBotAi.Paladin, eRazaAi.Enano) = Val(Leer.GetValue("BodyClaseRaza", "PaladinEN")) + BodyClaseRaza(eBotAi.Paladin, eRazaAi.Drow) = Val(Leer.GetValue("BodyClaseRaza", "PaladinEO")) + BodyClaseRaza(eBotAi.Asesino, eRazaAi.Humano) = Val(Leer.GetValue("BodyClaseRaza", "AsesinoH")) + BodyClaseRaza(eBotAi.Asesino, eRazaAi.Gnomo) = Val(Leer.GetValue("BodyClaseRaza", "AsesinoG")) + BodyClaseRaza(eBotAi.Asesino, eRazaAi.Elfo) = Val(Leer.GetValue("BodyClaseRaza", "AsesinoE")) + BodyClaseRaza(eBotAi.Asesino, eRazaAi.Enano) = Val(Leer.GetValue("BodyClaseRaza", "AsesinoEN")) + BodyClaseRaza(eBotAi.Asesino, eRazaAi.Drow) = Val(Leer.GetValue("BodyClaseRaza", "AsesinoEO")) + BodyClaseRaza(eBotAi.Bardo, eRazaAi.Humano) = Val(Leer.GetValue("BodyClaseRaza", "BardoH")) + BodyClaseRaza(eBotAi.Bardo, eRazaAi.Gnomo) = Val(Leer.GetValue("BodyClaseRaza", "BardoG")) + BodyClaseRaza(eBotAi.Bardo, eRazaAi.Elfo) = Val(Leer.GetValue("BodyClaseRaza", "BardoE")) + BodyClaseRaza(eBotAi.Bardo, eRazaAi.Enano) = Val(Leer.GetValue("BodyClaseRaza", "BardoEN")) + BodyClaseRaza(eBotAi.Bardo, eRazaAi.Drow) = Val(Leer.GetValue("BodyClaseRaza", "BardoEO")) + BodyClaseRaza(eBotAi.Clerigo, eRazaAi.Humano) = Val(Leer.GetValue("BodyClaseRaza", "ClerigoH")) + BodyClaseRaza(eBotAi.Clerigo, eRazaAi.Gnomo) = Val(Leer.GetValue("BodyClaseRaza", "ClerigoG")) + BodyClaseRaza(eBotAi.Clerigo, eRazaAi.Elfo) = Val(Leer.GetValue("BodyClaseRaza", "ClerigoE")) + BodyClaseRaza(eBotAi.Clerigo, eRazaAi.Enano) = Val(Leer.GetValue("BodyClaseRaza", "ClerigoEN")) + BodyClaseRaza(eBotAi.Clerigo, eRazaAi.Drow) = Val(Leer.GetValue("BodyClaseRaza", "ClerigoEO")) + BodyClaseRaza(eBotAi.Druida, eRazaAi.Humano) = Val(Leer.GetValue("BodyClaseRaza", "DruidaH")) + BodyClaseRaza(eBotAi.Druida, eRazaAi.Gnomo) = Val(Leer.GetValue("BodyClaseRaza", "DruidaG")) + BodyClaseRaza(eBotAi.Druida, eRazaAi.Elfo) = Val(Leer.GetValue("BodyClaseRaza", "DruidaE")) + BodyClaseRaza(eBotAi.Druida, eRazaAi.Enano) = Val(Leer.GetValue("BodyClaseRaza", "DruidaEN")) + BodyClaseRaza(eBotAi.Druida, eRazaAi.Drow) = Val(Leer.GetValue("BodyClaseRaza", "DruidaEO")) + BodyClaseRaza(eBotAi.Guerrero, eRazaAi.Humano) = Val(Leer.GetValue("BodyClaseRaza", "GuerreroH")) + BodyClaseRaza(eBotAi.Guerrero, eRazaAi.Gnomo) = Val(Leer.GetValue("BodyClaseRaza", "GuerreroG")) + BodyClaseRaza(eBotAi.Guerrero, eRazaAi.Elfo) = Val(Leer.GetValue("BodyClaseRaza", "GuerreroE")) + BodyClaseRaza(eBotAi.Guerrero, eRazaAi.Enano) = Val(Leer.GetValue("BodyClaseRaza", "GuerreroEN")) + BodyClaseRaza(eBotAi.Guerrero, eRazaAi.Drow) = Val(Leer.GetValue("BodyClaseRaza", "GuerreroEO")) + + HeadRazaGenero(eRazaAi.Humano, 0) = Val(Leer.GetValue("HeadRazaGenero", "HumanoH")) + HeadRazaGenero(eRazaAi.Humano, 1) = Val(Leer.GetValue("HeadRazaGenero", "HumanoM")) + HeadRazaGenero(eRazaAi.Enano, 0) = Val(Leer.GetValue("HeadRazaGenero", "EnanoH")) + HeadRazaGenero(eRazaAi.Enano, 1) = Val(Leer.GetValue("HeadRazaGenero", "EnanoM")) + HeadRazaGenero(eRazaAi.Elfo, 0) = Val(Leer.GetValue("HeadRazaGenero", "ElfoH")) + HeadRazaGenero(eRazaAi.Elfo, 1) = Val(Leer.GetValue("HeadRazaGenero", "ElfoM")) + HeadRazaGenero(eRazaAi.Gnomo, 0) = Val(Leer.GetValue("HeadRazaGenero", "GnomoH")) + HeadRazaGenero(eRazaAi.Gnomo, 1) = Val(Leer.GetValue("HeadRazaGenero", "GnomoM")) + HeadRazaGenero(eRazaAi.Drow, 0) = Val(Leer.GetValue("HeadRazaGenero", "ElfoDrowH")) + HeadRazaGenero(eRazaAi.Drow, 1) = Val(Leer.GetValue("HeadRazaGenero", "ElfoDrowM")) + + ArmaClase(eBotAi.Mago) = Val(Leer.GetValue("ArmaClase", "Mago")) + ArmaClase(eBotAi.Paladin) = Val(Leer.GetValue("ArmaClase", "Paladin")) + ArmaClase(eBotAi.Clerigo) = Val(Leer.GetValue("ArmaClase", "Clerigo")) + ArmaClase(eBotAi.Asesino) = Val(Leer.GetValue("ArmaClase", "Asesino")) + ArmaClase(eBotAi.Bardo) = Val(Leer.GetValue("ArmaClase", "Bardo")) + ArmaClase(eBotAi.Druida) = Val(Leer.GetValue("ArmaClase", "Druida")) + ArmaClase(eBotAi.Guerrero) = Val(Leer.GetValue("ArmaClase", "Guerrero")) + + CascoClase(eBotAi.Mago) = Val(Leer.GetValue("CascoClase", "Mago")) + CascoClase(eBotAi.Paladin) = Val(Leer.GetValue("CascoClase", "Paladin")) + CascoClase(eBotAi.Clerigo) = Val(Leer.GetValue("CascoClase", "Clerigo")) + CascoClase(eBotAi.Asesino) = Val(Leer.GetValue("CascoClase", "Asesino")) + CascoClase(eBotAi.Bardo) = Val(Leer.GetValue("CascoClase", "Bardo")) + CascoClase(eBotAi.Druida) = Val(Leer.GetValue("CascoClase", "Druida")) + CascoClase(eBotAi.Guerrero) = Val(Leer.GetValue("CascoClase", "Guerrero")) + + EscudoClase(eBotAi.Mago) = Val(Leer.GetValue("EscudoClase", "Mago")) + EscudoClase(eBotAi.Paladin) = Val(Leer.GetValue("EscudoClase", "Paladin")) + EscudoClase(eBotAi.Clerigo) = Val(Leer.GetValue("EscudoClase", "Clerigo")) + EscudoClase(eBotAi.Asesino) = Val(Leer.GetValue("EscudoClase", "Asesino")) + EscudoClase(eBotAi.Bardo) = Val(Leer.GetValue("EscudoClase", "Bardo")) + EscudoClase(eBotAi.Druida) = Val(Leer.GetValue("EscudoClase", "Druida")) + EscudoClase(eBotAi.Guerrero) = Val(Leer.GetValue("EscudoClase", "Guerrero")) + + MinArmaClase(eBotAi.Mago) = Val(Leer.GetValue("MinArmaClase", "Mago")) + MinArmaClase(eBotAi.Paladin) = Val(Leer.GetValue("MinArmaClase", "Paladin")) + MinArmaClase(eBotAi.Clerigo) = Val(Leer.GetValue("MinArmaClase", "Clerigo")) + MinArmaClase(eBotAi.Asesino) = Val(Leer.GetValue("MinArmaClase", "Asesino")) + MinArmaClase(eBotAi.Bardo) = Val(Leer.GetValue("MinArmaClase", "Bardo")) + MinArmaClase(eBotAi.Druida) = Val(Leer.GetValue("MinArmaClase", "Druida")) + MinArmaClase(eBotAi.Guerrero) = Val(Leer.GetValue("MinArmaClase", "Guerrero")) + + MaxArmaClase(eBotAi.Mago) = Val(Leer.GetValue("MaxArmaClase", "Mago")) + MaxArmaClase(eBotAi.Paladin) = Val(Leer.GetValue("MaxArmaClase", "Paladin")) + MaxArmaClase(eBotAi.Clerigo) = Val(Leer.GetValue("MaxArmaClase", "Clerigo")) + MaxArmaClase(eBotAi.Asesino) = Val(Leer.GetValue("MaxArmaClase", "Asesino")) + MaxArmaClase(eBotAi.Bardo) = Val(Leer.GetValue("MaxArmaClase", "Bardo")) + MaxArmaClase(eBotAi.Druida) = Val(Leer.GetValue("MaxArmaClase", "Druida")) + MaxArmaClase(eBotAi.Guerrero) = Val(Leer.GetValue("MaxArmaClase", "Guerrero")) + + MinDefBClase(eBotAi.Mago) = Val(Leer.GetValue("MinDefBClase", "Mago")) + MinDefBClase(eBotAi.Paladin) = Val(Leer.GetValue("MinDefBClase", "Paladin")) + MinDefBClase(eBotAi.Clerigo) = Val(Leer.GetValue("MinDefBClase", "Clerigo")) + MinDefBClase(eBotAi.Asesino) = Val(Leer.GetValue("MinDefBClase", "Asesino")) + MinDefBClase(eBotAi.Bardo) = Val(Leer.GetValue("MinDefBClase", "Bardo")) + MinDefBClase(eBotAi.Druida) = Val(Leer.GetValue("MinDefBClase", "Druida")) + MinDefBClase(eBotAi.Guerrero) = Val(Leer.GetValue("MinDefBClase", "Guerrero")) + + MaxDefBClase(eBotAi.Mago) = Val(Leer.GetValue("MaxDefBClase", "Mago")) + MaxDefBClase(eBotAi.Paladin) = Val(Leer.GetValue("MaxDefBClase", "Paladin")) + MaxDefBClase(eBotAi.Clerigo) = Val(Leer.GetValue("MaxDefBClase", "Clerigo")) + MaxDefBClase(eBotAi.Asesino) = Val(Leer.GetValue("MaxDefBClase", "Asesino")) + MaxDefBClase(eBotAi.Bardo) = Val(Leer.GetValue("MaxDefBClase", "Bardo")) + MaxDefBClase(eBotAi.Druida) = Val(Leer.GetValue("MaxDefBClase", "Druida")) + MaxDefBClase(eBotAi.Guerrero) = Val(Leer.GetValue("MaxDefBClase", "Guerrero")) + + MinDefHClase(eBotAi.Mago) = Val(Leer.GetValue("MinDefHClase", "Mago")) + MinDefHClase(eBotAi.Paladin) = Val(Leer.GetValue("MinDefHClase", "Paladin")) + MinDefHClase(eBotAi.Clerigo) = Val(Leer.GetValue("MinDefHClase", "Clerigo")) + MinDefHClase(eBotAi.Asesino) = Val(Leer.GetValue("MinDefHClase", "Asesino")) + MinDefHClase(eBotAi.Bardo) = Val(Leer.GetValue("MinDefHClase", "Bardo")) + MinDefHClase(eBotAi.Druida) = Val(Leer.GetValue("MinDefHClase", "Druida")) + + MaxDefHClase(eBotAi.Mago) = Val(Leer.GetValue("MaxDefHClase", "Mago")) + MaxDefHClase(eBotAi.Paladin) = Val(Leer.GetValue("MaxDefHClase", "Paladin")) + MaxDefHClase(eBotAi.Clerigo) = Val(Leer.GetValue("MaxDefHClase", "Clerigo")) + MaxDefHClase(eBotAi.Asesino) = Val(Leer.GetValue("MaxDefHClase", "Asesino")) + MaxDefHClase(eBotAi.Bardo) = Val(Leer.GetValue("MaxDefHClase", "Bardo")) + MaxDefHClase(eBotAi.Druida) = Val(Leer.GetValue("MaxDefHClase", "Druida")) + MaxDefHClase(eBotAi.Guerrero) = Val(Leer.GetValue("MaxDefHClase", "Guerrero")) + + MinRMClase(eBotAi.Mago) = Val(Leer.GetValue("MinRMClase", "Mago")) + MinRMClase(eBotAi.Paladin) = Val(Leer.GetValue("MinRMClase", "Paladin")) + MinRMClase(eBotAi.Clerigo) = Val(Leer.GetValue("MinRMClase", "Clerigo")) + MinRMClase(eBotAi.Asesino) = Val(Leer.GetValue("MinRMClase", "Asesino")) + MinRMClase(eBotAi.Bardo) = Val(Leer.GetValue("MinRMClase", "Bardo")) + MinRMClase(eBotAi.Druida) = Val(Leer.GetValue("MinRMClase", "Druida")) + MinRMClase(eBotAi.Guerrero) = Val(Leer.GetValue("MinRMClase", "Guerrero")) + + MaxRMClase(eBotAi.Mago) = Val(Leer.GetValue("MaxRMClase", "Mago")) + MaxRMClase(eBotAi.Paladin) = Val(Leer.GetValue("MaxRMClase", "Paladin")) + MaxRMClase(eBotAi.Clerigo) = Val(Leer.GetValue("MaxRMClase", "Clerigo")) + MaxRMClase(eBotAi.Asesino) = Val(Leer.GetValue("MaxRMClase", "Asesino")) + MaxRMClase(eBotAi.Bardo) = Val(Leer.GetValue("MaxRMClase", "Bardo")) + MaxRMClase(eBotAi.Druida) = Val(Leer.GetValue("MaxRMClase", "Druida")) + MaxRMClase(eBotAi.Guerrero) = Val(Leer.GetValue("MaxRMClase", "Guerrero")) + + ModEvasionClase(eBotAi.Mago) = Val(Leer.GetValue("ModEvasionClase", "Mago")) + ModEvasionClase(eBotAi.Paladin) = Val(Leer.GetValue("ModEvasionClase", "Paladin")) + ModEvasionClase(eBotAi.Clerigo) = Val(Leer.GetValue("ModEvasionClase", "Clerigo")) + ModEvasionClase(eBotAi.Asesino) = Val(Leer.GetValue("ModEvasionClase", "Asesino")) + ModEvasionClase(eBotAi.Bardo) = Val(Leer.GetValue("ModEvasionClase", "Bardo")) + ModEvasionClase(eBotAi.Druida) = Val(Leer.GetValue("ModEvasionClase", "Druida")) + ModEvasionClase(eBotAi.Guerrero) = Val(Leer.GetValue("ModEvasionClase", "Guerrero")) + + ModAtaqueArmaClase(eBotAi.Mago) = Val(Leer.GetValue("ModAtaqueArmaClase", "Mago")) + ModAtaqueArmaClase(eBotAi.Paladin) = Val(Leer.GetValue("ModAtaqueArmaClase", "Paladin")) + ModAtaqueArmaClase(eBotAi.Clerigo) = Val(Leer.GetValue("ModAtaqueArmaClase", "Clerigo")) + ModAtaqueArmaClase(eBotAi.Asesino) = Val(Leer.GetValue("ModAtaqueArmaClase", "Asesino")) + ModAtaqueArmaClase(eBotAi.Bardo) = Val(Leer.GetValue("ModAtaqueArmaClase", "Bardo")) + ModAtaqueArmaClase(eBotAi.Druida) = Val(Leer.GetValue("ModAtaqueArmaClase", "Druida")) + ModAtaqueArmaClase(eBotAi.Guerrero) = Val(Leer.GetValue("ModAtaqueArmaClase", "Guerrero")) + + ModAtaqueProyectilClase(eBotAi.Mago) = Val(Leer.GetValue("ModAtaqueArmaClase", "Mago")) + ModAtaqueProyectilClase(eBotAi.Paladin) = Val(Leer.GetValue("ModAtaqueArmaClase", "Paladin")) + ModAtaqueProyectilClase(eBotAi.Clerigo) = Val(Leer.GetValue("ModAtaqueArmaClase", "Clerigo")) + ModAtaqueProyectilClase(eBotAi.Asesino) = Val(Leer.GetValue("ModAtaqueArmaClase", "Asesino")) + ModAtaqueProyectilClase(eBotAi.Bardo) = Val(Leer.GetValue("ModAtaqueArmaClase", "Bardo")) + ModAtaqueProyectilClase(eBotAi.Druida) = Val(Leer.GetValue("ModAtaqueArmaClase", "Druida")) + ModAtaqueProyectilClase(eBotAi.Guerrero) = Val(Leer.GetValue("ModAtaqueArmaClase", "Guerrero")) + + ModDañoArmaClase(eBotAi.Mago) = Val(Leer.GetValue("ModDañoArmaClase", "Mago")) + ModDañoArmaClase(eBotAi.Paladin) = Val(Leer.GetValue("ModDañoArmaClase", "Paladin")) + ModDañoArmaClase(eBotAi.Clerigo) = Val(Leer.GetValue("ModDañoArmaClase", "Clerigo")) + ModDañoArmaClase(eBotAi.Asesino) = Val(Leer.GetValue("ModDañoArmaClase", "Asesino")) + ModDañoArmaClase(eBotAi.Bardo) = Val(Leer.GetValue("ModDañoArmaClase", "Bardo")) + ModDañoArmaClase(eBotAi.Druida) = Val(Leer.GetValue("ModDañoArmaClase", "Druida")) + ModDañoArmaClase(eBotAi.Guerrero) = Val(Leer.GetValue("ModDañoArmaClase", "Guerrero")) + + ModDañoProyectilClase(eBotAi.Mago) = Val(Leer.GetValue("ModDañoArmaClase", "Mago")) + ModDañoProyectilClase(eBotAi.Paladin) = Val(Leer.GetValue("ModDañoArmaClase", "Paladin")) + ModDañoProyectilClase(eBotAi.Clerigo) = Val(Leer.GetValue("ModDañoArmaClase", "Clerigo")) + ModDañoProyectilClase(eBotAi.Asesino) = Val(Leer.GetValue("ModDañoArmaClase", "Asesino")) + ModDañoProyectilClase(eBotAi.Bardo) = Val(Leer.GetValue("ModDañoArmaClase", "Bardo")) + ModDañoProyectilClase(eBotAi.Druida) = Val(Leer.GetValue("ModDañoArmaClase", "Druida")) + ModDañoProyectilClase(eBotAi.Guerrero) = Val(Leer.GetValue("ModDañoArmaClase", "Guerrero")) + + ModEscudoClase(eBotAi.Mago) = Val(Leer.GetValue("ModEscudoClase", "Mago")) + ModEscudoClase(eBotAi.Paladin) = Val(Leer.GetValue("ModEscudoClase", "Paladin")) + ModEscudoClase(eBotAi.Clerigo) = Val(Leer.GetValue("ModEscudoClase", "Clerigo")) + ModEscudoClase(eBotAi.Asesino) = Val(Leer.GetValue("ModEscudoClase", "Asesino")) + ModEscudoClase(eBotAi.Bardo) = Val(Leer.GetValue("ModEscudoClase", "Bardo")) + ModEscudoClase(eBotAi.Druida) = Val(Leer.GetValue("ModEscudoClase", "Druida")) + ModEscudoClase(eBotAi.Guerrero) = Val(Leer.GetValue("ModEscudoClase", "Guerrero")) + + ModDMClase(eBotAi.Mago) = Val(Leer.GetValue("ModDMClase", "Mago")) + ModDMClase(eBotAi.Paladin) = Val(Leer.GetValue("ModDMClase", "Paladin")) + ModDMClase(eBotAi.Clerigo) = Val(Leer.GetValue("ModDMClase", "Clerigo")) + ModDMClase(eBotAi.Asesino) = Val(Leer.GetValue("ModDMClase", "Asesino")) + ModDMClase(eBotAi.Bardo) = Val(Leer.GetValue("ModDMClase", "Bardo")) + ModDMClase(eBotAi.Druida) = Val(Leer.GetValue("ModDMClase", "Druida")) + ModDMClase(eBotAi.Guerrero) = Val(Leer.GetValue("ModDMClase", "Guerrero")) + + For i = 1 To 6 + Hechizo(i).name = Leer.GetValue("Hechizo" & i, "Nombre") + Hechizo(i).Mana = Val(Leer.GetValue("Hechizo" & i, "Mana")) + Hechizo(i).Sta = Val(Leer.GetValue("Hechizo" & i, "Sta")) + Hechizo(i).MinHP = Val(Leer.GetValue("Hechizo" & i, "MinHP")) + Hechizo(i).MaxHP = Val(Leer.GetValue("Hechizo" & i, "MaxHP")) + Hechizo(i).WAV = Val(Leer.GetValue("Hechizo" & i, "WAV")) + Hechizo(i).FX = Val(Leer.GetValue("Hechizo" & i, "FX")) + Hechizo(i).Palabras = Leer.GetValue("Hechizo" & i, "Palabras") + Next i + + ItemData(1).MinHit = Val(Leer.GetValue("Item1", "MinHit")) + ItemData(1).MaxHit = Val(Leer.GetValue("Item1", "MaxHit")) + ItemData(2).MinHit = Val(Leer.GetValue("Item2", "MinHit")) + ItemData(2).MaxHit = Val(Leer.GetValue("Item2", "MaxHit")) + ItemData(2).Refuerzo = Val(Leer.GetValue("Item2", "Refuerzo")) + ItemData(3).MinRM = Val(Leer.GetValue("Item3", "MinRM")) + ItemData(3).MaxRM = Val(Leer.GetValue("Item3", "MaxRM")) + ItemData(3).DM = Val(Leer.GetValue("Item3", "DM")) + ItemData(4).MinRM = Val(Leer.GetValue("Item4", "MinRM")) + ItemData(4).MaxRM = Val(Leer.GetValue("Item4", "MaxRM")) + ItemData(4).DM = Val(Leer.GetValue("Item4", "DM")) + Set Leer = Nothing +End Sub + +Public Function RandomNum(ByVal max As Integer) As Integer +'--------------------------------------------------------------------------------------- +' Procedure : RandomNum +' Author : Anagrama +' Date : ??? +' Purpose : Una funcion mucho mas aleatoria de la que habia. +'--------------------------------------------------------------------------------------- +' + Randomize + + RandomNum = CInt(Int((max * Rnd()) + 1)) +End Function + +Public Sub CharDie(ByVal CharIndex As Integer) +'--------------------------------------------------------------------------------------- +' Procedure : CharDie +' Author : Anagrama +' Date : ??? +' Purpose : ¿El personaje muere?. +'--------------------------------------------------------------------------------------- +' + Dim i As Byte + + If charlist(CharIndex).Genero = 0 Then + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessagePlayWave(11, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + Else + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessagePlayWave(74, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + End If + If EnTeam(CharIndex) = 2 Then + For i = 1 To UBound(Team2) + If charlist(i).Bot = 1 Then + Call CharTimer(Team2(i)).SetInterval(TimersIndex.Resu, INT_RESU + RandomNumber(100 * Dificultad, 200 * Dificultad)) + Call CharTimer(Team2(i)).Restart(TimersIndex.Resu) + End If + Next i + Else + If UBound(Team1) > 1 Then + For i = 1 To UBound(Team1) + If charlist(i).Bot = 1 Then + Call CharTimer(Team1(i)).SetInterval(TimersIndex.Resu, INT_RESU + RandomNumber(100 * Dificultad, 200 * Dificultad)) + Call CharTimer(Team1(i)).Restart(TimersIndex.Resu) + End If + Next i + End If + End If + If charlist(CharIndex).Bot = 0 And charlist(CharIndex).Inmo = 1 Then + charlist(CharIndex).Inmo = 0 + Call WriteParalizeOK(CharIndex, charlist(CharIndex).Inmo) + End If + charlist(CharIndex).Inmo = 0 + charlist(CharIndex).body = BodyData(7) + charlist(CharIndex).Head = HeadData(11) + charlist(CharIndex).Arma = WeaponAnimData(2) + charlist(CharIndex).Casco = CascoAnimData(2) + charlist(CharIndex).Escudo = ShieldAnimData(2) + Call ServerSendData(SendTarget.ToAllButIndex, UserCharIndex, PrepareMessageCharacterChange(7, _ + 11, charlist(CharIndex).heading, CharIndex, 2, _ + 2, charlist(CharIndex).FxIndex, charlist(CharIndex).FX.Loops, 2)) +End Sub + +Public Sub EquiparItem(ByVal CharIndex As Integer, ByVal Slot As Byte) +'--------------------------------------------------------------------------------------- +' Procedure : EquiparItem +' Author : Anagrama +' Date : ??? +' Purpose : Equipa el item seleccionado. +'--------------------------------------------------------------------------------------- +' + + If Slot = 0 Then Exit Sub + If Inventario.OBJIndex(Slot) < 3 Then Exit Sub + Select Case Inventario.OBJIndex(Slot) + Case 3 + Call Inventario.SetItem(3, 3, 0, 1, 601, 1, 0, 0, 0, 0, 0, "Hacha de Guerra Dos Filos") + Call Inventario.SetItem(2, 4, 0, 0, 602, 1, 0, 0, 0, 0, 0, "Arco de Cazador") + Call Inventario.SetItem(5, 4, 0, 0, 602, 1, 0, 0, 0, 0, 0, "Arco de Cazador") + Case 4 + Call Inventario.SetItem(3, 3, 0, 0, 601, 1, 0, 0, 0, 0, 0, "Hacha de Guerra Dos Filos") + Call Inventario.SetItem(2, 4, 0, 1, 602, 1, 0, 0, 0, 0, 0, "Arco de Cazador") + Call Inventario.SetItem(5, 4, 0, 1, 602, 1, 0, 0, 0, 0, 0, "Arco de Cazador") + Case 5 + Call Inventario.SetItem(3, 5, 0, 1, 603, 1, 0, 0, 0, 0, 0, "Laúd Élfico") + Call Inventario.SetItem(4, 6, 0, 0, 604, 1, 0, 0, 0, 0, 0, "Anillo de Disolución Mágica") + Case 6 + Call Inventario.SetItem(3, 5, 0, 0, 603, 1, 0, 0, 0, 0, 0, "Laúd Élfico") + Call Inventario.SetItem(4, 6, 0, 1, 604, 1, 0, 0, 0, 0, 0, "Anillo de Disolución Mágica") + End Select + Call WriteEquipItem(Slot) +End Sub + +Public Sub LimpiarPrioridadTarget(ByVal Team As Byte) +'--------------------------------------------------------------------------------------- +' Procedure : LimpiarPrioridadTarget +' Author : Anagrama +' Date : ??? +' Purpose : Limpia el array de prioridades del team correspondiente. +'--------------------------------------------------------------------------------------- +' + Dim i As Byte + + If Team = 1 Then + For i = 1 To 5 + Prioridad1(i).Char = 0 + Prioridad1(i).Probabilidad = 0 + Next + Else + For i = 1 To 5 + Prioridad2(i).Char = 0 + Prioridad2(i).Probabilidad = 0 + Next + End If +End Sub + +Public Sub DarPrioridadTarget(ByVal Team As Byte) +'--------------------------------------------------------------------------------------- +' Procedure : DarPrioridadTarget +' Author : Anagrama +' Date : ??? +' Purpose : Llena los array de orden de prioridad de ataque segun el team y llama a calcular la probabilidad de target. +'--------------------------------------------------------------------------------------- +' + Dim i As Byte + Dim a As Byte + + Call LimpiarPrioridadTarget(Team) + + If Team = 1 Then + If UBound(Team1) > 0 Then + For i = 1 To UBound(Team1) + a = 1 + Do While a <= 5 + If Prioridad1(a).Char > 0 Then + If PrioridadClase(charlist(Team1(i)).Ai) < PrioridadClase(charlist(Prioridad1(a).Char).Ai) Then + If a < 5 Then Call PushPrioridad(1, a) + Prioridad1(a).Char = Team1(i) + Exit Do + ElseIf PrioridadClase(charlist(Team1(i)).Ai) = PrioridadClase(charlist(Prioridad1(a).Char).Ai) Then + If PrioridadRaza(charlist(Team1(i)).Raza) < PrioridadRaza(charlist(Prioridad1(a).Char).Raza) Then + If a < 5 Then Call PushPrioridad(1, a) + Prioridad1(a).Char = Team1(i) + Exit Do + End If + End If + Else + Prioridad1(a).Char = Team1(i) + Exit Do + End If + a = a + 1 + Loop + Next + Call CalcProbTarget(1) + End If + Else + If UBound(Team2) > 0 Then + For i = 1 To UBound(Team2) + a = 1 + Do While a <= 5 + If Prioridad2(a).Char > 0 Then + If PrioridadClase(charlist(Team2(i)).Ai) < PrioridadClase(charlist(Prioridad2(a).Char).Ai) Then + If a < 5 Then Call PushPrioridad(2, a) + Prioridad2(a).Char = Team2(i) + Exit Do + ElseIf PrioridadClase(charlist(Team2(i)).Ai) = PrioridadClase(charlist(Prioridad2(a).Char).Ai) Then + If PrioridadRaza(charlist(Team2(i)).Raza) < PrioridadRaza(charlist(Prioridad2(a).Char).Raza) Then + If a < 5 Then Call PushPrioridad(2, a) + Prioridad2(a).Char = Team2(i) + Exit Do + End If + End If + Else + Prioridad2(a).Char = Team2(i) + Exit Do + End If + a = a + 1 + Loop + Next + Call CalcProbTarget(2) + End If + End If + +End Sub + +Public Sub PushPrioridad(ByVal Team As Byte, ByVal Finish As Byte) +'--------------------------------------------------------------------------------------- +' Procedure : PushPrioridad +' Author : Anagrama +' Date : ??? +' Purpose : Empuja el orden de prioridad para atras dejando un lugar abuerto donde se lo solicita. +'--------------------------------------------------------------------------------------- +' + Dim i As Integer + + If Team = 1 Then + For i = 5 To Finish + 1 Step -1 + Prioridad1(i).Char = Prioridad1(i - 1).Char + Prioridad1(i).Probabilidad = Prioridad1(i - 1).Probabilidad + Next + Else + For i = 5 To Finish + 1 Step -1 + Prioridad2(i).Char = Prioridad2(i - 1).Char + Prioridad2(i).Probabilidad = Prioridad2(i - 1).Probabilidad + Next + End If +End Sub + +Public Sub CalcProbTarget(ByVal Team As Byte) +'--------------------------------------------------------------------------------------- +' Procedure : CalcProbTarget +' Author : Anagrama +' Date : ??? +' Purpose : Calcula la probabilidad de focusear a un personaje en base al orden de prioridad y la prioridad del segundo. +'--------------------------------------------------------------------------------------- +' + Dim i As Byte + Dim a As Byte + Dim Diferencia As Byte + + If Team = 1 Then + For i = 1 To UBound(Team1) + If charlist(Prioridad1(i).Char).MinHP > 0 Then + If i < UBound(Team1) Then + a = i + 1 + Do While a <= UBound(Team1) + If charlist(Prioridad1(a).Char).MinHP > 0 Then + Diferencia = PrioridadClase(charlist(Prioridad1(a).Char).Ai) - PrioridadClase(charlist(Prioridad1(i).Char).Ai) + If Diferencia = 0 Then 'Son la misma clase + Prioridad1(i).Probabilidad = 60 + Prioridad1(a).Probabilidad = 30 + ElseIf Diferencia = 1 Then + Prioridad1(i).Probabilidad = 65 + Prioridad1(a).Probabilidad = 25 + ElseIf Diferencia = 2 Then + Prioridad1(i).Probabilidad = 75 + Prioridad1(a).Probabilidad = 15 + ElseIf Diferencia = 3 Then + Prioridad1(i).Probabilidad = 80 + Prioridad1(a).Probabilidad = 10 + ElseIf Diferencia = 4 Then + Prioridad1(i).Probabilidad = 85 + Prioridad1(a).Probabilidad = 10 + ElseIf Diferencia = 5 Then + Prioridad1(i).Probabilidad = 90 + Prioridad1(a).Probabilidad = 5 + ElseIf Diferencia = 6 Then + Prioridad1(i).Probabilidad = 100 + Prioridad1(a).Probabilidad = 0 + End If + Exit Sub + End If + a = a + 1 + Loop + Else + Prioridad1(i).Probabilidad = 100 + End If + End If + Next + Else + For i = 1 To UBound(Team2) + If charlist(Prioridad2(i).Char).MinHP > 0 Then + If i < UBound(Team1) Then + a = i + 1 + Do While a <= UBound(Team2) + If charlist(Prioridad2(a).Char).MinHP > 0 Then + Diferencia = PrioridadClase(charlist(Prioridad2(a).Char).Ai) - PrioridadClase(charlist(Prioridad2(i).Char).Ai) + If Diferencia = 0 Then 'Son la misma clase + Prioridad2(i).Probabilidad = 60 + Prioridad2(a).Probabilidad = 30 + ElseIf Diferencia = 1 Then + Prioridad2(i).Probabilidad = 65 + Prioridad2(a).Probabilidad = 25 + ElseIf Diferencia = 2 Then + Prioridad2(i).Probabilidad = 75 + Prioridad2(a).Probabilidad = 15 + ElseIf Diferencia = 3 Then + Prioridad2(i).Probabilidad = 80 + Prioridad2(a).Probabilidad = 10 + ElseIf Diferencia = 4 Then + Prioridad2(i).Probabilidad = 85 + Prioridad2(a).Probabilidad = 10 + ElseIf Diferencia = 5 Then + Prioridad2(i).Probabilidad = 90 + Prioridad2(a).Probabilidad = 5 + ElseIf Diferencia = 6 Then + Prioridad2(i).Probabilidad = 100 + Prioridad2(a).Probabilidad = 0 + End If + Exit Sub + End If + a = a + 1 + Loop + Else + Prioridad2(i).Probabilidad = 100 + End If + End If + Next + End If +End Sub + +Public Sub VerTile(ByVal CharIndex As Integer, ByVal X As Byte, ByVal Y As Byte) + If MapData(X, Y + 1).CharIndex > 0 Then + If EnTeam(MapData(X, Y + 1).CharIndex) = 1 Then + Call WriteConsoleMsg(CharIndex, "Ves a " & charlist(MapData(X, Y + 1).CharIndex).Nombre & ".", FontTypeNames.FONTTYPE_CITIZEN) + Else + Call WriteConsoleMsg(CharIndex, "Ves a " & charlist(MapData(X, Y + 1).CharIndex).Nombre & ".", FontTypeNames.FONTTYPE_FIGHT) + End If + ElseIf MapData(X, Y).CharIndex > 0 Then + If EnTeam(MapData(X, Y).CharIndex) = 1 Then + Call WriteConsoleMsg(CharIndex, "Ves a " & charlist(MapData(X, Y).CharIndex).Nombre & ".", FontTypeNames.FONTTYPE_CITIZEN) + Else + Call WriteConsoleMsg(CharIndex, "Ves a " & charlist(MapData(X, Y).CharIndex).Nombre & ".", FontTypeNames.FONTTYPE_FIGHT) + End If + Else + Call WriteConsoleMsg(CharIndex, "No ves nada interesante.", FontTypeNames.FONTTYPE_INFO) + End If +End Sub + +Public Sub UsarInvItem(ByVal CharIndex As Integer, ByVal Item As Byte) + If pausa Or EnCuenta Then Exit Sub + If charlist(CharIndex).MinHP = 0 Then + Call WriteConsoleMsg(CharIndex, "¡¡Estás muerto!!.", FontTypeNames.FONTTYPE_INFO) + Exit Sub + End If + Select Case Item + Case 1 + charlist(CharIndex).MinHP = charlist(CharIndex).MinHP + 30 + If charlist(CharIndex).MinHP >= charlist(CharIndex).MaxHP Then charlist(CharIndex).MinHP = charlist(CharIndex).MaxHP + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessagePlayWave(46, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + Call WriteUpdateCharStats(CharIndex) + Case 2 + charlist(CharIndex).MinMAN = charlist(CharIndex).MinMAN + (charlist(CharIndex).MaxMAN * 4) / 100 + charlist(CharIndex).Lvl \ 2 + 40 / charlist(CharIndex).Lvl + If charlist(CharIndex).MinMAN >= charlist(CharIndex).MaxMAN Then charlist(CharIndex).MinMAN = charlist(CharIndex).MaxMAN + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessagePlayWave(46, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + Call WriteUpdateCharStats(CharIndex) + Case 4 + If charlist(CharIndex).TipoArma = 1 Then + Call WriteConsoleMsg(CharIndex, "Debes equipar el arco primero.", FontTypeNames.FONTTYPE_INFO) + End If + End Select +End Sub + +Public Sub IniTimers(ByVal CharIndex As Integer) + Call CharTimer(CharIndex).Start(TimersIndex.Attack) + Call CharTimer(CharIndex).Start(TimersIndex.UseItemWithU) + Call CharTimer(CharIndex).Start(TimersIndex.UseItemWithDblClick) + Call CharTimer(CharIndex).Start(TimersIndex.SendRPU) + Call CharTimer(CharIndex).Start(TimersIndex.CastSpell) + Call CharTimer(CharIndex).Start(TimersIndex.Arrows) + Call CharTimer(CharIndex).Start(TimersIndex.CastAttack) + Call CharTimer(CharIndex).Start(TimersIndex.AttackCast) + Call CharTimer(CharIndex).Start(TimersIndex.UseItem) + Call CharTimer(CharIndex).Start(TimersIndex.GolpeU) + + Call CharTimer(CharIndex).SetInterval(TimersIndex.SendRPU, INT_SENTRPU) + Call CharTimer(CharIndex).SetInterval(TimersIndex.Arrows, INT_ARROWS) + Call CharTimer(CharIndex).SetInterval(TimersIndex.UseItem, INT_MINU) + Call CharTimer(CharIndex).SetInterval(TimersIndex.GolpeU, INT_GOLPEU) + Call CharTimer(CharIndex).SetInterval(TimersIndex.Attack, INT_ATTACK) + Call CharTimer(CharIndex).SetInterval(TimersIndex.UseItemWithDblClick, INT_USEITEMDCK) + Call CharTimer(CharIndex).SetInterval(TimersIndex.UseItemWithU, INT_USEITEMU) + Call CharTimer(CharIndex).SetInterval(TimersIndex.CastSpell, INT_CAST_SPELL) + Call CharTimer(CharIndex).SetInterval(TimersIndex.CastAttack, INT_CAST_ATTACK) + Call CharTimer(CharIndex).SetInterval(TimersIndex.AttackCast, INT_ATTACK_CAST) +End Sub + +Public Sub EquiparInvItem(ByVal CharIndex As Integer, ByVal Slot As Byte) +'--------------------------------------------------------------------------------------- +' Procedure : EquiparInvItem +' Author : Anagrama +' Date : ??? +' Purpose : Equipa el item seleccionado y envía el cambio a los usuarios. +'--------------------------------------------------------------------------------------- +' + + If charlist(CharIndex).Ai = eBotAi.Guerrero Then + Select Case Slot + Case 3 + charlist(CharIndex).Arma = WeaponAnimData(3) + charlist(CharIndex).iArma = 3 + charlist(CharIndex).ArmaMinHit = ItemData(1).MinHit + charlist(CharIndex).ArmaMaxHit = ItemData(1).MaxHit + charlist(CharIndex).Refuerzo = 0 + charlist(CharIndex).TipoArma = 1 + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessagePlayWave(25, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessageCharacterChange(charlist(CharIndex).iBody, _ + charlist(CharIndex).iHead, charlist(CharIndex).heading, CharIndex, charlist(CharIndex).iArma, _ + charlist(CharIndex).iEscudo, charlist(CharIndex).FxIndex, charlist(CharIndex).FX.Loops, charlist(CharIndex).iCasco)) + Case 2, 5 + charlist(CharIndex).Arma = WeaponAnimData(5) + charlist(CharIndex).iArma = 5 + charlist(CharIndex).ArmaMinHit = ItemData(2).MinHit + charlist(CharIndex).ArmaMaxHit = ItemData(2).MaxHit + charlist(CharIndex).Refuerzo = ItemData(2).Refuerzo + charlist(CharIndex).TipoArma = 2 + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessagePlayWave(25, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessageCharacterChange(charlist(CharIndex).iBody, _ + charlist(CharIndex).iHead, charlist(CharIndex).heading, CharIndex, charlist(CharIndex).iArma, _ + charlist(CharIndex).iEscudo, charlist(CharIndex).FxIndex, charlist(CharIndex).FX.Loops, charlist(CharIndex).iCasco)) + End Select + ElseIf charlist(CharIndex).Ai = eBotAi.Bardo Then + Select Case Slot + Case 3 + charlist(CharIndex).MinRM = ItemData(3).MinRM + charlist(CharIndex).MaxRM = ItemData(3).MaxRM + charlist(CharIndex).DM = ItemData(3).DM + Case 4 + charlist(CharIndex).MinRM = ItemData(4).MinRM + charlist(CharIndex).MaxRM = ItemData(4).MaxRM + charlist(CharIndex).DM = ItemData(4).DM + End Select + End If +End Sub + +Public Function NextOpenTeamIndex() As Byte + Dim i As Byte + Dim tmpIndex As Byte + Dim FoundIt As Byte + + tmpIndex = NextOpenUser + + Do While FoundIt = 0 + If UBound(Team1) > 0 Then + For i = 1 To UBound(Team1) + If TeamData1(i).index = tmpIndex Then + tmpIndex = tmpIndex + 1 + FoundIt = 0 + Exit For + End If + If i = UBound(Team1) Then FoundIt = 1 + Next i + End If + For i = 1 To UBound(Team2) + If TeamData2(i).index = tmpIndex Then + tmpIndex = tmpIndex + 1 + FoundIt = 0 + Exit For + End If + If i = UBound(Team2) And UBound(Team1) = 0 Then FoundIt = 1 + Next i + Loop + + NextOpenTeamIndex = tmpIndex +End Function + +Public Sub PushTeamData(ByVal Team As Byte, ByVal Limit As Byte) + Dim i As Byte + If Team = 1 Then + For i = Limit To 4 + TeamData1(i).Clase = TeamData1(i + 1).Clase + TeamData1(i).Raza = TeamData1(i + 1).Raza + TeamData1(i).Genero = TeamData1(i + 1).Genero + TeamData1(i).Nivel = TeamData1(i + 1).Nivel + TeamData1(i).Bot = TeamData1(i + 1).Bot + TeamData1(i).index = TeamData1(i + 1).index + TeamData1(i).Nombre = TeamData1(i + 1).Nombre + Next i + Else + For i = Limit To 4 + TeamData2(i).Clase = TeamData2(i + 1).Clase + TeamData2(i).Raza = TeamData2(i + 1).Raza + TeamData2(i).Genero = TeamData2(i + 1).Genero + TeamData2(i).Nivel = TeamData2(i + 1).Nivel + TeamData2(i).Bot = TeamData2(i + 1).Bot + TeamData2(i).index = TeamData2(i + 1).index + TeamData2(i).Nombre = TeamData2(i + 1).Nombre + Next i + End If +End Sub + +Public Sub CambiarPj(ByVal CharIndex As Integer, ByVal Clase As Byte, ByVal Raza As Byte, ByVal Genero As Byte, ByVal Nivel As Byte, ByVal Team As Byte) + Dim TeamIndex As Byte + + If EnTeam(CharIndex) = 1 Then + TeamIndex = GetTeamIndex(CharIndex, 1) + If Team <> 1 Then + Call PushTeamData(1, TeamIndex) + TeamData2(UBound(Team2) + 1).Clase = Clase + TeamData2(UBound(Team2) + 1).Raza = Raza + TeamData2(UBound(Team2) + 1).Genero = Genero + TeamData2(UBound(Team2) + 1).Nivel = Nivel + TeamData2(UBound(Team2) + 1).index = CharIndex + TeamData2(UBound(Team2) + 1).Nombre = charlist(CharIndex).Nombre + Call ResetDuelo(-1, UBound(Team1) - 1, UBound(Team2) + 1) + Else + TeamData1(TeamIndex).Clase = Clase + TeamData1(TeamIndex).Raza = Raza + TeamData1(TeamIndex).Genero = Genero + TeamData1(TeamIndex).Nivel = Nivel + Call ResetDuelo(-1, UBound(Team1), UBound(Team2)) + End If + Else + TeamIndex = GetTeamIndex(CharIndex, 2) + If Team <> 2 Then + Call PushTeamData(2, TeamIndex) + TeamData1(UBound(Team1) + 1).Clase = Clase + TeamData1(UBound(Team1) + 1).Raza = Raza + TeamData1(UBound(Team1) + 1).Genero = Genero + TeamData1(UBound(Team1) + 1).Nivel = Nivel + TeamData1(UBound(Team1) + 1).index = CharIndex + TeamData1(UBound(Team1) + 1).Nombre = charlist(CharIndex).Nombre + Call ResetDuelo(-1, UBound(Team1) + 1, UBound(Team2) - 1) + Else + TeamData2(TeamIndex).Clase = Clase + TeamData2(TeamIndex).Raza = Raza + TeamData2(TeamIndex).Genero = Genero + TeamData2(TeamIndex).Nivel = Nivel + Call ResetDuelo(-1, UBound(Team1), UBound(Team2)) + End If + End If +End Sub diff --git a/CODIGO/MainTimer.cls b/CODIGO/MainTimer.cls new file mode 100644 index 0000000..5bda5a0 --- /dev/null +++ b/CODIGO/MainTimer.cls @@ -0,0 +1,249 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "clsTimer" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +'************************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the GNU General Public License as published by +'the Free Software Foundation; either version 2 of the License, or +'(at your option) any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the GNU General Public License +'along with this program; if not, write to the Free Software +'Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +'************************************************************************** + +'' +' The MainTimer of the game. +' Controls client´s intervals. +' +' @author Nacho (Integer) integer-x@hotmail.com +' @version 1.0 +' @date 20060428 + +'***************************************************** +'Timer class for Argentum Online +'Designed and implemented by Nacho (Integer) +'integer-x@hotmail.com +'***************************************************** + +Option Explicit + +'' +' How many timers we are going to use- +' +' @see See MainTimer.CreateAll + Private Const CANTIDADTIMERS As Byte = 18 + +'' +' A Timer data structure. +' +' @param Interval How long, in miliseconds, a cicle lasts. +' @param CurrentTick Current Tick in which the Timer is. +' @param StartTick Tick in which current cicle has started. +' @param Run True if the timer is active. + +Private Type Timer + Interval As Long + CurrentTick As Long + StartTick As Long + Run As Boolean +End Type + +'Timers +Dim Timer(1 To CANTIDADTIMERS) As Timer + +Public Enum TimersIndex + Attack = 1 + Work = 2 + UseItemWithU = 3 + UseItemWithDblClick = 4 + SendRPU = 5 + CastSpell = 6 + Arrows = 7 + CastAttack = 8 + UseItem = 9 + WaitP = 10 + WaitH = 11 + Walk = 12 + GolpeU = 13 + AttackCast = 14 + Remo = 15 + Lan = 16 + RemoOtro = 17 + Resu = 18 +End Enum + + +'' +' Window´s API Function. +' A milisecond pricision counter. +' +' @return Miliseconds since midnight. + +Private Declare Function GetTickCount Lib "kernel32" () As Long + +'' +' Sets a new interval for a timer. +' +' @param TimerIndex Timer´s Index +' @param Interval New lenght for the Timer´s cicle in miliseconds. +' @remarks Must be done after creating the timer and before using it, otherwise, Interval will be 0 + +Public Sub SetInterval(ByVal TimerIndex As TimersIndex, ByVal Interval As Long) +'************************************************* +'Author: Nacho (Integer) +'Last modified: +'Desc: Sets a new interval for a timer. +'************************************************* + If TimerIndex < 1 Or TimerIndex > CANTIDADTIMERS Then Exit Sub + + Timer(TimerIndex).Interval = Interval +End Sub + +'' +' Retrieves the interval of a timer. +' +' @param TimerIndex Timer´s Index +' +' @return The requested timer's interval. + +Public Function GetInterval(ByVal TimerIndex As TimersIndex) As Long +'************************************************* +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last modified: 13/10/2008 +'Desc: Retrieves the interval of a timer. +'************************************************* + If TimerIndex < 1 Or TimerIndex > CANTIDADTIMERS Then Exit Function + + GetInterval = Timer(TimerIndex).Interval +End Function + +'' +' Starts the timer. +' +' @param TimerIndex Timer´s Index +' @remarks Do this for starting the timer. + +Public Sub Start(ByVal TimerIndex As TimersIndex) +'************************************************* +'Author: Nacho (Integer) +'Last modified: +'Desc: Starts running the Timer. +'************************************************* + If TimerIndex < 1 Or TimerIndex > CANTIDADTIMERS Then Exit Sub + + Timer(TimerIndex).Run = True 'We allow the Timer to run. +End Sub + +'' +' Resume the timer form where we had stoped. +' +' @param TimerIndex Timer´s Index +' @remarks Makes the Timer continue from where it had stoped. + +Public Sub Continue(ByVal TimerIndex As TimersIndex) +'************************************************* +'Author: Nacho (Integer) +'Last modified: +'Desc: Continue our timer from where we had stopped it. +'************************************************* + If TimerIndex < 1 Or TimerIndex > CANTIDADTIMERS Then Exit Sub + + Timer(TimerIndex).Run = True 'We allow the Timer to run. + + 'We´ll set the StartTick again + Timer(TimerIndex).StartTick = Timer(TimerIndex).StartTick + Timer(TimerIndex).CurrentTick +End Sub + +'' +' Pauses the Timer +' +' @param TimerIndex Timer´s Index +' @remarks Can be resumed with Continue() + +Public Sub Pause(ByVal TimerIndex As TimersIndex) +'************************************************* +'Author: Nacho (Integer) +'Last modified: +'Desc: Pauses the timer. +'************************************************* + If TimerIndex < 1 Or TimerIndex > CANTIDADTIMERS Then Exit Sub + + Timer(TimerIndex).Run = False 'Don´t allow the timer to run. + + Timer(TimerIndex).CurrentTick = GetTickCount - Timer(TimerIndex).StartTick 'Calculates acutual tick +End Sub + +'' +' Check if the timer has already completed it´s cicle. +' +' @param TimerIndex Timer´s Index +' @param Restart If true, restart if we timer has ticked +' @return True if the interval has already been elapsed +' @remarks Can´t be done if the timer is stoped or if it had never been started. + +Public Function Check(ByVal TimerIndex As TimersIndex, Optional Restart As Boolean = True) As Boolean +'************************************************* +'Author: Nacho Agustin (Integer) +'Last modified: 08/26/06 +'Modification: NIGO: Added Restart as boolean +'Desc: Checks if the Timer has alredy "ticked" +'Returns: True if it has ticked, False if not. +'************************************************* + If TimerIndex < 1 Or TimerIndex > CANTIDADTIMERS Then Exit Function + + If Not Timer(TimerIndex).Run Then Exit Function 'If we weren´t allowed to run, exit function + + Timer(TimerIndex).CurrentTick = GetTickCount - Timer(TimerIndex).StartTick 'Calcutates CurrentTick + + If Timer(TimerIndex).CurrentTick >= Timer(TimerIndex).Interval Then + Check = True 'We have Ticked! + If Restart Then + Timer(TimerIndex).StartTick = GetTickCount 'Restart Timer (Nicer than calling Restart() ) + If TimerIndex = TimersIndex.Attack Then + Timer(TimersIndex.AttackCast).StartTick = GetTickCount + ElseIf TimerIndex = TimersIndex.CastSpell Then + Timer(TimersIndex.CastAttack).StartTick = GetTickCount 'Set Cast-Attack interval + ElseIf TimerIndex = TimersIndex.CastAttack Then + Timer(TimersIndex.Attack).StartTick = GetTickCount 'Restart Attack interval + Timer(TimersIndex.AttackCast).StartTick = GetTickCount 'Restart Attack interval + Timer(TimersIndex.CastSpell).StartTick = GetTickCount 'Restart Magic interval + ElseIf TimerIndex = TimersIndex.AttackCast Then + Timer(TimersIndex.Attack).StartTick = GetTickCount 'Restart Attack interval + Timer(TimersIndex.CastSpell).StartTick = GetTickCount 'Restart Magic interval + Timer(TimersIndex.CastAttack).StartTick = GetTickCount 'Restart Magic interval + End If + End If + End If +End Function +'' +' Restarts timer. +' +' @param TimerIndex Timer´s Index + +Public Sub Restart(ByVal TimerIndex As TimersIndex) +'************************************************* +'Author: Nacho Agustin (Integer) +'Last modified: +'Desc: Restarts timer +'************************************************* + If TimerIndex < 1 Or TimerIndex > CANTIDADTIMERS Then Exit Sub + + Timer(TimerIndex).StartTick = GetTickCount +End Sub + diff --git a/CODIGO/ModAreas.bas b/CODIGO/ModAreas.bas new file mode 100644 index 0000000..8be702f --- /dev/null +++ b/CODIGO/ModAreas.bas @@ -0,0 +1,70 @@ +Attribute VB_Name = "ModAreas" +'Argentum Online 0.11.6 +' +'Copyright (C) 2002 Márquez Pablo Ignacio +'Copyright (C) 2002 Otto Perez +'Copyright (C) 2002 Aaron Perkins +'Copyright (C) 2002 Matías Fernando Pequeño +' +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +' +'Argentum Online is based on Baronsoft's VB6 Online RPG +'You can contact the original creator of ORE at aaron@baronsoft.com +'for more information about ORE please visit http://www.baronsoft.com/ +' +' +'You can contact me at: +'morgolock@speedy.com.ar +'www.geocities.com/gmorgolock +'Calle 3 número 983 piso 7 dto A +'La Plata - Pcia, Buenos Aires - Republica Argentina +'Código Postal 1900 +'Pablo Ignacio Márquez + +Option Explicit + +'LAS GUARDAMOS PARA PROCESAR LOS MPs y sabes si borrar personajes +Public MinLimiteX As Integer +Public MaxLimiteX As Integer +Public MinLimiteY As Integer +Public MaxLimiteY As Integer + +Public Sub CambioDeArea(ByVal X As Byte, ByVal Y As Byte) + Dim loopX As Long, loopY As Long + + MinLimiteX = (X \ 9 - 1) * 9 + MaxLimiteX = MinLimiteX + 26 + + MinLimiteY = (Y \ 9 - 1) * 9 + MaxLimiteY = MinLimiteY + 26 + + For loopX = 1 To 100 + For loopY = 1 To 100 + + If (loopY < MinLimiteY) Or (loopY > MaxLimiteY) Or (loopX < MinLimiteX) Or (loopX > MaxLimiteX) Then + 'Erase NPCs + + If MapData(loopX, loopY).CharIndex > 0 Then + If MapData(loopX, loopY).CharIndex <> UserCharIndex Then + Call EraseChar(MapData(loopX, loopY).CharIndex) + End If + End If + + 'Erase OBJs + MapData(loopX, loopY).ObjGrh.GrhIndex = 0 + End If + Next loopY + Next loopX + + Call RefreshAllChars +End Sub diff --git a/CODIGO/Protocol.bas b/CODIGO/Protocol.bas new file mode 100644 index 0000000..cf6595c --- /dev/null +++ b/CODIGO/Protocol.bas @@ -0,0 +1,2683 @@ +Attribute VB_Name = "Protocol" +'************************************************************** +' Protocol.bas - Handles all incoming / outgoing messages for client-server communications. +' Uses a binary protocol designed by myself. +' +' Designed and implemented by Juan Martín Sotuyo Dodero (Maraxus) +' (juansotuyo@gmail.com) +'************************************************************** + +'************************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +'************************************************************************** + +'' +'Handles all incoming / outgoing packets for client - server communications +'The binary prtocol here used was designed by Juan Martín Sotuyo Dodero. +'This is the first time it's used in Alkon, though the second time it's coded. +'This implementation has several enhacements from the first design. +' +' @file Protocol.bas +' @author Juan Martín Sotuyo Dodero (Maraxus) juansotuyo@gmail.com +' @version 1.0.0 +' @date 20060517 + +Option Explicit + +'' +' TODO : /BANIP y /UNBANIP ya no trabajan con nicks. Esto lo puede mentir en forma local el cliente con un paquete a NickToIp + +'' +'When we have a list of strings, we use this to separate them and prevent +'having too many string lengths in the queue. Yes, each string is NULL-terminated :P +Private Const SEPARATOR As String * 1 = vbNullChar + +Private auxiliarBuffer As New clsByteQueue + +Private Type tFont + red As Byte + green As Byte + blue As Byte + bold As Boolean + italic As Boolean +End Type + +Private Enum ServerPacketID + Logged ' LOGGED + Disconnect ' FINOK + UpdateSta ' ASS + UpdateMana ' ASM + UpdateHP ' ASH + ChangeMap ' CM + PosUpdate ' PU + ChatOverHead ' || + ConsoleMsg ' || - Beware!! its the same as above, but it was properly splitted + CharIndexInServer ' IP + CharacterCreate ' CC + CharacterRemove ' BP + CharacterChangeNick + CharacterMove ' MP, +, * and _ ' + ForceCharMove + CharacterChange ' CP + PlayMIDI ' TM + PlayWave ' TW + AreaChanged ' CA + PauseToggle ' BKW + CreateFX ' CFX + UpdateCharStats ' EST + ErrorMsg ' ERR + SetInvisible ' NOVER + ParalizeOK ' PARADOK + Pong + CuentaToggle +End Enum + +Private Enum ClientPacketID + LoginChar 'OLOGIN + Talk '; + Walk 'M + RequestPositionUpdate 'RPU + Attack 'AT + CastSpell 'LH + LeftClick 'LC + UseItem 'USA + WorkLeftClick 'WLC + EquipItem 'EQUI + ChangeHeading 'CHEA + Online '/ONLINE + Quit '/SALIR + Ping '/PING + LanzaFlecha + ChangePj +End Enum + +Public Enum FontTypeNames + FONTTYPE_TALK + FONTTYPE_FIGHT + FONTTYPE_WARNING + FONTTYPE_INFO + FONTTYPE_INFOBOLD + FONTTYPE_EJECUCION + FONTTYPE_PARTY + FONTTYPE_VENENO + FONTTYPE_GUILD + FONTTYPE_SERVER + FONTTYPE_GUILDMSG + FONTTYPE_CONSEJO + FONTTYPE_CONSEJOCAOS + FONTTYPE_CONSEJOVesA + FONTTYPE_CONSEJOCAOSVesA + FONTTYPE_CENTINELA + FONTTYPE_GMMSG + FONTTYPE_GM + FONTTYPE_CITIZEN + FONTTYPE_CONSE + FONTTYPE_DIOS +End Enum + +Public FontTypes(20) As tFont + +'' +' Initializes the fonts array + +Public Sub InitFonts() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + With FontTypes(FontTypeNames.FONTTYPE_TALK) + .red = 255 + .green = 255 + .blue = 255 + End With + + With FontTypes(FontTypeNames.FONTTYPE_FIGHT) + .red = 255 + .bold = 1 + End With + + With FontTypes(FontTypeNames.FONTTYPE_WARNING) + .red = 32 + .green = 51 + .blue = 223 + .bold = 1 + .italic = 1 + End With + + With FontTypes(FontTypeNames.FONTTYPE_INFO) + .red = 65 + .green = 190 + .blue = 156 + End With + + With FontTypes(FontTypeNames.FONTTYPE_INFOBOLD) + .red = 65 + .green = 190 + .blue = 156 + .bold = 1 + End With + + With FontTypes(FontTypeNames.FONTTYPE_EJECUCION) + .red = 130 + .green = 130 + .blue = 130 + .bold = 1 + End With + + With FontTypes(FontTypeNames.FONTTYPE_PARTY) + .red = 255 + .green = 180 + .blue = 250 + End With + + FontTypes(FontTypeNames.FONTTYPE_VENENO).green = 255 + + With FontTypes(FontTypeNames.FONTTYPE_GUILD) + .red = 255 + .green = 255 + .blue = 255 + .bold = 1 + End With + + FontTypes(FontTypeNames.FONTTYPE_SERVER).green = 185 + + With FontTypes(FontTypeNames.FONTTYPE_GUILDMSG) + .red = 228 + .green = 199 + .blue = 27 + End With + + With FontTypes(FontTypeNames.FONTTYPE_CONSEJO) + .red = 130 + .green = 130 + .blue = 255 + .bold = 1 + End With + + With FontTypes(FontTypeNames.FONTTYPE_CONSEJOCAOS) + .red = 255 + .green = 60 + .bold = 1 + End With + + With FontTypes(FontTypeNames.FONTTYPE_CONSEJOVesA) + .green = 200 + .blue = 255 + .bold = 1 + End With + + With FontTypes(FontTypeNames.FONTTYPE_CONSEJOCAOSVesA) + .red = 255 + .green = 50 + .bold = 1 + End With + + With FontTypes(FontTypeNames.FONTTYPE_CENTINELA) + .green = 255 + .bold = 1 + End With + + With FontTypes(FontTypeNames.FONTTYPE_GMMSG) + .red = 255 + .green = 255 + .blue = 255 + .italic = 1 + End With + + With FontTypes(FontTypeNames.FONTTYPE_GM) + .red = 30 + .green = 255 + .blue = 30 + .bold = 1 + End With + + With FontTypes(FontTypeNames.FONTTYPE_CITIZEN) + .blue = 200 + .bold = 1 + End With + + With FontTypes(FontTypeNames.FONTTYPE_CONSE) + .red = 30 + .green = 150 + .blue = 30 + .bold = 1 + End With + + With FontTypes(FontTypeNames.FONTTYPE_DIOS) + .red = 250 + .green = 250 + .blue = 150 + .bold = 1 + End With +End Sub + +Public Sub ServerHandleIncomingData(ByVal CharIndex As Integer) + +On Error Resume Next + Dim packetID As Byte + + packetID = charlist(CharIndex).incomingData.PeekByte() + + 'Does the packet requires a logged user?? + If Not (packetID = ClientPacketID.LoginChar) Then + + 'Is the user actually logged? + If Not charlist(CharIndex).Logged Then + Call CloseSocket(CharIndex) + Exit Sub + End If + End If + + Select Case packetID + Case ClientPacketID.LoginChar 'OLOGIN + Call HandleLoginChar(CharIndex) + + Case ClientPacketID.Talk '; + Call HandleTalk(CharIndex) + + Case ClientPacketID.Walk 'M + Call HandleWalk(CharIndex) + + Case ClientPacketID.RequestPositionUpdate 'RPU + Call HandleRequestPositionUpdate(CharIndex) + + Case ClientPacketID.Attack 'AT + Call HandleAttack(CharIndex) + + Case ClientPacketID.CastSpell 'LH + Call HandleCastSpell(CharIndex) + + Case ClientPacketID.LeftClick 'LC + Call HandleLeftClick(CharIndex) + + Case ClientPacketID.UseItem 'USA + Call HandleUseItem(CharIndex) + + Case ClientPacketID.EquipItem 'EQUI + Call HandleEquipItem(CharIndex) + + Case ClientPacketID.ChangeHeading 'CHEA + Call HandleChangeHeading(CharIndex) + + Case ClientPacketID.Online '/ONLINE + Call HandleOnline(CharIndex) + + Case ClientPacketID.Quit '/SALIR + Call HandleQuit(CharIndex) + + Case ClientPacketID.Ping '/PING + Call HandlePing(CharIndex) + + Case ClientPacketID.LanzaFlecha + Call HandleLanzaFlecha(CharIndex) + + Case ClientPacketID.ChangePj + Call HandleChangePj(CharIndex) + + Case Else + 'ERROR : Abort! + Call CloseSocket(CharIndex) + End Select + + 'Done with this packet, move on to next one or send everything if no more packets found + If charlist(CharIndex).incomingData.length > 0 And Err.Number = 0 Then + Err.Clear + Call ServerHandleIncomingData(CharIndex) + + ElseIf Err.Number <> 0 And Not Err.Number = charlist(CharIndex).incomingData.NotEnoughDataErrCode Then + Call CloseSocket(CharIndex) + Else + 'Flush buffer - send everything that has been written + Call ServerFlushBuffer(CharIndex) + End If +End Sub + +Public Sub ClientHandleIncomingData() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** +On Error Resume Next + + Select Case incomingData.PeekByte() + Case ServerPacketID.Logged ' LOGGED + Call HandleLogged + + Case ServerPacketID.Disconnect ' FINOK + Call HandleDisconnect + + Case ServerPacketID.UpdateSta ' ASS + Call HandleUpdateSta + + Case ServerPacketID.UpdateMana ' ASM + Call HandleUpdateMana + + Case ServerPacketID.UpdateHP ' ASH + Call HandleUpdateHP + + Case ServerPacketID.ChangeMap ' CM + Call HandleChangeMap + + Case ServerPacketID.PosUpdate ' PU + Call HandlePosUpdate + + Case ServerPacketID.ChatOverHead ' || + Call HandleChatOverHead + + Case ServerPacketID.ConsoleMsg ' || - Beware!! its the same as above, but it was properly splitted + Call HandleConsoleMessage + + Case ServerPacketID.CharIndexInServer ' IP + Call HandleCharIndexInServer + + Case ServerPacketID.CharacterCreate ' CC + Call HandleCharacterCreate + + Case ServerPacketID.CharacterRemove ' BP + Call HandleCharacterRemove + + Case ServerPacketID.CharacterChangeNick + Call HandleCharacterChangeNick + + Case ServerPacketID.CharacterMove ' MP, +, * and _ ' + Call HandleCharacterMove + + Case ServerPacketID.ForceCharMove + Call HandleForceCharMove + + Case ServerPacketID.CharacterChange ' CP + Call HandleCharacterChange + + Case ServerPacketID.PlayMIDI ' TM + Call HandlePlayMIDI + + Case ServerPacketID.PlayWave ' TW + Call HandlePlayWave + + Case ServerPacketID.AreaChanged ' CA + Call HandleAreaChanged + + Case ServerPacketID.PauseToggle ' BKW + Call HandlePauseToggle + + Case ServerPacketID.CreateFX ' CFX + Call HandleCreateFX + + Case ServerPacketID.UpdateCharStats ' EST + Call HandleUpdateCharStats + + Case ServerPacketID.ErrorMsg ' ERR + Call HandleErrorMessage + + Case ServerPacketID.SetInvisible ' NOVER + Call HandleSetInvisible + + Case ServerPacketID.ParalizeOK ' PARADOK + Call HandleParalizeOK + + Case ServerPacketID.Pong + Call HandlePong + + Case ServerPacketID.CuentaToggle + Call HandleCuentaToggle + +#If SeguridadAlkon Then + Case Else + Call HandleIncomingDataEx +#Else + Case Else + 'ERROR : Abort! + Exit Sub +#End If + End Select + + 'Done with this packet, move on to next one + If incomingData.length > 0 And Err.Number <> incomingData.NotEnoughDataErrCode Then + Err.Clear + Call ClientHandleIncomingData + End If +End Sub + +'' +' Handles the Logged message. + +Private Sub HandleLogged() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + 'Remove packet ID + Call incomingData.ReadByte + + ' Variable initialization + EngineRun = True + Nombres = True + + 'Set connected state + Call SetConnected +End Sub + +'' +' Handles the Disconnect message. + +Private Sub HandleDisconnect() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + Dim i As Long + + 'Remove packet ID + Call incomingData.ReadByte + + frmMain.Socket1.Disconnect + + 'Hide main form + frmMain.Visible = False + + 'Stop audio + Call Audio.StopWave + frmMain.IsPlaying = PlayLoop.plNone + + 'Show connection form + frmLogin.Visible = True + + 'Reset global vars + UserParalizado = False + pausa = False + + 'Delete all kind of dialogs + Call CleanDialogs + + 'Unload all forms except frmMain and frmConnect + Dim frm As Form + + For Each frm In Forms + If frm.name <> frmLogin.name And frm.name <> frmMain.name Then + Unload frm + End If + Next + + For i = 1 To MAX_INVENTORY_SLOTS + Call Inventario.SetItem(i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "") + Next i + +End Sub + +'' +' Handles the UpdateSta message. + +Private Sub HandleUpdateSta() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + 'Check packet is complete + If incomingData.length < 3 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet ID + Call incomingData.ReadByte + + 'Get data and update form + UserMinSTA = incomingData.ReadInteger() +End Sub + +'' +' Handles the UpdateMana message. + +Private Sub HandleUpdateMana() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + 'Check packet is complete + If incomingData.length < 3 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet ID + Call incomingData.ReadByte + + 'Get data and update form + UserMinMAN = incomingData.ReadInteger() + + frmMain.lblMana = UserMinMAN & "/" & UserMaxMAN + + Dim bWidth As Byte + + If UserMaxMAN > 0 Then _ + bWidth = (((UserMinMAN / 100) / (UserMaxMAN / 100)) * 75) + + frmMain.shpMana.Width = 75 - bWidth + frmMain.shpMana.Left = 584 + (75 - frmMain.shpMana.Width) + + frmMain.shpMana.Visible = (bWidth <> 75) +End Sub + +'' +' Handles the UpdateHP message. + +Private Sub HandleUpdateHP() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + 'Check packet is complete + If incomingData.length < 3 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet ID + Call incomingData.ReadByte + + 'Get data and update form + UserMinHP = incomingData.ReadInteger() + + frmMain.lblVida = charlist(UserCharIndex).MinHP & "/" & charlist(UserCharIndex).MaxHP + + Dim bWidth As Byte + + bWidth = (((charlist(UserCharIndex).MinHP / 100) / (charlist(UserCharIndex).MaxHP / 100)) * 75) + + frmMain.shpVida.Width = 75 - bWidth + frmMain.shpVida.Left = 584 + (75 - frmMain.shpVida.Width) + + frmMain.shpVida.Visible = (bWidth <> 75) +End Sub + +'' +' Handles the ChangeMap message. +Private Sub HandleChangeMap() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + If incomingData.length < 5 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet ID + Call incomingData.ReadByte + + UserMap = incomingData.ReadInteger() + +'TODO: Once on-the-fly editor is implemented check for map version before loading.... +'For now we just drop it + Call incomingData.ReadInteger + +#If SeguridadAlkon Then + Call InitMI +#End If + + If FileExist(DirMapas & "Mapa" & UserMap & ".map", vbNormal) Then + Call SwitchMap(UserMap) + If bLluvia(UserMap) = 0 Then + If bRain Then + Call Audio.StopWave(RainBufferIndex) + RainBufferIndex = 0 + frmMain.IsPlaying = PlayLoop.plNone + End If + End If + Else + 'no encontramos el mapa en el hd + MsgBox "Error en los mapas, algún archivo ha sido modificado o esta dañado." + + Call CloseClient + End If +End Sub + +'' +' Handles the PosUpdate message. + +Private Sub HandlePosUpdate() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + If incomingData.length < 3 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet ID + Call incomingData.ReadByte + + 'Set new pos + UserPos.X = incomingData.ReadByte() + UserPos.Y = incomingData.ReadByte() + +End Sub + +'' +' Handles the ChatOverHead message. + +Private Sub HandleChatOverHead() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + If incomingData.length < 8 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + +On Error GoTo ErrHandler + 'This packet contains strings, make a copy of the data to prevent losses if it's not complete yet... + Dim buffer As New clsByteQueue + Call buffer.CopyBuffer(incomingData) + + 'Remove packet ID + Call buffer.ReadByte + + Dim Chat As String + Dim CharIndex As Integer + Dim r As Byte + Dim g As Byte + Dim b As Byte + + Chat = buffer.ReadASCIIString() + CharIndex = buffer.ReadInteger() + + r = buffer.ReadByte() + g = buffer.ReadByte() + b = buffer.ReadByte() + + 'Only add the chat if the character exists (a CharacterRemove may have been sent to the PC / NPC area before the buffer was flushed) + If charlist(CharIndex).Active Then _ + Call Dialogos.CreateDialog(Trim$(Chat), CharIndex, RGB(r, g, b)) + + 'If we got here then packet is complete, copy data back to original queue + Call incomingData.CopyBuffer(buffer) + +ErrHandler: + Dim error As Long + error = Err.Number +On Error GoTo 0 + + 'Destroy auxiliar buffer + Set buffer = Nothing + + If error <> 0 Then _ + Err.Raise error +End Sub + +'' +' Handles the ConsoleMessage message. + +Private Sub HandleConsoleMessage() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + If incomingData.length < 4 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + +On Error GoTo ErrHandler + 'This packet contains strings, make a copy of the data to prevent losses if it's not complete yet... + Dim buffer As New clsByteQueue + Call buffer.CopyBuffer(incomingData) + + 'Remove packet ID + Call buffer.ReadByte + + Dim Chat As String + Dim FontIndex As Integer + Dim str As String + Dim r As Byte + Dim g As Byte + Dim b As Byte + + Chat = buffer.ReadASCIIString() + FontIndex = buffer.ReadByte() + + If InStr(1, Chat, "~") Then + str = ReadField(2, Chat, 126) + If Val(str) > 255 Then + r = 255 + Else + r = Val(str) + End If + + str = ReadField(3, Chat, 126) + If Val(str) > 255 Then + g = 255 + Else + g = Val(str) + End If + + str = ReadField(4, Chat, 126) + If Val(str) > 255 Then + b = 255 + Else + b = Val(str) + End If + + Call AddtoRichTextBox(frmMain.RecTxt, Left$(Chat, InStr(1, Chat, "~") - 1), r, g, b, Val(ReadField(5, Chat, 126)) <> 0, Val(ReadField(6, Chat, 126)) <> 0) + Else + With FontTypes(FontIndex) + Call AddtoRichTextBox(frmMain.RecTxt, Chat, .red, .green, .blue, .bold, .italic) + End With + + End If +' Call checkText(chat) + 'If we got here then packet is complete, copy data back to original queue + Call incomingData.CopyBuffer(buffer) + +ErrHandler: + Dim error As Long + error = Err.Number +On Error GoTo 0 + + 'Destroy auxiliar buffer + Set buffer = Nothing + + If error <> 0 Then _ + Err.Raise error +End Sub + +'' +' Handles the UserIndexInServer message. + +Private Sub HandleUserIndexInServer() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + If incomingData.length < 3 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet ID + Call incomingData.ReadByte + + UserIndex = incomingData.ReadInteger() +End Sub + +'' +' Handles the UserCharIndexInServer message. + +Private Sub HandleCharIndexInServer() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + If incomingData.length < 3 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet ID + Call incomingData.ReadByte + + UserCharIndex = incomingData.ReadInteger() + +End Sub + +'' +' Handles the CharacterCreate message. + +Private Sub HandleCharacterCreate() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + If incomingData.length < 24 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + +On Error GoTo ErrHandler + 'This packet contains strings, make a copy of the data to prevent losses if it's not complete yet... + Dim buffer As New clsByteQueue + Call buffer.CopyBuffer(incomingData) + + 'Remove packet ID + Call buffer.ReadByte + + Dim CharIndex As Integer + Dim body As Integer + Dim Head As Integer + Dim heading As E_Heading + Dim X As Byte + Dim Y As Byte + Dim weapon As Integer + Dim shield As Integer + Dim helmet As Integer + Dim Nombre As String + Dim MinHP As Integer + Dim Team As Byte + + CharIndex = buffer.ReadInteger() + body = buffer.ReadInteger() + Head = buffer.ReadInteger() + heading = buffer.ReadByte() + X = buffer.ReadByte() + Y = buffer.ReadByte() + weapon = buffer.ReadInteger() + shield = buffer.ReadInteger() + helmet = buffer.ReadInteger() + Nombre = buffer.ReadASCIIString() + MinHP = buffer.ReadInteger() + Team = buffer.ReadByte() + + Call MakeChar(CharIndex, body, Head, heading, X, Y, weapon, shield, helmet) + charlist(CharIndex).MinHP = MinHP + charlist(CharIndex).Nombre = Nombre + charlist(CharIndex).Team = Team + + Call RefreshAllChars + + 'If we got here then packet is complete, copy data back to original queue + Call incomingData.CopyBuffer(buffer) + +ErrHandler: + Dim error As Long + error = Err.Number +On Error GoTo 0 + + 'Destroy auxiliar buffer + Set buffer = Nothing + + If error <> 0 Then _ + Err.Raise error +End Sub + +Private Sub HandleCharacterChangeNick() +'*************************************************** +'Author: Budi +'Last Modification: 07/23/09 +' +'*************************************************** + If incomingData.length < 6 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet id + Call incomingData.ReadByte + Dim CharIndex As Integer + CharIndex = incomingData.ReadInteger + charlist(CharIndex).Nombre = incomingData.ReadASCIIString + +End Sub + +'' +' Handles the CharacterRemove message. + +Private Sub HandleCharacterRemove() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + If incomingData.length < 3 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet ID + Call incomingData.ReadByte + + Dim CharIndex As Integer + + CharIndex = incomingData.ReadInteger() + + Call EraseChar(CharIndex) + Call RefreshAllChars +End Sub + +'' +' Handles the CharacterMove message. + +Private Sub HandleCharacterMove() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + If incomingData.length < 5 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet ID + Call incomingData.ReadByte + + Dim CharIndex As Integer + Dim X As Byte + Dim Y As Byte + + CharIndex = incomingData.ReadInteger() + X = incomingData.ReadByte() + Y = incomingData.ReadByte() + + Call DoPasosFx(CharIndex) + + Call MoveCharbyPos(CharIndex, X, Y) + + Call RefreshAllChars +End Sub + +'' +' Handles the ForceCharMove message. + +Private Sub HandleForceCharMove() + + If incomingData.length < 2 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet ID + Call incomingData.ReadByte + + Dim Direccion As Byte + + Direccion = incomingData.ReadByte() + + Call MoveCharbyHead(UserCharIndex, Direccion) + Call MoveScreen(Direccion) + + Call RefreshAllChars +End Sub + +'' +' Handles the CharacterChange message. + +Private Sub HandleCharacterChange() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 25/08/2009 +'25/08/2009: ZaMa - Changed a variable used incorrectly. +'*************************************************** + If incomingData.length < 18 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet ID + Call incomingData.ReadByte + + Dim CharIndex As Integer + Dim TempInt As Integer + Dim headIndex As Integer + + CharIndex = incomingData.ReadInteger() + + With charlist(CharIndex) + TempInt = incomingData.ReadInteger() + + If TempInt < LBound(BodyData()) Or TempInt > UBound(BodyData()) Then + .body = BodyData(0) + .iBody = 0 + Else + .body = BodyData(TempInt) + .iBody = TempInt + End If + + + headIndex = incomingData.ReadInteger() + + If headIndex < LBound(HeadData()) Or headIndex > UBound(HeadData()) Then + .Head = HeadData(0) + .iHead = 0 + Else + .Head = HeadData(headIndex) + .iHead = headIndex + End If + + .heading = incomingData.ReadByte() + + TempInt = incomingData.ReadInteger() + If TempInt <> 0 Then + .Arma = WeaponAnimData(TempInt) + .iArma = TempInt + End If + + TempInt = incomingData.ReadInteger() + If TempInt <> 0 Then + .Escudo = ShieldAnimData(TempInt) + .iEscudo = TempInt + End If + + TempInt = incomingData.ReadInteger() + If TempInt <> 0 Then + .Casco = CascoAnimData(TempInt) + .iCasco = TempInt + End If + + Call SetCharacterFx(CharIndex, incomingData.ReadInteger(), incomingData.ReadInteger()) + End With + + Call RefreshAllChars +End Sub + +'' +' Handles the PlayMIDI message. + +Private Sub HandlePlayMIDI() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + If incomingData.length < 4 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + Dim currentMidi As Byte + + 'Remove packet ID + Call incomingData.ReadByte + + currentMidi = incomingData.ReadByte() + + If currentMidi Then + Call Audio.PlayMIDI(CStr(currentMidi) & ".mid", incomingData.ReadInteger()) + Else + 'Remove the bytes to prevent errors + Call incomingData.ReadInteger + End If +End Sub + +'' +' Handles the PlayWave message. + +Private Sub HandlePlayWave() +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 08/14/07 +'Last Modified by: Rapsodius +'Added support for 3D Sounds. +'*************************************************** + If incomingData.length < 3 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet ID + Call incomingData.ReadByte + + Dim wave As Byte + Dim srcX As Byte + Dim srcY As Byte + + wave = incomingData.ReadByte() + srcX = incomingData.ReadByte() + srcY = incomingData.ReadByte() + + Call Audio.PlayWave(CStr(wave) & ".wav", srcX, srcY) +End Sub + +'' +' Handles the AreaChanged message. + +Private Sub HandleAreaChanged() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + If incomingData.length < 3 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet ID + Call incomingData.ReadByte + + Dim X As Byte + Dim Y As Byte + + X = incomingData.ReadByte() + Y = incomingData.ReadByte() + + Call CambioDeArea(X, Y) +End Sub + +'' +' Handles the PauseToggle message. + +Private Sub HandlePauseToggle() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + 'Remove packet ID + Call incomingData.ReadByte + + pausa = incomingData.ReadByte() +End Sub + +'' +' Handles the CreateFX message. + +Private Sub HandleCreateFX() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + If incomingData.length < 7 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet ID + Call incomingData.ReadByte + + Dim CharIndex As Integer + Dim FX As Integer + Dim Loops As Integer + + CharIndex = incomingData.ReadInteger() + FX = incomingData.ReadInteger() + Loops = incomingData.ReadInteger() + + Call SetCharacterFx(CharIndex, FX, Loops) +End Sub + + +Private Sub HandleUpdateCharStats() + + If incomingData.length < 14 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + Dim bWidth As Long + Dim LastMP As Integer + Dim LastHP As Integer + Dim LastMaxHP As Integer + Dim LastMaxMP As Integer + Dim Dif As Integer + + 'Remove packet ID + Call incomingData.ReadByte + + LastMP = charlist(UserCharIndex).MinMAN + LastHP = charlist(UserCharIndex).MinHP + LastMaxHP = charlist(UserCharIndex).MaxHP + LastMaxMP = charlist(UserCharIndex).MaxMAN + + charlist(UserCharIndex).MaxHP = incomingData.ReadInteger() + charlist(UserCharIndex).MinHP = incomingData.ReadInteger() + charlist(UserCharIndex).MaxMAN = incomingData.ReadInteger() + charlist(UserCharIndex).MinMAN = incomingData.ReadInteger() + charlist(UserCharIndex).MaxSTA = incomingData.ReadInteger() + charlist(UserCharIndex).MinSTA = incomingData.ReadInteger() + charlist(UserCharIndex).Lvl = incomingData.ReadByte() + + frmMain.lblLvl = charlist(UserCharIndex).Lvl + + Dif = LastMP - charlist(UserCharIndex).MinMAN + + If LastMaxHP <> charlist(UserCharIndex).MaxHP Then + frmMain.ActualHP = 0 + End If + If LastMaxMP <> charlist(UserCharIndex).MaxMAN Then + frmMain.ActualMP = 0 + End If + + If charlist(UserCharIndex).MaxMAN > 0 Then + If frmMain.ActualMP < charlist(UserCharIndex).MinMAN Then + frmMain.MoviendoMana = (charlist(UserCharIndex).MinMAN - frmMain.ActualMP + Dif) * 10 / 100 + ElseIf frmMain.ActualMP > charlist(UserCharIndex).MinMAN Then + frmMain.MoviendoMana = (frmMain.ActualMP - charlist(UserCharIndex).MinMAN + Dif) * 10 / 100 + ElseIf frmMain.ActualMP = charlist(UserCharIndex).MinMAN Then + frmMain.MoviendoMana = Dif * 10 / 100 + End If + End If + Dif = LastHP - charlist(UserCharIndex).MinHP + If frmMain.ActualHP < charlist(UserCharIndex).MinHP Then + frmMain.MoviendoVida = (charlist(UserCharIndex).MinHP - frmMain.ActualHP + Dif) * 10 / 100 + ElseIf frmMain.ActualHP > charlist(UserCharIndex).MinHP Then + frmMain.MoviendoVida = (frmMain.ActualHP - charlist(UserCharIndex).MinHP + Dif) * 10 / 100 + ElseIf frmMain.ActualHP = charlist(UserCharIndex).MinHP Then + frmMain.MoviendoVida = Dif * 10 / 100 + End If + Call ActualizarStats + +End Sub + +'' +' Handles the ErrorMessage message. + +Private Sub HandleErrorMessage() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + If incomingData.length < 3 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + +On Error GoTo ErrHandler + 'This packet contains strings, make a copy of the data to prevent losses if it's not complete yet... + Dim buffer As New clsByteQueue + Call buffer.CopyBuffer(incomingData) + + 'Remove packet ID + Call buffer.ReadByte + + Call MsgBox(buffer.ReadASCIIString()) + + If frmLogin.Visible Then + frmMain.Socket1.Disconnect + frmMain.Socket1.Cleanup + End If + + 'If we got here then packet is complete, copy data back to original queue + Call incomingData.CopyBuffer(buffer) + +ErrHandler: + Dim error As Long + error = Err.Number +On Error GoTo 0 + + 'Destroy auxiliar buffer + Set buffer = Nothing + + If error <> 0 Then _ + Err.Raise error +End Sub + +'' +' Handles the SetInvisible message. + +Private Sub HandleSetInvisible() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + If incomingData.length < 4 Then + Err.Raise incomingData.NotEnoughDataErrCode + Exit Sub + End If + + 'Remove packet ID + Call incomingData.ReadByte + + Dim CharIndex As Integer + + CharIndex = incomingData.ReadInteger() + charlist(CharIndex).invisible = incomingData.ReadBoolean() + +#If SeguridadAlkon Then + If charlist(CharIndex).invisible Then + Call MI(CualMI).SetInvisible(CharIndex) + Else + Call MI(CualMI).ResetInvisible(CharIndex) + End If +#End If + +End Sub + +'' +' Handles the ParalizeOK message. + +Private Sub HandleParalizeOK() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + 'Remove packet ID + Call incomingData.ReadByte + + charlist(UserCharIndex).Inmo = incomingData.ReadByte() + +End Sub + +'' +' Handles the Pong message. + +Private Sub HandlePong() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +' +'*************************************************** + Call incomingData.ReadByte + + Call AddtoRichTextBox(frmMain.RecTxt, "El ping es " & (GetTickCount - pingTime) & " ms.", 255, 0, 0, True, False, True) + + pingTime = 0 +End Sub + +Public Sub WriteLoginChar() + + Dim i As Long + + With outgoingData + Call .WriteByte(ClientPacketID.LoginChar) + + Call .WriteASCIIString(UserName) + Call .WriteByte(UserClase) + Call .WriteByte(UserRaza) + Call .WriteByte(UserGenero) + Call .WriteByte(UserLvl) + Call .WriteByte(UserTeam) + + Call .WriteByte(App.Major) + Call .WriteByte(App.Minor) + Call .WriteByte(App.Revision) + + End With +End Sub + +'' +' Writes the "Talk" message to the outgoing data buffer. +' +' @param chat The chat text to be sent. +' @remarks The data is not actually sent until the buffer is properly flushed. + +Public Sub WriteTalk(ByVal Chat As String) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +'Writes the "Talk" message to the outgoing data buffer +'*************************************************** + With outgoingData + Call .WriteByte(ClientPacketID.Talk) + + Call .WriteASCIIString(Chat) + End With +End Sub + +'' +' Writes the "Walk" message to the outgoing data buffer. +' +' @param heading The direction in wich the user is moving. +' @remarks The data is not actually sent until the buffer is properly flushed. + +Public Sub WriteWalk(ByVal heading As E_Heading) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +'Writes the "Walk" message to the outgoing data buffer +'*************************************************** + With outgoingData + Call .WriteByte(ClientPacketID.Walk) + + Call .WriteByte(heading) + End With +End Sub + +'' +' Writes the "RequestPositionUpdate" message to the outgoing data buffer. +' +' @remarks The data is not actually sent until the buffer is properly flushed. + +Public Sub WriteRequestPositionUpdate() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +'Writes the "RequestPositionUpdate" message to the outgoing data buffer +'*************************************************** + Call outgoingData.WriteByte(ClientPacketID.RequestPositionUpdate) +End Sub + +'' +' Writes the "Attack" message to the outgoing data buffer. +' +' @remarks The data is not actually sent until the buffer is properly flushed. + +Public Sub WriteAttack() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +'Writes the "Attack" message to the outgoing data buffer +'*************************************************** + Call outgoingData.WriteByte(ClientPacketID.Attack) +End Sub + +'' +' Writes the "CastSpell" message to the outgoing data buffer. +' +' @param slot Spell List slot where the spell to cast is. +' @remarks The data is not actually sent until the buffer is properly flushed. + +Public Sub WriteCastSpell(ByVal X As Byte, ByVal Y As Byte, ByVal Spell As Byte) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +'Writes the "CastSpell" message to the outgoing data buffer +'*************************************************** + With outgoingData + Call .WriteByte(ClientPacketID.CastSpell) + + Call .WriteByte(X) + Call .WriteByte(Y) + Call .WriteByte(Spell) + End With +End Sub + +'' +' Writes the "LeftClick" message to the outgoing data buffer. +' +' @param x Tile coord in the x-axis in which the user clicked. +' @param y Tile coord in the y-axis in which the user clicked. +' @remarks The data is not actually sent until the buffer is properly flushed. + +Public Sub WriteLeftClick(ByVal X As Byte, ByVal Y As Byte) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +'Writes the "LeftClick" message to the outgoing data buffer +'*************************************************** + With outgoingData + Call .WriteByte(ClientPacketID.LeftClick) + + Call .WriteByte(X) + Call .WriteByte(Y) + End With +End Sub + +'' +' Writes the "UseItem" message to the outgoing data buffer. +' +' @param slot Invetory slot where the item to use is. +' @remarks The data is not actually sent until the buffer is properly flushed. + +Public Sub WriteUseItem(ByVal Slot As Byte, ByVal Click As Byte) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +'Writes the "UseItem" message to the outgoing data buffer +'*************************************************** + With outgoingData + Call .WriteByte(ClientPacketID.UseItem) + + Call .WriteByte(Slot) + Call .WriteByte(Click) + End With +End Sub + +'' +' Writes the "WorkLeftClick" message to the outgoing data buffer. +' +' @param x Tile coord in the x-axis in which the user clicked. +' @param y Tile coord in the y-axis in which the user clicked. +' @param skill The skill which the user attempts to use. +' @remarks The data is not actually sent until the buffer is properly flushed. + +Public Sub WriteWorkLeftClick(ByVal X As Byte, ByVal Y As Byte, ByVal Skill As eSkill) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +'Writes the "WorkLeftClick" message to the outgoing data buffer +'*************************************************** + With outgoingData + Call .WriteByte(ClientPacketID.WorkLeftClick) + + Call .WriteByte(X) + Call .WriteByte(Y) + + Call .WriteByte(Skill) + End With +End Sub + +' Writes the "EquipItem" message to the outgoing data buffer. +' +' @param slot Invetory slot where the item to equip is. +' @remarks The data is not actually sent until the buffer is properly flushed. + +Public Sub WriteEquipItem(ByVal Slot As Byte) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +'Writes the "EquipItem" message to the outgoing data buffer +'*************************************************** + With outgoingData + Call .WriteByte(ClientPacketID.EquipItem) + + Call .WriteByte(Slot) + End With +End Sub + +'' +' Writes the "ChangeHeading" message to the outgoing data buffer. +' +' @param heading The direction in wich the user is moving. +' @remarks The data is not actually sent until the buffer is properly flushed. + +Public Sub WriteChangeHeading(ByVal heading As E_Heading) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +'Writes the "ChangeHeading" message to the outgoing data buffer +'*************************************************** + With outgoingData + Call .WriteByte(ClientPacketID.ChangeHeading) + + Call .WriteByte(heading) + End With +End Sub + +'' +' Writes the "Online" message to the outgoing data buffer. +' +' @remarks The data is not actually sent until the buffer is properly flushed. + +Public Sub WriteOnline() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +'Writes the "Online" message to the outgoing data buffer +'*************************************************** + Call outgoingData.WriteByte(ClientPacketID.Online) +End Sub + +'' +' Writes the "Quit" message to the outgoing data buffer. +' +' @remarks The data is not actually sent until the buffer is properly flushed. + +Public Sub WriteQuit() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 08/16/08 +'Writes the "Quit" message to the outgoing data buffer +'*************************************************** + Call outgoingData.WriteByte(ClientPacketID.Quit) +End Sub + +'' +' Writes the "Ping" message to the outgoing data buffer. +' +' @remarks The data is not actually sent until the buffer is properly flushed. + +Public Sub WritePing() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 26/01/2007 +'Writes the "Ping" message to the outgoing data buffer +'*************************************************** + 'Prevent the timer from being cut + If pingTime <> 0 Then Exit Sub + + Call outgoingData.WriteByte(ClientPacketID.Ping) + + ' Avoid computing errors due to frame rate + Call FlushBuffer + DoEvents + + pingTime = GetTickCount +End Sub + +'' +' Flushes the outgoing data buffer of the user. +' +' @param UserIndex User whose outgoing data buffer will be flushed. + +Public Sub FlushBuffer() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +'Sends all data existing in the buffer +'*************************************************** + Dim sndData As String + + With outgoingData + If .length = 0 Then _ + Exit Sub + + sndData = .ReadASCIIStringFixed(.length) + + Call SendData(sndData) + End With +End Sub + +Public Function PrepareMessageErrorMsg(ByVal Message As String) As String +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/17/06 +'Prepares the "ErrorMsg" message and returns it +'*************************************************** + With auxiliarBuffer + Call .WriteByte(ServerPacketID.ErrorMsg) + Call .WriteASCIIString(Message) + + PrepareMessageErrorMsg = .ReadASCIIStringFixed(.length) + End With +End Function + +Private Sub HandleLoginChar(ByVal CharIndex As Integer) + + If charlist(CharIndex).incomingData.length < 12 Then + Err.Raise charlist(CharIndex).incomingData.NotEnoughDataErrCode + Exit Sub + End If + + +On Error GoTo ErrHandler + 'This packet contains strings, make a copy of the data to prevent losses if it's not complete yet... + Dim buffer As New clsByteQueue + Call buffer.CopyBuffer(charlist(CharIndex).incomingData) + + 'Remove packet ID + Call buffer.ReadByte + + Dim CharName As String + Dim Clase As Byte + Dim Raza As Byte + Dim Genero As Byte + Dim Lvl As Byte + Dim Team As Byte + + Dim version As String + + CharName = buffer.ReadASCIIString() + Clase = buffer.ReadByte() + Raza = buffer.ReadByte() + Genero = buffer.ReadByte() + Lvl = buffer.ReadByte() + Team = buffer.ReadByte() + + 'Convert version number to string + version = CStr(buffer.ReadByte()) & "." & CStr(buffer.ReadByte()) & "." & CStr(buffer.ReadByte()) + + If Not AsciiValidos(CharName) Then + Call WriteErrorMsg(CharIndex, "Nombre inválido.") + Call ServerFlushBuffer(CharIndex) + Call CloseSocket(CharIndex) + + Exit Sub + End If + + If Clase < 0 Or Clase > 6 Then + Call WriteErrorMsg(CharIndex, "Clase inválida.") + Call ServerFlushBuffer(CharIndex) + Call CloseSocket(CharIndex) + + Exit Sub + End If + + If Genero < 0 Or Genero > 1 Then + Call WriteErrorMsg(CharIndex, "Genero inválido.") + Call ServerFlushBuffer(CharIndex) + Call CloseSocket(CharIndex) + + Exit Sub + End If + + If Raza < 0 Or Raza > 4 Then + Call WriteErrorMsg(CharIndex, "Raza inválida.") + Call ServerFlushBuffer(CharIndex) + Call CloseSocket(CharIndex) + + Exit Sub + End If + + If Lvl < 35 Or Lvl > 50 Then + Call WriteErrorMsg(CharIndex, "Nivel inválido.") + Call ServerFlushBuffer(CharIndex) + Call CloseSocket(CharIndex) + + Exit Sub + End If + + If Not VersionOK(version) Then + Call WriteErrorMsg(CharIndex, "Esta versión del juego es obsoleta, la versión correcta es la " & ULTIMAVERSION & ". La misma se encuentra disponible en www.argentumonline.com.ar") + Else + Call ConnectChar(CharIndex, CharName, Clase, Raza, Genero, Lvl, Team) + End If + + + 'If we got here then packet is complete, copy data back to original queue + Call charlist(CharIndex).incomingData.CopyBuffer(buffer) + +ErrHandler: + Dim error As Long + error = Err.Number +On Error GoTo 0 + + 'Destroy auxiliar buffer + Set buffer = Nothing + + If error <> 0 Then _ + Err.Raise error +End Sub + +Private Sub HandleTalk(ByVal CharIndex As Integer) + + If charlist(CharIndex).incomingData.length < 3 Then + Err.Raise charlist(CharIndex).incomingData.NotEnoughDataErrCode + Exit Sub + End If + +On Error GoTo ErrHandler + With charlist(CharIndex) + + 'This packet contains strings, make a copy of the data to prevent losses if it's not complete yet... + Dim buffer As New clsByteQueue + Call buffer.CopyBuffer(.incomingData) + + 'Remove packet ID + Call buffer.ReadByte + + Dim Chat As String + + Chat = buffer.ReadASCIIString() + + If LenB(Chat) <> 0 Then + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessageChatOverHead(Chat, CharIndex, RGB(255, 255, 255))) + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessageConsoleMsg(charlist(CharIndex).Nombre & "> " & Chat, FontTypeNames.FONTTYPE_GUILD)) + End If + + 'If we got here then packet is complete, copy data back to original queue + Call .incomingData.CopyBuffer(buffer) + End With + +ErrHandler: + Dim error As Long + error = Err.Number +On Error GoTo 0 + + 'Destroy auxiliar buffer + Set buffer = Nothing + + If error <> 0 Then _ + Err.Raise error +End Sub + +Private Sub HandleWalk(ByVal CharIndex As Integer) + + If charlist(CharIndex).incomingData.length < 2 Then + Err.Raise charlist(CharIndex).incomingData.NotEnoughDataErrCode + Exit Sub + End If + + Dim heading As E_Heading + Dim nPos As WorldPos + Dim X As Integer + Dim Y As Integer + Dim addX As Integer + Dim addY As Integer + + With charlist(CharIndex) + 'Remove packet ID + Call .incomingData.ReadByte + + heading = .incomingData.ReadByte() + + If .Inmo = 0 Then + .Quieto = 0 + If CharIndex <> UserCharIndex Then + Select Case heading + Case E_Heading.NORTH + If MoveToLegalPos(.Pos.X, .Pos.Y - 1) Then + nPos.X = .Pos.X + nPos.Y = .Pos.Y - 1 + Else: Exit Sub + End If + Case E_Heading.EAST + If MoveToLegalPos(.Pos.X + 1, .Pos.Y) Then + nPos.X = .Pos.X + 1 + nPos.Y = .Pos.Y + Else: Exit Sub + End If + Case E_Heading.SOUTH + If MoveToLegalPos(.Pos.X, .Pos.Y + 1) Then + nPos.X = .Pos.X + nPos.Y = .Pos.Y + 1 + Else: Exit Sub + End If + Case E_Heading.WEST + If MoveToLegalPos(.Pos.X - 1, .Pos.Y) Then + nPos.X = .Pos.X - 1 + nPos.Y = .Pos.Y + Else: Exit Sub + End If + End Select + X = .Pos.X + Y = .Pos.Y + + addX = nPos.X - X + addY = nPos.Y - Y + + MapData(.Pos.X, .Pos.Y).CharIndex = 0 + MapData(nPos.X, nPos.Y).CharIndex = CharIndex + .Pos.X = nPos.X + .Pos.Y = nPos.Y + .heading = heading + + .MoveOffsetX = -1 * (TilePixelWidth * addX) + .MoveOffsetY = -1 * (TilePixelHeight * addY) + + .Moving = 1 + + .scrollDirectionX = Sgn(addX) + .scrollDirectionY = Sgn(addY) + Else + nPos.X = .Pos.X + nPos.Y = .Pos.Y + End If + Call ServerSendData(SendTarget.ToAllButIndexAndHost, CharIndex, PrepareMessageCharacterMove(CharIndex, nPos.X, nPos.Y)) + End If + + End With +End Sub + +Private Sub HandleRequestPositionUpdate(ByVal CharIndex As Integer) + + 'Remove packet ID + charlist(CharIndex).incomingData.ReadByte + + Call WritePosUpdate(CharIndex) +End Sub + +Private Sub HandleAttack(ByVal CharIndex As Integer) + + With charlist(CharIndex) + 'Remove packet ID + Call .incomingData.ReadByte + + 'If dead, can't attack + If .MinHP = 0 Then + Call WriteConsoleMsg(CharIndex, "¡¡Estás muerto!!", FontTypeNames.FONTTYPE_INFO) + Exit Sub + End If + + 'If equiped weapon is ranged, can't attack this way + If .TipoArma = 2 Then + Call WriteConsoleMsg(CharIndex, "No puedes usar así este arma.", FontTypeNames.FONTTYPE_INFO) + Exit Sub + End If + + 'Attack! + Call UsuarioAtaca(CharIndex) + End With +End Sub + +Private Sub HandleCastSpell(ByVal CharIndex As Integer) + + If charlist(CharIndex).incomingData.length < 4 Then + Err.Raise charlist(CharIndex).incomingData.NotEnoughDataErrCode + Exit Sub + End If + + With charlist(CharIndex) + 'Remove packet ID + Call .incomingData.ReadByte + + Dim Spell As Byte + Dim X As Byte + Dim Y As Byte + + X = .incomingData.ReadByte() + Y = .incomingData.ReadByte() + Spell = .incomingData.ReadByte() + + If .MinHP = 0 Then + Call WriteConsoleMsg(CharIndex, "¡¡Estás muerto!!", FontTypeNames.FONTTYPE_INFO) + Exit Sub + End If + + If Spell < LBound(Hechizo) Then + Exit Sub + ElseIf Spell > UBound(Hechizo) Then + Exit Sub + End If + + If Not CharTimer(CharIndex).Check(TimersIndex.Attack, False) Then 'Check if attack interval has finished. + If charlist(CharIndex).LastCombo = 1 And CharTimer(CharIndex).Check(TimersIndex.AttackCast, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.AttackCast) + Call LanzarSpell(CharIndex, Spell, X, Y) + charlist(CharIndex).LastCombo = 2 + Else + Call WriteConsoleMsg(CharIndex, "No puedes lanzar hechizos tan rápido.", FontTypeNames.FONTTYPE_INFO) + End If + Else + If CharTimer(CharIndex).Check(TimersIndex.CastSpell) Then + Call LanzarSpell(CharIndex, Spell, X, Y) + charlist(CharIndex).LastCombo = 2 + Else + Call WriteConsoleMsg(CharIndex, "No puedes lanzar hechizos tan rápido.", FontTypeNames.FONTTYPE_INFO) + End If + End If + End With +End Sub + +Private Sub HandleLeftClick(ByVal CharIndex As Integer) + + If charlist(CharIndex).incomingData.length < 3 Then + Err.Raise charlist(CharIndex).incomingData.NotEnoughDataErrCode + Exit Sub + End If + + With charlist(CharIndex).incomingData + 'Remove packet ID + Call .ReadByte + + Dim X As Byte + Dim Y As Byte + + X = .ReadByte() + Y = .ReadByte() + + If X < 10 Or X > 90 Or Y < 10 Or Y > 90 Then Exit Sub + + Call VerTile(CharIndex, X, Y) + End With +End Sub + +Private Sub HandleUseItem(ByVal CharIndex As Integer) + + If charlist(CharIndex).incomingData.length < 3 Then + Err.Raise charlist(CharIndex).incomingData.NotEnoughDataErrCode + Exit Sub + End If + + With charlist(CharIndex) + 'Remove packet ID + Call .incomingData.ReadByte + + Dim Slot As Byte + Dim Click As Byte + + Slot = .incomingData.ReadByte() + Click = .incomingData.ReadByte() + + If Slot < 1 Or Slot > 3 Then Exit Sub + + If CharTimer(CharIndex).Check(TimersIndex.GolpeU, False) Then + If Click = 0 Then + If CharTimer(CharIndex).Check(TimersIndex.UseItemWithU, False) Then + If CharTimer(CharIndex).Check(TimersIndex.UseItem, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.UseItem) + Call CharTimer(CharIndex).Restart(TimersIndex.UseItemWithU) + Call UsarInvItem(CharIndex, Slot) + End If + End If + Else + If CharTimer(CharIndex).Check(TimersIndex.UseItem, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.UseItem) + Call UsarInvItem(CharIndex, Slot) + End If + End If + Else + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessageConsoleMsg("Debes esperar unos momentos para tomar una pocion.", FontTypeNames.FONTTYPE_INFO)) + End If + End With +End Sub + +Private Sub HandleEquipItem(ByVal CharIndex As Integer) + + If charlist(CharIndex).incomingData.length < 2 Then + Err.Raise charlist(CharIndex).incomingData.NotEnoughDataErrCode + Exit Sub + End If + + With charlist(CharIndex) + 'Remove packet ID + Call .incomingData.ReadByte + + Dim itemSlot As Byte + + itemSlot = .incomingData.ReadByte() + + 'Dead Chars can't equip items + If .MinHP = 0 Then Exit Sub + + 'Validate item slot + If itemSlot > 5 Or itemSlot < 1 Then Exit Sub + + Call EquiparInvItem(CharIndex, itemSlot) + End With +End Sub + +Private Sub HandleChangeHeading(ByVal CharIndex As Integer) + + If charlist(CharIndex).incomingData.length < 2 Then + Err.Raise charlist(CharIndex).incomingData.NotEnoughDataErrCode + Exit Sub + End If + + With charlist(CharIndex) + 'Remove packet ID + Call .incomingData.ReadByte + + Dim heading As E_Heading + Dim posX As Integer + Dim posY As Integer + + heading = .incomingData.ReadByte() + + If .Inmo = 0 Then + Select Case heading + Case E_Heading.NORTH + posY = -1 + Case E_Heading.EAST + posX = 1 + Case E_Heading.SOUTH + posY = 1 + Case E_Heading.WEST + posX = -1 + End Select + + If LegalPos(.Pos.X + posX, .Pos.Y + posY) Then + Exit Sub + End If + End If + + 'Validate heading (VB won't say invalid cast if not a valid index like .Net languages would do... *sigh*) + If heading > 0 And heading < 5 Then + .heading = heading + Call ServerSendData(SendTarget.ToAllButIndex, CharIndex, PrepareMessageCharacterChange(.iBody, .iHead, heading, CharIndex, .iArma, .iEscudo, .FxIndex, .FX.Loops, .iCasco)) + End If + End With +End Sub + +Private Sub HandleOnline(ByVal CharIndex As Integer) + + Dim i As Long + Dim Count As Long + + With charlist(CharIndex) + 'Remove packet ID + Call .incomingData.ReadByte + + For i = 1 To MaxUsers + If LenB(charlist(i).Nombre) <> 0 And .Bot = 0 Then + Count = Count + 1 + End If + Next i + + Call WriteConsoleMsg(CharIndex, "Número de usuarios: " & CStr(Count), FontTypeNames.FONTTYPE_INFO) + End With +End Sub + +Private Sub HandleQuit(ByVal CharIndex As Integer) + + With charlist(CharIndex) + 'Remove packet ID + Call .incomingData.ReadByte + + Call CloseSocket(CharIndex) + End With +End Sub + +Public Sub HandlePing(ByVal CharIndex As Integer) + + With charlist(CharIndex) + 'Remove Packet ID + Call .incomingData.ReadByte + + Call WritePong(CharIndex) + End With +End Sub + +Public Sub ServerFlushBuffer(ByVal CharIndex As Integer) + + Dim sndData As String + + With charlist(CharIndex).outgoingData + If .length = 0 Then _ + Exit Sub + + sndData = .ReadASCIIStringFixed(.length) + + Call EnviarDatosASlot(CharIndex, sndData) + End With +End Sub + +Public Sub WriteErrorMsg(ByVal CharIndex As Integer, ByVal Message As String) + +On Error GoTo ErrHandler + Call charlist(CharIndex).outgoingData.WriteASCIIStringFixed(PrepareMessageErrorMsg(Message)) +Exit Sub + +ErrHandler: + If Err.Number = charlist(CharIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(CharIndex) + Resume + End If +End Sub + +Public Function PrepareMessageChatOverHead(ByVal Chat As String, ByVal CharIndex As Integer, ByVal color As Long) As String + + With auxiliarBuffer + Call .WriteByte(ServerPacketID.ChatOverHead) + Call .WriteASCIIString(Chat) + Call .WriteInteger(CharIndex) + + ' Write rgb channels and save one byte from long :D + Call .WriteByte(color And &HFF) + Call .WriteByte((color And &HFF00&) \ &H100&) + Call .WriteByte((color And &HFF0000) \ &H10000) + + PrepareMessageChatOverHead = .ReadASCIIStringFixed(.length) + End With +End Function + +Public Sub WriteConsoleMsg(ByVal CharIndex As Integer, ByVal Chat As String, ByVal FontIndex As FontTypeNames) + +On Error GoTo ErrHandler + Call charlist(CharIndex).outgoingData.WriteASCIIStringFixed(PrepareMessageConsoleMsg(Chat, FontIndex)) +Exit Sub + +ErrHandler: + If Err.Number = charlist(CharIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(CharIndex) + Resume + End If +End Sub + +Public Sub WritePong(ByVal CharIndex As Integer) + +On Error GoTo ErrHandler + Call charlist(CharIndex).outgoingData.WriteByte(ServerPacketID.Pong) +Exit Sub + +ErrHandler: + If Err.Number = charlist(CharIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(CharIndex) + Resume + End If +End Sub + +Public Function PrepareMessageConsoleMsg(ByVal Chat As String, ByVal FontIndex As FontTypeNames) As String + + With auxiliarBuffer + Call .WriteByte(ServerPacketID.ConsoleMsg) + Call .WriteASCIIString(Chat) + Call .WriteByte(FontIndex) + + PrepareMessageConsoleMsg = .ReadASCIIStringFixed(.length) + End With +End Function + +Public Sub WriteLoggedMessage(ByVal CharIndex As Integer) + +On Error GoTo ErrHandler + Call charlist(CharIndex).outgoingData.WriteByte(ServerPacketID.Logged) +Exit Sub + +ErrHandler: + If Err.Number = charlist(CharIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(CharIndex) + Resume + End If +End Sub + +Public Sub WriteCreateFX(ByVal CharIndex As Integer, ByVal TargetIndex As Integer, ByVal FX As Integer, ByVal FXLoops As Integer) + +On Error GoTo ErrHandler + Call charlist(CharIndex).outgoingData.WriteASCIIStringFixed(PrepareMessageCreateFX(TargetIndex, FX, FXLoops)) +Exit Sub + +ErrHandler: + If Err.Number = charlist(CharIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(CharIndex) + Resume + End If +End Sub + +Public Function PrepareMessageCreateFX(ByVal CharIndex As Integer, ByVal FX As Integer, ByVal FXLoops As Integer) As String + + With auxiliarBuffer + Call .WriteByte(ServerPacketID.CreateFX) + Call .WriteInteger(CharIndex) + Call .WriteInteger(FX) + Call .WriteInteger(FXLoops) + + PrepareMessageCreateFX = .ReadASCIIStringFixed(.length) + End With +End Function + +Public Sub WriteCharacterCreate(ByVal UserIndex As Integer, ByVal body As Integer, ByVal Head As Integer, ByVal heading As E_Heading, _ + ByVal CharIndex As Integer, ByVal X As Byte, ByVal Y As Byte, ByVal weapon As Integer, ByVal shield As Integer, _ + ByVal helmet As Integer, ByVal name As String, ByVal MinHP As Integer, ByVal Team As Byte) + +On Error GoTo ErrHandler + Call charlist(UserIndex).outgoingData.WriteASCIIStringFixed(PrepareMessageCharacterCreate(body, Head, heading, CharIndex, X, Y, weapon, shield, _ + helmet, name, MinHP, Team)) +Exit Sub + +ErrHandler: + If Err.Number = charlist(UserIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(UserIndex) + Resume + End If +End Sub + +Public Function PrepareMessageCharacterCreate(ByVal body As Integer, ByVal Head As Integer, ByVal heading As E_Heading, _ + ByVal CharIndex As Integer, ByVal X As Byte, ByVal Y As Byte, ByVal weapon As Integer, ByVal shield As Integer, _ + ByVal helmet As Integer, ByVal name As String, ByVal MinHP As Integer, ByVal Team As Byte) As String + + With auxiliarBuffer + Call .WriteByte(ServerPacketID.CharacterCreate) + + Call .WriteInteger(CharIndex) + Call .WriteInteger(body) + Call .WriteInteger(Head) + Call .WriteByte(heading) + Call .WriteByte(X) + Call .WriteByte(Y) + Call .WriteInteger(weapon) + Call .WriteInteger(shield) + Call .WriteInteger(helmet) + Call .WriteASCIIString(name) + Call .WriteInteger(MinHP) + Call .WriteByte(Team) + + PrepareMessageCharacterCreate = .ReadASCIIStringFixed(.length) + End With +End Function + +Public Sub WriteUpdateCharStats(ByVal CharIndex As Integer) + +On Error GoTo ErrHandler + With charlist(CharIndex).outgoingData + Call .WriteByte(ServerPacketID.UpdateCharStats) + Call .WriteInteger(charlist(CharIndex).MaxHP) + Call .WriteInteger(charlist(CharIndex).MinHP) + Call .WriteInteger(charlist(CharIndex).MaxMAN) + Call .WriteInteger(charlist(CharIndex).MinMAN) + Call .WriteInteger(charlist(CharIndex).MaxSTA) + Call .WriteInteger(charlist(CharIndex).MinSTA) + Call .WriteByte(charlist(CharIndex).Lvl) + End With +Exit Sub + +ErrHandler: + If Err.Number = charlist(CharIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(CharIndex) + Resume + End If +End Sub + +Public Sub WriteCharIndexInServer(ByVal CharIndex As Integer) + +On Error GoTo ErrHandler + With charlist(CharIndex).outgoingData + Call .WriteByte(ServerPacketID.CharIndexInServer) + Call .WriteInteger(CharIndex) + End With +Exit Sub + +ErrHandler: + If Err.Number = charlist(CharIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(CharIndex) + Resume + End If +End Sub + +Public Sub WritePosUpdate(ByVal CharIndex As Integer) + +On Error GoTo ErrHandler + With charlist(CharIndex).outgoingData + Call .WriteByte(ServerPacketID.PosUpdate) + Call .WriteByte(charlist(CharIndex).Pos.X) + Call .WriteByte(charlist(CharIndex).Pos.Y) + End With +Exit Sub + +ErrHandler: + If Err.Number = charlist(CharIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(CharIndex) + Resume + End If +End Sub + +Public Function PrepareMessageCharacterMove(ByVal CharIndex As Integer, ByVal X As Byte, ByVal Y As Byte) As String + + With auxiliarBuffer + Call .WriteByte(ServerPacketID.CharacterMove) + Call .WriteInteger(CharIndex) + Call .WriteByte(X) + Call .WriteByte(Y) + + PrepareMessageCharacterMove = .ReadASCIIStringFixed(.length) + End With +End Function + +Public Sub WritePlayWave(ByVal CharIndex As Integer, ByVal wave As Byte, ByVal X As Byte, ByVal Y As Byte) + +On Error GoTo ErrHandler + Call charlist(CharIndex).outgoingData.WriteASCIIStringFixed(PrepareMessagePlayWave(wave, X, Y)) +Exit Sub + +ErrHandler: + If Err.Number = charlist(CharIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(CharIndex) + Resume + End If +End Sub + +Public Function PrepareMessagePlayWave(ByVal wave As Byte, ByVal X As Byte, ByVal Y As Byte) As String + + With auxiliarBuffer + Call .WriteByte(ServerPacketID.PlayWave) + Call .WriteByte(wave) + Call .WriteByte(X) + Call .WriteByte(Y) + + PrepareMessagePlayWave = .ReadASCIIStringFixed(.length) + End With +End Function + +Private Sub HandleLanzaFlecha(ByVal CharIndex As Integer) + + If charlist(CharIndex).incomingData.length < 3 Then + Err.Raise charlist(CharIndex).incomingData.NotEnoughDataErrCode + Exit Sub + End If + + Dim X As Byte + Dim Y As Byte + + With charlist(CharIndex) + 'Remove packet ID + Call .incomingData.ReadByte + + X = .incomingData.ReadByte() + Y = .incomingData.ReadByte() + + 'If dead, can't attack + If .MinHP = 0 Then + Call WriteConsoleMsg(CharIndex, "¡¡Estás muerto!!", FontTypeNames.FONTTYPE_INFO) + Exit Sub + End If + + 'If equiped weapon is melee, can't attack this way + If .TipoArma = 1 Then + Call WriteConsoleMsg(CharIndex, "No puedes usar así este arma.", FontTypeNames.FONTTYPE_INFO) + Exit Sub + End If + + If Not CharTimer(CharIndex).Check(TimersIndex.Attack, False) Then Exit Sub 'Check if arrows interval has finished. + If Not CharTimer(CharIndex).Check(TimersIndex.Arrows) Then Exit Sub + + If MapData(X, Y).CharIndex > 0 Then + Call UsuarioAtacaUsuario(CharIndex, MapData(X, Y).CharIndex) + ElseIf MapData(X, Y + 1).CharIndex > 0 Then + Call UsuarioAtacaUsuario(CharIndex, MapData(X, Y + 1).CharIndex) + End If + End With +End Sub + +Public Sub WriteLanzaFlecha(ByVal X As Byte, ByVal Y As Byte) + + Call outgoingData.WriteByte(ClientPacketID.LanzaFlecha) + + Call outgoingData.WriteByte(X) + Call outgoingData.WriteByte(Y) +End Sub + +Public Sub WriteCharacterRemove(ByVal CharIndex As Integer, ByVal TargetIndex As Integer) + +On Error GoTo ErrHandler + Call charlist(CharIndex).outgoingData.WriteASCIIStringFixed(PrepareMessageCharacterRemove(TargetIndex)) +Exit Sub + +ErrHandler: + If Err.Number = charlist(CharIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(CharIndex) + Resume + End If +End Sub + +Public Function PrepareMessageCharacterRemove(ByVal CharIndex As Integer) As String + + With auxiliarBuffer + Call .WriteByte(ServerPacketID.CharacterRemove) + Call .WriteInteger(CharIndex) + + PrepareMessageCharacterRemove = .ReadASCIIStringFixed(.length) + End With +End Function + +Public Sub WritePauseToggle(ByVal CharIndex As Integer, ByVal Pausado As Byte) + +On Error GoTo ErrHandler + Call charlist(CharIndex).outgoingData.WriteASCIIStringFixed(PrepareMessagePauseToggle(Pausado)) +Exit Sub + +ErrHandler: + If Err.Number = charlist(CharIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(CharIndex) + Resume + End If +End Sub + +Public Function PrepareMessagePauseToggle(ByVal Pausado As Byte) As String + + With auxiliarBuffer + Call .WriteByte(ServerPacketID.PauseToggle) + Call .WriteByte(Pausado) + PrepareMessagePauseToggle = .ReadASCIIStringFixed(.length) + End With +End Function + +Public Sub WriteCuentaToggle(ByVal CharIndex As Integer, ByVal Contando As Byte) + +On Error GoTo ErrHandler + Call charlist(CharIndex).outgoingData.WriteASCIIStringFixed(PrepareMessageCuentaToggle(Contando)) +Exit Sub + +ErrHandler: + If Err.Number = charlist(CharIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(CharIndex) + Resume + End If +End Sub + +Public Function PrepareMessageCuentaToggle(ByVal Contando As Byte) As String + + With auxiliarBuffer + Call .WriteByte(ServerPacketID.CuentaToggle) + Call .WriteByte(Contando) + PrepareMessageCuentaToggle = .ReadASCIIStringFixed(.length) + End With +End Function + +Private Sub HandleCuentaToggle() + + 'Remove packet ID + Call incomingData.ReadByte + + EnCuenta = incomingData.ReadByte() +End Sub + +Public Sub WriteCharacterChange(ByVal UserIndex As Integer, ByVal body As Integer, ByVal Head As Integer, ByVal heading As E_Heading, _ + ByVal CharIndex As Integer, ByVal weapon As Integer, ByVal shield As Integer, _ + ByVal FX As Integer, ByVal FXLoops As Integer, ByVal helmet As Integer) + +On Error GoTo ErrHandler + Call charlist(UserIndex).outgoingData.WriteASCIIStringFixed(PrepareMessageCharacterChange(body, Head, heading, CharIndex, weapon, shield, FX, FXLoops, helmet)) +Exit Sub + +ErrHandler: + If Err.Number = charlist(UserIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(UserIndex) + Resume + End If +End Sub + +Public Function PrepareMessageCharacterChange(ByVal body As Integer, ByVal Head As Integer, ByVal heading As E_Heading, _ + ByVal CharIndex As Integer, ByVal weapon As Integer, ByVal shield As Integer, _ + ByVal FX As Integer, ByVal FXLoops As Integer, ByVal helmet As Integer) As String + + With auxiliarBuffer + Call .WriteByte(ServerPacketID.CharacterChange) + + Call .WriteInteger(CharIndex) + Call .WriteInteger(body) + Call .WriteInteger(Head) + Call .WriteByte(heading) + Call .WriteInteger(weapon) + Call .WriteInteger(shield) + Call .WriteInteger(helmet) + Call .WriteInteger(FX) + Call .WriteInteger(FXLoops) + + PrepareMessageCharacterChange = .ReadASCIIStringFixed(.length) + End With +End Function + +Public Sub WriteParalizeOK(ByVal CharIndex As Integer, ByVal Inmo As Byte) + +On Error GoTo ErrHandler + Call charlist(CharIndex).outgoingData.WriteByte(ServerPacketID.ParalizeOK) + Call charlist(CharIndex).outgoingData.WriteByte(Inmo) + 'If CharIndex <> UserCharIndex Then Call WritePosUpdate(CharIndex) +Exit Sub + +ErrHandler: + If Err.Number = charlist(CharIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(CharIndex) + Resume + End If +End Sub + +Private Sub HandleChangePj(ByVal CharIndex As Integer) + + If charlist(CharIndex).incomingData.length < 6 Then + Err.Raise charlist(CharIndex).incomingData.NotEnoughDataErrCode + Exit Sub + End If + + Dim Clase As Byte + Dim Raza As Byte + Dim Genero As Byte + Dim Nivel As Byte + Dim Team As Byte + + With charlist(CharIndex) + 'Remove packet ID + Call .incomingData.ReadByte + + Clase = .incomingData.ReadByte() + Raza = .incomingData.ReadByte() + Genero = .incomingData.ReadByte() + Nivel = .incomingData.ReadByte() + Team = .incomingData.ReadByte() + + If Clase < 0 Or Clase > 6 Then Exit Sub + If Raza < 0 Or Raza > 4 Then Exit Sub + If Genero < 0 Or Genero > 1 Then Exit Sub + If Nivel < 35 Or Nivel > 50 Then Exit Sub + If Team < 1 Or Team > 2 Then Exit Sub + + If Team = 1 Then + If UBound(Team1) = 5 Then + Call WriteConsoleMsg(CharIndex, "El equipo está lleno.", FontTypeNames.FONTTYPE_INFO) + Exit Sub + End If + Else + If UBound(Team2) = 5 Then + Call WriteConsoleMsg(CharIndex, "El equipo está lleno.", FontTypeNames.FONTTYPE_INFO) + Exit Sub + End If + End If + + Call CambiarPj(CharIndex, Clase, Raza, Genero, Nivel, Team) + End With +End Sub + +Public Sub WriteChangePj() + + With outgoingData + Call .WriteByte(ClientPacketID.ChangePj) + + Call .WriteByte(UserClase) + Call .WriteByte(UserRaza) + Call .WriteByte(UserGenero) + Call .WriteByte(UserLvl) + Call .WriteByte(UserTeam) + End With +End Sub + +Public Sub WriteDisconnect(ByVal CharIndex As Integer) + +On Error GoTo ErrHandler + Call charlist(CharIndex).outgoingData.WriteByte(ServerPacketID.Disconnect) +Exit Sub + +ErrHandler: + If Err.Number = charlist(CharIndex).outgoingData.NotEnoughSpaceErrCode Then + Call ServerFlushBuffer(CharIndex) + Resume + End If +End Sub + +'' +' Sends the data using the socket controls in the MainForm. +' +' @param sdData The data to be sent to the server. + +Private Sub SendData(ByRef sdData As String) + + 'No enviamos nada si no estamos conectados +#If UsarWrench = 1 Then + If Not frmMain.Socket1.IsWritable Then + 'Put data back in the bytequeue + Call outgoingData.WriteASCIIStringFixed(sdData) + + Exit Sub + End If + + If Not frmMain.Socket1.Connected Then Exit Sub +#Else + If frmMain.Winsock1.State <> sckConnected Then Exit Sub +#End If + +#If SeguridadAlkon Then + Dim data() As Byte + + data = StrConv(sdData, vbFromUnicode) + + Call DataSent(data) + + sdData = StrConv(data, vbUnicode) +#End If + + 'Send data! +#If UsarWrench = 1 Then + Call frmMain.Socket1.Write(sdData, Len(sdData)) +#Else + Call frmMain.Winsock1.SendData(sdData) +#End If + +End Sub diff --git a/CODIGO/ProtocolCmdParse.bas b/CODIGO/ProtocolCmdParse.bas new file mode 100644 index 0000000..a3f1462 --- /dev/null +++ b/CODIGO/ProtocolCmdParse.bas @@ -0,0 +1,262 @@ +Attribute VB_Name = "ProtocolCmdParse" +'Argentum Online +' +'Copyright (C) 2006 Juan Martín Sotuyo Dodero (Maraxus) +'Copyright (C) 2006 Alejandro Santos (AlejoLp) + +' +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +' +'Argentum Online is based on Baronsoft's VB6 Online RPG +'You can contact the original creator of ORE at aaron@baronsoft.com +'for more information about ORE please visit http://www.baronsoft.com/ +' + +Option Explicit + +Public Enum eNumber_Types + ent_Byte + ent_Integer + ent_Long + ent_Trigger +End Enum + +'' +' Interpreta, valida y ejecuta el comando ingresado . +' +' @param RawCommand El comando en version String +' @remarks None Known. + +Public Sub ParseUserCommand(ByVal RawCommand As String) +'*************************************************** +'Author: Alejandro Santos (AlejoLp) +'Last Modification: 16/11/2009 +'Interpreta, valida y ejecuta el comando ingresado +'26/03/2009: ZaMa - Flexibilizo la cantidad de parametros de /nene, /onlinemap y /telep +'16/11/2009: ZaMa - Ahora el /ct admite radio +'*************************************************** + Dim TmpArgos() As String + + Dim Comando As String + Dim ArgumentosAll() As String + Dim ArgumentosRaw As String + Dim Argumentos2() As String + Dim Argumentos3() As String + Dim Argumentos4() As String + Dim CantidadArgumentos As Long + Dim notNullArguments As Boolean + + Dim tmpArr() As String + Dim tmpInt As Integer + + ' TmpArgs: Un array de a lo sumo dos elementos, + ' el primero es el comando (hasta el primer espacio) + ' y el segundo elemento es el resto. Si no hay argumentos + ' devuelve un array de un solo elemento + TmpArgos = Split(RawCommand, " ", 2) + + Comando = Trim$(UCase$(TmpArgos(0))) + + If UBound(TmpArgos) > 0 Then + ' El string en crudo que este despues del primer espacio + ArgumentosRaw = TmpArgos(1) + + 'veo que los argumentos no sean nulos + notNullArguments = LenB(Trim$(ArgumentosRaw)) + + ' Un array separado por blancos, con tantos elementos como + ' se pueda + ArgumentosAll = Split(TmpArgos(1), " ") + + ' Cantidad de argumentos. En ESTE PUNTO el minimo es 1 + CantidadArgumentos = UBound(ArgumentosAll) + 1 + + ' Los siguientes arrays tienen A LO SUMO, COMO MAXIMO + ' 2, 3 y 4 elementos respectivamente. Eso significa + ' que pueden tener menos, por lo que es imperativo + ' preguntar por CantidadArgumentos. + + Argumentos2 = Split(TmpArgos(1), " ", 2) + Argumentos3 = Split(TmpArgos(1), " ", 3) + Argumentos4 = Split(TmpArgos(1), " ", 4) + Else + CantidadArgumentos = 0 + End If + + ' Sacar cartel APESTA!! (y es ilógico, estás diciendo una pausa/espacio :rolleyes: ) + If Comando = "" Then Comando = " " + + If Left$(Comando, 1) = "/" Then + ' Comando normal + + Select Case Comando + Case "/ONLINE" + Call WriteOnline + + Case "/SALIR" + Call WriteQuit + + Case "/PING" + Call WritePing + + End Select + + Else + ' Hablar + Call WriteTalk(RawCommand) + End If +End Sub + +'' +' Show a console message. +' +' @param Message The message to be written. +' @param red Sets the font red color. +' @param green Sets the font green color. +' @param blue Sets the font blue color. +' @param bold Sets the font bold style. +' @param italic Sets the font italic style. + +Public Sub ShowConsoleMsg(ByVal Message As String, Optional ByVal red As Integer = 255, Optional ByVal green As Integer = 255, Optional ByVal blue As Integer = 255, Optional ByVal bold As Boolean = False, Optional ByVal italic As Boolean = False) +'*************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modification: 01/03/07 +' +'*************************************************** + Call AddtoRichTextBox(frmMain.RecTxt, Message, red, green, blue, bold, italic) +End Sub + +'' +' Returns whether the number is correct. +' +' @param Numero The number to be checked. +' @param Tipo The acceptable type of number. + +Public Function ValidNumber(ByVal Numero As String, ByVal TIPO As eNumber_Types) As Boolean +'*************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modification: 01/06/07 +' +'*************************************************** + Dim Minimo As Long + Dim Maximo As Long + + If Not IsNumeric(Numero) Then _ + Exit Function + + Select Case TIPO + Case eNumber_Types.ent_Byte + Minimo = 0 + Maximo = 255 + + Case eNumber_Types.ent_Integer + Minimo = -32768 + Maximo = 32767 + + Case eNumber_Types.ent_Long + Minimo = -2147483648# + Maximo = 2147483647 + + Case eNumber_Types.ent_Trigger + Minimo = 0 + Maximo = 6 + End Select + + If Val(Numero) >= Minimo And Val(Numero) <= Maximo Then _ + ValidNumber = True +End Function + +'' +' Returns whether the ip format is correct. +' +' @param IP The ip to be checked. + +Private Function validipv4str(ByVal ip As String) As Boolean +'*************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modification: 01/06/07 +' +'*************************************************** + Dim tmpArr() As String + + tmpArr = Split(ip, ".") + + If UBound(tmpArr) <> 3 Then _ + Exit Function + + If Not ValidNumber(tmpArr(0), eNumber_Types.ent_Byte) Or _ + Not ValidNumber(tmpArr(1), eNumber_Types.ent_Byte) Or _ + Not ValidNumber(tmpArr(2), eNumber_Types.ent_Byte) Or _ + Not ValidNumber(tmpArr(3), eNumber_Types.ent_Byte) Then _ + Exit Function + + validipv4str = True +End Function + +'' +' Converts a string into the correct ip format. +' +' @param IP The ip to be converted. + +Private Function str2ipv4l(ByVal ip As String) As Byte() +'*************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modification: 07/26/07 +'Last Modified By: Rapsodius +'Specify Return Type as Array of Bytes +'Otherwise, the default is a Variant or Array of Variants, that slows down +'the function +'*************************************************** + Dim tmpArr() As String + Dim bArr(3) As Byte + + tmpArr = Split(ip, ".") + + bArr(0) = CByte(tmpArr(0)) + bArr(1) = CByte(tmpArr(1)) + bArr(2) = CByte(tmpArr(2)) + bArr(3) = CByte(tmpArr(3)) + + str2ipv4l = bArr +End Function + +'' +' Do an Split() in the /AEMAIL in onother way +' +' @param text All the comand without the /aemail +' @return An bidimensional array with user and mail + +Private Function AEMAILSplit(ByRef Text As String) As String() +'*************************************************** +'Author: Lucas Tavolaro Ortuz (Tavo) +'Useful for AEMAIL BUG FIX +'Last Modification: 07/26/07 +'Last Modified By: Rapsodius +'Specify Return Type as Array of Strings +'Otherwise, the default is a Variant or Array of Variants, that slows down +'the function +'*************************************************** + Dim tmpArr(0 To 1) As String + Dim Pos As Byte + + Pos = InStr(1, Text, "-") + + If Pos <> 0 Then + tmpArr(0) = mid$(Text, 1, Pos - 1) + tmpArr(1) = mid$(Text, Pos + 1) + Else + tmpArr(0) = vbNullString + End If + + AEMAILSplit = tmpArr +End Function diff --git a/CODIGO/Resolution.bas b/CODIGO/Resolution.bas new file mode 100644 index 0000000..677fa19 --- /dev/null +++ b/CODIGO/Resolution.bas @@ -0,0 +1,159 @@ +Attribute VB_Name = "Resolution" +'************************************************************** +' Resolution.bas - Performs resolution changes. +' +' Designed and implemented by Juan Martín Sotuyo Dodero (Maraxus) +' (juansotuyo@gmail.com) +'************************************************************** + +'************************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +'************************************************************************** + +'' +'Handles all incoming / outgoing packets for client - server communications +'The binary prtocol here used was designed by Juan Martín Sotuyo Dodero. +'This is the first time it's used in Alkon, though the second time it's coded. +'This implementation has several enhacements from the first design. +' +' @file Resolution.bas +' @author Juan Martín Sotuyo Dodero (Maraxus) juansotuyo@gmail.com +' @version 1.1.0 +' @date 20080329 + +'************************************************************************** +' - HISTORY +' v1.0.0 - Initial release ( 2007/08/14 - Juan Martín Sotuyo Dodero ) +' v1.1.0 - Made it reset original depth and frequency at exit ( 2008/03/29 - Juan Martín Sotuyo Dodero ) +'************************************************************************** + +Option Explicit + +Private Const CCDEVICENAME As Long = 32 +Private Const CCFORMNAME As Long = 32 +Private Const DM_BITSPERPEL As Long = &H40000 +Private Const DM_PELSWIDTH As Long = &H80000 +Private Const DM_PELSHEIGHT As Long = &H100000 +Private Const DM_DISPLAYFREQUENCY As Long = &H400000 +Private Const CDS_TEST As Long = &H4 +Private Const ENUM_CURRENT_SETTINGS As Long = -1 + +Private Type typDevMODE + dmDeviceName As String * CCDEVICENAME + dmSpecVersion As Integer + dmDriverVersion As Integer + dmSize As Integer + dmDriverExtra As Integer + dmFields As Long + dmOrientation As Integer + dmPaperSize As Integer + dmPaperLength As Integer + dmPaperWidth As Integer + dmScale As Integer + dmCopies As Integer + dmDefaultSource As Integer + dmPrintQuality As Integer + dmColor As Integer + dmDuplex As Integer + dmYResolution As Integer + dmTTOption As Integer + dmCollate As Integer + dmFormName As String * CCFORMNAME + dmUnusedPadding As Integer + dmBitsPerPel As Integer + dmPelsWidth As Long + dmPelsHeight As Long + dmDisplayFlags As Long + dmDisplayFrequency As Long +End Type + +Private oldResHeight As Long +Private oldResWidth As Long +Private oldDepth As Integer +Private oldFrequency As Long +Private bNoResChange As Boolean + + +Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lptypDevMode As Any) As Boolean +Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lptypDevMode As Any, ByVal dwFlags As Long) As Long + + +'TODO : Change this to not depend on any external public variable using args instead! + +Public Sub SetResolution() +'*************************************************** +'Autor: Unknown +'Last Modification: 03/29/08 +'Changes the display resolution if needed. +'Last Modified By: Juan Martín Sotuyo Dodero (Maraxus) +' 03/29/2008: Maraxus - Retrieves current settings storing display depth and frequency for proper restoration. +'*************************************************** + Dim lRes As Long + Dim MidevM As typDevMODE + Dim CambiarResolucion As Boolean + + lRes = EnumDisplaySettings(0, ENUM_CURRENT_SETTINGS, MidevM) + + oldResWidth = Screen.Width \ Screen.TwipsPerPixelX + oldResHeight = Screen.Height \ Screen.TwipsPerPixelY + + If NoRes Then + CambiarResolucion = (oldResWidth < 800 Or oldResHeight < 600) + Else + CambiarResolucion = (oldResWidth <> 800 Or oldResHeight <> 600) + End If + + If CambiarResolucion Then + + With MidevM + oldDepth = .dmBitsPerPel + oldFrequency = .dmDisplayFrequency + + .dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL + .dmPelsWidth = 800 + .dmPelsHeight = 600 + .dmBitsPerPel = 16 + End With + + lRes = ChangeDisplaySettings(MidevM, CDS_TEST) + Else + bNoResChange = True + End If +End Sub + +Public Sub ResetResolution() +'*************************************************** +'Autor: Unknown +'Last Modification: 03/29/08 +'Changes the display resolution if needed. +'Last Modified By: Juan Martín Sotuyo Dodero (Maraxus) +' 03/29/2008: Maraxus - Properly restores display depth and frequency. +'*************************************************** + Dim typDevM As typDevMODE + Dim lRes As Long + + If Not bNoResChange Then + + lRes = EnumDisplaySettings(0, ENUM_CURRENT_SETTINGS, typDevM) + + With typDevM + .dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL Or DM_DISPLAYFREQUENCY + .dmPelsWidth = oldResWidth + .dmPelsHeight = oldResHeight + .dmBitsPerPel = oldDepth + .dmDisplayFrequency = oldFrequency + End With + + lRes = ChangeDisplaySettings(typDevM, CDS_TEST) + End If +End Sub diff --git a/CODIGO/SecurityIp.bas b/CODIGO/SecurityIp.bas new file mode 100644 index 0000000..e573f57 --- /dev/null +++ b/CODIGO/SecurityIp.bas @@ -0,0 +1,306 @@ +Attribute VB_Name = "SecurityIp" +'Argentum Online 0.12.2 +'Copyright (C) 2002 Márquez Pablo Ignacio +' +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +' +'Argentum Online is based on Baronsoft's VB6 Online RPG +'You can contact the original creator of ORE at aaron@baronsoft.com +'for more information about ORE please visit http://www.baronsoft.com/ +' +' +'You can contact me at: +'morgolock@speedy.com.ar +'www.geocities.com/gmorgolock +'Calle 3 número 983 piso 7 dto A +'La Plata - Pcia, Buenos Aires - Republica Argentina +'Código Postal 1900 +'Pablo Ignacio Márquez + + +'************************************************************** +' General_IpSecurity.Bas - Maneja la seguridad de las IPs +' +' Escrito y diseñado por DuNga (ltourrilhes@gmail.com) +'************************************************************** +Option Explicit + +'************************************************* ************* +' General_IpSecurity.Bas - Maneja la seguridad de las IPs +' +' Escrito y diseñado por DuNga (ltourrilhes@gmail.com) +'************************************************* ************* + +Private IpTables() As Long 'USAMOS 2 LONGS: UNO DE LA IP, SEGUIDO DE UNO DE LA INFO +Private EntrysCounter As Long +Private MaxValue As Long +Private Multiplicado As Long 'Cuantas veces multiplike el EntrysCounter para que me entren? +Private Const IntervaloEntreConexiones As Long = 1000 + +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +'Declaraciones para maximas conexiones por usuario +'Agregado por EL OSO +Private MaxConTables() As Long +Private MaxConTablesEntry As Long 'puntero a la ultima insertada + +Private Const LIMITECONEXIONESxIP As Long = 10 + +Private Enum e_SecurityIpTabla + IP_INTERVALOS = 1 + IP_LIMITECONEXIONES = 2 +End Enum + +Public Sub InitIpTables(ByVal OptCountersValue As Long) +'************************************************* ************* +'Author: Lucio N. Tourrilhes (DuNga) +'Last Modify Date: EL OSO 21/01/06. Soporte para MaxConTables +' +'************************************************* ************* + EntrysCounter = OptCountersValue + Multiplicado = 1 + + ReDim IpTables(EntrysCounter * 2) As Long + MaxValue = 0 + + ReDim MaxConTables(MaxUsers * 2 - 1) As Long + MaxConTablesEntry = 0 + +End Sub + +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +''''''''''''''''''''''FUNCIONES PARA INTERVALOS''''''''''''''''''''''''''''''''' +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +Public Sub IpSecurityMantenimientoLista() +'************************************************* ************* +'Author: Lucio N. Tourrilhes (DuNga) +'Last Modify Date: Unknow +' +'************************************************* ************* + 'Las borro todas cada 1 hora, asi se "renuevan" + EntrysCounter = EntrysCounter \ Multiplicado + Multiplicado = 1 + ReDim IpTables(EntrysCounter * 2) As Long + MaxValue = 0 +End Sub + +Public Function IpSecurityAceptarNuevaConexion(ByVal ip As Long) As Boolean +'************************************************* ************* +'Author: Lucio N. Tourrilhes (DuNga) +'Last Modify Date: Unknow +' +'************************************************* ************* +Dim IpTableIndex As Long + + + IpTableIndex = FindTableIp(ip, IP_INTERVALOS) + + If IpTableIndex >= 0 Then + If IpTables(IpTableIndex + 1) + IntervaloEntreConexiones <= GetTickCount Then 'No está saturando de connects? + IpTables(IpTableIndex + 1) = GetTickCount + IpSecurityAceptarNuevaConexion = True + Debug.Print "CONEXION ACEPTADA" + Exit Function + Else + IpSecurityAceptarNuevaConexion = False + + Debug.Print "CONEXION NO ACEPTADA" + Exit Function + End If + Else + IpTableIndex = Not IpTableIndex + AddNewIpIntervalo ip, IpTableIndex + IpTables(IpTableIndex + 1) = GetTickCount + IpSecurityAceptarNuevaConexion = True + Exit Function + End If + +End Function + + +Private Sub AddNewIpIntervalo(ByVal ip As Long, ByVal index As Long) +'************************************************* ************* +'Author: Lucio N. Tourrilhes (DuNga) +'Last Modify Date: Unknow +' +'************************************************* ************* + '2) Pruebo si hay espacio, sino agrando la lista + If MaxValue + 1 > EntrysCounter Then + EntrysCounter = EntrysCounter \ Multiplicado + Multiplicado = Multiplicado + 1 + EntrysCounter = EntrysCounter * Multiplicado + + ReDim Preserve IpTables(EntrysCounter * 2) As Long + End If + + '4) Corro todo el array para arriba + Call CopyMemory(IpTables(index + 2), IpTables(index), (MaxValue - index \ 2) * 8) '*4 (peso del long) * 2(cantidad de elementos por c/u) + IpTables(index) = ip + + '3) Subo el indicador de el maximo valor almacenado y listo :) + MaxValue = MaxValue + 1 +End Sub + +' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +' ''''''''''''''''''''FUNCIONES PARA LIMITES X IP'''''''''''''''''''''''''''''''' +' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +Public Function IPSecuritySuperaLimiteConexiones(ByVal ip As Long) As Boolean +Dim IpTableIndex As Long + + IpTableIndex = FindTableIp(ip, IP_LIMITECONEXIONES) + + If IpTableIndex >= 0 Then + + If MaxConTables(IpTableIndex + 1) < LIMITECONEXIONESxIP Then + Debug.Print "suma conexion a " & ip & " total " & MaxConTables(IpTableIndex + 1) + 1 + MaxConTables(IpTableIndex + 1) = MaxConTables(IpTableIndex + 1) + 1 + IPSecuritySuperaLimiteConexiones = False + Else + Debug.Print "rechaza conexion a " & ip + IPSecuritySuperaLimiteConexiones = True + End If + Else + IPSecuritySuperaLimiteConexiones = False + If MaxConTablesEntry < MaxUsers Then 'si hay espacio.. + IpTableIndex = Not IpTableIndex + AddNewIpLimiteConexiones ip, IpTableIndex 'iptableindex es donde lo agrego + MaxConTables(IpTableIndex + 1) = 1 + End If + End If + +End Function + +Private Sub AddNewIpLimiteConexiones(ByVal ip As Long, ByVal index As Long) +'************************************************* ************* +'Author: (EL OSO) +'Last Modify Date: Unknow +' +'************************************************* ************* + 'Debug.Print "agrega conexion a " & ip + 'Debug.Print "(Declaraciones.MaxUsers - index) = " & (Declaraciones.MaxUsers - Index) + '4) Corro todo el array para arriba + 'Call CopyMemory(MaxConTables(Index + 2), MaxConTables(Index), (MaxConTablesEntry - Index \ 2) * 8) '*4 (peso del long) * 2(cantidad de elementos por c/u) + 'MaxConTables(Index) = ip + + '3) Subo el indicador de el maximo valor almacenado y listo :) + 'MaxConTablesEntry = MaxConTablesEntry + 1 + + +'************************************************* ************* +'Author: (EL OSO) +'Last Modify Date: 16/2/2006 +'Modified by Juan Martín Sotuyo Dodero (Maraxus) +'************************************************* ************* + Debug.Print "agrega conexion a " & ip + Debug.Print "(Declaraciones.MaxUsers - index) = " & (MaxUsers - index) + Debug.Print "Agrega conexion a nueva IP " & ip + '4) Corro todo el array para arriba + Dim temp() As Long + ReDim temp((MaxConTablesEntry - index \ 2) * 2) As Long 'VB no deja inicializar con rangos variables... + Call CopyMemory(temp(0), MaxConTables(index), (MaxConTablesEntry - index \ 2) * 8) '*4 (peso del long) * 2(cantidad de elementos por c/u) + Call CopyMemory(MaxConTables(index + 2), temp(0), (MaxConTablesEntry - index \ 2) * 8) '*4 (peso del long) * 2(cantidad de elementos por c/u) + MaxConTables(index) = ip + + '3) Subo el indicador de el maximo valor almacenado y listo :) + MaxConTablesEntry = MaxConTablesEntry + 1 + +End Sub + +Public Sub IpRestarConexion(ByVal ip As Long) +'*************************************************** +'Author: Unknown +'Last Modification: - +' +'*************************************************** + +Dim key As Long + Debug.Print "resta conexion a " & ip + + key = FindTableIp(ip, IP_LIMITECONEXIONES) + + If key >= 0 Then + If MaxConTables(key + 1) > 0 Then + MaxConTables(key + 1) = MaxConTables(key + 1) - 1 + End If + If MaxConTables(key + 1) <= 0 Then + 'la limpiamos + Call CopyMemory(MaxConTables(key), MaxConTables(key + 2), (MaxConTablesEntry - (key \ 2) + 1) * 8) + MaxConTablesEntry = MaxConTablesEntry - 1 + End If + Else 'Key <= 0 + 'LogCriticEvent "SecurityIp.IpRestarconexion obtuvo un valor negativo en key" + End If +End Sub + + + +' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +' ''''''''''''''''''''''''FUNCIONES GENERALES'''''''''''''''''''''''''''''''''''' +' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + + +Private Function FindTableIp(ByVal ip As Long, ByVal Tabla As e_SecurityIpTabla) As Long +'************************************************* ************* +'Author: Lucio N. Tourrilhes (DuNga) +'Last Modify Date: Unknow +'Modified by Juan Martín Sotuyo Dodero (Maraxus) to use Binary Insertion +'************************************************* ************* +Dim First As Long +Dim Last As Long +Dim Middle As Long + + Select Case Tabla + Case e_SecurityIpTabla.IP_INTERVALOS + First = 0 + Last = MaxValue + Do While First <= Last + Middle = (First + Last) \ 2 + + If (IpTables(Middle * 2) < ip) Then + First = Middle + 1 + ElseIf (IpTables(Middle * 2) > ip) Then + Last = Middle - 1 + Else + FindTableIp = Middle * 2 + Exit Function + End If + Loop + FindTableIp = Not (Middle * 2) + + Case e_SecurityIpTabla.IP_LIMITECONEXIONES + + First = 0 + Last = MaxConTablesEntry + + Do While First <= Last + Middle = (First + Last) \ 2 + + If MaxConTables(Middle * 2) < ip Then + First = Middle + 1 + ElseIf MaxConTables(Middle * 2) > ip Then + Last = Middle - 1 + Else + FindTableIp = Middle * 2 + Exit Function + End If + Loop + FindTableIp = Not (Middle * 2) + End Select +End Function diff --git a/CODIGO/TCP.bas b/CODIGO/TCP.bas new file mode 100644 index 0000000..fa06518 --- /dev/null +++ b/CODIGO/TCP.bas @@ -0,0 +1,289 @@ +Attribute VB_Name = "TCP" +'Argentum Online 0.12.2 +'Copyright (C) 2002 Márquez Pablo Ignacio +' +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +' +'Argentum Online is based on Baronsoft's VB6 Online RPG +'You can contact the original creator of ORE at aaron@baronsoft.com +'for more information about ORE please visit http://www.baronsoft.com/ +' +' +'You can contact me at: +'morgolock@speedy.com.ar +'www.geocities.com/gmorgolock +'Calle 3 número 983 piso 7 dto A +'La Plata - Pcia, Buenos Aires - Republica Argentina +'Código Postal 1900 +'Pablo Ignacio Márquez + +Option Explicit + +Public Const ULTIMAVERSION As String = "0.2.1" +Public Hosting As Byte + +Sub Login() + + Call WriteLoginChar + + DoEvents + + Call FlushBuffer +End Sub + +Sub ConnectChar(ByVal CharIndex As Integer, ByRef name As String, ByVal Clase As Byte, ByVal Raza As Byte, _ + ByVal Genero As Byte, ByVal Lvl As Byte, ByVal Team As Byte) + +Dim N As Integer +Dim tStr As String +Dim i As Byte + +With charlist(CharIndex) + + 'Controlamos no pasar el maximo de usuarios + If NumChars >= MaxUsers Then + Call WriteErrorMsg(CharIndex, "El servidor ha alcanzado el máximo de usuarios soportado, por favor vuelva a intertarlo más tarde.") + Call ServerFlushBuffer(CharIndex) + Call CloseSocket(CharIndex) + Exit Sub + End If + + For i = 1 To MaxUsers + If charlist(i).ConnID <> -1 Then + If name = charlist(i).Nombre Then + Call WriteErrorMsg(CharIndex, "Ya hay un usuario con ese nombre, por favor elija otro.") + Call ServerFlushBuffer(CharIndex) + Call CloseSocket(CharIndex) + Exit Sub + End If + End If + Next + + 'Nombre de sistema + .Nombre = name + .Ai = Clase + .Raza = Raza + .Genero = Genero + .Lvl = Lvl + + If Team = 1 Then + If UserCharIndex = 0 Then + Team1(UBound(Team1)) = CharIndex + TeamData1(UBound(Team1)).Clase = Clase + TeamData1(UBound(Team1)).Raza = Raza + TeamData1(UBound(Team1)).Genero = Genero + TeamData1(UBound(Team1)).Nivel = Lvl + TeamData1(UBound(Team1)).index = CharIndex + TeamData1(UBound(Team1)).Nombre = name + TeamData2(UBound(Team1)).Bot = 0 + Else + If UBound(Team1) > 0 Then + ReDim Preserve Team1(1 To UBound(Team1) + 1) As Integer + Else + ReDim Team1(1 To UBound(Team1) + 1) As Integer + End If + Team1(UBound(Team1)) = CharIndex + TeamData1(UBound(Team1)).Clase = Clase + TeamData1(UBound(Team1)).Raza = Raza + TeamData1(UBound(Team1)).Genero = Genero + TeamData1(UBound(Team1)).Nivel = Lvl + TeamData1(UBound(Team1)).index = CharIndex + TeamData1(UBound(Team1)).Nombre = name + TeamData2(UBound(Team1)).Bot = 0 + End If + Else + If UBound(Team2) > 0 Then + ReDim Preserve Team2(1 To UBound(Team2) + 1) As Integer + Else + ReDim Team2(1 To UBound(Team2) + 1) As Integer + End If + Team2(UBound(Team2)) = CharIndex + TeamData2(UBound(Team2)).Clase = Clase + TeamData2(UBound(Team2)).Raza = Raza + TeamData2(UBound(Team2)).Genero = Genero + TeamData2(UBound(Team2)).Nivel = Lvl + TeamData2(UBound(Team2)).index = CharIndex + TeamData2(UBound(Team2)).Nombre = name + TeamData2(UBound(Team2)).Bot = 0 + End If + + .Logged = True + + If UserCharIndex = 0 Then + Call CrearChar(CharIndex) + Call WriteCharIndexInServer(CharIndex) + Call WriteUpdateCharStats(CharIndex) + Else + Call CrearChar(CharIndex) + For i = 1 To MaxUsers + If charlist(i).ConnID <> -1 And charlist(i).Bot = 0 Then + 'If UserCharIndex <> i Then + Call WriteCharacterCreate(CharIndex, charlist(i).iBody, charlist(i).iHead, charlist(i).heading, i, _ + charlist(i).Pos.X, charlist(i).Pos.Y, charlist(i).iArma, charlist(i).iEscudo, charlist(i).iCasco, charlist(i).Nombre, charlist(i).MinHP, EnTeam(i)) + 'End If + End If + Next + Call WriteCharIndexInServer(CharIndex) + Call WriteUpdateCharStats(CharIndex) + Call ResetDuelo(-1, UBound(Team1), UBound(Team2)) + End If + + Call IniTimers(CharIndex) + Call WriteLoggedMessage(CharIndex) + + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessageConsoleMsg("El usuario " & charlist(CharIndex).Nombre & " ha ingresado al equipo " & Team & ".", FontTypeNames.FONTTYPE_SERVER)) +End With +End Sub + +Function VersionOK(ByVal Ver As String) As Boolean + VersionOK = (Ver = ULTIMAVERSION) +End Function + +Function NextOpenUser() As Integer + Dim LoopC As Long + + For LoopC = 1 To MaxUsers + 1 + If LoopC > MaxUsers Then Exit For + If (charlist(LoopC).ConnID = -1 And charlist(LoopC).Bot = 0) Then Exit For + Next LoopC + + NextOpenUser = LoopC +End Function + +Function Numeric(ByVal cad As String) As Boolean +'*************************************************** +'Author: Unknown +'Last Modification: - +' +'*************************************************** + +Dim car As Byte +Dim i As Integer + +cad = LCase$(cad) + +For i = 1 To Len(cad) + car = Asc(mid$(cad, i, 1)) + + If (car < 48 Or car > 57) Then + Numeric = False + Exit Function + End If + +Next i + +Numeric = True + +End Function + +Sub CloseSocket(ByVal CharIndex As Integer) +'*************************************************** +'Author: Unknown +'Last Modification: - +' +'*************************************************** + +On Error GoTo ErrHandler + + 'Call SecurityIp.IpRestarConexion(GetLongIp(CharList(CharIndex).ip)) + + If charlist(CharIndex).ConnID <> -1 Then + If charlist(CharIndex).Logged > 0 Then + Call WriteDisconnect(CharIndex) + Call ServerFlushBuffer(CharIndex) + Call CloseSocketSL(CharIndex) + If EnTeam(CharIndex) = 1 Then + If GetTeamIndex(CharIndex, 1) < 5 Then _ + Call PushTeamData(1, GetTeamIndex(CharIndex, 1)) + Call ResetDuelo(-1, UBound(Team1) - 1, UBound(Team2)) + Else + If GetTeamIndex(CharIndex, 2) < 5 Then _ + Call PushTeamData(2, GetTeamIndex(CharIndex, 2)) + Call ResetDuelo(-1, UBound(Team1), UBound(Team2) - 1) + End If + Call ServerSendData(SendTarget.ToAllButIndex, UserCharIndex, PrepareMessageCharacterRemove(CharIndex)) + Call EraseChar(CharIndex) + NumChars = NumChars - 1 + Else + Call CloseSocketSL(CharIndex) + End If + End If + + 'Empty buffer for reuse + Call charlist(CharIndex).incomingData.ReadASCIIStringFixed(charlist(CharIndex).incomingData.length) + + charlist(CharIndex).ConnID = -1 + charlist(CharIndex).ConnIDValida = False +Exit Sub + +ErrHandler: + charlist(CharIndex).ConnID = -1 + charlist(CharIndex).ConnIDValida = False +End Sub + +'[Alejo-21-5]: Cierra un socket sin limpiar el slot +Sub CloseSocketSL(ByVal CharIndex As Integer) +'*************************************************** +'Author: Unknown +'Last Modification: - +' +'*************************************************** + +If charlist(CharIndex).ConnID <> -1 And charlist(CharIndex).ConnIDValida Then + Call BorraSlotSock(charlist(CharIndex).ConnID) + Call WSApiCloseSocket(charlist(CharIndex).ConnID) + charlist(CharIndex).ConnIDValida = False +End If + +End Sub + +'' +' Send an string to a Slot +' +' @param userIndex The index of the User +' @param Datos The string that will be send +' @remarks If UsarQueSocket is 3 it won`t use the clsByteQueue + +Public Function EnviarDatosASlot(ByVal UserIndex As Integer, ByRef Datos As String) As Long +'*************************************************** +'Author: Unknown +'Last Modification: 01/10/07 +'Last Modified By: Lucas Tavolaro Ortiz (Tavo) +'Now it uses the clsByteQueue class and don`t make a FIFO Queue of String +'*************************************************** + + Dim Ret As Long + + Ret = WsApiEnviar(UserIndex, Datos) + + If Ret <> 0 And Ret <> WSAEWOULDBLOCK Then + ' Close the socket avoiding any critical error + Call CloseSocketSL(UserIndex) + End If +Exit Function + +End Function + +Sub CloseChar(ByVal CharIndex As Integer) + +charlist(CharIndex).FX.GrhIndex = 0 +charlist(CharIndex).FX.Loops = 0 +Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessageCreateFX(CharIndex, 0, 0)) + + +charlist(CharIndex).Logged = False + +'Call EraseChar(CharIndex) + +End Sub + diff --git a/CODIGO/TileEngine.bas b/CODIGO/TileEngine.bas new file mode 100644 index 0000000..7d4eb59 --- /dev/null +++ b/CODIGO/TileEngine.bas @@ -0,0 +1,2238 @@ +Attribute VB_Name = "Mod_TileEngine" +'Argentum Online 0.11.6 +' +'Copyright (C) 2002 Márquez Pablo Ignacio +'Copyright (C) 2002 Otto Perez +'Copyright (C) 2002 Aaron Perkins +'Copyright (C) 2002 Matías Fernando Pequeño +' +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +' +'Argentum Online is based on Baronsoft's VB6 Online RPG +'You can contact the original creator of ORE at aaron@baronsoft.com +'for more information about ORE please visit http://www.baronsoft.com/ +' +' +'You can contact me at: +'morgolock@speedy.com.ar +'www.geocities.com/gmorgolock +'Calle 3 número 983 piso 7 dto A +'La Plata - Pcia, Buenos Aires - Republica Argentina +'Código Postal 1900 +'Pablo Ignacio Márquez + + + +Option Explicit + + +'Map sizes in tiles +Public Const XMaxMapSize As Byte = 100 +Public Const XMinMapSize As Byte = 1 +Public Const YMaxMapSize As Byte = 100 +Public Const YMinMapSize As Byte = 1 + +Private Const GrhFogata As Integer = 1521 + +'' +'Sets a Grh animation to loop indefinitely. +Private Const INFINITE_LOOPS As Integer = -1 + + +'Encabezado bmp +Type BITMAPFILEHEADER + bfType As Integer + bfSize As Long + bfReserved1 As Integer + bfReserved2 As Integer + bfOffBits As Long +End Type + +'Info del encabezado del bmp +Type BITMAPINFOHEADER + biSize As Long + biWidth As Long + biHeight As Long + biPlanes As Integer + biBitCount As Integer + biCompression As Long + biSizeImage As Long + biXPelsPerMeter As Long + biYPelsPerMeter As Long + biClrUsed As Long + biClrImportant As Long +End Type + +'Posicion en un mapa +Public Type Position + X As Long + Y As Long +End Type + +'Posicion en el Mundo +Public Type WorldPos + Map As Integer + X As Integer + Y As Integer +End Type + +'Contiene info acerca de donde se puede encontrar un grh tamaño y animacion +Public Type GrhData + sX As Integer + sY As Integer + + FileNum As Long + + pixelWidth As Integer + pixelHeight As Integer + + TileWidth As Single + TileHeight As Single + + NumFrames As Integer + Frames() As Long + + Speed As Single +End Type + +'apunta a una estructura grhdata y mantiene la animacion +Public Type Grh + GrhIndex As Integer + FrameCounter As Single + Speed As Single + Started As Byte + Loops As Integer +End Type + +'Lista de cuerpos +Public Type BodyData + Walk(E_Heading.NORTH To E_Heading.WEST) As Grh + HeadOffset As Position +End Type + +'Lista de cabezas +Public Type HeadData + Head(E_Heading.NORTH To E_Heading.WEST) As Grh +End Type + +'Lista de las animaciones de las armas +Type WeaponAnimData + WeaponWalk(E_Heading.NORTH To E_Heading.WEST) As Grh +End Type + +'Lista de las animaciones de los escudos +Type ShieldAnimData + ShieldWalk(E_Heading.NORTH To E_Heading.WEST) As Grh +End Type + +Public Type tCounters + LastMove As Integer + LastPot As Integer + LastSpell As Integer + LastAttack As Integer +End Type + +'Apariencia del personaje +Public Type Char + Team As Byte + Found As Byte + + Logged As Byte + Bot As Byte + + outgoingData As clsByteQueue + incomingData As clsByteQueue + + ConnIDValida As Boolean + ConnID As Long 'ID + ip As String + + TargetIndex As Integer + Inmo As Byte + Lanzando As Byte + ComportamientoHechizos As Byte + ComportamientoPotas As Byte + ComportamientoCombo As Byte + + Lvl As Byte + Ai As eBotAi + Raza As eRazaAi + Genero As Byte + + Quieto As Integer + + TipoPocion As Byte + TipoArma As Byte + + LastCombo As Byte + + Fuerza As Byte + Agilidad As Byte + + MinHit As Integer + MaxHit As Integer + + MinDef As Integer + MaxDef As Integer + + MinDefH As Integer + MaxDefH As Integer + + DM As Single + + Refuerzo As Byte + + MinRM As Integer + MaxRM As Integer + + ArmaMinHit As Byte + ArmaMaxHit As Byte + + ModEvasion As Single + ModAtaqueArma As Single + ModDañoArma As Single + ModAtaqueProyectil As Single + ModDañoProyectil As Single + ModEscudo As Single + + Contador As tCounters + + MinHP As Integer + MaxHP As Integer + MinMAN As Integer + MaxMAN As Integer + MinSTA As Integer + MaxSTA As Integer + + Active As Byte + heading As E_Heading + Pos As Position + + iHead As Integer + iBody As Integer + iArma As Integer + iEscudo As Integer + iCasco As Integer + body As BodyData + Head As HeadData + Casco As HeadData + Arma As WeaponAnimData + Escudo As ShieldAnimData + UsandoArma As Boolean + + FX As Grh + FxIndex As Integer + + Criminal As Byte + Atacable As Boolean + + Nombre As String + + scrollDirectionX As Integer + scrollDirectionY As Integer + + Moving As Byte + MoveOffsetX As Single + MoveOffsetY As Single + + pie As Boolean + muerto As Boolean + invisible As Boolean + priv As Byte +End Type + +'Info de un objeto +Public Type Obj + OBJIndex As Integer + Amount As Integer +End Type + +'Tipo de las celdas del mapa +Public Type MapBlock + Graphic(1 To 4) As Grh + CharIndex As Integer + ObjGrh As Grh + + NpcIndex As Integer + OBJInfo As Obj + TileExit As WorldPos + Blocked As Byte + + Trigger As Integer +End Type + +'Info de cada mapa +Public Type MapInfo + Music As String + name As String + StartPos As WorldPos + MapVersion As Integer +End Type + +'DX7 Objects +Public DirectX As New DirectX7 +Public DirectDraw As DirectDraw7 +Private PrimarySurface As DirectDrawSurface7 +Private PrimaryClipper As DirectDrawClipper +Private BackBufferSurface As DirectDrawSurface7 + +Public IniPath As String +Public MapPath As String + + +'Bordes del mapa +Public MinXBorder As Byte +Public MaxXBorder As Byte +Public MinYBorder As Byte +Public MaxYBorder As Byte + +'Status del user +Public CurMap As Integer 'Mapa actual +Public UserIndex As Integer +Public UserMoving As Byte +Public UserBody As Integer +Public UserHead As Integer +Public UserPos As Position 'Posicion +Public AddtoUserPos As Position 'Si se mueve +Public UserCharIndex As Integer + +Public EngineRun As Boolean + +Public FPS As Long +Public FramesPerSecCounter As Long +Private fpsLastCheck As Long + +'Tamaño del la vista en Tiles +Private WindowTileWidth As Integer +Private WindowTileHeight As Integer + +Private HalfWindowTileWidth As Integer +Private HalfWindowTileHeight As Integer + +'Offset del desde 0,0 del main view +Private MainViewTop As Integer +Private MainViewLeft As Integer + +'Cuantos tiles el engine mete en el BUFFER cuando +'dibuja el mapa. Ojo un tamaño muy grande puede +'volver el engine muy lento +Public TileBufferSize As Integer + +Private TileBufferPixelOffsetX As Integer +Private TileBufferPixelOffsetY As Integer + +'Tamaño de los tiles en pixels +Public TilePixelHeight As Integer +Public TilePixelWidth As Integer + +'Number of pixels the engine scrolls per frame. MUST divide evenly into pixels per tile +Public ScrollPixelsPerFrameX As Integer +Public ScrollPixelsPerFrameY As Integer + +Dim timerElapsedTime As Single +Dim timerTicksPerFrame As Single +Dim engineBaseSpeed As Single + + +Public NumBodies As Integer +Public Numheads As Integer +Public NumFxs As Integer + +Public NumChars As Integer +Public LastChar As Integer +Public NumWeaponAnims As Integer +Public NumShieldAnims As Integer + + +Private MainDestRect As RECT +Private MainViewRect As RECT +Private BackBufferRect As RECT + +Private MainViewWidth As Integer +Private MainViewHeight As Integer + +Private MouseTileX As Byte +Private MouseTileY As Byte + + + + +'¿?¿?¿?¿?¿?¿?¿?¿?¿?¿Graficos¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿? +Public GrhData() As GrhData 'Guarda todos los grh +Public BodyData() As BodyData +Public HeadData() As HeadData +Public FxData() As tIndiceFx +Public WeaponAnimData() As WeaponAnimData +Public ShieldAnimData() As ShieldAnimData +Public CascoAnimData() As HeadData +'¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿? + +'¿?¿?¿?¿?¿?¿?¿?¿?¿?¿Mapa?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿? +Public MapData() As MapBlock ' Mapa +Public MapInfo As MapInfo ' Info acerca del mapa en uso +'¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿? + +Public bRain As Boolean 'está raineando? +Public bTecho As Boolean 'hay techo? +Public brstTick As Long + +Private RLluvia(7) As RECT 'RECT de la lluvia +Private iFrameIndex As Byte 'Frame actual de la LL +Private llTick As Long 'Contador +Private LTLluvia(4) As Integer + +Public charlist(1 To 10000) As Char + +#If SeguridadAlkon Then + +Public MI(1 To 1233) As clsManagerInvisibles +Public CualMI As Integer + +#End If + +' Used by GetTextExtentPoint32 +Private Type size + cx As Long + cy As Long +End Type + +'[CODE 001]:MatuX +Public Enum PlayLoop + plNone = 0 + plLluviain = 1 + plLluviaout = 2 +End Enum +'[END]' +' +' [END] +'¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿?¿? + +#If ConAlfaB Then + +Private Declare Function BltAlphaFast Lib "vbabdx" (ByRef lpDDSDest As Any, ByRef lpDDSSource As Any, ByVal iWidth As Long, ByVal iHeight As Long, _ + ByVal pitchSrc As Long, ByVal pitchDst As Long, ByVal dwMode As Long) As Long +Private Declare Function BltEfectoNoche Lib "vbabdx" (ByRef lpDDSDest As Any, ByVal iWidth As Long, ByVal iHeight As Long, _ + ByVal pitchDst As Long, ByVal dwMode As Long) As Long + +#End If + +'Very percise counter 64bit system counter +Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long +Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long + +'Text width computation. Needed to center text. +Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As size) As Long + +Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long +Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long + +Sub CargarCabezas() + Dim N As Integer + Dim i As Long + Dim Numheads As Integer + Dim Miscabezas() As tIndiceCabeza + + N = FreeFile() + Open App.path & "\init\Cabezas.ind" For Binary Access Read As #N + + 'cabecera + Get #N, , MiCabecera + + 'num de cabezas + Get #N, , Numheads + + 'Resize array + ReDim HeadData(0 To Numheads) As HeadData + ReDim Miscabezas(0 To Numheads) As tIndiceCabeza + + For i = 1 To Numheads + Get #N, , Miscabezas(i) + + If Miscabezas(i).Head(1) Then + Call InitGrh(HeadData(i).Head(1), Miscabezas(i).Head(1), 0) + Call InitGrh(HeadData(i).Head(2), Miscabezas(i).Head(2), 0) + Call InitGrh(HeadData(i).Head(3), Miscabezas(i).Head(3), 0) + Call InitGrh(HeadData(i).Head(4), Miscabezas(i).Head(4), 0) + End If + Next i + + Close #N +End Sub + +Sub CargarCascos() + Dim N As Integer + Dim i As Long + Dim NumCascos As Integer + + Dim Miscabezas() As tIndiceCabeza + + N = FreeFile() + Open App.path & "\init\Cascos.ind" For Binary Access Read As #N + + 'cabecera + Get #N, , MiCabecera + + 'num de cabezas + Get #N, , NumCascos + + 'Resize array + ReDim CascoAnimData(0 To NumCascos) As HeadData + ReDim Miscabezas(0 To NumCascos) As tIndiceCabeza + + For i = 1 To NumCascos + Get #N, , Miscabezas(i) + + If Miscabezas(i).Head(1) Then + Call InitGrh(CascoAnimData(i).Head(1), Miscabezas(i).Head(1), 0) + Call InitGrh(CascoAnimData(i).Head(2), Miscabezas(i).Head(2), 0) + Call InitGrh(CascoAnimData(i).Head(3), Miscabezas(i).Head(3), 0) + Call InitGrh(CascoAnimData(i).Head(4), Miscabezas(i).Head(4), 0) + End If + Next i + + Close #N +End Sub + +Sub CargarCuerpos() + Dim N As Integer + Dim i As Long + Dim NumCuerpos As Integer + Dim MisCuerpos() As tIndiceCuerpo + + N = FreeFile() + Open App.path & "\init\Personajes.ind" For Binary Access Read As #N + + 'cabecera + Get #N, , MiCabecera + + 'num de cabezas + Get #N, , NumCuerpos + + 'Resize array + ReDim BodyData(0 To NumCuerpos) As BodyData + ReDim MisCuerpos(0 To NumCuerpos) As tIndiceCuerpo + + For i = 1 To NumCuerpos + Get #N, , MisCuerpos(i) + + If MisCuerpos(i).body(1) Then + InitGrh BodyData(i).Walk(1), MisCuerpos(i).body(1), 0 + InitGrh BodyData(i).Walk(2), MisCuerpos(i).body(2), 0 + InitGrh BodyData(i).Walk(3), MisCuerpos(i).body(3), 0 + InitGrh BodyData(i).Walk(4), MisCuerpos(i).body(4), 0 + + BodyData(i).HeadOffset.X = MisCuerpos(i).HeadOffsetX + BodyData(i).HeadOffset.Y = MisCuerpos(i).HeadOffsetY + End If + Next i + + Close #N +End Sub + +Sub CargarFxs() + Dim N As Integer + Dim i As Long + Dim NumFxs As Integer + + N = FreeFile() + Open App.path & "\init\Fxs.ind" For Binary Access Read As #N + + 'cabecera + Get #N, , MiCabecera + + 'num de cabezas + Get #N, , NumFxs + + 'Resize array + ReDim FxData(1 To NumFxs) As tIndiceFx + + For i = 1 To NumFxs + Get #N, , FxData(i) + Next i + + Close #N +End Sub + + +Sub ConvertCPtoTP(ByVal viewPortX As Integer, ByVal viewPortY As Integer, ByRef tX As Byte, ByRef tY As Byte) +'****************************************** +'Converts where the mouse is in the main window to a tile position. MUST be called eveytime the mouse moves. +'****************************************** + tX = UserPos.X + viewPortX \ TilePixelWidth - WindowTileWidth \ 2 + tY = UserPos.Y + viewPortY \ TilePixelHeight - WindowTileHeight \ 2 +End Sub + +Sub MakeChar(ByVal CharIndex As Integer, ByVal body As Integer, ByVal Head As Integer, ByVal heading As Byte, ByVal X As Integer, ByVal Y As Integer, ByVal Arma As Integer, ByVal Escudo As Integer, ByVal Casco As Integer) +On Error Resume Next + 'Apuntamos al ultimo Char + If CharIndex > LastChar Then LastChar = CharIndex + + With charlist(CharIndex) + 'If the char wasn't allready active (we are rewritting it) don't increase char count + If .Active = 0 Then _ + NumChars = NumChars + 1 + + If Arma = 0 Then Arma = 2 + If Escudo = 0 Then Escudo = 2 + If Casco = 0 Then Casco = 2 + + .iHead = Head + .iBody = body + .iArma = Arma + .iEscudo = Escudo + .iCasco = Casco + + .Head = HeadData(Head) + .body = BodyData(body) + .Arma = WeaponAnimData(Arma) + + .Escudo = ShieldAnimData(Escudo) + .Casco = CascoAnimData(Casco) + + .heading = heading + + 'Reset moving stats + .Moving = 0 + .MoveOffsetX = 0 + .MoveOffsetY = 0 + + 'Update position + .Pos.X = X + .Pos.Y = Y + + 'Make active + .Active = 1 + End With + + 'Plot on map + MapData(X, Y).CharIndex = CharIndex +End Sub + +Sub ResetCharInfo(ByVal CharIndex As Integer) + With charlist(CharIndex) + .Active = 0 + .Criminal = 0 + .Atacable = False + .FxIndex = 0 + .invisible = False + .Inmo = 0 + + .Moving = 0 + .muerto = False + .Nombre = "" + .pie = False + .Pos.X = 0 + .Pos.Y = 0 + .UsandoArma = False + End With +End Sub + +Sub EraseChar(ByVal CharIndex As Integer) +'***************************************************************** +'Erases a character from CharList and map +'***************************************************************** +On Error Resume Next + charlist(CharIndex).Active = 0 + + 'Update lastchar + If CharIndex = LastChar Then + Do Until charlist(LastChar).Active = 1 + LastChar = LastChar - 1 + If LastChar = 0 Then Exit Do + Loop + End If + + MapData(charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y).CharIndex = 0 + + 'Remove char's dialog + Call Dialogos.RemoveDialog(CharIndex) + + Call ResetCharInfo(CharIndex) + +End Sub + +Public Sub InitGrh(ByRef Grh As Grh, ByVal GrhIndex As Integer, Optional ByVal Started As Byte = 2) +'***************************************************************** +'Sets up a grh. MUST be done before rendering +'***************************************************************** + Grh.GrhIndex = GrhIndex + + If Started = 2 Then + If GrhData(Grh.GrhIndex).NumFrames > 1 Then + Grh.Started = 1 + Else + Grh.Started = 0 + End If + Else + 'Make sure the graphic can be started + If GrhData(Grh.GrhIndex).NumFrames = 1 Then Started = 0 + Grh.Started = Started + End If + + + If Grh.Started Then + Grh.Loops = INFINITE_LOOPS + Else + Grh.Loops = 0 + End If + + Grh.FrameCounter = 1 + Grh.Speed = GrhData(Grh.GrhIndex).Speed +End Sub + +Sub MoveCharbyHead(ByVal CharIndex As Integer, ByVal nHeading As E_Heading) +'***************************************************************** +'Starts the movement of a character in nHeading direction +'***************************************************************** + Dim addX As Integer + Dim addY As Integer + Dim X As Integer + Dim Y As Integer + Dim nX As Integer + Dim nY As Integer + + With charlist(CharIndex) + X = .Pos.X + Y = .Pos.Y + + 'Figure out which way to move + Select Case nHeading + Case E_Heading.NORTH + addY = -1 + + Case E_Heading.EAST + addX = 1 + + Case E_Heading.SOUTH + addY = 1 + + Case E_Heading.WEST + addX = -1 + End Select + + nX = X + addX + nY = Y + addY + + If .Bot = 1 Then _ + Call ServerSendData(SendTarget.ToAllButIndex, UserCharIndex, PrepareMessageCharacterMove(CharIndex, nX, nY)) + + MapData(nX, nY).CharIndex = CharIndex + .Pos.X = nX + .Pos.Y = nY + MapData(X, Y).CharIndex = 0 + + .MoveOffsetX = -1 * (TilePixelWidth * addX) + .MoveOffsetY = -1 * (TilePixelHeight * addY) + + .Moving = 1 + .heading = nHeading + + .scrollDirectionX = addX + .scrollDirectionY = addY + End With + + If UserEstado = 0 Then Call DoPasosFx(CharIndex) + + 'areas viejos + If (nY < MinLimiteY) Or (nY > MaxLimiteY) Or (nX < MinLimiteX) Or (nX > MaxLimiteX) Then + If CharIndex <> UserCharIndex Then + Call EraseChar(CharIndex) + End If + End If +End Sub + +Public Sub DoFogataFx() + Dim location As Position + + If bFogata Then + bFogata = HayFogata(location) + If Not bFogata Then + Call Audio.StopWave(FogataBufferIndex) + FogataBufferIndex = 0 + End If + Else + bFogata = HayFogata(location) + If bFogata And FogataBufferIndex = 0 Then FogataBufferIndex = Audio.PlayWave("fuego.wav", location.X, location.Y, LoopStyle.Enabled) + End If +End Sub + +Private Function EstaPCarea(ByVal CharIndex As Integer) As Boolean + With charlist(CharIndex).Pos + EstaPCarea = .X > UserPos.X - MinXBorder And .X < UserPos.X + MinXBorder And .Y > UserPos.Y - MinYBorder And .Y < UserPos.Y + MinYBorder + End With +End Function + +Sub DoPasosFx(ByVal CharIndex As Integer) + If Not UserNavegando Then + With charlist(CharIndex) + If Not .muerto And EstaPCarea(CharIndex) And (.priv = 0 Or .priv > 5) Then + .pie = Not .pie + + If .pie Then + Call Audio.PlayWave(SND_PASOS1, .Pos.X, .Pos.Y) + Else + Call Audio.PlayWave(SND_PASOS2, .Pos.X, .Pos.Y) + End If + End If + End With + Else +' TODO : Actually we would have to check if the CharIndex char is in the water or not.... + Call Audio.PlayWave(SND_NAVEGANDO, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y) + End If +End Sub + +Sub MoveCharbyPos(ByVal CharIndex As Integer, ByVal nX As Integer, ByVal nY As Integer) +On Error Resume Next + Dim X As Integer + Dim Y As Integer + Dim addX As Integer + Dim addY As Integer + Dim nHeading As E_Heading + + With charlist(CharIndex) + X = .Pos.X + Y = .Pos.Y + + addX = nX - X + addY = nY - Y + + If Sgn(addX) = 1 Then + nHeading = E_Heading.EAST + ElseIf Sgn(addX) = -1 Then + nHeading = E_Heading.WEST + ElseIf Sgn(addY) = -1 Then + nHeading = E_Heading.NORTH + ElseIf Sgn(addY) = 1 Then + nHeading = E_Heading.SOUTH + End If + + MapData(X, Y).CharIndex = 0 + MapData(nX, nY).CharIndex = CharIndex + + .Pos.X = nX + .Pos.Y = nY + + .MoveOffsetX = -1 * (TilePixelWidth * addX) + .MoveOffsetY = -1 * (TilePixelHeight * addY) + + .Moving = 1 + .heading = nHeading + + .scrollDirectionX = Sgn(addX) + .scrollDirectionY = Sgn(addY) + + 'parche para que no medite cuando camina + If .FxIndex = FxMeditar.CHICO Or .FxIndex = FxMeditar.GRANDE Or .FxIndex = FxMeditar.MEDIANO Or .FxIndex = FxMeditar.XGRANDE Or .FxIndex = FxMeditar.XXGRANDE Then + .FxIndex = 0 + End If + End With + + If Not EstaPCarea(CharIndex) Then Call Dialogos.RemoveDialog(CharIndex) + + If (nY < MinLimiteY) Or (nY > MaxLimiteY) Or (nX < MinLimiteX) Or (nX > MaxLimiteX) Then + Call EraseChar(CharIndex) + End If +End Sub + +Sub MoveScreen(ByVal nHeading As E_Heading) +'****************************************** +'Starts the screen moving in a direction +'****************************************** + Dim X As Integer + Dim Y As Integer + Dim tX As Integer + Dim tY As Integer + + 'Figure out which way to move + Select Case nHeading + Case E_Heading.NORTH + Y = -1 + + Case E_Heading.EAST + X = 1 + + Case E_Heading.SOUTH + Y = 1 + + Case E_Heading.WEST + X = -1 + End Select + + 'Fill temp pos + tX = UserPos.X + X + tY = UserPos.Y + Y + + 'Check to see if its out of bounds + If tX < MinXBorder Or tX > MaxXBorder Or tY < MinYBorder Or tY > MaxYBorder Then + Exit Sub + Else + 'Start moving... MainLoop does the rest + AddtoUserPos.X = X + UserPos.X = tX + AddtoUserPos.Y = Y + UserPos.Y = tY + UserMoving = 1 + + bTecho = IIf(MapData(UserPos.X, UserPos.Y).Trigger = 1 Or _ + MapData(UserPos.X, UserPos.Y).Trigger = 2 Or _ + MapData(UserPos.X, UserPos.Y).Trigger = 4, True, False) + End If +End Sub + +Private Function HayFogata(ByRef location As Position) As Boolean + Dim j As Long + Dim k As Long + + For j = UserPos.X - 8 To UserPos.X + 8 + For k = UserPos.Y - 6 To UserPos.Y + 6 + If InMapBounds(j, k) Then + If MapData(j, k).ObjGrh.GrhIndex = GrhFogata Then + location.X = j + location.Y = k + + HayFogata = True + Exit Function + End If + End If + Next k + Next j +End Function + +Function NextOpenChar() As Integer +'***************************************************************** +'Finds next open char slot in CharList +'***************************************************************** + Dim LoopC As Long + Dim Dale As Boolean + + LoopC = 1 + Do While charlist(LoopC).Active And Dale + LoopC = LoopC + 1 + Dale = (LoopC <= UBound(charlist)) + Loop + + NextOpenChar = LoopC +End Function + +'' +' Loads grh data using the new file format. +' +' @return True if the load was successfull, False otherwise. + +Private Function LoadGrhData() As Boolean +On Error GoTo ErrorHandler + Dim Grh As Long + Dim Frame As Long + Dim grhCount As Long + Dim handle As Integer + Dim fileVersion As Long + + 'Open files + handle = FreeFile() + + Open IniPath & GraphicsFile For Binary Access Read As handle + Seek #1, 1 + + 'Get file version + Get handle, , fileVersion + + 'Get number of grhs + Get handle, , grhCount + + 'Resize arrays + ReDim GrhData(1 To grhCount) As GrhData + + While Not EOF(handle) + Get handle, , Grh + + With GrhData(Grh) + 'Get number of frames + Get handle, , .NumFrames + If .NumFrames <= 0 Then GoTo ErrorHandler + + ReDim .Frames(1 To GrhData(Grh).NumFrames) + + If .NumFrames > 1 Then + 'Read a animation GRH set + For Frame = 1 To .NumFrames + Get handle, , .Frames(Frame) + If .Frames(Frame) <= 0 Or .Frames(Frame) > grhCount Then + GoTo ErrorHandler + End If + Next Frame + + Get handle, , .Speed + + If .Speed <= 0 Then GoTo ErrorHandler + + 'Compute width and height + .pixelHeight = GrhData(.Frames(1)).pixelHeight + If .pixelHeight <= 0 Then GoTo ErrorHandler + + .pixelWidth = GrhData(.Frames(1)).pixelWidth + If .pixelWidth <= 0 Then GoTo ErrorHandler + + .TileWidth = GrhData(.Frames(1)).TileWidth + If .TileWidth <= 0 Then GoTo ErrorHandler + + .TileHeight = GrhData(.Frames(1)).TileHeight + If .TileHeight <= 0 Then GoTo ErrorHandler + Else + 'Read in normal GRH data + Get handle, , .FileNum + If .FileNum <= 0 Then GoTo ErrorHandler + + Get handle, , GrhData(Grh).sX + If .sX < 0 Then GoTo ErrorHandler + + Get handle, , .sY + If .sY < 0 Then GoTo ErrorHandler + + Get handle, , .pixelWidth + If .pixelWidth <= 0 Then GoTo ErrorHandler + + Get handle, , .pixelHeight + If .pixelHeight <= 0 Then GoTo ErrorHandler + + 'Compute width and height + .TileWidth = .pixelWidth / TilePixelHeight + .TileHeight = .pixelHeight / TilePixelWidth + + .Frames(1) = Grh + End If + End With + Wend + + Close handle + + LoadGrhData = True +Exit Function + +ErrorHandler: + LoadGrhData = False +End Function + +Function LegalPos(ByVal X As Integer, ByVal Y As Integer) As Boolean +'***************************************************************** +'Checks to see if a tile position is legal +'***************************************************************** + 'Limites del mapa + If X < MinXBorder Or X > MaxXBorder Or Y < MinYBorder Or Y > MaxYBorder Then + Exit Function + End If + + 'Tile Bloqueado? + If MapData(X, Y).Blocked = 1 Then + Exit Function + End If + + '¿Hay un personaje? + If MapData(X, Y).CharIndex > 0 Then + Exit Function + End If + + If UserNavegando <> HayAgua(X, Y) Then + Exit Function + End If + + LegalPos = True +End Function + +Function MoveToLegalPos(ByVal X As Integer, ByVal Y As Integer) As Boolean +'***************************************************************** +'Author: ZaMa +'Last Modify Date: 01/08/2009 +'Checks to see if a tile position is legal, including if there is a casper in the tile +'10/05/2009: ZaMa - Now you can't change position with a casper which is in the shore. +'01/08/2009: ZaMa - Now invisible admins can't change position with caspers. +'***************************************************************** + Dim CharIndex As Integer + + 'Limites del mapa + If X < MinXBorder Or X > MaxXBorder Or Y < MinYBorder Or Y > MaxYBorder Then + Exit Function + End If + + 'Tile Bloqueado? + If MapData(X, Y).Blocked = 1 Then + Exit Function + End If + + CharIndex = MapData(X, Y).CharIndex + '¿Hay un personaje? + If CharIndex > 0 Then + + If MapData(UserPos.X, UserPos.Y).Blocked = 1 Then + Exit Function + End If + + With charlist(CharIndex) + ' Si no es casper, no puede pasar + If .iHead <> CASPER_HEAD And .iBody <> FRAGATA_FANTASMAL Then + Exit Function + Else + ' No puedo intercambiar con un casper que este en la orilla (Lado tierra) + If HayAgua(UserPos.X, UserPos.Y) Then + If Not HayAgua(X, Y) Then Exit Function + Else + ' No puedo intercambiar con un casper que este en la orilla (Lado agua) + If HayAgua(X, Y) Then Exit Function + End If + + ' Los admins no pueden intercambiar pos con caspers cuando estan invisibles + If charlist(UserCharIndex).priv > 0 And charlist(UserCharIndex).priv < 6 Then + If charlist(UserCharIndex).invisible = True Then Exit Function + End If + End If + End With + End If + + If UserNavegando <> HayAgua(X, Y) Then + Exit Function + End If + + MoveToLegalPos = True +End Function + +Function InMapBounds(ByVal X As Integer, ByVal Y As Integer) As Boolean +'***************************************************************** +'Checks to see if a tile position is in the maps bounds +'***************************************************************** + If X < XMinMapSize Or X > XMaxMapSize Or Y < YMinMapSize Or Y > YMaxMapSize Then + Exit Function + End If + + InMapBounds = True +End Function + +Private Sub DDrawGrhtoSurface(ByRef Grh As Grh, ByVal X As Integer, ByVal Y As Integer, ByVal Center As Byte, ByVal Animate As Byte) + Dim CurrentGrhIndex As Integer + Dim SourceRect As RECT +On Error GoTo error + + If Animate Then + If Grh.Started = 1 Then + Grh.FrameCounter = Grh.FrameCounter + (timerElapsedTime * GrhData(Grh.GrhIndex).NumFrames / Grh.Speed) + If Grh.FrameCounter > GrhData(Grh.GrhIndex).NumFrames Then + Grh.FrameCounter = (Grh.FrameCounter Mod GrhData(Grh.GrhIndex).NumFrames) + 1 + + If Grh.Loops <> INFINITE_LOOPS Then + If Grh.Loops > 0 Then + Grh.Loops = Grh.Loops - 1 + Else + Grh.Started = 0 + End If + End If + End If + End If + End If + + 'Figure out what frame to draw (always 1 if not animated) + CurrentGrhIndex = GrhData(Grh.GrhIndex).Frames(Grh.FrameCounter) + + With GrhData(CurrentGrhIndex) + 'Center Grh over X,Y pos + If Center Then + If .TileWidth <> 1 Then + X = X - Int(.TileWidth * TilePixelWidth / 2) + TilePixelWidth \ 2 + End If + + If .TileHeight <> 1 Then + Y = Y - Int(.TileHeight * TilePixelHeight) + TilePixelHeight + End If + End If + + SourceRect.Left = .sX + SourceRect.Top = .sY + SourceRect.Right = SourceRect.Left + .pixelWidth + SourceRect.Bottom = SourceRect.Top + .pixelHeight + + 'Draw + Call BackBufferSurface.BltFast(X, Y, SurfaceDB.Surface(.FileNum), SourceRect, DDBLTFAST_WAIT) + End With +Exit Sub + +error: + If Err.Number = 9 And Grh.FrameCounter < 1 Then + Grh.FrameCounter = 1 + Resume + Else + MsgBox "Ocurrió un error inesperado, por favor comuniquelo a los administradores del juego." & vbCrLf & "Descripción del error: " & _ + vbCrLf & Err.Description, vbExclamation, "[ " & Err.Number & " ] Error" + End + End If +End Sub + +Sub DDrawTransGrhIndextoSurface(ByVal GrhIndex As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal Center As Byte) + Dim SourceRect As RECT + + With GrhData(GrhIndex) + 'Center Grh over X,Y pos + If Center Then + If .TileWidth <> 1 Then + X = X - Int(.TileWidth * TilePixelWidth / 2) + TilePixelWidth \ 2 + End If + + If .TileHeight <> 1 Then + Y = Y - Int(.TileHeight * TilePixelHeight) + TilePixelHeight + End If + End If + + SourceRect.Left = .sX + SourceRect.Top = .sY + SourceRect.Right = SourceRect.Left + .pixelWidth + SourceRect.Bottom = SourceRect.Top + .pixelHeight + + 'Draw + Call BackBufferSurface.BltFast(X, Y, SurfaceDB.Surface(.FileNum), SourceRect, DDBLTFAST_SRCCOLORKEY Or DDBLTFAST_WAIT) + End With +End Sub + +Sub DDrawTransGrhtoSurface(ByRef Grh As Grh, ByVal X As Integer, ByVal Y As Integer, ByVal Center As Byte, ByVal Animate As Byte) +'***************************************************************** +'Draws a GRH transparently to a X and Y position +'***************************************************************** + Dim CurrentGrhIndex As Integer + Dim SourceRect As RECT + +On Error GoTo error + + If Animate Then + If Grh.Started = 1 Then + Grh.FrameCounter = Grh.FrameCounter + (timerElapsedTime * GrhData(Grh.GrhIndex).NumFrames / Grh.Speed) + + If Grh.FrameCounter > GrhData(Grh.GrhIndex).NumFrames Then + Grh.FrameCounter = (Grh.FrameCounter Mod GrhData(Grh.GrhIndex).NumFrames) + 1 + + If Grh.Loops <> INFINITE_LOOPS Then + If Grh.Loops > 0 Then + Grh.Loops = Grh.Loops - 1 + Else + Grh.Started = 0 + End If + End If + End If + End If + End If + + 'Figure out what frame to draw (always 1 if not animated) + CurrentGrhIndex = GrhData(Grh.GrhIndex).Frames(Grh.FrameCounter) + + With GrhData(CurrentGrhIndex) + 'Center Grh over X,Y pos + If Center Then + If .TileWidth <> 1 Then + X = X - Int(.TileWidth * TilePixelWidth / 2) + TilePixelWidth \ 2 + End If + + If .TileHeight <> 1 Then + Y = Y - Int(.TileHeight * TilePixelHeight) + TilePixelHeight + End If + End If + + SourceRect.Left = .sX + SourceRect.Top = .sY + SourceRect.Right = SourceRect.Left + .pixelWidth + SourceRect.Bottom = SourceRect.Top + .pixelHeight + + 'Draw + Call BackBufferSurface.BltFast(X, Y, SurfaceDB.Surface(.FileNum), SourceRect, DDBLTFAST_SRCCOLORKEY Or DDBLTFAST_WAIT) + End With +Exit Sub + +error: + If Err.Number = 9 And Grh.FrameCounter < 1 Then + Grh.FrameCounter = 1 + Resume + Else + MsgBox "Ocurrió un error inesperado, por favor comuniquelo a los administradores del juego." & vbCrLf & "Descripción del error: " & _ + vbCrLf & Err.Description, vbExclamation, "[ " & Err.Number & " ] Error" + End + End If +End Sub + +#If ConAlfaB = 1 Then + +Sub DDrawTransGrhtoSurfaceAlpha(ByRef Grh As Grh, ByVal X As Integer, ByVal Y As Integer, ByVal Center As Byte, ByVal Animate As Byte) +'***************************************************************** +'Draws a GRH transparently to a X and Y position +'***************************************************************** + Dim CurrentGrhIndex As Integer + Dim SourceRect As RECT + Dim Src As DirectDrawSurface7 + Dim rDest As RECT + Dim dArray() As Byte, sArray() As Byte + Dim ddsdSrc As DDSURFACEDESC2, ddsdDest As DDSURFACEDESC2 + Dim Modo As Long + + If Animate Then + If Grh.Started = 1 Then + Grh.FrameCounter = Grh.FrameCounter + (timerElapsedTime * GrhData(Grh.GrhIndex).NumFrames / Grh.Speed) + + If Grh.FrameCounter > GrhData(Grh.GrhIndex).NumFrames Then + Grh.FrameCounter = (Grh.FrameCounter Mod GrhData(Grh.GrhIndex).NumFrames) + 1 + + If Grh.Loops <> INFINITE_LOOPS Then + If Grh.Loops > 0 Then + Grh.Loops = Grh.Loops - 1 + Else + Grh.Started = 0 + End If + End If + End If + End If + End If + + 'Figure out what frame to draw (always 1 if not animated) + CurrentGrhIndex = GrhData(Grh.GrhIndex).Frames(Grh.FrameCounter) + + With GrhData(CurrentGrhIndex) + 'Center Grh over X,Y pos + If Center Then + If .TileWidth <> 1 Then + X = X - Int(.TileWidth * TilePixelWidth / 2) + TilePixelWidth \ 2 + End If + If .TileHeight <> 1 Then + Y = Y - Int(.TileHeight * TilePixelHeight) + TilePixelHeight + End If + End If + + SourceRect.Left = .sX + SourceRect.Top = .sY + SourceRect.Right = SourceRect.Left + .pixelWidth + SourceRect.Bottom = SourceRect.Top + .pixelHeight + + Set Src = SurfaceDB.Surface(.FileNum) + + Src.GetSurfaceDesc ddsdSrc + BackBufferSurface.GetSurfaceDesc ddsdDest + + rDest.Left = X + rDest.Top = Y + rDest.Right = X + .pixelWidth + rDest.Bottom = Y + .pixelHeight + + If rDest.Right > ddsdDest.lWidth Then + rDest.Right = ddsdDest.lWidth + End If + If rDest.Bottom > ddsdDest.lHeight Then + rDest.Bottom = ddsdDest.lHeight + End If + End With + + ' 0 -> 16 bits 555 + ' 1 -> 16 bits 565 + ' 2 -> 16 bits raro (Sin implementar) + ' 3 -> 24 bits + ' 4 -> 32 bits + + If ddsdDest.ddpfPixelFormat.lGBitMask = &H3E0& And ddsdSrc.ddpfPixelFormat.lGBitMask = &H3E0& Then + Modo = 0 + ElseIf ddsdDest.ddpfPixelFormat.lGBitMask = &H7E0& And ddsdSrc.ddpfPixelFormat.lGBitMask = &H7E0& Then + Modo = 1 +'TODO : Revisar las máscaras de 24!! Quizás mirando el campo lRGBBitCount para diferenciar 24 de 32... + ElseIf ddsdDest.ddpfPixelFormat.lGBitMask = &H7E0& And ddsdSrc.ddpfPixelFormat.lGBitMask = &H7E0& Then + Modo = 3 + ElseIf ddsdDest.ddpfPixelFormat.lGBitMask = &HFF00& And ddsdSrc.ddpfPixelFormat.lGBitMask = &HFF00& Then + Modo = 4 + Else + 'Modo = 2 '16 bits raro ? + Call BackBufferSurface.BltFast(X, Y, Src, SourceRect, DDBLTFAST_SRCCOLORKEY Or DDBLTFAST_WAIT) + Exit Sub + End If + + Dim SrcLock As Boolean + Dim DstLock As Boolean + + SrcLock = False + DstLock = False + +On Local Error GoTo HayErrorAlpha + + Call Src.Lock(SourceRect, ddsdSrc, DDLOCK_WAIT, 0) + SrcLock = True + Call BackBufferSurface.Lock(rDest, ddsdDest, DDLOCK_WAIT, 0) + DstLock = True + + Call BackBufferSurface.GetLockedArray(dArray()) + Call Src.GetLockedArray(sArray()) + + Call BltAlphaFast(ByVal VarPtr(dArray(X + X, Y)), ByVal VarPtr(sArray(SourceRect.Left * 2, SourceRect.Top)), rDest.Right - rDest.Left, rDest.Bottom - rDest.Top, ddsdSrc.lPitch, ddsdDest.lPitch, Modo) + + BackBufferSurface.Unlock rDest + DstLock = False + Src.Unlock SourceRect + SrcLock = False +Exit Sub + +HayErrorAlpha: + If SrcLock Then Src.Unlock SourceRect + If DstLock Then BackBufferSurface.Unlock rDest +End Sub + +#End If 'ConAlfaB = 1 + +Function GetBitmapDimensions(ByVal BmpFile As String, ByRef bmWidth As Long, ByRef bmHeight As Long) +'***************************************************************** +'Gets the dimensions of a bmp +'***************************************************************** + Dim BMHeader As BITMAPFILEHEADER + Dim BINFOHeader As BITMAPINFOHEADER + + Open BmpFile For Binary Access Read As #1 + + Get #1, , BMHeader + Get #1, , BINFOHeader + + Close #1 + + bmWidth = BINFOHeader.biWidth + bmHeight = BINFOHeader.biHeight +End Function + +Sub DrawGrhtoHdc(ByVal hdc As Long, ByVal GrhIndex As Integer, ByRef SourceRect As RECT, ByRef destRect As RECT) +'***************************************************************** +'Draws a Grh's portion to the given area of any Device Context +'***************************************************************** + Call SurfaceDB.Surface(GrhData(GrhIndex).FileNum).BltToDC(hdc, SourceRect, destRect) +End Sub + +Public Sub DrawTransparentGrhtoHdc(ByVal dsthdc As Long, ByVal srchdc As Long, ByRef SourceRect As RECT, ByRef destRect As RECT, ByVal TransparentColor) +'************************************************************** +'Author: Torres Patricio (Pato) +'Last Modify Date: 12/22/2009 +'This method is SLOW... Don't use in a loop if you care about +'speed! +'************************************************************* + Dim color As Long + Dim X As Long + Dim Y As Long + + For X = SourceRect.Left To SourceRect.Right + For Y = SourceRect.Top To SourceRect.Bottom + color = GetPixel(srchdc, X, Y) + + If color <> TransparentColor Then + Call SetPixel(dsthdc, destRect.Left + (X - SourceRect.Left), destRect.Top + (Y - SourceRect.Top), color) + End If + Next Y + Next X +End Sub + +Public Sub DrawImageInPicture(ByRef PictureBox As PictureBox, ByRef Picture As StdPicture, ByVal X1 As Single, ByVal Y1 As Single, Optional Width1, Optional Height1, Optional X2, Optional Y2, Optional Width2, Optional Height2) +'************************************************************** +'Author: Torres Patricio (Pato) +'Last Modify Date: 12/28/2009 +'Draw Picture in the PictureBox +'************************************************************* + +Call PictureBox.PaintPicture(Picture, X1, Y1, Width1, Height1, X2, Y2, Width2, Height2) +End Sub + + +Sub RenderScreen(ByVal tilex As Integer, ByVal tiley As Integer, ByVal PixelOffsetX As Integer, ByVal PixelOffsetY As Integer) +'************************************************************** +'Author: Aaron Perkins +'Last Modify Date: 8/14/2007 +'Last modified by: Juan Martín Sotuyo Dodero (Maraxus) +'Renders everything to the viewport +'************************************************************** + Dim Y As Long 'Keeps track of where on map we are + Dim X As Long 'Keeps track of where on map we are + Dim screenminY As Integer 'Start Y pos on current screen + Dim screenmaxY As Integer 'End Y pos on current screen + Dim screenminX As Integer 'Start X pos on current screen + Dim screenmaxX As Integer 'End X pos on current screen + Dim minY As Integer 'Start Y pos on current map + Dim maxY As Integer 'End Y pos on current map + Dim minX As Integer 'Start X pos on current map + Dim maxX As Integer 'End X pos on current map + Dim ScreenX As Integer 'Keeps track of where to place tile on screen + Dim ScreenY As Integer 'Keeps track of where to place tile on screen + Dim minXOffset As Integer + Dim minYOffset As Integer + Dim PixelOffsetXTemp As Integer 'For centering grhs + Dim PixelOffsetYTemp As Integer 'For centering grhs + + + 'Figure out Ends and Starts of screen + screenminY = tiley - HalfWindowTileHeight + screenmaxY = tiley + HalfWindowTileHeight + screenminX = tilex - HalfWindowTileWidth + screenmaxX = tilex + HalfWindowTileWidth + + minY = screenminY - TileBufferSize + maxY = screenmaxY + TileBufferSize + minX = screenminX - TileBufferSize + maxX = screenmaxX + TileBufferSize + + 'Make sure mins and maxs are allways in map bounds + If minY < XMinMapSize Then + minYOffset = YMinMapSize - minY + minY = YMinMapSize + End If + + If maxY > YMaxMapSize Then maxY = YMaxMapSize + + If minX < XMinMapSize Then + minXOffset = XMinMapSize - minX + minX = XMinMapSize + End If + + If maxX > XMaxMapSize Then maxX = XMaxMapSize + + 'If we can, we render around the view area to make it smoother + If screenminY > YMinMapSize Then + screenminY = screenminY - 1 + Else + screenminY = 1 + ScreenY = 1 + End If + + If screenmaxY < YMaxMapSize Then screenmaxY = screenmaxY + 1 + + If screenminX > XMinMapSize Then + screenminX = screenminX - 1 + Else + screenminX = 1 + ScreenX = 1 + End If + + If screenmaxX < XMaxMapSize Then screenmaxX = screenmaxX + 1 + + 'Draw floor layer + For Y = screenminY To screenmaxY + For X = screenminX To screenmaxX + + 'Layer 1 ********************************** + Call DDrawGrhtoSurface(MapData(X, Y).Graphic(1), _ + (ScreenX - 1) * TilePixelWidth + PixelOffsetX + TileBufferPixelOffsetX, _ + (ScreenY - 1) * TilePixelHeight + PixelOffsetY + TileBufferPixelOffsetY, _ + 0, 1) + '****************************************** + + ScreenX = ScreenX + 1 + Next X + + 'Reset ScreenX to original value and increment ScreenY + ScreenX = ScreenX - X + screenminX + ScreenY = ScreenY + 1 + Next Y + + 'Draw floor layer 2 + ScreenY = minYOffset + For Y = minY To maxY + ScreenX = minXOffset + For X = minX To maxX + + 'Layer 2 ********************************** + If MapData(X, Y).Graphic(2).GrhIndex <> 0 Then + Call DDrawTransGrhtoSurface(MapData(X, Y).Graphic(2), _ + (ScreenX - 1) * TilePixelWidth + PixelOffsetX, _ + (ScreenY - 1) * TilePixelHeight + PixelOffsetY, _ + 1, 1) + End If + '****************************************** + + ScreenX = ScreenX + 1 + Next X + ScreenY = ScreenY + 1 + Next Y + + Dim i As Byte + + 'Draw Transparent Layers + ScreenY = minYOffset + For Y = minY To maxY + ScreenX = minXOffset + For X = minX To maxX + PixelOffsetXTemp = (ScreenX - 1) * TilePixelWidth + PixelOffsetX + PixelOffsetYTemp = (ScreenY - 1) * TilePixelHeight + PixelOffsetY + + With MapData(X, Y) + 'Object Layer ********************************** + 'If .ObjGrh.GrhIndex <> 0 Then + ' Call DDrawTransGrhtoSurface(.ObjGrh, _ + PixelOffsetXTemp, PixelOffsetYTemp, 1, 1) + 'End If + '*********************************************** + + + 'Char layer ************************************ + If .CharIndex <> 0 Then + Call CharRender(.CharIndex, PixelOffsetXTemp, PixelOffsetYTemp) + If Hosting Then charlist(.CharIndex).Found = 1 + End If + '************************************************* + + + 'Layer 3 ***************************************** + 'If .Graphic(3).GrhIndex <> 0 Then + 'Draw + ' Call DDrawTransGrhtoSurface(.Graphic(3), _ + PixelOffsetXTemp, PixelOffsetYTemp, 1, 1) + 'End If + '************************************************ + End With + + ScreenX = ScreenX + 1 + Next X + ScreenY = ScreenY + 1 + Next Y + + If Hosting Then + For i = 1 To MaxUsers + If charlist(i).ConnID <> -1 Or charlist(i).Bot = 1 Then + If charlist(i).Found = 1 Then + charlist(i).Found = 0 + Else + Call CharRender(i, 1000, 1000) + End If + End If + Next i + End If + + If Not bTecho Then + 'Draw blocked tiles and grid + ScreenY = minYOffset + For Y = minY To maxY + ScreenX = minXOffset + For X = minX To maxX + + 'Layer 4 ********************************** + If MapData(X, Y).Graphic(4).GrhIndex Then + 'Draw + Call DDrawTransGrhtoSurface(MapData(X, Y).Graphic(4), _ + (ScreenX - 1) * TilePixelWidth + PixelOffsetX, _ + (ScreenY - 1) * TilePixelHeight + PixelOffsetY, _ + 1, 1) + End If + '********************************** + + ScreenX = ScreenX + 1 + Next X + ScreenY = ScreenY + 1 + Next Y + End If + +End Sub + +Public Function RenderSounds() +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 3/30/2008 +'Actualiza todos los sonidos del mapa. +'************************************************************** + + DoFogataFx +End Function + +Function HayUserAbajo(ByVal X As Integer, ByVal Y As Integer, ByVal GrhIndex As Integer) As Boolean + If GrhIndex > 0 Then + HayUserAbajo = _ + charlist(UserCharIndex).Pos.X >= X - (GrhData(GrhIndex).TileWidth \ 2) _ + And charlist(UserCharIndex).Pos.X <= X + (GrhData(GrhIndex).TileWidth \ 2) _ + And charlist(UserCharIndex).Pos.Y >= Y - (GrhData(GrhIndex).TileHeight - 1) _ + And charlist(UserCharIndex).Pos.Y <= Y + End If +End Function + +Sub LoadGraphics() +'************************************************************** +'Author: Juan Martín Sotuyo Dodero - complete rewrite +'Last Modify Date: 11/03/2006 +'Initializes the SurfaceDB and sets up the rain rects +'************************************************************** + 'New surface manager :D + Call SurfaceDB.Initialize(DirectDraw, ClientSetup.bUseVideo, DirGraficos, ClientSetup.byMemory) + + 'Set up te rain rects + RLluvia(0).Top = 0: RLluvia(1).Top = 0: RLluvia(2).Top = 0: RLluvia(3).Top = 0 + RLluvia(0).Left = 0: RLluvia(1).Left = 128: RLluvia(2).Left = 256: RLluvia(3).Left = 384 + RLluvia(0).Right = 128: RLluvia(1).Right = 256: RLluvia(2).Right = 384: RLluvia(3).Right = 512 + RLluvia(0).Bottom = 128: RLluvia(1).Bottom = 128: RLluvia(2).Bottom = 128: RLluvia(3).Bottom = 128 + + RLluvia(4).Top = 128: RLluvia(5).Top = 128: RLluvia(6).Top = 128: RLluvia(7).Top = 128 + RLluvia(4).Left = 0: RLluvia(5).Left = 128: RLluvia(6).Left = 256: RLluvia(7).Left = 384 + RLluvia(4).Right = 128: RLluvia(5).Right = 256: RLluvia(6).Right = 384: RLluvia(7).Right = 512 + RLluvia(4).Bottom = 256: RLluvia(5).Bottom = 256: RLluvia(6).Bottom = 256: RLluvia(7).Bottom = 256 +End Sub + +Public Function InitTileEngine(ByVal setDisplayFormhWnd As Long, ByVal setMainViewTop As Integer, ByVal setMainViewLeft As Integer, ByVal setTilePixelHeight As Integer, ByVal setTilePixelWidth As Integer, ByVal setWindowTileHeight As Integer, ByVal setWindowTileWidth As Integer, ByVal setTileBufferSize As Integer, ByVal pixelsToScrollPerFrameX As Integer, pixelsToScrollPerFrameY As Integer, ByVal engineSpeed As Single) As Boolean +'*************************************************** +'Author: Aaron Perkins +'Last Modification: 08/14/07 +'Last modified by: Juan Martín Sotuyo Dodero (Maraxus) +'Creates all DX objects and configures the engine to start running. +'*************************************************** + Dim SurfaceDesc As DDSURFACEDESC2 + Dim ddck As DDCOLORKEY + + IniPath = App.path & "\Init\" + + 'Fill startup variables + MainViewTop = setMainViewTop + MainViewLeft = setMainViewLeft + TilePixelWidth = setTilePixelWidth + TilePixelHeight = setTilePixelHeight + WindowTileHeight = setWindowTileHeight + WindowTileWidth = setWindowTileWidth + TileBufferSize = setTileBufferSize + + HalfWindowTileHeight = setWindowTileHeight \ 2 + HalfWindowTileWidth = setWindowTileWidth \ 2 + + 'Compute offset in pixels when rendering tile buffer. + 'We diminish by one to get the top-left corner of the tile for rendering. + TileBufferPixelOffsetX = ((TileBufferSize - 1) * TilePixelWidth) + TileBufferPixelOffsetY = ((TileBufferSize - 1) * TilePixelHeight) + + engineBaseSpeed = engineSpeed + + 'Set FPS value to 60 for startup + FPS = 60 + FramesPerSecCounter = 60 + + MinXBorder = XMinMapSize + (WindowTileWidth \ 2) + MaxXBorder = XMaxMapSize - (WindowTileWidth \ 2) + MinYBorder = YMinMapSize + (WindowTileHeight \ 2) + MaxYBorder = YMaxMapSize - (WindowTileHeight \ 2) + + MainViewWidth = TilePixelWidth * WindowTileWidth + MainViewHeight = TilePixelHeight * WindowTileHeight + + 'Resize mapdata array + ReDim MapData(XMinMapSize To XMaxMapSize, YMinMapSize To YMaxMapSize) As MapBlock + + 'Set intial user position + UserPos.X = MinXBorder + UserPos.Y = MinYBorder + + 'Set scroll pixels per frame + ScrollPixelsPerFrameX = pixelsToScrollPerFrameX + ScrollPixelsPerFrameY = pixelsToScrollPerFrameY + + 'Set the view rect + With MainViewRect + .Left = MainViewLeft + .Top = MainViewTop + .Right = .Left + MainViewWidth + .Bottom = .Top + MainViewHeight + End With + + 'Set the dest rect + With MainDestRect + .Left = TilePixelWidth * TileBufferSize - TilePixelWidth + .Top = TilePixelHeight * TileBufferSize - TilePixelHeight + .Right = .Left + MainViewWidth + .Bottom = .Top + MainViewHeight + End With + +On Error Resume Next + Set DirectX = New DirectX7 + + If Err Then + MsgBox "No se puede iniciar DirectX. Por favor asegurese de tener la ultima version correctamente instalada." + Exit Function + End If + + + '****** INIT DirectDraw ****** + ' Create the root DirectDraw object + Set DirectDraw = DirectX.DirectDrawCreate("") + + If Err Then + MsgBox "No se puede iniciar DirectDraw. Por favor asegurese de tener la ultima version correctamente instalada." + Exit Function + End If + +On Error GoTo 0 + Call DirectDraw.SetCooperativeLevel(setDisplayFormhWnd, DDSCL_NORMAL) + + 'Primary Surface + ' Fill the surface description structure + With SurfaceDesc + .lFlags = DDSD_CAPS + .ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE + End With + ' Create the surface + Set PrimarySurface = DirectDraw.CreateSurface(SurfaceDesc) + + 'Create Primary Clipper + Set PrimaryClipper = DirectDraw.CreateClipper(0) + Call PrimaryClipper.SetHWnd(frmMain.hWnd) + Call PrimarySurface.SetClipper(PrimaryClipper) + + With BackBufferRect + .Left = 0 + .Top = 0 + .Right = TilePixelWidth * (WindowTileWidth + 2 * TileBufferSize) + .Bottom = TilePixelHeight * (WindowTileHeight + 2 * TileBufferSize) + End With + + With SurfaceDesc + .lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH + If ClientSetup.bUseVideo Then + .ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_VIDEOMEMORY + Else + .ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_SYSTEMMEMORY + End If + .lHeight = BackBufferRect.Bottom + .lWidth = BackBufferRect.Right + End With + + ' Create surface + Set BackBufferSurface = DirectDraw.CreateSurface(SurfaceDesc) + + 'Set color key + ddck.low = 0 + ddck.high = 0 + Call BackBufferSurface.SetColorKey(DDCKEY_SRCBLT, ddck) + + 'Set font transparency + Call BackBufferSurface.SetFontTransparency(D_TRUE) + + Call LoadGrhData + Call CargarCuerpos + Call CargarCabezas + Call CargarCascos + Call CargarFxs + + LTLluvia(0) = 224 + LTLluvia(1) = 352 + LTLluvia(2) = 480 + LTLluvia(3) = 608 + LTLluvia(4) = 736 + + Call LoadGraphics + + InitTileEngine = True +End Function + +Public Sub DeinitTileEngine() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 08/14/07 +'Destroys all DX objects +'*************************************************** +On Error Resume Next + Set PrimarySurface = Nothing + Set PrimaryClipper = Nothing + Set BackBufferSurface = Nothing + + Set DirectDraw = Nothing + + Set DirectX = Nothing +End Sub + +Sub ShowNextFrame(ByVal DisplayFormTop As Integer, ByVal DisplayFormLeft As Integer, ByVal MouseViewX As Integer, ByVal MouseViewY As Integer) +'*************************************************** +'Author: Arron Perkins +'Last Modification: 08/14/07 +'Last modified by: Juan Martín Sotuyo Dodero (Maraxus) +'Updates the game's model and renders everything. +'*************************************************** + Static OffsetCounterX As Single + Static OffsetCounterY As Single + + '****** Set main view rectangle ****** + MainViewRect.Left = (DisplayFormLeft / Screen.TwipsPerPixelX) + MainViewLeft + MainViewRect.Top = (DisplayFormTop / Screen.TwipsPerPixelY) + MainViewTop + MainViewRect.Right = MainViewRect.Left + MainViewWidth + MainViewRect.Bottom = MainViewRect.Top + MainViewHeight + + If EngineRun Then + If UserMoving Then + '****** Move screen Left and Right if needed ****** + If AddtoUserPos.X <> 0 Then + OffsetCounterX = OffsetCounterX - ScrollPixelsPerFrameX * AddtoUserPos.X * timerTicksPerFrame + If Abs(OffsetCounterX) >= Abs(TilePixelWidth * AddtoUserPos.X) Then + OffsetCounterX = 0 + AddtoUserPos.X = 0 + UserMoving = False + End If + End If + + '****** Move screen Up and Down if needed ****** + If AddtoUserPos.Y <> 0 Then + OffsetCounterY = OffsetCounterY - ScrollPixelsPerFrameY * AddtoUserPos.Y * timerTicksPerFrame + If Abs(OffsetCounterY) >= Abs(TilePixelHeight * AddtoUserPos.Y) Then + OffsetCounterY = 0 + AddtoUserPos.Y = 0 + UserMoving = False + End If + End If + End If + + 'Update mouse position within view area + Call ConvertCPtoTP(MouseViewX, MouseViewY, MouseTileX, MouseTileY) + + '****** Update screen ****** + If UserCiego Then + Call CleanViewPort + Else + Call RenderScreen(UserPos.X - AddtoUserPos.X, UserPos.Y - AddtoUserPos.Y, OffsetCounterX, OffsetCounterY) + End If + If ClientSetup.bActive Then + If isCapturePending Then + + End If + End If + Call Dialogos.Render + + #If ModoDebug Then + Call Mod_TileEngine.RenderText(260, 260, "BotHP: " & charlist(2).MinHP & "/" & charlist(2).MaxHP, vbYellow, frmMain.RecTxt.font) + Call Mod_TileEngine.RenderText(260, 270, "BotMP: " & charlist(2).MinMAN & "/" & charlist(2).MaxMAN, vbYellow, frmMain.RecTxt.font) + Call Mod_TileEngine.RenderText(260, 280, "Lanzando: " & charlist(2).Lanzando, vbYellow, frmMain.RecTxt.font) + Call Mod_TileEngine.RenderText(260, 290, "ComP: " & charlist(2).ComportamientoPotas, vbYellow, frmMain.RecTxt.font) + Call Mod_TileEngine.RenderText(260, 300, "ComH: " & charlist(2).ComportamientoHechizos, vbYellow, frmMain.RecTxt.font) + Call Mod_TileEngine.RenderText(260, 310, "ComC: " & charlist(2).ComportamientoCombo, vbYellow, frmMain.RecTxt.font) + Call Mod_TileEngine.RenderText(260, 320, "TipoP: " & charlist(2).TipoPocion, vbYellow, frmMain.RecTxt.font) + Call Mod_TileEngine.RenderText(260, 330, "Quieto: " & charlist(1).Quieto, vbYellow, frmMain.RecTxt.font) + #End If + + If pausa Then + Call Mod_TileEngine.RenderText(480, 260, ">JUEGO PAUSADO<", vbYellow, frmMain.RecTxt.font) + End If + + 'Display front-buffer! + Call PrimarySurface.Blt(MainViewRect, BackBufferSurface, MainDestRect, DDBLT_WAIT) + + 'Limit FPS to 100 (an easy number higher than monitor's vertical refresh rates) + While (DirectX.TickCount - fpsLastCheck) \ 10 < FramesPerSecCounter + Sleep 5 + Wend + + 'FPS update + If fpsLastCheck + 1000 < DirectX.TickCount Then + FPS = FramesPerSecCounter + FramesPerSecCounter = 1 + fpsLastCheck = DirectX.TickCount + Else + FramesPerSecCounter = FramesPerSecCounter + 1 + End If + + 'Get timing info + timerElapsedTime = GetElapsedTime() + timerTicksPerFrame = timerElapsedTime * engineBaseSpeed + End If +End Sub + +#If ConAlfaB Then + +Public Sub EfectoNoche(ByRef Surface As DirectDrawSurface7) + Dim dArray() As Byte + Dim ddsdDest As DDSURFACEDESC2 + Dim Modo As Long + Dim rRect As RECT + + Surface.GetSurfaceDesc ddsdDest + + With rRect + .Left = 0 + .Top = 0 + .Right = ddsdDest.lWidth + .Bottom = ddsdDest.lHeight + End With + + If ddsdDest.ddpfPixelFormat.lGBitMask = &H3E0 Then + Modo = 0 + ElseIf ddsdDest.ddpfPixelFormat.lGBitMask = &H7E0 Then + Modo = 1 + Else + Modo = 2 + End If + + Dim DstLock As Boolean + DstLock = False + + On Local Error GoTo HayErrorAlpha + + Surface.Lock rRect, ddsdDest, DDLOCK_WAIT, 0 + DstLock = True + + Surface.GetLockedArray dArray() + Call BltEfectoNoche(ByVal VarPtr(dArray(0, 0)), _ + ddsdDest.lWidth, ddsdDest.lHeight, ddsdDest.lPitch, _ + Modo) + +HayErrorAlpha: + If DstLock = True Then + Surface.Unlock rRect + DstLock = False + End If +End Sub + +#End If + +Public Sub RenderText(ByVal lngXPos As Integer, ByVal lngYPos As Integer, ByRef strText As String, ByVal lngColor As Long, ByRef font As StdFont) + If strText <> "" Then + Call BackBufferSurface.SetForeColor(vbBlack) + Call BackBufferSurface.SetFont(font) + Call BackBufferSurface.DrawText(lngXPos - 2, lngYPos - 1, strText, False) + + Call BackBufferSurface.SetForeColor(lngColor) + Call BackBufferSurface.DrawText(lngXPos, lngYPos, strText, False) + End If +End Sub + +Public Sub RenderTextCentered(ByVal lngXPos As Integer, ByVal lngYPos As Integer, ByRef strText As String, ByVal lngColor As Long, ByRef font As StdFont) + Dim hdc As Long + Dim Ret As size + + If strText <> "" Then + Call BackBufferSurface.SetFont(font) + + 'Get width of text once rendered + hdc = BackBufferSurface.GetDC() + Call GetTextExtentPoint32(hdc, strText, Len(strText), Ret) + Call BackBufferSurface.ReleaseDC(hdc) + + lngXPos = lngXPos - Ret.cx \ 2 + + Call BackBufferSurface.SetForeColor(vbBlack) + Call BackBufferSurface.DrawText(lngXPos - 2, lngYPos - 1, strText, False) + + Call BackBufferSurface.SetForeColor(lngColor) + Call BackBufferSurface.DrawText(lngXPos, lngYPos, strText, False) + End If +End Sub + +Private Function GetElapsedTime() As Single +'************************************************************** +'Author: Aaron Perkins +'Last Modify Date: 10/07/2002 +'Gets the time that past since the last call +'************************************************************** + Dim start_time As Currency + Static end_time As Currency + Static timer_freq As Currency + + 'Get the timer frequency + If timer_freq = 0 Then + QueryPerformanceFrequency timer_freq + End If + + 'Get current time + Call QueryPerformanceCounter(start_time) + + 'Calculate elapsed time + GetElapsedTime = (start_time - end_time) / timer_freq * 1000 + + 'Get next end time + Call QueryPerformanceCounter(end_time) +End Function + +Private Sub CharRender(ByVal CharIndex As Long, ByVal PixelOffsetX As Integer, ByVal PixelOffsetY As Integer) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 12/03/04 +'Draw char's to screen without offcentering them +'*************************************************** + Dim moved As Boolean + Dim Pos As Integer + Dim line As String + Dim color As Long + + With charlist(CharIndex) + If .Moving Then + 'If needed, move left and right + If .scrollDirectionX <> 0 Then + .MoveOffsetX = .MoveOffsetX + ScrollPixelsPerFrameX * Sgn(.scrollDirectionX) * timerTicksPerFrame + + 'Start animations +'TODO : Este parche es para evita los uncornos exploten al moverse!! REVER!!! + If .body.Walk(.heading).Speed > 0 Then _ + .body.Walk(.heading).Started = 1 + .Arma.WeaponWalk(.heading).Started = 1 + .Escudo.ShieldWalk(.heading).Started = 1 + + 'Char moved + moved = True + + 'Check if we already got there + If (Sgn(.scrollDirectionX) = 1 And .MoveOffsetX >= 0) Or _ + (Sgn(.scrollDirectionX) = -1 And .MoveOffsetX <= 0) Then + .MoveOffsetX = 0 + .scrollDirectionX = 0 + End If + End If + + 'If needed, move up and down + If .scrollDirectionY <> 0 Then + .MoveOffsetY = .MoveOffsetY + ScrollPixelsPerFrameY * Sgn(.scrollDirectionY) * timerTicksPerFrame + + 'Start animations +'TODO : Este parche es para evita los uncornos exploten al moverse!! REVER!!! + If .body.Walk(.heading).Speed > 0 Then _ + .body.Walk(.heading).Started = 1 + .Arma.WeaponWalk(.heading).Started = 1 + .Escudo.ShieldWalk(.heading).Started = 1 + + 'Char moved + moved = True + + 'Check if we already got there + If (Sgn(.scrollDirectionY) = 1 And .MoveOffsetY >= 0) Or _ + (Sgn(.scrollDirectionY) = -1 And .MoveOffsetY <= 0) Then + .MoveOffsetY = 0 + .scrollDirectionY = 0 + End If + End If + End If + + 'If done moving stop animation + If Not moved Then + 'Stop animations + .body.Walk(.heading).Started = 0 + .body.Walk(.heading).FrameCounter = 1 + + .Arma.WeaponWalk(.heading).Started = 0 + .Arma.WeaponWalk(.heading).FrameCounter = 1 + + .Escudo.ShieldWalk(.heading).Started = 0 + .Escudo.ShieldWalk(.heading).FrameCounter = 1 + + .Moving = False + End If + + PixelOffsetX = PixelOffsetX + .MoveOffsetX + PixelOffsetY = PixelOffsetY + .MoveOffsetY + + If .Head.Head(.heading).GrhIndex Then + If Not .invisible Then + 'Draw Body + If .body.Walk(.heading).GrhIndex Then _ + Call DDrawTransGrhtoSurface(.body.Walk(.heading), PixelOffsetX, PixelOffsetY, 1, 1) + + 'Draw Head + If .Head.Head(.heading).GrhIndex Then + Call DDrawTransGrhtoSurface(.Head.Head(.heading), PixelOffsetX + .body.HeadOffset.X, PixelOffsetY + .body.HeadOffset.Y, 1, 0) + + 'Draw Helmet + If .Casco.Head(.heading).GrhIndex Then _ + Call DDrawTransGrhtoSurface(.Casco.Head(.heading), PixelOffsetX + .body.HeadOffset.X, PixelOffsetY + .body.HeadOffset.Y + OFFSET_HEAD, 1, 0) + + 'Draw Weapon + If .Arma.WeaponWalk(.heading).GrhIndex Then _ + Call DDrawTransGrhtoSurface(.Arma.WeaponWalk(.heading), PixelOffsetX, PixelOffsetY, 1, 1) + + 'Draw Shield + If .Escudo.ShieldWalk(.heading).GrhIndex Then _ + Call DDrawTransGrhtoSurface(.Escudo.ShieldWalk(.heading), PixelOffsetX, PixelOffsetY, 1, 1) + + + 'Draw name over head + If LenB(.Nombre) > 0 Then + If Nombres Then + Pos = getTagPosition(.Nombre) + 'Pos = InStr(.Nombre, "<") + 'If Pos = 0 Then Pos = Len(.Nombre) + 2 + + If .priv = 0 Then + If .Atacable Then + color = RGB(ColoresPJ(48).r, ColoresPJ(48).g, ColoresPJ(48).b) + Else + If EnTeam(CharIndex) = 1 Or .Team = 1 Then + color = RGB(ColoresPJ(49).r, ColoresPJ(49).g, ColoresPJ(49).b) + Else + color = RGB(ColoresPJ(50).r, ColoresPJ(50).g, ColoresPJ(50).b) + End If + End If + Else + color = RGB(ColoresPJ(.priv).r, ColoresPJ(.priv).g, ColoresPJ(.priv).b) + End If + + 'Nick + line = Left$(.Nombre, Pos - 2) + Call RenderTextCentered(PixelOffsetX + TilePixelWidth \ 2 + 5, PixelOffsetY + 30, line, color, frmMain.font) + + 'Clan + line = mid$(.Nombre, Pos) + Call RenderTextCentered(PixelOffsetX + TilePixelWidth \ 2 + 5, PixelOffsetY + 45, line, color, frmMain.font) + + If CharIndex = UserCharIndex Then + Dim BackBox As RECT + Dim StaBox As RECT + Dim tmpSta As Long + + BackBox.Bottom = PixelOffsetY + .body.HeadOffset.Y + OFFSET_HEAD + BackBox.Top = PixelOffsetY + .body.HeadOffset.Y + OFFSET_HEAD - 10 + BackBox.Left = PixelOffsetX + .body.HeadOffset.X - 10 + BackBox.Right = PixelOffsetX + .body.HeadOffset.X + 45 + + tmpSta = .MinSTA + StaBox.Bottom = BackBox.Bottom + StaBox.Top = BackBox.Top + StaBox.Left = BackBox.Left + StaBox.Right = BackBox.Left + 55 * (tmpSta * 100 / .MaxSTA) / 100 + + Call BackBufferSurface.BltColorFill(BackBox, RGB(0, 0, 0)) + Call BackBufferSurface.BltColorFill(StaBox, RGB(0, 255, 255)) + Call RenderTextCentered((BackBox.Right + BackBox.Left) / 2 + 3, BackBox.Top - 1, .MinSTA & "/" & .MaxSTA, RGB(255, 255, 255), frmMain.font) + End If + End If + End If + End If + End If + Else + 'Draw Body + If .body.Walk(.heading).GrhIndex Then _ + Call DDrawTransGrhtoSurface(.body.Walk(.heading), PixelOffsetX, PixelOffsetY, 1, 1) + End If + + + 'Update dialogs + Call Dialogos.UpdateDialogPos(PixelOffsetX + .body.HeadOffset.X, PixelOffsetY + .body.HeadOffset.Y + OFFSET_HEAD, CharIndex) '34 son los pixeles del grh de la cabeza que quedan superpuestos al cuerpo + + 'Draw FX + If .FxIndex <> 0 Then +#If (ConAlfaB = 1) Then + Call DDrawTransGrhtoSurfaceAlpha(.FX, PixelOffsetX + FxData(.FxIndex).OffsetX, PixelOffsetY + FxData(.FxIndex).OffsetY, 1, 1) +#Else + Call DDrawTransGrhtoSurface(.FX, PixelOffsetX + FxData(.FxIndex).OffsetX, PixelOffsetY + FxData(.FxIndex).OffsetY, 1, 1) +#End If + + 'Check if animation is over + If .FX.Started = 0 Then _ + .FxIndex = 0 + End If + End With +End Sub + +Public Sub SetCharacterFx(ByVal CharIndex As Integer, ByVal FX As Integer, ByVal Loops As Integer) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 12/03/04 +'Sets an FX to the character. +'*************************************************** + With charlist(CharIndex) + .FxIndex = FX + + If .FxIndex > 0 Then + Call InitGrh(.FX, FxData(FX).Animacion) + + .FX.Loops = Loops + End If + End With +End Sub + +Private Sub CleanViewPort() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 12/03/04 +'Fills the viewport with black. +'*************************************************** + Dim r As RECT + Call BackBufferSurface.BltColorFill(r, vbBlack) +End Sub diff --git a/CODIGO/cDIBSection.cls b/CODIGO/cDIBSection.cls new file mode 100644 index 0000000..d956c9e --- /dev/null +++ b/CODIGO/cDIBSection.cls @@ -0,0 +1,467 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "cDIBSection" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +Option Explicit + +Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ + lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long) + +Private Type SAFEARRAYBOUND + cElements As Long + lLbound As Long +End Type +Private Type SAFEARRAY2D + cDims As Integer + fFeatures As Integer + cbElements As Long + cLocks As Long + pvData As Long + Bounds(0 To 1) As SAFEARRAYBOUND +End Type +Private Declare Function VarPtrArray Lib "msvbvm50.dll" Alias "VarPtr" (Ptr() As Any) As Long + +Private Type RGBQUAD + rgbBlue As Byte + rgbGreen As Byte + rgbRed As Byte + rgbReserved As Byte +End Type +Private Type BITMAPINFOHEADER '40 bytes + biSize As Long + biWidth As Long + biHeight As Long + biPlanes As Integer + biBitCount As Integer + biCompression As Long + biSizeImage As Long + biXPelsPerMeter As Long + biYPelsPerMeter As Long + biClrUsed As Long + biClrImportant As Long +End Type +Private Type BITMAPINFO + bmiHeader As BITMAPINFOHEADER + bmiColors As RGBQUAD +End Type +Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long +Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long +Private Declare Function GetDesktopWindow Lib "user32" () As Long +' Note - this is not the declare in the API viewer - modify lplpVoid to be +' Byref so we get the pointer back: +Private Declare Function CreateDIBSection Lib "gdi32" _ + (ByVal hdc As Long, _ + pBitmapInfo As BITMAPINFO, _ + ByVal un As Long, _ + lplpVoid As Long, _ + ByVal handle As Long, _ + ByVal dw As Long) As Long +Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long +Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long +Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long +Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long +Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long +Private Const BI_RGB = 0& +Private Const DIB_RGB_COLORS = 0 ' color table in RGBs + +Private Type BITMAP + bmType As Long + bmWidth As Long + bmHeight As Long + bmWidthBytes As Long + bmPlanes As Integer + bmBitsPixel As Integer + bmBits As Long +End Type +Private Declare Function GetObjectAPI Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long +Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long + +' Clipboard functions: +Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long +Private Declare Function CloseClipboard Lib "user32" () As Long +Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long +Private Declare Function EmptyClipboard Lib "user32" () As Long +Private Const CF_BITMAP = 2 + +' Handle to the current DIBSection: +Private m_hDIb As Long +' Handle to the old bitmap in the DC, for clear up: +Private m_hBmpOld As Long +' Handle to the Device context holding the DIBSection: +Private m_hDC As Long +' Address of memory pointing to the DIBSection's bits: +Private m_lPtr As Long +' Type containing the Bitmap information: +Private m_tBI As BITMAPINFO + +Public Function CopyToClipboard( _ + Optional ByVal bAsDIB As Boolean = True _ + ) As Boolean +Dim lhDCDesktop As Long +Dim lhDC As Long +Dim lhBmpOld As Long +Dim hObj As Long +Dim lFmt As Long + + lhDCDesktop = GetDC(GetDesktopWindow()) + If (lhDCDesktop <> 0) Then + lhDC = CreateCompatibleDC(lhDCDesktop) + If (lhDC <> 0) Then + If (bAsDIB) Then + MsgBox "I don't know how to put a DIB on the clipboard! Copy as bitmap instead!!!" + ' Create a duplicate DIBSection and copy + ' to the clipboard: + 'LSet tBI = m_tBI + 'hDibCopy = CreateDIBSection( _ + ' lhDC, _ + ' m_tBI, _ + ' DIB_RGB_COLORS, _ + ' lPtr, _ + ' 0, 0) + 'If (hDibCopy <> 0) Then + ' lhBmpOld = SelectObject(lhDC, hObj) + ' BitBlt lhDC, 0, 0, Width, Height, m_hDC, 0, 0, vbSrcCopy + ' SelectObject lhDC, lhBmpOld + ' lFmt = CF_DIB + ' + ' '.... + + 'Else + ' hObj = 0 + 'End If + Else + ' Create a compatible bitmap and copy to + ' the clipboard: + hObj = CreateCompatibleBitmap(lhDCDesktop, Width, Height) + If (hObj <> 0) Then + lhBmpOld = SelectObject(lhDC, hObj) + PaintPicture lhDC + SelectObject lhDC, lhBmpOld + lFmt = CF_BITMAP + ' Now set the clipboard to the bitmap: + If (OpenClipboard(0) <> 0) Then + EmptyClipboard + If (SetClipboardData(lFmt, hObj) <> 0) Then + CopyToClipboard = True + End If + CloseClipboard + End If + End If + End If + DeleteDC lhDC + End If + DeleteDC lhDCDesktop + End If +End Function + +Public Function CreateDIB( _ + ByVal lhDC As Long, _ + ByVal lWidth As Long, _ + ByVal lHeight As Long, _ + ByRef hDib As Long _ + ) As Boolean + With m_tBI.bmiHeader + .biSize = Len(m_tBI.bmiHeader) + .biWidth = lWidth + .biHeight = lHeight + .biPlanes = 1 + .biBitCount = 24 + .biCompression = BI_RGB + .biSizeImage = BytesPerScanLine * .biHeight + End With + hDib = CreateDIBSection( _ + lhDC, _ + m_tBI, _ + DIB_RGB_COLORS, _ + m_lPtr, _ + 0, 0) + CreateDIB = (hDib <> 0) +End Function +Public Function CreateFromPicture( _ + ByRef picThis As StdPicture _ + ) +Dim lhDC As Long +Dim lhDCDesktop As Long +Dim lhBmpOld As Long +Dim tBMP As BITMAP +Dim lhWnd As Long + + GetObjectAPI picThis.handle, Len(tBMP), tBMP + If (Create(tBMP.bmWidth, tBMP.bmHeight)) Then + lhWnd = GetDesktopWindow() + lhDCDesktop = GetDC(lhWnd) + If (lhDCDesktop <> 0) Then + lhDC = CreateCompatibleDC(lhDCDesktop) + ReleaseDC lhWnd, lhDCDesktop + If (lhDC <> 0) Then + lhBmpOld = SelectObject(lhDC, picThis.handle) + LoadPictureBlt lhDC + SelectObject lhDC, lhBmpOld + DeleteDC lhDC + End If + End If + End If +End Function +Public Function Create( _ + ByVal lWidth As Long, _ + ByVal lHeight As Long _ + ) As Boolean + ClearUp + m_hDC = CreateCompatibleDC(0) + If (m_hDC <> 0) Then + If (CreateDIB(m_hDC, lWidth, lHeight, m_hDIb)) Then + m_hBmpOld = SelectObject(m_hDC, m_hDIb) + Create = True + Else + DeleteDC m_hDC + m_hDC = 0 + End If + End If +End Function +Public Property Get BytesPerScanLine() As Long + ' Scans must align on dword boundaries: + BytesPerScanLine = (m_tBI.bmiHeader.biWidth * 3 + 3) And &HFFFFFFFC +End Property + +Public Property Get Width() As Long + Width = m_tBI.bmiHeader.biWidth +End Property +Public Property Get Height() As Long + Height = m_tBI.bmiHeader.biHeight +End Property + +Public Sub LoadPictureBlt( _ + ByVal lhDC As Long, _ + Optional ByVal lSrcLeft As Long = 0, _ + Optional ByVal lSrcTop As Long = 0, _ + Optional ByVal lSrcWidth As Long = -1, _ + Optional ByVal lSrcHeight As Long = -1, _ + Optional ByVal eRop As RasterOpConstants = vbSrcCopy _ + ) + If lSrcWidth < 0 Then lSrcWidth = m_tBI.bmiHeader.biWidth + If lSrcHeight < 0 Then lSrcHeight = m_tBI.bmiHeader.biHeight + BitBlt m_hDC, 0, 0, lSrcWidth, lSrcHeight, lhDC, lSrcLeft, lSrcTop, eRop +End Sub + + +Public Sub PaintPicture( _ + ByVal lhDC As Long, _ + Optional ByVal lDestLeft As Long = 0, _ + Optional ByVal lDestTop As Long = 0, _ + Optional ByVal lDestWidth As Long = -1, _ + Optional ByVal lDestHeight As Long = -1, _ + Optional ByVal lSrcLeft As Long = 0, _ + Optional ByVal lSrcTop As Long = 0, _ + Optional ByVal eRop As RasterOpConstants = vbSrcCopy _ + ) + If (lDestWidth < 0) Then lDestWidth = m_tBI.bmiHeader.biWidth + If (lDestHeight < 0) Then lDestHeight = m_tBI.bmiHeader.biHeight + BitBlt lhDC, lDestLeft, lDestTop, lDestWidth, lDestHeight, m_hDC, lSrcLeft, lSrcTop, eRop +End Sub + +Public Property Get hdc() As Long + hdc = m_hDC +End Property +Public Property Get hDib() As Long + hDib = m_hDIb +End Property +Public Property Get DIBSectionBitsPtr() As Long + DIBSectionBitsPtr = m_lPtr +End Property +Public Sub RandomiseBits( _ + Optional ByVal bGray As Boolean = False _ + ) +Dim bDib() As Byte +Dim X As Long, Y As Long +Dim lC As Long +Dim tSA As SAFEARRAY2D +Dim xEnd As Long + + ' Get the bits in the from DIB section: + With tSA + .cbElements = 1 + .cDims = 2 + .Bounds(0).lLbound = 0 + .Bounds(0).cElements = m_tBI.bmiHeader.biHeight + .Bounds(1).lLbound = 0 + .Bounds(1).cElements = BytesPerScanLine() + .pvData = m_lPtr + End With + CopyMemory ByVal VarPtrArray(bDib()), VarPtr(tSA), 4 + + ' random: + Randomize Timer + + xEnd = (Width - 1) * 3 + If (bGray) Then + For Y = 0 To m_tBI.bmiHeader.biHeight - 1 + For X = 0 To xEnd Step 3 + lC = Rnd * 255 + bDib(X, Y) = lC + bDib(X + 1, Y) = lC + bDib(X + 2, Y) = lC + Next X + Next Y + Else + For X = 0 To xEnd Step 3 + For Y = 0 To m_tBI.bmiHeader.biHeight - 1 + bDib(X, Y) = 0 + bDib(X + 1, Y) = Rnd * 255 + bDib(X + 2, Y) = Rnd * 255 + Next Y + Next X + End If + + ' Clear the temporary array descriptor + ' (This does not appear to be necessary, but + ' for safety do it anyway) + CopyMemory ByVal VarPtrArray(bDib), 0&, 4 + +End Sub + +Public Sub ClearUp() + If (m_hDC <> 0) Then + If (m_hDIb <> 0) Then + SelectObject m_hDC, m_hBmpOld + DeleteObject m_hDIb + End If + DeleteDC m_hDC + End If + m_hDC = 0: m_hDIb = 0: m_hBmpOld = 0: m_lPtr = 0 +End Sub + +Public Function Resample( _ + ByVal lNewHeight As Long, _ + ByVal lNewWidth As Long _ + ) As cDIBSection +Dim cDib As cDIBSection + Set cDib = New cDIBSection + If cDib.Create(lNewWidth, lNewHeight) Then + If (lNewWidth <> m_tBI.bmiHeader.biWidth) Or (lNewHeight <> m_tBI.bmiHeader.biHeight) Then + ' Change in size, do resample: + ResampleDib cDib + Else + ' No size change so just return a copy: + cDib.LoadPictureBlt m_hDC + End If + Set Resample = cDib + End If +End Function + +Private Function ResampleDib(ByRef cDibTo As cDIBSection) As Boolean +Dim bDibFrom() As Byte +Dim bDibTo() As Byte + +Dim tSAFrom As SAFEARRAY2D +Dim tSATo As SAFEARRAY2D + + ' Get the bits in the from DIB section: + With tSAFrom + .cbElements = 1 + .cDims = 2 + .Bounds(0).lLbound = 0 + .Bounds(0).cElements = m_tBI.bmiHeader.biHeight + .Bounds(1).lLbound = 0 + .Bounds(1).cElements = BytesPerScanLine() + .pvData = m_lPtr + End With + CopyMemory ByVal VarPtrArray(bDibFrom()), VarPtr(tSAFrom), 4 + + ' Get the bits in the to DIB section: + With tSATo + .cbElements = 1 + .cDims = 2 + .Bounds(0).lLbound = 0 + .Bounds(0).cElements = cDibTo.Height + .Bounds(1).lLbound = 0 + .Bounds(1).cElements = cDibTo.BytesPerScanLine() + .pvData = cDibTo.DIBSectionBitsPtr + End With + CopyMemory ByVal VarPtrArray(bDibTo()), VarPtr(tSATo), 4 + +Dim xScale As Single +Dim yScale As Single + +Dim X As Long, Y As Long, xEnd As Long, xOut As Long + +Dim FX As Single, fY As Single +Dim ifY As Long, ifX As Long +Dim dX As Single, dy As Single +Dim r As Long, r1 As Single, r2 As Single, r3 As Single, r4 As Single +Dim g As Long, g1 As Single, g2 As Single, g3 As Single, g4 As Single +Dim b As Long, b1 As Single, b2 As Single, b3 As Single, b4 As Single +Dim ir1 As Long, ig1 As Long, ib1 As Long +Dim ir2 As Long, ig2 As Long, ib2 As Long + + xScale = (Width - 1) / cDibTo.Width + yScale = (Height - 1) / cDibTo.Height + + xEnd = cDibTo.Width - 1 + + For Y = 0 To cDibTo.Height - 1 + + fY = Y * yScale + ifY = Int(fY) + dy = fY - ifY + + For X = 0 To xEnd + FX = X * xScale + ifX = Int(FX) + dX = FX - ifX + + ifX = ifX * 3 + ' Interpolate using the four nearest pixels in the source + b1 = bDibFrom(ifX, ifY): g1 = bDibFrom(ifX + 1, ifY): r1 = bDibFrom(ifX + 2, ifY) + b2 = bDibFrom(ifX + 3, ifY): g2 = bDibFrom(ifX + 4, ifY): r2 = bDibFrom(ifX + 5, ifY) + b3 = bDibFrom(ifX, ifY + 1): g3 = bDibFrom(ifX + 1, ifY + 1): r3 = bDibFrom(ifX + 2, ifY + 1) + b4 = bDibFrom(ifX + 3, ifY + 1): g4 = bDibFrom(ifX + 4, ifY + 1): r4 = bDibFrom(ifX + 5, ifY + 1) + + ' Interplate in x direction: + ir1 = r1 * (1 - dy) + r3 * dy: ig1 = g1 * (1 - dy) + g3 * dy: ib1 = b1 * (1 - dy) + b3 * dy + ir2 = r2 * (1 - dy) + r4 * dy: ig2 = g2 * (1 - dy) + g4 * dy: ib2 = b2 * (1 - dy) + b4 * dy + ' Interpolate in y: + r = ir1 * (1 - dX) + ir2 * dX: g = ig1 * (1 - dX) + ig2 * dX: b = ib1 * (1 - dX) + ib2 * dX + + ' Set output: + If (r < 0) Then r = 0 + If (r > 255) Then r = 255 + If (g < 0) Then g = 0 + If (g > 255) Then g = 255 + If (b < 0) Then b = 0 + If (b > 255) Then + b = 255 + End If + xOut = X * 3 + bDibTo(xOut, Y) = b + bDibTo(xOut + 1, Y) = g + bDibTo(xOut + 2, Y) = r + + Next X + + Next Y + + ' Clear the temporary array descriptor + ' (This does not appear to be necessary, but + ' for safety do it anyway) + CopyMemory ByVal VarPtrArray(bDibFrom), 0&, 4 + CopyMemory ByVal VarPtrArray(bDibTo), 0&, 4 + + +End Function + +Private Sub Class_Terminate() + ClearUp +End Sub + + + + diff --git a/CODIGO/clsAudio.cls b/CODIGO/clsAudio.cls new file mode 100644 index 0000000..d7041c9 --- /dev/null +++ b/CODIGO/clsAudio.cls @@ -0,0 +1,1154 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "clsAudio" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +'************************************************************** +' clsAudio.cls - Controls all audio using DirectSound and DirectMusic +' +' Designed and implemented by Juan Martín Sotuyo Dodero (Maraxus) +' (juansotuyo@hotmail.com) +'************************************************************** + +'************************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the GNU General Public License as published by +'the Free Software Foundation; either version 2 of the License, or +'(at your option) any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the GNU General Public License +'along with this program; if not, write to the Free Software +'Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +'************************************************************************** + +'16/03/2004 - Juan Martín Sotuyo Dodero (Maraxus) - (juansotuyo@gmail.com) +' - First Release +' +'03/03/2007 - Juan Martín Sotuyo Dodero (Maraxus) - (juansotuyo@gmail.com) +' - Add: Sound and Music activation / deactivation from within the class. +' - Add: Documentation +' - Change: Volume is no longer the dB amplification / atenuation to be +' applied but a percentage for easier interaction with user. +' +'30/03/2008 - Juan Martín Sotuyo Dodero (Maraxus) - (juansotuyo@gmail.com) +' - Add: 3D-like sound effects by altering frequency to emulate Doppler effect, +' volume to emulate distance and panning for position. +' +'28/07/2008 - Franco Zeoli (Noich) - (zeolifranco@gmail.com) +' -Add: Optional sound effects +' +'23/03/2010 - Torres Patricio(Pato) - (paatoo.torres@gmail.com) +' -Add: ORE code to reproduce MP3 + +'' +' Controls all audio using DirectSound and DirectMusic 7. +' +' @file clsAudio.cls +' @author Juan Martín Sotuyo Dodero (Maraxus) juansotuyo@gmail.com +' @version 1.2.1 +' @date 20070303 + +Option Explicit + +'' +' Maximum number of sound buffers to hold in memory at any time. +Private Const NumSoundBuffers As Byte = 30 + +'' +' The distance at which the sound is inaudible. +Private Const MAX_DISTANCE_TO_SOURCE As Integer = 150 + +'' +' The frequency variation coefficient for Doppler effect simulation. +Private Const DELTA_FQ As Integer = 75 + +'' +' Custom sound buffer structure. +' +' @param FileName The name of the file loaded in this buffer +' @param looping Set to true if the sound will loop until stopped +' @param X The X position of the sound in map coordinates +' @param Y The Y position of the sound in map coordinates +' @param normalFq The frequency of the sound when not affected by Doppler effect. +' @param Buffer The DirectSoundBuffer object to wich the file is loaded +Private Type SoundBuffer + FileName As String + looping As Boolean + X As Byte + Y As Byte + normalFq As Long + buffer As DirectSoundBuffer +End Type + +'' +' States how to set a sound's looping state. +' +' @param Default If wave is in memory use it's looping setting, otherwise false +' @param Disabled Never loop +' @param Enabled Loop until stopped +Public Enum LoopStyle + Default = 0 + Disabled = 1 + Enabled = 2 +End Enum + +'' +' Set to true once the object is created to prevent multiple initializations of the same object. +Dim inited As Boolean + +'' +'The one and only DirectSound object +Dim DirectSound As DirectSound + +'' +'Array of all existing sound buffers +Dim DSBuffers(1 To NumSoundBuffers) As SoundBuffer + +'' +'Directory from which to load sound files by default +Dim SoundPath As String + +'' +'The volume for sounds (FXs) +Dim SndVolume As Long + +'' +'DirectMusic's Performance object +Dim Performance As DirectMusicPerformance + +'' +'Currently loaded segment +Dim Segment As DirectMusicSegment + +'' +'The one and only DirectMusic Loader +Dim Loader As DirectMusicLoader + +'' +'State of the currently loaded segment +Dim SegState As DirectMusicSegmentState + +'' +'States wether music is supported by hardware or not +Dim Music As Boolean + +'' +'Directory from which to load music files by default +Dim MusicPath As String + +'' +'Last loaded music file. Used to be able to load it when music gets activated +Dim CurrentMusicFile As String + +'' +'States wether music is currently activated or not +Dim mActivated As Boolean + +'' +'States wether sound is currently activated or not +Dim sActivated As Boolean + +'' +'States the last position where the listener was in the X axis +Dim lastPosX As Integer + +'' +'States the last position where the listener was in the Y axis +Dim lastPosY As Integer + +'' +'States wether sound effects are currently activated or not +Dim sEffectsActivated As Boolean + +'**** Used By MP3 Playing. ***** +Dim IMC As IMediaControl +Dim IBA As IBasicAudio +Dim IME As IMediaEvent +Dim IMPos As IMediaPosition + +'' +'Constructor. Performs no action at all. + +Private Sub Class_Initialize() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +' +'*************************************************** +End Sub + +'' +'Destructor. Releases all created objects assuring no memory-leaks. + +Private Sub Class_Terminate() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 12/31/09 +'Destroy's all DirectMusic and DirectSound objects +'12/31/09 - Pato: Use StopWave method to prevent errors. +'*************************************************** +On Local Error Resume Next + 'Stop every channel being used and destroy the buffer + Call StopWave + + 'Stop music + Call Performance.Stop(Segment, SegState, 0, 0) + + Call Performance.CloseDown + + Set DirectSound = Nothing + + Set Segment = Nothing + Set Performance = Nothing + Set Loader = Nothing + + inited = False +End Sub + +'' +'Initializes the clsAudio object. +' +' @param dX DirectX7 object to be used when creating the DirectSound and Directmusic objects. +' @param hWnd Handle to the window to be used by DirectMusic when playing midi files. +' @param sound_path Directory in wich to search for sound files. +' @param music_path Directory in wich to search for music files. +' +' @return True if no errors occured, false otherwise. + +Public Function Initialize(ByRef dX As DirectX7, ByVal hWnd As Long, ByVal sound_path As String, ByVal music_path As String) As Boolean +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +'Creates all DS and DM objects +'*************************************************** +On Error GoTo Errhandler + + ' Prevent multiple creations + If inited Then Exit Function + + 'Validate DX object + If dX Is Nothing Then GoTo Errhandler + + 'Initialize DirectSound + Set DirectSound = dX.DirectSoundCreate("") + + Call DirectSound.SetCooperativeLevel(hWnd, DSSCL_PRIORITY) + + 'Set sound path + SoundPath = sound_path + + 'Set default volume + SndVolume = 0 + + 'Initialize DirectMusic + Music = InitializedirectMusic(dX, hWnd) + + 'Set music path + MusicPath = music_path + + mActivated = True + sActivated = True + + CurrentMusicFile = vbNullString + + 'Set tempo to 0 and volume of music + MusicTempo = 0 + Call Performance.SetMasterVolume(200) + + inited = True + + Initialize = True +Exit Function + +Errhandler: +End Function + +'' +' Creates and configures all DirectMusic objects. +' +' @param dX DirectX7 object to be used when creating the DirectSound and Directmusic objects. +' @param hWnd Handle to the window to be used by DirectMusic when playing midi files. +' +' @return True if no errors occured, false otherwise. + +Private Function InitializedirectMusic(ByRef dX As DirectX7, ByVal hWnd As Long) As Boolean +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +'Initialize DM. Returns false if music isn't supported by HW +'*************************************************** +On Error GoTo Errhandler + Set Loader = DirectX.DirectMusicLoaderCreate() + + Set Performance = dX.DirectMusicPerformanceCreate() + Call Performance.Init(DirectSound, hWnd) + Call Performance.SetMasterAutoDownload(True) 'Enable auto download of instruments + + 'Set to port default, 1 channel group is enough for MIDIs + Call Performance.SetPort(-1, 1) + + InitializedirectMusic = True +Exit Function + +Errhandler: +End Function + +'' +' Plays a new WAVE file. +' +' @param FileName The path to the file to be loaded. Must be a relative path from the default path set at initialization. +' @param srcX The X position of the sound source, in map coordinates. -1 if sound should not be altered by 3D alterations. +' @param srcY The Y position of the sound source, in map coordinates. -1 if sound should not be altered by 3D alterations. +' @param LoopSound The loop state for the sound. +' +' @return The buffer index in which the sound is playing, or 0 in case of error. + +Public Function PlayWave(ByVal FileName As String, Optional ByVal srcX As Byte = 0, Optional ByVal srcY As Byte = 0, Optional ByVal LoopSound As LoopStyle = LoopStyle.Default) As Long +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 28/07/08 +'Last Modified by: Franco Zeoli (Noich) +'Added support for 3D sound effects. +'*************************************************** +On Error GoTo Errhandler + Dim bufferIndex As Long + + If Not SoundActivated Then Exit Function + + 'Get the buffer index were wave was loaded + bufferIndex = LoadWave(FileName, LoopSound) + If bufferIndex = 0 Then Exit Function 'If an error ocurred abort + + With DSBuffers(bufferIndex) + If .looping Then + .buffer.Play DSBPLAY_LOOPING + Else + .buffer.Play DSBPLAY_DEFAULT + End If + + 'Apply volume + Call .buffer.SetVolume(SndVolume) + + 'Store position + .X = srcX + .Y = srcY + + 'Get standard frequency + .normalFq = .buffer.GetFrequency() + End With + + PlayWave = bufferIndex + + If sEffectsActivated Then + If srcX <> 0 And srcY <> 0 Then + Call Update3DSound(bufferIndex, 0, 0) + End If + End If +Exit Function + +Errhandler: +End Function + +Private Sub ResetSoundValues() +'*************************************************** +'Author: Torres Patricio (Pato) +'Last Modification: 03/04/10 +'Reset the frequency, volume and pan. +'*************************************************** + Dim i As Long + + For i = 1 To NumSoundBuffers + If Not DSBuffers(i).buffer Is Nothing Then + With DSBuffers(i) + Call .buffer.SetFrequency(.normalFq) + Call .buffer.SetVolume(SndVolume) + Call .buffer.SetPan(0) + End With + End If + Next i +End Sub + +Private Sub Update3DSound(ByVal bufferIndex As Long, ByVal deltaX As Integer, ByVal deltaY As Integer) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 05/09/09 +'Last Modified by: Marco Vanotti (MarKoxX) +'Fixed Dopplers formula +'Refreshes the sound's arguments. +'Fixed the sndVolume formula +'*************************************************** + Dim linearDistanceOld As Single + Dim linearDistanceNew As Single + Dim deltaDistance As Single + Dim distanceXOld As Long + Dim distanceYOld As Long + Dim distanceXNew As Long + Dim distanceYNew As Long + Dim perceivedFq As Long + + With DSBuffers(bufferIndex) + distanceXOld = .X - lastPosX + distanceYOld = .Y - lastPosY + + distanceXNew = distanceXOld + deltaX + distanceYNew = distanceYOld + deltaY + + linearDistanceOld = Sqr(distanceXOld * distanceXOld + distanceYOld * distanceYOld) + linearDistanceNew = Sqr(distanceXNew * distanceXNew + distanceYNew * distanceYNew) + + deltaDistance = linearDistanceNew - linearDistanceOld + + 'Update frequency emulating Doppler effect + perceivedFq = .normalFq * (1 - deltaDistance / DELTA_FQ) + If perceivedFq < DSBFREQUENCY_MIN Then perceivedFq = DSBFREQUENCY_MIN + + Call .buffer.SetFrequency(perceivedFq) + + 'Set volumen amortiguation according to distance + If linearDistanceNew > MAX_DISTANCE_TO_SOURCE Then + Call .buffer.SetVolume(SndVolume + (DSBVOLUME_MIN - SndVolume)) + Else + Call .buffer.SetVolume(SndVolume + (linearDistanceNew / MAX_DISTANCE_TO_SOURCE) * (DSBVOLUME_MIN - SndVolume)) + End If + + 'Prevent division by zero + If linearDistanceNew = 0 Then linearDistanceNew = 1 + + 'Set panning according to relative position of the source to the listener + Call .buffer.SetPan((distanceXNew / linearDistanceNew) * DSBPAN_RIGHT) + End With +End Sub + +'' +' Updates 3D sounds based on the movement of the listener. +' +' @param x The new coordinate of the listener in the x axis (consider 0 as the furthest point to the left). +' @param y The new coordinate of the listener in the y axis (consider 0 as the furthest point to the front). +' +' @return The buffer index in which the sound is playing, or 0 in case of error. + +Public Sub MoveListener(ByVal X As Integer, ByVal Y As Integer) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 28/07/08 +'Last Modification by: Franco Zeoli (Noich) +'Moves the position of the listener updating all 3D sounds. +'*************************************************** + Dim i As Long + Dim deltaX As Integer + Dim deltaY As Integer + + If Not sEffectsActivated Then Exit Sub + + deltaX = X - lastPosX + deltaY = Y - lastPosY + + For i = 1 To NumSoundBuffers + If Not DSBuffers(i).buffer Is Nothing Then + If DSBuffers(i).buffer.GetStatus And DSBSTATUS_PLAYING Then + If DSBuffers(i).X <> 0 And DSBuffers(i).Y <> 0 Then + Call Update3DSound(i, deltaX, deltaY) + End If + End If + End If + Next i + + lastPosX = X + lastPosY = Y +End Sub + +'' +' Loads a new WAVE file. +' +' @param FileName The path to the file to be loaded. Must be a relative path from the default path set at initialization. +' @param looping The loop state for the sound. +' +' @return The buffer index in which the sound is playing, or 0 in case of error. + +Private Function LoadWave(ByVal FileName As String, ByVal looping As LoopStyle) As Long +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/28/09 +'Last Modification by: Marco Vanotti (MarKoxX) +'Loads a new wave into memory (if it's not already loaded) and returns +'the buffer index +'*************************************************** +On Error GoTo Errhandler + Dim bufferDesc As DSBUFFERDESC + Dim waveFormat As WAVEFORMATEX + Dim i As Long + + FileName = UCase$(FileName) + + If Not FileExist(SoundPath & FileName, vbArchive) Then _ + Exit Function + + 'Check if the buffer is in memory and not playing + For i = 1 To NumSoundBuffers + If DSBuffers(i).FileName = FileName Then + If DSBuffers(i).buffer.GetStatus = 0 Or DSBuffers(i).buffer.GetStatus() = DSBSTATUS_BUFFERLOST Then + 'Found it!!! We just play this one :) + LoadWave = i + + 'Set looping if needed + If looping <> LoopStyle.Default Then DSBuffers(i).looping = (looping = LoopStyle.Enabled) + + 'Reset default sound frecuency to avoid issues. + Call DSBuffers(i).buffer.SetFrequency(DSBuffers(i).normalFq) + + Exit Function + End If + End If + Next i + + 'Not in memory, search for an empty buffer + For i = 1 To NumSoundBuffers + If DSBuffers(i).buffer Is Nothing Then + Exit For + End If + Next i + + 'No empty buffers?? Search for one not being played and use that slot + If i > NumSoundBuffers Then + For i = 1 To NumSoundBuffers + If DSBuffers(i).buffer.GetStatus() = DSBSTATUS_BUFFERLOST Or DSBuffers(i).buffer.GetStatus() = 0 Then + Exit For + End If + Next i + End If + + 'Still no free buffers?? Get the first non-looping sound + If i > NumSoundBuffers Then + For i = 1 To NumSoundBuffers + If Not (DSBuffers(i).buffer.GetStatus() And DSBSTATUS_LOOPING) Then + Call DSBuffers(i).buffer.Stop + Exit For + End If + Next i + End If + + 'If every sound is looping, just ignore new sound unless it's looping too (in which case we set it at the first slot by default) + If i > NumSoundBuffers Then + If Not looping Then Exit Function + i = 1 + End If + + 'Create new sound + bufferDesc.lFlags = DSBCAPS_CTRLFREQUENCY Or DSBCAPS_CTRLPAN Or DSBCAPS_CTRLVOLUME Or DSBCAPS_STATIC + + waveFormat.nFormatTag = WAVE_FORMAT_PCM + waveFormat.nChannels = 2 + waveFormat.lSamplesPerSec = 22050 + waveFormat.nBitsPerSample = 16 + waveFormat.nBlockAlign = waveFormat.nBitsPerSample / 8 * waveFormat.nChannels + waveFormat.lAvgBytesPerSec = waveFormat.lSamplesPerSec * waveFormat.nBlockAlign + + With DSBuffers(i) + Set .buffer = Nothing 'Get rid of any previous data + + .FileName = FileName + .looping = (looping = LoopStyle.Enabled) + + Set .buffer = DirectSound.CreateSoundBufferFromFile(SoundPath & FileName, bufferDesc, waveFormat) + End With + + LoadWave = i +Exit Function + +Errhandler: +End Function + +'' +' Stops a given sound or all of them. +' +' @param bufferIndex The index of the sound file to stop playing. If 0, all sounds are stopped. + +Public Sub StopWave(Optional ByVal bufferIndex As Long = 0) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +'Stops the sound in the given buffer index, or every sound if +'index is 0 +'*************************************************** + If bufferIndex > 0 And bufferIndex <= NumSoundBuffers Then + If DSBuffers(bufferIndex).buffer.GetStatus() And DSBSTATUS_PLAYING Then + Call DSBuffers(bufferIndex).buffer.Stop + End If + ElseIf bufferIndex = 0 Then + Dim i As Long + For i = 1 To NumSoundBuffers + If Not DSBuffers(i).buffer Is Nothing Then + If DSBuffers(i).buffer.GetStatus() <> 0 And DSBuffers(i).buffer.GetStatus() <> DSBSTATUS_BUFFERLOST Then + Call DSBuffers(i).buffer.Stop + End If + End If + Next i + End If +End Sub + +'' +' Retrieves wether there are sounds currentyl playing or not. +' +' @return true if there is at least one sound playing, false otherwise. + +Public Property Get PlayingSound() As Boolean +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +'Returns true if there is at least one sound playing +'*************************************************** + Dim i As Long + + For i = 1 To NumSoundBuffers + If Not DSBuffers(i).buffer Is Nothing Then + If DSBuffers(i).buffer.GetStatus() And DSBSTATUS_PLAYING Then + PlayingSound = True + Exit Property + End If + End If + Next i +End Property + +'' +' Sets the volume of sound. +' +' @param Volume New value to be set, in percentage (0 to 100). + +Public Property Let SoundVolume(ByVal Volume As Byte) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +'Sets the sound's volume as a percentage +'*************************************************** + Dim i As Long + + If Volume > 100 Then Exit Property + + 'Take percentage to actual value + SndVolume = Volume * (DSBVOLUME_MAX - DSBVOLUME_MIN) / 100 + DSBVOLUME_MIN + + For i = 1 To NumSoundBuffers + If Not DSBuffers(i).buffer Is Nothing Then + If DSBuffers(i).buffer.GetStatus And DSBSTATUS_PLAYING Then + Call DSBuffers(i).buffer.SetVolume(SndVolume) + End If + End If + Next i +End Property + +'' +' Gets the volume of sound. +' +' @return The current sound volume in percentage. + +Public Property Get SoundVolume() As Byte +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +'Sets the music's volume as a percentage +'*************************************************** + SoundVolume = CByte((SndVolume - DSBVOLUME_MIN) * 100 / (DSBVOLUME_MAX - DSBVOLUME_MIN)) +End Property + +'' +' Plays a new MIDI file. +' +' @param file The path to the file to be loaded. Must be a relative path from the default path set at initialization. +' @param Loops Number of times to loop sound. For eternal loops set it to -1. +' +' @return True if file was properly loaded and started playing, False otherwise. + +Public Function PlayMIDI(Optional ByVal file As String = "", Optional ByVal Loops As Long = -1) As Boolean +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +'Loads a midi and start to play it +'*************************************************** +On Error GoTo Errhandler + If LenB(file) > 0 Then _ + CurrentMusicFile = file + + If Not MusicActivated Then Exit Function + + If Not Music Then Exit Function + + If PlayingMusic Then StopMidi + + If LenB(file) > 0 Then + If Not LoadMidi(file) Then Exit Function + Else + 'Make sure we have a loaded segment + If Segment Is Nothing Then Exit Function + End If + + MusicMP3Stop + + 'Play it + Call Segment.SetRepeats(Loops) + + Set SegState = Performance.PlaySegment(Segment, 0, 0) + + PlayMIDI = True +Exit Function + +Errhandler: +End Function + +'' +' Loads a new MIDI file. +' +' @param file The path to the file to be loaded. Must be a relative path from the default path set at initialization. +' +' @return True if file was properly loaded and started playing, False otherwise. + +Private Function LoadMidi(ByVal file As String) As Boolean +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +'Loads a midi to memory +'*************************************************** +On Error GoTo Errhandler + If Not FileExist(MusicPath & file, vbArchive) Then Exit Function + + Call StopMidi + + 'Destroy old object + Set Segment = Nothing + + Set Segment = Loader.LoadSegment(MusicPath & file) + + If Segment Is Nothing Then + Exit Function + End If + + Call Segment.SetStandardMidiFile + + LoadMidi = True +Exit Function + +Errhandler: +End Function + +'' +' Stops playing the currently loaded MIDI file. + +Public Sub StopMidi() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +'Stops playing a midi +'*************************************************** +On Error GoTo Errhandler + If PlayingMusic Then + Call Performance.Stop(Segment, SegState, 0, 0) + End If +Exit Sub + +Errhandler: +End Sub + +'' +' Sets the music's tempo. +' +' @param Tempo New Tempo value. Must be in the range of 0.25 to 2.0 + +Public Property Let MusicTempo(ByVal Tempo As Single) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +'Sets the music's tempo +'*************************************************** + If Not Music Then Exit Property + + If Tempo < 0.25 Or Tempo > 2# Then Exit Property + + Call Performance.SetMasterTempo(Tempo) +End Property + +'' +' Sets the music's volume. +' +' @param Volume Percentage to wich to set the music volume. + +Public Property Let MusicVolume(ByVal Volume As Long) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +'Sets the music's volume as a percentage +'*************************************************** + If Not Music Then Exit Property + + If Volume < 0 Or Volume > 100 Then Exit Property + + ' Volume ranges from -10000 to 10000 + Call Performance.SetMasterVolume(Volume * 200 - 10000) +End Property + +'' +' Gets the music's tempo. +' +' @return Current music'tempo. + +Public Property Get MusicTempo() As Single +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +'Returns the music's tempo +'*************************************************** + If Not Music Then Exit Property + + MusicTempo = Performance.GetMasterTempo() +End Property + +'' +' Gets the music's volume. +' +' @return Current music's volume as a percentage. + +Public Property Get MusicVolume() As Long +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +'Returns the music's volume as a percentage +'*************************************************** + If Not Music Then Exit Property + + MusicVolume = (Performance.GetMasterVolume() + 10000) / 200 +End Property + +'' +' Checks wether there is music currently playing. +' +' @return True if there is a MIDI playing, false otherwise. + +Public Property Get PlayingMusic() As Boolean +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +'Returns True if a midi is being played +'*************************************************** + If Not Music Or Segment Is Nothing Then Exit Property + + PlayingMusic = Performance.IsPlaying(Segment, SegState) +End Property + +'' +' Retrieves the music's length. +' +' @return Current music's length. + +Public Property Get MusicLenght() As Long +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 16/03/04 +'Returns the lenght of the current midi +'*************************************************** + If Not Music Then Exit Property + + MusicLenght = Segment.GetLength() +End Property + +'' +' Destroy the MP3 objects. +' +' @return True If the objects were destroy. + +Public Function MusicMP3Empty() As Boolean +'************************************** +'* Created by: Fredrik Alexandersson * +'* Modify Date: 20/5/2003 * +'************************************** + On Error GoTo ErrorHandl + + If ObjPtr(IMC) > 0 Then + Call MusicMP3Stop + End If + + Set IBA = Nothing + Set IME = Nothing + Set IMPos = Nothing + Set IMC = Nothing + + MusicMP3Empty = True + Exit Function + +ErrorHandl: + MusicMP3Empty = False + End +End Function + +'' +' Loads a new MP3 file. +' +' @param FilePath The path to the file to be loaded. +' @return True If file was properly loaded and started playing, False otherwise. + +Public Function MusicMP3Load(ByVal FilePath As String, Optional ByVal Volume As Long = 0, Optional ByVal Balance As Long = 0) As Boolean '**** Loads a MP3 ***** +'************************************** +'* Created by: Fredrik Alexandersson * +'* Modify Date: 20/5/2003 * +'************************************** + On Error GoTo ErrorHandl + + If Not FileExist(FilePath, vbArchive) Then Exit Function + + If Not MusicMP3Empty() = True Then GoTo ErrorHandl + + Set IMC = New FilgraphManager + Call IMC.RenderFile(FilePath) + + Set IBA = IMC + + If SoundVolume > 0 Then SoundVolume = 0 + If Volume < -4000 Then Volume = -4000 + + IBA.Volume = Volume + + If Balance > 5000 Then Balance = 5000 + If Balance < -5000 Then Balance = -5000 + + IBA.Balance = Balance + + Set IME = IMC + + Set IMPos = IMC + If ObjPtr(IMPos) Then IMPos.Rate = 1# + IMPos.CurrentPosition = 0 + + MusicMP3Load = True + Exit Function + +ErrorHandl: + MusicMP3Load = False +End Function + +'' +' Plays a new MP3 file. +' +' @param FilePath The path to the file to be loaded. If the path is null then play the loaded MP3. +' +' @return True If file was properly loaded and started playing, False otherwise. + +Public Function MusicMP3Play(Optional ByVal FilePath As String = "") As Boolean +'************************************** +'* Created by: Fredrik Alexandersson * +'* Modify Date: 20/5/2003 * +'************************************** + On Error GoTo ErrorHandl + + If Not MusicActivated Then Exit Function + + If Not Music Then Exit Function + + If LenB(FilePath) > 0 Then + If Not MusicMP3Load(FilePath) Then Exit Function + Else + If IMC Is Nothing Then Exit Function + End If + + StopMidi + Call IMC.Run + + MusicMP3Play = True + Exit Function + +ErrorHandl: + MusicMP3Play = False +End Function + +'' +' Check if the song need looping. + +Public Sub MusicMP3GetLoop() + On Error GoTo ErrorHandl + + If IMPos.StopTime = IMPos.CurrentPosition Then + MusicMP3Stop + MusicMP3Play + End If +ErrorHandl: +End Sub + +'' +' Stop a the current MP3 file. +' +' @return True If file was properly stop, False otherwise. + +Public Function MusicMP3Stop() As Boolean +'************************************** +'* Created by: Fredrik Alexandersson * +'* Modify Date: 20/5/2003 * +'************************************** + On Error GoTo ErrorHandl + + IMC.Stop + IMPos.CurrentPosition = 0 + + MusicMP3Stop = True + Exit Function + +ErrorHandl: + MusicMP3Stop = False +End Function + +'' +' Pause a the current MP3 file. +' +' @return True If file was properly pause, False otherwise. + +Public Function MusicMP3Pause() As Boolean +'*************************************************** +' Created by: Juan Martín Sotuyo Dodero +' Modify Date: 25/6/2004 +'*************************************************** + On Error GoTo ErrorHandl + + Call IMC.Pause + + MusicMP3Pause = True + Exit Function + +ErrorHandl: + MusicMP3Pause = False +End Function + +'' +' Set the volume to the current MP3. +' +' @param SoundVolume The new volume to the current MP3. +' @return True If the volume was properly change, False otherwise. + +Public Function MusicMP3VolumeSet(ByVal SoundVolume As Long) As Boolean +'************************************** +'* Created by: Fredrik Alexandersson * +'* Modify Date: 20/5/2003 * +'************************************** + On Error GoTo ErrorHandl + + If SoundVolume > 0 Then SoundVolume = 0 + If SoundVolume < -4000 Then SoundVolume = -4000 + + IBA.Volume = SoundVolume + + MusicMP3VolumeSet = True + Exit Function + +ErrorHandl: + MusicMP3VolumeSet = False +End Function + +'' +' Retrieves wether music is activated or not. +' +' @return True if music is activated, false otherwise. + +Public Property Get MusicActivated() As Boolean +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 03/03/07 +'Retrieves wether the music is activated or not +'*************************************************** + MusicActivated = mActivated +End Property + +'' +' Sets wether music is activated or not. +' +' @param nValue True if music should be activated, false otherwise. + +Public Property Let MusicActivated(ByVal nValue As Boolean) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 03/03/07 +'Sets wether the music is activated or not +'*************************************************** + If mActivated = nValue Then Exit Property + + mActivated = nValue + + If nValue Then + Call PlayMIDI(CurrentMusicFile) + Else + Call StopMidi + End If +End Property + +'' +' Retrieves wether sound is activated or not. +' +' @return True if sound is activated, false otherwise. + +Public Property Get SoundActivated() As Boolean +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 03/03/07 +'Retrieves wether the sound is activated or not +'*************************************************** + SoundActivated = sActivated +End Property + +'' +' Sets wether sound is activated or not. +' +' @param nValue True if sound should be activated, false otherwise. + +Public Property Let SoundActivated(ByVal nValue As Boolean) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 03/03/07 +'Sets wether the sound is activated or not +'*************************************************** + If sActivated = nValue Then Exit Property + + sActivated = nValue + + If Not nValue Then + Call StopWave + End If +End Property + +'' +' Sets wether sound effects are activated or not. +' +' @param nValue True if sound effects should be activated, false otherwise. + +Public Property Let SoundEffectsActivated(ByVal nValue As Boolean) +'*************************************************** +'Author: Franco Zeoli (Noich) +'Last Modification: 03/04/10 +'Sets wether the sound effects are activated or not +'03/04/10 - Pato: If sound effects are disable, then reset the frequency, volume and pan. +'*************************************************** + sEffectsActivated = nValue + + If Not nValue Then + Call ResetSoundValues + End If +End Property + +'' +' Retrieves wether sound effects are activated or not. +' +' @return True if sound effects are activated, false otherwise. + +Public Property Get SoundEffectsActivated() As Boolean +'*************************************************** +'Author: Franco Zeoli (Noich) +'Last Modification: 28/07/08 +'Retrieves wether the sound effects are activated or not +'*************************************************** + SoundEffectsActivated = sEffectsActivated +End Property diff --git a/CODIGO/clsByteQueue.cls b/CODIGO/clsByteQueue.cls new file mode 100644 index 0000000..a9d10f3 --- /dev/null +++ b/CODIGO/clsByteQueue.cls @@ -0,0 +1,1234 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "clsByteQueue" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +'************************************************************** +' clsByteQueue.cls - FIFO list of bytes. +' Creates and manipulates byte arrays to be sent and received by both client and server +' +' Designed and implemented by Juan Martín Sotuyo Dodero (Maraxus) +' (juansotuyo@gmail.com) +'************************************************************** + +'************************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +'************************************************************************** + +'' +' FIFO list of bytes +' Used to create and manipulate the byte arrays to be sent and received by both client and server +' +' @author Juan Martín Sotuyo Dodero (Maraxus) juansotuyo@gmail.com +' @version 1.1.0 +' @date 20060427 + +'************************************************************************** +' - HISTORY +' v1.0.0 - Initial release ( 2006/04/27 - Juan Martín Sotuyo Dodero ) +' v1.1.0 - Added Single and Double support ( 2007/10/28 - Juan Martín Sotuyo Dodero ) +'************************************************************************** + +Option Explicit +Option Base 0 'It's the default, but we make it explicit just in case... + +'' +' The error number thrown when there is not enough data in +' the buffer to read the specified data type. +' It's 9 (subscript out of range) + the object error constant +Private Const NOT_ENOUGH_DATA As Long = vbObjectError + 9 + +'' +' The error number thrown when there is not enough space in +' the buffer to write. +Private Const NOT_ENOUGH_SPACE As Long = vbObjectError + 10 + + +'' +' Default size of a data buffer (10 Kbs) +' +' @see Class_Initialize +Private Const DATA_BUFFER As Long = 10240 + +'' +' The byte data +Dim data() As Byte + +'' +' How big the data array is +Dim queueCapacity As Long + +'' +' How far into the data array have we written +Dim queueLength As Long + +'' +' CopyMemory is the fastest way to copy memory blocks, so we abuse of it +' +' @param destination Where the data will be copied. +' @param source The data to be copied. +' @param length Number of bytes to be copied. + +Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef destination As Any, ByRef source As Any, ByVal length As Long) + +'' +' Initializes the queue with the default queueCapacity +' +' @see DATA_BUFFER + +Private Sub Class_Initialize() +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Initializes the queue with the default queueCapacity +'*************************************************** + ReDim data(DATA_BUFFER - 1) As Byte + + queueCapacity = DATA_BUFFER +End Sub + +'' +' Clean up and release resources + +Private Sub Class_Terminate() +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Clean up +'*************************************************** + Erase data +End Sub + +'' +' Copies another ByteQueue's data into this object. +' +' @param source The ByteQueue whose buffer will eb copied. +' @remarks This method will resize the ByteQueue's buffer to match +' the source. All previous data on this object will be lost. + +Public Sub CopyBuffer(ByRef source As clsByteQueue) +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'A Visual Basic equivalent of a Copy Contructor +'*************************************************** + If source.length = 0 Then + 'Clear the list and exit + Call RemoveData(length) + Exit Sub + End If + + ' Set capacity and resize array - make sure all data is lost + queueCapacity = source.Capacity + + ReDim data(queueCapacity - 1) As Byte + + ' Read buffer + Dim buf() As Byte + ReDim buf(source.length - 1) As Byte + + Call source.PeekBlock(buf, source.length) + + queueLength = 0 + + ' Write buffer + Call WriteBlock(buf, source.length) +End Sub + +'' +' Returns the smaller of val1 and val2 +' +' @param val1 First value to compare +' @param val2 Second Value to compare +' @return The smaller of val1 and val2 +' @remarks This method is faster than Iif() and cleaner, therefore it's used instead of it + +Private Function min(ByVal val1 As Long, ByVal val2 As Long) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'It's faster than iif and I like it better +'*************************************************** + If val1 < val2 Then + min = val1 + Else + min = val2 + End If +End Function + +'' +' Writes a byte array at the end of the byte queue if there is enough space. +' Otherwise it throws NOT_ENOUGH_DATA. +' +' @param buf Byte array containing the data to be copied. MUST have 0 as the first index. +' @param datalength Total number of elements in the array +' @return The actual number of bytes copied +' @remarks buf MUST be Base 0 +' @see RemoveData +' @see ReadData +' @see NOT_ENOUGH_DATA + +Private Function WriteData(ByRef buf() As Byte, ByVal dataLength As Long) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'If the queueCapacity allows it copyes a byte buffer to the queue, if not it throws NOT_ENOUGH_DATA +'*************************************************** + 'Check if there is enough free space + If queueCapacity - queueLength - dataLength < 0 Then + Call Err.Raise(NOT_ENOUGH_SPACE) + Exit Function + End If + + 'Copy data from buffer + Call CopyMemory(data(queueLength), buf(0), dataLength) + + 'Update length of data + queueLength = queueLength + dataLength + WriteData = dataLength +End Function + +'' +' Reads a byte array from the beginning of the byte queue if there is enough data available. +' Otherwise it throws NOT_ENOUGH_DATA. +' +' @param buf Byte array where to copy the data. MUST have 0 as the first index and already be sized properly. +' @param datalength Total number of elements in the array +' @return The actual number of bytes copied +' @remarks buf MUST be Base 0 and be already resized to be able to contain the requested bytes. +' This method performs no checks of such things as being a private method it's supposed that the consistency of the module is to be kept. +' If there is not enough data available it will read all available data. +' @see WriteData +' @see RemoveData +' @see NOT_ENOUGH_DATA + +Private Function ReadData(ByRef buf() As Byte, ByVal dataLength As Long) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'If enough memory is available, it copies the requested number of bytes to the buffer +'*************************************************** + 'Check if we can read the number of bytes requested + If dataLength > queueLength Then + Call Err.Raise(NOT_ENOUGH_DATA) + Exit Function + End If + + 'Copy data to buffer + Call CopyMemory(buf(0), data(0), dataLength) + ReadData = dataLength +End Function + +'' +' Removes a given number of bytes from the beginning of the byte queue. +' If there is less data available than the requested amount it removes all data. +' +' @param datalength Total number of bytes to remove +' @return The actual number of bytes removed +' @see WriteData +' @see ReadData + +Private Function RemoveData(ByVal dataLength As Long) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Moves forward the queue overwriting the first dataLength bytes +'*************************************************** + 'Figure out how many bytes we can remove + RemoveData = min(dataLength, queueLength) + + 'Remove data - prevent rt9 when cleaning a full queue + If RemoveData <> queueCapacity Then _ + Call CopyMemory(data(0), data(RemoveData), queueLength - RemoveData) + + 'Update length + queueLength = queueLength - RemoveData +End Function + +'' +' Writes a single byte at the end of the queue +' +' @param value The value to be written +' @return The number of bytes written +' @see PeekByte +' @see ReadByte + +Public Function WriteByte(ByVal value As Byte) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Writes a byte to the queue +'*************************************************** + Dim buf(0) As Byte + + buf(0) = value + + WriteByte = WriteData(buf, 1) +End Function + +'' +' Writes an integer at the end of the queue +' +' @param value The value to be written +' @return The number of bytes written +' @see PeekInteger +' @see ReadInteger + +Public Function WriteInteger(ByVal value As Integer) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Writes an integer to the queue +'*************************************************** + Dim buf(1) As Byte + + 'Copy data to temp buffer + Call CopyMemory(buf(0), value, 2) + + WriteInteger = WriteData(buf, 2) +End Function + +'' +' Writes a long at the end of the queue +' +' @param value The value to be written +' @return The number of bytes written +' @see PeekLong +' @see ReadLong + +Public Function WriteLong(ByVal value As Long) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Writes a long to the queue +'*************************************************** + Dim buf(3) As Byte + + 'Copy data to temp buffer + Call CopyMemory(buf(0), value, 4) + + WriteLong = WriteData(buf, 4) +End Function + +'' +' Writes a single at the end of the queue +' +' @param value The value to be written +' @return The number of bytes written +' @see PeekSingle +' @see ReadSingle + +Public Function WriteSingle(ByVal value As Single) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 10/28/07 +'Writes a single to the queue +'*************************************************** + Dim buf(3) As Byte + + 'Copy data to temp buffer + Call CopyMemory(buf(0), value, 4) + + WriteSingle = WriteData(buf, 4) +End Function + +'' +' Writes a double at the end of the queue +' +' @param value The value to be written +' @return The number of bytes written +' @see PeekDouble +' @see ReadDouble + +Public Function WriteDouble(ByVal value As Double) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 10/28/07 +'Writes a double to the queue +'*************************************************** + Dim buf(7) As Byte + + 'Copy data to temp buffer + Call CopyMemory(buf(0), value, 8) + + WriteDouble = WriteData(buf, 8) +End Function + +'' +' Writes a boolean value at the end of the queue +' +' @param value The value to be written +' @return The number of bytes written +' @see PeekBoolean +' @see ReadBoolean + +Public Function WriteBoolean(ByVal value As Boolean) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Writes a byte to the queue +'*************************************************** + Dim buf(0) As Byte + + If value Then buf(0) = 1 + + WriteBoolean = WriteData(buf, 1) +End Function + +'' +' Writes a fixed length ASCII string at the end of the queue +' +' @param value The string to be written +' @return The number of bytes written +' @see PeekASCIIStringFixed +' @see ReadASCIIStringFixed + +Public Function WriteASCIIStringFixed(ByVal value As String) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Writes a fixed length ASCII string to the queue +'*************************************************** + Dim buf() As Byte + ReDim buf(Len(value) - 1) As Byte + + 'Copy data to temp buffer + Call CopyMemory(buf(0), ByVal StrPtr(StrConv(value, vbFromUnicode)), Len(value)) + + WriteASCIIStringFixed = WriteData(buf, Len(value)) +End Function + +'' +' Writes a fixed length unicode string at the end of the queue +' +' @param value The string to be written +' @return The number of bytes written +' @see PeekUnicodeStringFixed +' @see ReadUnicodeStringFixed + +Public Function WriteUnicodeStringFixed(ByVal value As String) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Writes a fixed length UNICODE string to the queue +'*************************************************** + Dim buf() As Byte + ReDim buf(LenB(value)) As Byte + + 'Copy data to temp buffer + Call CopyMemory(buf(0), ByVal StrPtr(value), LenB(value)) + + WriteUnicodeStringFixed = WriteData(buf, LenB(value)) +End Function + +'' +' Writes a variable length ASCII string at the end of the queue +' +' @param value The string to be written +' @return The number of bytes written +' @see PeekASCIIString +' @see ReadASCIIString + +Public Function WriteASCIIString(ByVal value As String) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Writes a variable length ASCII string to the queue +'*************************************************** + Dim buf() As Byte + ReDim buf(Len(value) + 1) As Byte + + 'Copy length to temp buffer + Call CopyMemory(buf(0), CInt(Len(value)), 2) + + If Len(value) > 0 Then + 'Copy data to temp buffer + Call CopyMemory(buf(2), ByVal StrPtr(StrConv(value, vbFromUnicode)), Len(value)) + End If + + WriteASCIIString = WriteData(buf, Len(value) + 2) +End Function + +'' +' Writes a variable length unicode string at the end of the queue +' +' @param value The string to be written +' @return The number of bytes written +' @see PeekUnicodeString +' @see ReadUnicodeString + +Public Function WriteUnicodeString(ByVal value As String) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Writes a variable length UNICODE string to the queue +'*************************************************** + Dim buf() As Byte + ReDim buf(LenB(value) + 1) As Byte + + 'Copy length to temp buffer + Call CopyMemory(buf(0), CInt(Len(value)), 2) + + If Len(value) > 0 Then + 'Copy data to temp buffer + Call CopyMemory(buf(2), ByVal StrPtr(value), LenB(value)) + End If + + WriteUnicodeString = WriteData(buf, LenB(value) + 2) +End Function + +'' +' Writes a byte array at the end of the queue +' +' @param value The byte array to be written. MUST be Base 0. +' @param length The number of elements to copy from the byte array. If less than 0 it will copy the whole array. +' @return The number of bytes written +' @remarks value() MUST be Base 0. +' @see PeekBlock +' @see ReadBlock + +Public Function WriteBlock(ByRef value() As Byte, Optional ByVal length As Long = -1) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Writes a byte array to the queue +'*************************************************** + 'Prevent from copying memory outside the array + If length > UBound(value()) + 1 Or length < 0 Then length = UBound(value()) + 1 + + WriteBlock = WriteData(value, length) +End Function + +'' +' Reads a single byte from the begining of the queue and removes it +' +' @return The read value +' @remarks Read methods removes the data from the queue. +' Data removed can't be recovered by the queue in any way +' @see PeekByte +' @see WriteByte + +Public Function ReadByte() As Byte +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a byte from the queue and removes it +'*************************************************** + Dim buf(0) As Byte + + 'Read the data and remove it + Call RemoveData(ReadData(buf, 1)) + + ReadByte = buf(0) +End Function + +'' +' Reads an integer from the begining of the queue and removes it +' +' @return The read value +' @remarks Read methods removes the data from the queue. +' Data removed can't be recovered by the queue in any way +' @see PeekInteger +' @see WriteInteger + +Public Function ReadInteger() As Integer +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads an integer from the queue and removes it +'*************************************************** + Dim buf(1) As Byte + + 'Read the data and remove it + Call RemoveData(ReadData(buf, 2)) + + 'Copy data to temp buffer + Call CopyMemory(ReadInteger, buf(0), 2) +End Function + +'' +' Reads a long from the begining of the queue and removes it +' +' @return The read value +' @remarks Read methods removes the data from the queue. +' Data removed can't be recovered by the queue in any way +' @see PeekLong +' @see WriteLong + +Public Function ReadLong() As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a long from the queue and removes it +'*************************************************** + Dim buf(3) As Byte + + 'Read the data and remove it + Call RemoveData(ReadData(buf, 4)) + + 'Copy data to temp buffer + Call CopyMemory(ReadLong, buf(0), 4) +End Function + +'' +' Reads a single from the begining of the queue and removes it +' +' @return The read value +' @remarks Read methods removes the data from the queue. +' Data removed can't be recovered by the queue in any way +' @see PeekSingle +' @see WriteSingle + +Public Function ReadSingle() As Single +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 10/28/07 +'Reads a single from the queue and removes it +'*************************************************** + Dim buf(3) As Byte + + 'Read the data and remove it + Call RemoveData(ReadData(buf, 4)) + + 'Copy data to temp buffer + Call CopyMemory(ReadSingle, buf(0), 4) +End Function + +'' +' Reads a double from the begining of the queue and removes it +' +' @return The read value +' @remarks Read methods removes the data from the queue. +' Data removed can't be recovered by the queue in any way +' @see PeekDouble +' @see WriteDouble + +Public Function ReadDouble() As Double +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 10/28/07 +'Reads a double from the queue and removes it +'*************************************************** + Dim buf(7) As Byte + + 'Read the data and remove it + Call RemoveData(ReadData(buf, 8)) + + 'Copy data to temp buffer + Call CopyMemory(ReadDouble, buf(0), 8) +End Function + +'' +' Reads a Boolean from the begining of the queue and removes it +' +' @return The read value +' @remarks Read methods removes the data from the queue. +' Data removed can't be recovered by the queue in any way +' @see PeekBoolean +' @see WriteBoolean + +Public Function ReadBoolean() As Boolean +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a Boolean from the queue and removes it +'*************************************************** + Dim buf(0) As Byte + + 'Read the data and remove it + Call RemoveData(ReadData(buf, 1)) + + If buf(0) = 1 Then ReadBoolean = True +End Function + +'' +' Reads a fixed length ASCII string from the begining of the queue and removes it +' +' @param length The length of the string to be read +' @return The read string +' @remarks Read methods removes the data from the queue. +' Data removed can't be recovered by the queue in any way +' If there is not enough data to read the complete string then nothing is removed and an empty string is returned +' @see PeekASCIIStringFixed +' @see WriteUnicodeStringFixed + +Public Function ReadASCIIStringFixed(ByVal length As Long) As String +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a fixed length ASCII string from the queue and removes it +'*************************************************** + If length <= 0 Then Exit Function + + If queueLength >= length Then + Dim buf() As Byte + ReDim buf(length - 1) As Byte + + 'Read the data and remove it + Call RemoveData(ReadData(buf, length)) + + ReadASCIIStringFixed = StrConv(buf, vbUnicode) + Else + Call Err.Raise(NOT_ENOUGH_DATA) + End If +End Function + +'' +' Reads a fixed length unicode string from the begining of the queue and removes it +' +' @param length The length of the string to be read. +' @return The read string if enough data is available, an empty string otherwise. +' @remarks Read methods removes the data from the queue. +' Data removed can't be recovered by the queue in any way. +' If there is not enough data to read the complete string then nothing is removed and an empty string is returned +' @see PeekUnicodeStringFixed +' @see WriteUnicodeStringFixed + +Public Function ReadUnicodeStringFixed(ByVal length As Long) As String +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a fixed length UNICODE string from the queue and removes it +'*************************************************** + If length <= 0 Then Exit Function + + If queueLength >= length * 2 Then + Dim buf() As Byte + ReDim buf(length * 2 - 1) As Byte + + 'Read the data and remove it + Call RemoveData(ReadData(buf, length * 2)) + + ReadUnicodeStringFixed = buf + Else + Call Err.Raise(NOT_ENOUGH_DATA) + End If +End Function + +'' +' Reads a variable length ASCII string from the begining of the queue and removes it +' +' @return The read string +' @remarks Read methods removes the data from the queue. +' Data removed can't be recovered by the queue in any way +' If there is not enough data to read the complete string then nothing is removed and an empty string is returned +' @see PeekASCIIString +' @see WriteASCIIString + +Public Function ReadASCIIString() As String +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a variable length ASCII string from the queue and removes it +'*************************************************** + Dim buf(1) As Byte + Dim length As Integer + + 'Make sure we can read a valid length + If queueLength > 1 Then + 'Read the length + Call ReadData(buf, 2) + Call CopyMemory(length, buf(0), 2) + + 'Make sure there are enough bytes + If queueLength >= length + 2 Then + 'Remove the length + Call RemoveData(2) + + If length > 0 Then + Dim buf2() As Byte + ReDim buf2(length - 1) As Byte + + + 'Read the data and remove it + Call RemoveData(ReadData(buf2, length)) + + ReadASCIIString = StrConv(buf2, vbUnicode) + End If + Else + Call Err.Raise(NOT_ENOUGH_DATA) + End If + Else + Call Err.Raise(NOT_ENOUGH_DATA) + End If +End Function + +'' +' Reads a variable length unicode string from the begining of the queue and removes it +' +' @return The read string if enough data is available, an empty string otherwise. +' @remarks Read methods removes the data from the queue. +' Data removed can't be recovered by the queue in any way +' If there is not enough data to read the complete string then nothing is removed and an empty string is returned +' @see PeekUnicodeString +' @see WriteUnicodeString + +Public Function ReadUnicodeString() As String +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a variable length UNICODE string from the queue and removes it +'*************************************************** + Dim buf(1) As Byte + Dim length As Integer + + 'Make sure we can read a valid length + If queueLength > 1 Then + 'Read the length + Call ReadData(buf, 2) + Call CopyMemory(length, buf(0), 2) + + 'Make sure there are enough bytes + If queueLength >= length * 2 + 2 Then + 'Remove the length + Call RemoveData(2) + + Dim buf2() As Byte + ReDim buf2(length * 2 - 1) As Byte + + 'Read the data and remove it + Call RemoveData(ReadData(buf2, length * 2)) + + ReadUnicodeString = buf2 + Else + Call Err.Raise(NOT_ENOUGH_DATA) + End If + Else + Call Err.Raise(NOT_ENOUGH_DATA) + End If +End Function + +'' +' Reads a byte array from the begining of the queue and removes it +' +' @param block Byte array which will contain the read data. MUST be Base 0 and previously resized to contain the requested amount of bytes. +' @param dataLength Number of bytes to retrieve from the queue. +' @return The number of read bytes. +' @remarks The block() array MUST be Base 0 and previously resized to be able to contain the requested bytes. +' Read methods removes the data from the queue. +' Data removed can't be recovered by the queue in any way +' @see PeekBlock +' @see WriteBlock + +Public Function ReadBlock(ByRef block() As Byte, ByVal dataLength As Long) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a byte array from the queue and removes it +'*************************************************** + 'Read the data and remove it + If dataLength > 0 Then _ + ReadBlock = RemoveData(ReadData(block(), dataLength)) +End Function + +'' +' Reads a single byte from the begining of the queue but DOES NOT remove it. +' +' @return The read value. +' @remarks Peek methods, unlike Read methods, don't remove the data from the queue. +' @see ReadByte +' @see WriteByte + +Public Function PeekByte() As Byte +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a byte from the queue but doesn't removes it +'*************************************************** + Dim buf(0) As Byte + + 'Read the data and remove it + Call ReadData(buf, 1) + + PeekByte = buf(0) +End Function + +'' +' Reads an integer from the begining of the queue but DOES NOT remove it. +' +' @return The read value. +' @remarks Peek methods, unlike Read methods, don't remove the data from the queue. +' @see ReadInteger +' @see WriteInteger + +Public Function PeekInteger() As Integer +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads an integer from the queue but doesn't removes it +'*************************************************** + Dim buf(1) As Byte + + 'Read the data and remove it + Call ReadData(buf, 2) + + 'Copy data to temp buffer + Call CopyMemory(PeekInteger, buf(0), 2) +End Function + +'' +' Reads a long from the begining of the queue but DOES NOT remove it. +' +' @return The read value. +' @remarks Peek methods, unlike Read methods, don't remove the data from the queue. +' @see ReadLong +' @see WriteLong + +Public Function PeekLong() As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a long from the queue but doesn't removes it +'*************************************************** + Dim buf(3) As Byte + + 'Read the data and remove it + Call ReadData(buf, 4) + + 'Copy data to temp buffer + Call CopyMemory(PeekLong, buf(0), 4) +End Function + +'' +' Reads a single from the begining of the queue but DOES NOT remove it. +' +' @return The read value. +' @remarks Peek methods, unlike Read methods, don't remove the data from the queue. +' @see ReadSingle +' @see WriteSingle + +Public Function PeekSingle() As Single +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 10/28/07 +'Reads a single from the queue but doesn't removes it +'*************************************************** + Dim buf(3) As Byte + + 'Read the data and remove it + Call ReadData(buf, 4) + + 'Copy data to temp buffer + Call CopyMemory(PeekSingle, buf(0), 4) +End Function + +'' +' Reads a double from the begining of the queue but DOES NOT remove it. +' +' @return The read value. +' @remarks Peek methods, unlike Read methods, don't remove the data from the queue. +' @see ReadDouble +' @see WriteDouble + +Public Function PeekDouble() As Double +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 10/28/07 +'Reads a double from the queue but doesn't removes it +'*************************************************** + Dim buf(7) As Byte + + 'Read the data and remove it + Call ReadData(buf, 8) + + 'Copy data to temp buffer + Call CopyMemory(PeekDouble, buf(0), 8) +End Function + +'' +' Reads a Bollean from the begining of the queue but DOES NOT remove it. +' +' @return The read value. +' @remarks Peek methods, unlike Read methods, don't remove the data from the queue. +' @see ReadBoolean +' @see WriteBoolean + +Public Function PeekBoolean() As Boolean +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a Boolean from the queue but doesn't removes it +'*************************************************** + Dim buf(0) As Byte + + 'Read the data and remove it + Call ReadData(buf, 1) + + If buf(0) = 1 Then PeekBoolean = True +End Function + +'' +' Reads a fixed length ASCII string from the begining of the queue but DOES NOT remove it. +' +' @param length The length of the string to be read +' @return The read string if enough data is available, an empty string otherwise. +' @remarks Peek methods, unlike Read methods, don't remove the data from the queue. +' If there is not enough data to read the complete string then an empty string is returned +' @see ReadASCIIStringFixed +' @see WriteASCIIStringFixed + +Public Function PeekASCIIStringFixed(ByVal length As Long) As String +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a fixed length ASCII string from the queue but doesn't removes it +'*************************************************** + If length <= 0 Then Exit Function + + If queueLength >= length Then + Dim buf() As Byte + ReDim buf(length - 1) As Byte + + 'Read the data and remove it + Call ReadData(buf, length) + + PeekASCIIStringFixed = StrConv(buf, vbUnicode) + Else + Call Err.Raise(NOT_ENOUGH_DATA) + End If +End Function + +'' +' Reads a fixed length unicode string from the begining of the queue but DOES NOT remove it. +' +' @param length The length of the string to be read +' @return The read string if enough data is available, an empty string otherwise. +' @remarks Peek methods, unlike Read methods, don't remove the data from the queue. +' If there is not enough data to read the complete string then an empty string is returned +' @see ReadUnicodeStringFixed +' @see WriteUnicodeStringFixed + +Public Function PeekUnicodeStringFixed(ByVal length As Long) As String +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a fixed length UNICODE string from the queue but doesn't removes it +'*************************************************** + If length <= 0 Then Exit Function + + If queueLength >= length * 2 Then + Dim buf() As Byte + ReDim buf(length * 2 - 1) As Byte + + 'Read the data and remove it + Call ReadData(buf, length * 2) + + PeekUnicodeStringFixed = buf + Else + Call Err.Raise(NOT_ENOUGH_DATA) + End If +End Function + +'' +' Reads a variable length ASCII string from the begining of the queue but DOES NOT remove it. +' +' @return The read string if enough data is available, an empty string otherwise. +' @remarks Peek methods, unlike Read methods, don't remove the data from the queue. +' If there is not enough data to read the complete string then an empty string is returned +' @see ReadASCIIString +' @see WriteASCIIString + +Public Function PeekASCIIString() As String +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a variable length ASCII string from the queue but doesn't removes it +'*************************************************** + Dim buf(1) As Byte + Dim length As Integer + + 'Make sure we can read a valid length + If queueLength > 1 Then + 'Read the length + Call ReadData(buf, 2) + Call CopyMemory(length, buf(0), 2) + + 'Make sure there are enough bytes + If queueLength >= length + 2 Then + Dim buf2() As Byte + ReDim buf2(length + 1) As Byte + + 'Read the data (we have to read the length again) + Call ReadData(buf2, length + 2) + + If length > 0 Then + 'Get rid of the length + Dim buf3() As Byte + ReDim buf3(length - 1) As Byte + Call CopyMemory(buf3(0), buf2(2), length) + + PeekASCIIString = StrConv(buf3, vbUnicode) + End If + Else + Call Err.Raise(NOT_ENOUGH_DATA) + End If + Else + Call Err.Raise(NOT_ENOUGH_DATA) + End If +End Function + +'' +' Reads a variable length unicode string from the begining of the queue but DOES NOT remove it. +' +' @return The read string if enough data is available, an empty string otherwise. +' @remarks Peek methods, unlike Read methods, don't remove the data from the queue. +' If there is not enough data to read the complete string then an empty string is returned +' @see ReadUnicodeString +' @see WriteUnicodeString + +Public Function PeekUnicodeString() As String +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a variable length UNICODE string from the queue but doesn't removes it +'*************************************************** + Dim buf(1) As Byte + Dim length As Integer + + 'Make sure we can read a valid length + If queueLength > 1 Then + 'Read the length + Call ReadData(buf, 2) + Call CopyMemory(length, buf(0), 2) + + 'Make sure there are enough bytes + If queueLength >= length * 2 + 2 Then + Dim buf2() As Byte + ReDim buf2(length * 2 + 1) As Byte + + 'Read the data (we need to read the length again) + Call ReadData(buf2, length * 2 + 2) + + 'Get rid of the length bytes + Dim buf3() As Byte + ReDim buf3(length * 2 - 1) As Byte + Call CopyMemory(buf3(0), buf2(2), length * 2) + + PeekUnicodeString = buf3 + Else + Call Err.Raise(NOT_ENOUGH_DATA) + End If + Else + Call Err.Raise(NOT_ENOUGH_DATA) + End If +End Function + +'' +' Reads a byte array from the begining of the queue but DOES NOT remove it. +' +' @param block() Byte array that will contain the read data. MUST be Base 0 and previously resized to contain the requested amount of bytes. +' @param dataLength Number of bytes to be read +' @return The actual number of read bytes. +' @remarks Peek methods, unlike Read methods, don't remove the data from the queue. +' @see ReadBlock +' @see WriteBlock + +Public Function PeekBlock(ByRef block() As Byte, ByVal dataLength As Long) As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Reads a byte array from the queue but doesn't removes it +'*************************************************** + 'Read the data + If dataLength > 0 Then _ + PeekBlock = ReadData(block(), dataLength) +End Function + +'' +' Retrieves the current capacity of the queue. +' +' @return The current capacity of the queue. + +Public Property Get Capacity() As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Retrieves the current capacity of the queue +'*************************************************** + Capacity = queueCapacity +End Property + +'' +' Sets the capacity of the queue. +' +' @param value The new capacity of the queue. +' @remarks If the new capacity is smaller than the current Length, all exceeding data is lost. +' @see Length + +Public Property Let Capacity(ByVal value As Long) +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Sets the current capacity of the queue. +'All data in the queue exceeding the new capacity is lost +'*************************************************** + 'Upate capacity + queueCapacity = value + + 'All extra data is lost + If length > value Then queueLength = value + + 'Resize the queue + ReDim Preserve data(queueCapacity - 1) As Byte +End Property + +'' +' Retrieves the length of the total data in the queue. +' +' @return The length of the total data in the queue. + +Public Property Get length() As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Retrieves the current number of bytes in the queue +'*************************************************** + length = queueLength +End Property + +'' +' Retrieves the NOT_ENOUGH_DATA error code. +' +' @return NOT_ENOUGH_DATA. + +Public Property Get NotEnoughDataErrCode() As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Retrieves the NOT_ENOUGH_DATA error code +'*************************************************** + NotEnoughDataErrCode = NOT_ENOUGH_DATA +End Property + +'' +' Retrieves the NOT_ENOUGH_SPACE error code. +' +' @return NOT_ENOUGH_SPACE. + +Public Property Get NotEnoughSpaceErrCode() As Long +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/27/06 +'Retrieves the NOT_ENOUGH_SPACE error code +'*************************************************** + NotEnoughSpaceErrCode = NOT_ENOUGH_SPACE +End Property + diff --git a/CODIGO/clsCustomKeys.cls b/CODIGO/clsCustomKeys.cls new file mode 100644 index 0000000..3ff86e2 --- /dev/null +++ b/CODIGO/clsCustomKeys.cls @@ -0,0 +1,407 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "clsCustomKeys" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +'************************************************************** +' clsCustomKeys.cls - Allows the User to Customize Keys. +' +' Creation Date: 08/03/07 +' Created and Implemented by Rapsodius +'************************************************************** + +'************************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +'************************************************************************** + +'' +'Customizes User Keys. +' +'@author Rapsodius +'@version 1.1.0 +'@date 20080413 + +'03/08/2007 - Rapsodius +' - First Release +' +'13/04/2008 - Juan Martín Sotuyo Dodero (Maraxus) - (juansotuyo@gmail.com) +' - Removed lots of unwanted buggy features keeping it clean. Revised documentation and coding standards. + + +Option Explicit + +'' +'Number of Customizable Keys +Private Const NUM_CUSTOM_KEYS As Byte = 9 + +'' +'Error Raised in case the key file doesn't exist +Private Const ERROR_NO_KEY_FILE As Long = vbObjectError + 16 + +'' +'The relative path from the application's location where the key config file is. +Private Const KEY_CONFIG_FILE As String = "\init\BindKeys.bin" + +'' +'Array of mapped keys +Private mappedKeys(1 To NUM_CUSTOM_KEYS) As Integer + + +'' +'Index of keys on array +' +'@param mKeyUp Key for moving character up +'@param mKeyDown Key for moving character down +'@param mKeyLeft Key for moving character left +'@param mKeyRight Key for moving character right +'@param mKeyToggleMusic Key for toggling background music +'@param mKeyToggleSound Key for toggling sound +'@param mKeyToggleFxs Key for togglig the 3D Fxs +'@param mKeyRequestRefresh Key for sending a request refreshing packet +'@param mKeyToggleNames Key for toggling characters' names +'@param mKeyGetObject Key for retrieving an object from the ground +'@param mKeyEquipObject Key for equiping an inventory object +'@param mKeyTamAnimal Key for taming animals +'@param mKeySteal Key for Stealing other users' gold or objects +'@param mKeyToggleSafeMode Key for toggling Safe Mode +'@param mKeyToggleResuscitationSafe Key for toggling Resuscitation Safe +'@param mKeyHide Key for hiding the character +'@param mKeyDropObject Key for dropping inventory objects +'@param mKeyUseObject Key for using inventory objects +'@param mKeyAttack Key for attacking other Users/NPCs +'@param mKeyTalk Key for talking (to all) +'@param mKeyTalkWithGuild Key for talking (only to guild members) +'@param mKeyTakeScreenShot Key for taking a snapshot of the screen +'@param mKeyShowOptions Key for showing the "Options" form +'@param mKeyMeditate Key for start/stop meditation +'@param mKeyCastSpellMacro Key for start/stop the Cast Spell Macro +'@param mKeyWorkMacro Key for start/stop the Work Macro +'@param mKeyExitGame Key for close the game +Public Enum eKeyType + mKeyUp = 1 + mKeyDown + mKeyLeft + mKeyRight + mKeyUseObject + mKeyAttack + mKeyTalk + mKeyPausa + mKeyEquip +End Enum + +'' +'Shows a readable name for a specific Key code +' +'@param KeyCode Key code to process +'@return An User readable name for the key code or a null string if the key is not valid +'@remarks All keys not listed here are considered not valid + +Public Function ReadableName(ByVal KeyCode As Integer) As String +'*************************************************** +'Author: Rapsodius +'Last Modification: 08/04/07 +' +'*************************************************** + Select Case KeyCode + Case KeyCodeConstants.vbKeyA To KeyCodeConstants.vbKeyZ + ReadableName = Chr$(KeyCode) + + Case KeyCodeConstants.vbKeyNumpad0 To KeyCodeConstants.vbKeyNumpad9 + ReadableName = KeyCode - KeyCodeConstants.vbKeyNumpad0 & " (teclado numérico)" + + Case KeyCodeConstants.vbKeyF1 To KeyCodeConstants.vbKeyF16 + ReadableName = "F" & (KeyCode - KeyCodeConstants.vbKeyF1 + 1) + + Case KeyCodeConstants.vbKeyMultiply + ReadableName = "* (teclado numerico)" + + Case KeyCodeConstants.vbKeyAdd + ReadableName = "+ (teclado numerico)" + + Case KeyCodeConstants.vbKeySeparator + 'Note: Separator appears in MSDN as the Enter key for + 'the numpad, but MS recognizes it as the normal + 'Enter key + ReadableName = "Enter (teclado numérico)" + + Case KeyCodeConstants.vbKeySubtract + ReadableName = "- (teclado numerico)" + + Case KeyCodeConstants.vbKeyDecimal + ReadableName = ". (teclado numerico)" + + Case KeyCodeConstants.vbKeyDivide + ReadableName = "/ (teclado numerico)" + + Case KeyCodeConstants.vbKeyShift + ReadableName = "Shift" + + Case KeyCodeConstants.vbKeyControl + ReadableName = "Control" + + Case KeyCodeConstants.vbKeyMenu 'Alt + ReadableName = "Alt" + + Case KeyCodeConstants.vbKeyPause + ReadableName = "Pausa" + + Case KeyCodeConstants.vbKeyCapital + ReadableName = "Blq Mayus" + + Case KeyCodeConstants.vbKeyEscape + ReadableName = "Esc" + + Case KeyCodeConstants.vbKeyPageUp + ReadableName = "Ret Pag" + + Case KeyCodeConstants.vbKeyPageDown + ReadableName = "Av Pag" + + Case KeyCodeConstants.vbKeyEnd + ReadableName = "Fin" + + Case KeyCodeConstants.vbKeyHome + ReadableName = "Inicio" + + Case KeyCodeConstants.vbKeyLeft + ReadableName = "Izquierda" + + Case KeyCodeConstants.vbKeyUp + ReadableName = "Arriba" + + Case KeyCodeConstants.vbKeyRight + ReadableName = "Derecha" + + Case KeyCodeConstants.vbKeyDown + ReadableName = "Abajo" + + Case KeyCodeConstants.vbKeyInsert + ReadableName = "Insertar" + + Case KeyCodeConstants.vbKeyNumlock + ReadableName = "Blq Num" + + Case KeyCodeConstants.vbKeyScrollLock + ReadableName = "Blq Despl" + + Case KeyCodeConstants.vbKeySpace + ReadableName = "Barra Espaciadora" + + Case KeyCodeConstants.vbKeyBack + ReadableName = "Borrar" + + Case KeyCodeConstants.vbKeyReturn + ReadableName = "Enter" + + Case KeyCodeConstants.vbKeyDelete + ReadableName = "Suprimir" + + Case Else + 'In all other cases, key is considered not valid. + ReadableName = Constants.vbNullString + End Select +End Function + +'' +'Reads custom keys from a file. +' +'@remarks If the custom keys file is not found ERROR_NO_KEY_FILE is raised. + +Public Sub LoadCustomKeys() +'*************************************************** +'Author: Rapsodius +'Last Modification: 08/21/07 +' +'*************************************************** + Dim i As Long + Dim FileNum As Integer + FileNum = FreeFile() + + 'Inits keyboard config with default configurations + Call LoadDefaults + + Open App.path & KEY_CONFIG_FILE For Binary Access Read Lock Read Write As FileNum + + For i = 1 To NUM_CUSTOM_KEYS + Get FileNum, , mappedKeys(i) + If LenB(ReadableName(mappedKeys(i))) = 0 Then + Close FileNum + Call Err.Raise(ERROR_NO_KEY_FILE) + Exit Sub + End If + Next i + + Close FileNum +End Sub + +'' +' Saves custom keys to a file + +Public Sub SaveCustomKeys() +'*************************************************** +'Author: Rapsodius +'Last Modification: 08/04/07 +' +'*************************************************** + Dim FileNum As Integer + Dim i As Long + FileNum = FreeFile() + + Open App.path & KEY_CONFIG_FILE For Binary Access Write As FileNum + + For i = 1 To NUM_CUSTOM_KEYS + Put FileNum, , mappedKeys(i) + Next i + + Close #FileNum +End Sub + +'' +'Gets a key code +' +'@param index Index of the key code to retrieve +'@return The Key code that belongs to index + +Public Property Get BindedKey(ByVal index As eKeyType) As Integer +'*************************************************** +'Author: Rapsodius +'Last Modification: 08/04/07 +' +'*************************************************** + If index < 1 Or index > NUM_CUSTOM_KEYS Then Exit Property + BindedKey = mappedKeys(index) +End Property + +'' +'Sets a key code +' +'@param index Index of the key to change +'@param NewVal New key code + +Public Property Let BindedKey(ByVal index As eKeyType, ByVal NewVal As Integer) +'*************************************************** +'Author: Rapsodius +'Last Modification: 08/05/07 +' +'*************************************************** + If index < 1 Or index > NUM_CUSTOM_KEYS Then Exit Property + + If LenB(ReadableName(NewVal)) = 0 Then 'If key is not valid... + Exit Property 'Rejects the new assignment + End If + + If KeyAssigned(NewVal) Then 'Also reject it in case key is already assigned + Exit Property + End If + + mappedKeys(index) = NewVal +End Property + +'' +'Loads default keys + +Public Sub LoadDefaults() +'*************************************************** +'Author: Rapsodius +'Last Modification: 08/04/07 +' +'*************************************************** + mappedKeys(eKeyType.mKeyUp) = KeyCodeConstants.vbKeyUp + mappedKeys(eKeyType.mKeyDown) = KeyCodeConstants.vbKeyDown + mappedKeys(eKeyType.mKeyLeft) = KeyCodeConstants.vbKeyLeft + mappedKeys(eKeyType.mKeyRight) = KeyCodeConstants.vbKeyRight + mappedKeys(eKeyType.mKeyUseObject) = KeyCodeConstants.vbKeyU + mappedKeys(eKeyType.mKeyAttack) = KeyCodeConstants.vbKeyControl + mappedKeys(eKeyType.mKeyTalk) = KeyCodeConstants.vbKeyReturn + mappedKeys(eKeyType.mKeyPausa) = KeyCodeConstants.vbKeySpace + mappedKeys(eKeyType.mKeyEquip) = KeyCodeConstants.vbKeyE +End Sub + +'' +'Returns whether a key is binded to an action +' +'@param KeyCode Key code to check +'@return True if key is mapped, false otherwise + +Public Function KeyAssigned(ByVal KeyCode As Integer) As Boolean +'*************************************************** +'Author: Rapsodius +'Last Modification: 08/04/07 +' +'*************************************************** + Dim Counter As Long + + KeyAssigned = False + + For Counter = 1 To NUM_CUSTOM_KEYS + If mappedKeys(Counter) = KeyCode Then + KeyAssigned = True + Exit For + End If + Next Counter +End Function + +'' +'Retrieves the number of customizable keys +' +'@return The number of customizable keys + +Public Property Get Count() As Byte +'*************************************************** +'Author: Rapsodius +'Last Modification: 08/04/07 +' +'*************************************************** + Count = NUM_CUSTOM_KEYS +End Property + +'' +'Constructor. Loads Keys from file + +Private Sub Class_Initialize() +'*************************************************** +'Author: Rapsodius +'Last Modification: 08/04/07 +' +'*************************************************** +On Error GoTo ErrHand: + Call LoadCustomKeys + Exit Sub + +ErrHand: + If Err.Number = ERROR_NO_KEY_FILE Then + Call LoadDefaults + Call SaveCustomKeys + Resume Next + End If +End Sub + +'' +'Destructor. Saves Keys to file + +Private Sub Class_Terminate() +'*************************************************** +'Author: Rapsodius +'Last Modification: 08/04/07 +' +'*************************************************** + Call SaveCustomKeys +End Sub diff --git a/CODIGO/clsCustomMessages.cls b/CODIGO/clsCustomMessages.cls new file mode 100644 index 0000000..340c739 --- /dev/null +++ b/CODIGO/clsCustomMessages.cls @@ -0,0 +1,244 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "clsCustomMessages" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +'************************************************************** +' clsCustomMessages.cls - User-defined messages with shortcut. +' Allows the creation and serialization of user defined messages to be used with shortcuts. +' +' Designed and implemented by Juan Martín Sotuyo Dodero (Maraxus) +' (juansotuyo@gmail.com) +'************************************************************** + +'************************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +'************************************************************************** + + +Option Explicit +Option Base 0 + +'' +' Defines the number of messages that can be created. +Private Const MESSAGE_COUNT As Byte = 10 + +'' +' Defines the maximum length allowed for any custom message. +Private Const MAX_MESSAGE_LENGTH As Byte = 120 + +'' +' The error code thrown when the message being set is invalid. +Private Const INVALID_MESSAGE As Long = vbObjectError + 123 + +'' +' Relative path from the application in which custom message are stored. +Private Const MESSAGE_FILE_PATH As String = "/init/messages.txt" + + +'' +'Array of defined messages. +Private CustomMessages(MESSAGE_COUNT - 1) As String + + +'' +' Class constructor. Initializes a new clsCustomMessage + +Private Sub Class_Initialize() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 07/26/07 +'Initializes the messages by loading them from the config file +'*************************************************** +On Error GoTo Errhandler + Dim handle As Integer + Dim i As Long + + 'Load custom messages + handle = FreeFile() + + Open App.path & MESSAGE_FILE_PATH For Input As handle + + For i = 0 To MESSAGE_COUNT - 1 + Line Input #handle, CustomMessages(i) + + 'Purge invalid messages + If Not MessageIsValid(CustomMessages(i)) Then + CustomMessages(i) = vbNullString + End If + Next i + + Close handle + + 'If the file does not exist (only possible error), + 'then we have nothing to worry. All messages will be empty +Errhandler: +End Sub + +'' +' Class desconstructor. Serializes messages to + +Private Sub Class_Terminate() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 07/26/07 +'Stores all messages back into config file for later use. +'*************************************************** + Dim handle As Integer + Dim i As Long + Dim directories() As String + Dim path As String + + 'Make sure the path exists + directories = Split(MESSAGE_FILE_PATH, "/") + path = App.path + + For i = 0 To UBound(directories()) - 1 + path = path & "/" & directories(i) + + If LenB(Dir(path, vbDirectory)) = 0 Then + Call MkDir(path) + End If + Next i + + 'Serialize custom messages + handle = FreeFile() + + Open App.path & MESSAGE_FILE_PATH For Output As handle + + For i = 0 To MESSAGE_COUNT - 1 + Print #handle, CustomMessages(i) + Next i + + Close handle +End Sub + +'' +' Retrieves the requested message. +' +' @param index The message index to retrieve. +' @return The message requested. + +Public Property Get Message(ByVal index As Integer) As String +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 07/26/07 +'Retrieves the requested message. +'*************************************************** + If index < 0 Or index >= MESSAGE_COUNT Then + Exit Property + End If + + Message = CustomMessages(index) +End Property + +'' +' Sets the requested message. +' +' @param index The message index to be set. +' @param nValue The message to be stored. + +Public Property Let Message(ByVal index As Integer, ByVal nValue As String) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 07/26/07 +'Sets the given message index with the requested message. +'*************************************************** + If index < 0 Or index >= MESSAGE_COUNT Then + Exit Property + End If + + If Not MessageIsValid(nValue) Then + Call Err.Raise(INVALID_MESSAGE) + Exit Property + End If + + CustomMessages(index) = nValue +End Property + +'' +' Retrieves the error code of invalid messages. +' +' @return The error code triggered when an invalid message is found. + +Public Property Get InvalidMessageErrCode() As Long +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 07/26/07 +'Retrieves the INVALID_MESSAGE error code. +'*************************************************** + InvalidMessageErrCode = INVALID_MESSAGE +End Property + +'' +' Checks if the given message is valid or not. +' +' @param msg The message to be checked. +' @return True if the message is valid, False otherwise. + +Private Function MessageIsValid(ByRef msg As String) As Boolean +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 08/07/07 +'Last Modified by: Rapsodius +' +'Erased line "msg=StrConv(msg,vbUnicode)", because +'it was causing problems and detected as many messages +'as wrong with nothing bad on them +'*************************************************** + Dim i As Long + Dim Char As String * 1 + Dim ascii As Byte + + 'Get rid of spaces + msg = Trim$(msg) + + 'Empty messages are valid + If LenB(msg) = 0 Then + MessageIsValid = True + Exit Function + End If + + For i = 1 To Len(msg) + Char = mid$(msg, i, 1) + ascii = Asc(Char) + + 'check for invalid chars... + If ascii < 31 Then Exit Function + + If ascii > 126 And Char <> "á" And Char <> "Á" And Char <> "ä" And Char <> "Ä" _ + And Char <> "â" And Char <> "Â" And Char <> "à" And Char <> "À" And Char <> "é" _ + And Char <> "É" And Char <> "ë" And Char <> "Ë" And Char <> "ê" And Char <> "Ê" _ + And Char <> "è" And Char <> "È" And Char <> "í" And Char <> "Í" And Char <> "ï" _ + And Char <> "Ï" And Char <> "î" And Char <> "Î" And Char <> "ì" And Char <> "Ì" _ + And Char <> "ó" And Char <> "Ó" And Char <> "ö" And Char <> "Ö" And Char <> "ô" _ + And Char <> "Ô" And Char <> "ò" And Char <> "Ò" And Char <> "ú" And Char <> "Ú" _ + And Char <> "ü" And Char <> "Ü" And Char <> "û" And Char <> "Û" And Char <> "ù" _ + And Char <> "Ù" And Char <> "ñ" And Char <> "Ñ" And Char <> "¡" And Char <> "¿" Then + Exit Function + End If + Next i + + 'Discard extremely long messages + If Len(msg) > MAX_MESSAGE_LENGTH Then Exit Function + + MessageIsValid = True +End Function diff --git a/CODIGO/clsDialogs.cls b/CODIGO/clsDialogs.cls new file mode 100644 index 0000000..6c3590f --- /dev/null +++ b/CODIGO/clsDialogs.cls @@ -0,0 +1,408 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "clsDialogs" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +'************************************************************** +' clsDialogs.cls - Chats over head manager. +' Creates and manipulates chats over heads, rendering and updating them. +' +' Designed and implemented by Juan Martín Sotuyo Dodero (Maraxus) +' (juansotuyo@gmail.com) +'************************************************************** + +'************************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +'************************************************************************** + +'' +' Creates and manipulates chats over heads, rendering and updating them. +' +' @file clsDialogs.cls +' @author Juan Martín Sotuyo Dodero (Maraxus) juansotuyo@gmail.com +' @version 1.0.0 +' @date 20070729 + +Option Explicit +Option Base 0 + +'' +' Maximum number of dialogs that can exist. +Private Const MAX_DIALOGS As Byte = 100 + +'' +' Maximum length of any dialog line without having to split it. +Private Const MAX_LENGTH As Byte = 18 + +'' +' Number of milliseconds to add to the lifetime per dialog character +Private Const MS_PER_CHAR As Byte = 100 + +'' +' Number of extra milliseconds to add to the lifetime of a new dialog +Private Const MS_ADD_EXTRA As Integer = 5000 + +'' +' The dialog structure +' +' @param textLine Array of lines of a formated chat. +' @param x X coord for rendering. +' @param y Y coord for rendering. +' @param startTime The time (in ms) at which the dialog was created. +' @param lifeTime Time (in ms) this dialog should last. +' @param charIndex The charIndex that created this dialog. +' @param color The color to be used when rendering the text. +' @param renderable Set to True if the chat should be rendered this frame, False otherwise +' (used to skip dialogs from people outside render area). +Private Type dialog + textLine() As String + X As Integer + Y As Integer + startTime As Long + lifeTime As Long + CharIndex As Integer + color As Long + renderable As Boolean +End Type + +'' +' Array if dialogs, sorted by the charIndex. +Private dialogs(MAX_DIALOGS - 1) As dialog + +'' +' The number of dialogs being used at the moment. +Private dialogCount As Byte + +'' +' the size of the font being used to render +Private usedFont As StdFont + +'' +' A millisecond precision timer +Private Declare Function GetTickCount Lib "kernel32" () As Long + +'' +' Initializes the instance of the class. + +Private Sub Class_Initialize() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 07/28/07 +'Initializes the dialog instance +'*************************************************** + dialogCount = 0 +End Sub + +'' +' Clean up and release resources + +Private Sub Class_Terminate() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 07/28/07 +'Clean up +'*************************************************** +End Sub + +Private Function BinarySearch(ByVal CharIndex As Integer) As Integer +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 07/28/07 +'Returns the index of the dialog in the list, or the negation +'of the position were it should be if not found (for binary insertion) +'************************************************************** + Dim min As Long + Dim max As Long + Dim mid As Long + + min = 0 + max = dialogCount - 1 + + Do While min <= max + mid = (min + max) \ 2 + + If dialogs(mid).CharIndex < CharIndex Then + min = mid + 1 + ElseIf dialogs(mid).CharIndex > CharIndex Then + max = mid - 1 + Else + 'We found it + BinarySearch = mid + Exit Function + End If + Loop + + 'Not found, return the negation of the position where it should be + '(all higher values are to the right of the list and lower values are to the left) + BinarySearch = Not min +End Function + +'' +' Creates a new dialog. If the user already had a dialog, then it's replaced, +' otherwise a new slot is used. +' +' @param chat The text of the chat being spoken. +' @param charIndex The character saying the chat. +' @param color The color being used in the chat when rendered. +' +' @remarks If there are no more free slots, and the char didn't have a previous dialog, +' the chat is ignored. + +Public Sub CreateDialog(ByRef Chat As String, ByVal CharIndex As Integer, ByVal color As Long) +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modification: 08/29/07 by Rapsodius +'Changed life time of the dialogs to a variable amount, +'depending on the number of chars +'************************************************************** + Dim Slot As Integer + Dim i As Long + + Slot = BinarySearch(CharIndex) + + If Slot < 0 Then + If dialogCount = MAX_DIALOGS Then Exit Sub 'Out of space! Should never happen.... + + 'We need to add it. Get insertion index and move list backwards. + Slot = Not Slot + + For i = dialogCount To Slot + 1 Step -1 + dialogs(i) = dialogs(i - 1) + Next i + + dialogCount = dialogCount + 1 + End If + + With dialogs(Slot) + .CharIndex = CharIndex + .color = color + .renderable = False + .startTime = GetTickCount() + .textLine = FormatChat(Chat) + .lifeTime = MS_ADD_EXTRA + (MS_PER_CHAR * Len(Chat)) + End With +End Sub + +'' +' Splits a text into several lines to make it comply with the MAX_LENGTH unless it's impossible (a single word longer than MAX_LENGTH). +' +' @param chat The text to be formated. +' +' @return The array of lines into which the text is splitted. +' +' @see MAX_LENGTH + +Private Function FormatChat(ByRef Chat As String) As String() +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 07/28/07 +'Formats a dialog into different text lines. +'************************************************************** + Dim word As String + Dim curPos As Long + Dim length As Long + Dim acumLength As Long + Dim lineLength As Long + Dim wordLength As Long + Dim curLine As Long + Dim chatLines() As String + + 'Initialize variables + curLine = 0 + curPos = 1 + length = Len(Chat) + acumLength = 0 + lineLength = -1 + ReDim chatLines(FieldCount(Chat, 32)) As String + + 'Start formating + Do While acumLength < length + word = ReadField(curPos, Chat, 32) + + wordLength = Len(word) + + ' Is the first word of the first line? (it's the only that can start at -1) + If lineLength = -1 Then + chatLines(curLine) = word + + lineLength = wordLength + acumLength = wordLength + Else + ' Is the word too long to fit in this line? + If lineLength + wordLength + 1 > MAX_LENGTH Then + 'Put it in the next line + curLine = curLine + 1 + chatLines(curLine) = word + + lineLength = wordLength + Else + 'Add it to this line + chatLines(curLine) = chatLines(curLine) & " " & word + + lineLength = lineLength + wordLength + 1 + End If + + acumLength = acumLength + wordLength + 1 + End If + + 'Increase to search for next word + curPos = curPos + 1 + Loop + + ' If it's only one line, center text + If curLine = 0 And length < MAX_LENGTH Then + chatLines(curLine) = String((MAX_LENGTH - length) \ 2 + 1, " ") & chatLines(curLine) + End If + + 'Resize array to fit + ReDim Preserve chatLines(curLine) As String + + FormatChat = chatLines +End Function + +'' +' Updates the position where a given dialog will be rendered. +' +' @param x The X coord where to start rendering. +' @param y The Y coord where to start rendering. +' @param charIndex The character whose dialog's position is being updated. + +Public Sub UpdateDialogPos(ByVal X As Integer, ByVal Y As Integer, ByVal CharIndex As Integer) +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 07/28/07 +'Updates a dialog's position. +'************************************************************** + Dim Slot As Integer + + Slot = BinarySearch(CharIndex) + + If Slot >= 0 Then + With dialogs(Slot) + .X = X - (MAX_LENGTH \ 2) * 3 + .Y = Y - (UBound(.textLine()) * 3) + .renderable = True + End With + End If +End Sub + +'' +' Displays all renderable dialogs on screen. + +Public Sub Render() +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modification: 08/29/07 by Rapsodius +'Changed the way it gets rid of older dialogs. +'************************************************************** + Dim i As Long + Dim j As Long + Dim offset As Integer + Dim removedDialogs As Long + + For i = 0 To dialogCount - 1 + 'Decrease index to prevent jumping over a dialog + 'Crappy VB will cache the limit of the For loop, so even if it changed, it won't matter + With dialogs(i - removedDialogs) + If (GetTickCount() - .startTime) >= .lifeTime Then + Call RemoveDialog(.CharIndex) + + removedDialogs = removedDialogs + 1 + ElseIf .renderable Then + offset = -(usedFont.size + 2) * UBound(.textLine()) + + 'Render it + For j = 0 To UBound(.textLine()) + Call RenderText(.X, .Y + offset, .textLine(j), .color, usedFont) + offset = offset + usedFont.size + 5 + Next j + + 'Won't render it unless it's updated in next frmae + .renderable = False + End If + End With + Next i +End Sub + +'' +' Removes the dialog from the requested char. +' +' @param charIndex The character whose dialog will be removed. + +Public Sub RemoveDialog(ByVal CharIndex As Integer) +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 07/28/07 +'Removes the dialog from the requested char. +'************************************************************** + Dim Slot As Integer + Dim i As Long + + Slot = BinarySearch(CharIndex) + + If Slot < 0 Then Exit Sub + + For i = Slot To MAX_DIALOGS - 2 + dialogs(i) = dialogs(i + 1) + Next i + + dialogCount = dialogCount - 1 +End Sub + +'' +' Removes all dialogs from all characters. + +Public Sub RemoveAllDialogs() +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 07/28/07 +'Removes all dialogs from all chars. +'************************************************************** + dialogCount = 0 +End Sub + +'' +' Retrieves the font being used to render dialogs. +' +' @return The font being used to render dialogs. + +Public Property Get font() As StdFont +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 07/28/07 +'Retrieves the font being used to render dialogs. +'************************************************************** + font = usedFont +End Property + +'' +' Sets the font being used to render dialogs. +' +' @param nValue The new font to be used to render dialogs. + +Public Property Let font(ByRef nValue As StdFont) +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 07/28/07 +'Sets the font being used to render dialogs. +'************************************************************** + Set usedFont = nValue +End Property diff --git a/CODIGO/clsFormMovementManager.cls b/CODIGO/clsFormMovementManager.cls new file mode 100644 index 0000000..90723ca --- /dev/null +++ b/CODIGO/clsFormMovementManager.cls @@ -0,0 +1,84 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "clsFormMovementManager" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +'***************************************************** +'Form Movement Manager +'Designed and implemented by ZaMa +'zaxtor@gmail.com +'***************************************************** + +'************************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the GNU General Public License as published by +'the Free Software Foundation; either version 2 of the License, or +'(at your option) any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the GNU General Public License +'along with this program; if not, write to the Free Software +'Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +'************************************************************************** +Option Explicit + +Dim WithEvents Formulario As Form +Attribute Formulario.VB_VarHelpID = -1 + +Private DragX As Single +Private Dragy As Single + +Private LimitY As Integer + +Public Sub Initialize(ByRef tForm As Form, Optional ByVal VerticalLimit As Integer = 0) +'*************************************************** +'Author: ZaMa +'Last Modify Date: 29/12/09 +'Sets the reference to the form +'*************************************************** + Set Formulario = tForm + + LimitY = VerticalLimit +End Sub + +Private Sub Formulario_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) +'*************************************************** +'Author: ZaMa +'Last Modify Date: 29/12/09 +'Implements the mouse down event of the form. +'*************************************************** + If LimitY > 0 Then + If Y > LimitY Then Exit Sub + End If + + DragX = X + Dragy = Y +End Sub + +Private Sub Formulario_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) +'*************************************************** +'Author: ZaMa +'Last Modify Date: 01/07/10 +'Implements the mouse move event of the form. +'*************************************************** + If LimitY > 0 Then + If Y > LimitY Then Exit Sub + End If + + If Button > 0 Then + Formulario.Left = Formulario.Left + (X - DragX) + Formulario.Top = Formulario.Top + (Y - Dragy) + End If +End Sub diff --git a/CODIGO/clsGrapchicalInventory.cls b/CODIGO/clsGrapchicalInventory.cls new file mode 100644 index 0000000..282f948 --- /dev/null +++ b/CODIGO/clsGrapchicalInventory.cls @@ -0,0 +1,653 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "clsGrapchicalInventory" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +'***************************************************** +'Graphical inventory for ORE 0.4.1 +'Designed and implemented by Juan Martín Sotuyo Dodero (Maraxus) +'juansotuyo@hotmail.com +'***************************************************** + +'************************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the GNU General Public License as published by +'the Free Software Foundation; either version 2 of the License, or +'(at your option) any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the GNU General Public License +'along with this program; if not, write to the Free Software +'Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +'************************************************************************** + +Option Explicit + +Private InventoryOffset As Long 'Number of lines we scrolled down from topmost +Private InvSelectedItem As Long 'Currently selected item + +Private ownTilePixelWidth As Integer +Private ownTilePixelHeight As Integer +Private startdX As Integer +Private startdY As Integer + +Private ShowValue As Boolean +Private ImgContainer As Boolean + +Private InvSurface As DirectDrawSurface7 'DD Surface used to render everything + +Private Inventory() As Inventory 'User's inventory + +Private WithEvents InventoryWindow As PictureBox 'Placeholder where to render the inventory +Attribute InventoryWindow.VB_VarHelpID = -1 + +#If ConMenuesConextuales = 1 Then + Dim ItemMenu As Menu 'Menu to be shown as pop up +#End If + +Private Sub Class_Initialize() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +' +'*************************************************** +End Sub + +Private Sub Class_Terminate() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +' +'*************************************************** +End Sub + +Public Sub ScrollInventory(ByVal Up As Boolean) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 14/01/2010 +'Scrolls the graphical inventory up / down +'14/01/2010: ZaMa - Now redraws inventory only if needed +'*************************************************** + + 'Only move if there is something to show up /down + If CanScroll(Up) Then + InventoryOffset = InventoryOffset + IIf(Up, 1, -1) + + 'Redraw the inventory if needed + DrawInventory + End If + +End Sub + +Public Function CanScroll(ByVal Up As Boolean) +'*************************************************** +'Author: ZaMa +'Last Modify Date: 14/01/2010 +'Determines wether inventory can be scrolled up / down +'*************************************************** + If Up Then + CanScroll = (InventoryOffset + (InventoryWindow.ScaleHeight \ ownTilePixelHeight)) * _ + (InventoryWindow.ScaleWidth \ ownTilePixelWidth) < UBound(Inventory) + Else + CanScroll = InventoryOffset > 0 + End If + +End Function + +Public Sub SelectGold() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Sets the gold as the currently selected item +'*************************************************** + Dim prevSelectedItem As Long + + 'Store preivously selected item + prevSelectedItem = InvSelectedItem + + 'Select the gold + InvSelectedItem = FLAGORO + + 'Redraw old item to deselect it + If prevSelectedItem <> FLAGORO Then + Call DrawInventorySlot(prevSelectedItem) + End If +End Sub + +Public Sub DeselectItem() +'*************************************************** +'Author: ZaMa +'Last Modify Date: 30/11/2009 +'Deselect the currently selected item +'*************************************************** + If InvSelectedItem = 0 Then Exit Sub + + Dim ClearSlot As Byte + + ClearSlot = InvSelectedItem + + 'Select nothing + InvSelectedItem = 0 + + 'Redraw old item to deselect it + Call DrawInventorySlot(ClearSlot) + +End Sub + +Public Sub ChangeSlotItemAmount(ByVal Slot As Byte, ByVal Amount As Long) +'*************************************************** +'Author: ZaMa +'Created Date: 30/11/2009 +'Last Modify Date: 09/12/2009 (Budi) +'Change the amount of the required item, and update the slot. +'*************************************************** + + Inventory(Slot).Amount = Amount + + 'Update Amount + Call DrawInventorySlot(Slot) + +End Sub + +Public Property Get SelectedItem() As Long +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Retrieves the selected item index +'*************************************************** + SelectedItem = InvSelectedItem +End Property + +Public Property Get MaxHit(ByVal Slot As Byte) As Integer +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Retrieves the max hit of the selected item +'*************************************************** + MaxHit = Inventory(Slot).MaxHit +End Property + +Public Property Get MinHit(ByVal Slot As Byte) As Integer +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Retrieves the min hit of the selected item +'*************************************************** + MinHit = Inventory(Slot).MinHit +End Property + +Public Property Get MaxDef(ByVal Slot As Byte) As Integer +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Retrieves the defense of the selected item +'*************************************************** + MaxDef = Inventory(Slot).MaxDef +End Property + +Public Property Get MinDef(ByVal Slot As Byte) As Integer +'*************************************************** +'Author: Budi +'Last Modify Date: 02/1209 +'Retrieves the defense of the selected item +'*************************************************** + MinDef = Inventory(Slot).MinDef +End Property + +Public Property Get GrhIndex(ByVal Slot As Byte) As Integer +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Retrieves the grh index of the selected item +'*************************************************** + GrhIndex = Inventory(Slot).GrhIndex +End Property + +Public Property Get Valor(ByVal Slot As Byte) As Single +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Retrieves the value of the selected item +'*************************************************** + Valor = Inventory(Slot).Valor +End Property + +Public Property Get Amount(ByVal Slot As Byte) As Long +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Retrieves the selected item's amount +'*************************************************** + If Slot = FLAGORO Then + Amount = UserGLD + ElseIf Slot >= LBound(Inventory) And Slot <= UBound(Inventory) Then + Amount = Inventory(Slot).Amount + End If +End Property + +Public Property Get OBJIndex(ByVal Slot As Byte) As Integer +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Retrieves the selected item's object index +'*************************************************** + OBJIndex = Inventory(Slot).OBJIndex +End Property + +Public Property Get OBJType(ByVal Slot As Byte) As Integer +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Retrieves the selected item's object type +'*************************************************** + OBJType = Inventory(Slot).OBJType +End Property + +Public Property Get ItemName(ByVal Slot As Byte) As String +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Retrieves the selected item's name +'*************************************************** + ItemName = Inventory(Slot).name +End Property + +Public Property Get Equipped(ByVal Slot As Byte) As Boolean +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Retrieves True if the item at the given pos is eqiupped +'*************************************************** + Equipped = Inventory(Slot).Equipped +End Property + +Public Property Get MaxObjs() As Byte +'*************************************************** +'Author: Torres Patricio (Pato) +'Last Modify Date: 09/16/09 +'Retrieves the capacity of the Inventory +'*************************************************** + MaxObjs = UBound(Inventory) +End Property + +Public Sub SetMaxObjs(ByVal MaxObjs As Byte) +'*************************************************** +'Author: Torres Patricio (Pato) +'Last Modify Date: 09/16/09 +'Set the capacity of the Inventary +'*************************************************** + If UBound(Inventory) = MaxObjs Then Exit Sub + + ReDim Preserve Inventory(1 To MaxObjs) As Inventory +End Sub + +Public Sub ToggleShowValue(ByVal bShow As Boolean) +'*************************************************** +'Author: ZaMa +'Last Modify Date: 11/12 +'Indicates if the amount of the items in the inventory is shown +'*************************************************** + ShowValue = bShow + + Dim Slot As Integer + ' Update Inventory + For Slot = 1 To Me.MaxObjs + DrawInventorySlot (Slot) + Next Slot +End Sub + +Public Sub SetItem(ByVal Slot As Byte, ByVal eOBJIndex As Integer, ByVal eAmount As Long, ByVal eEquipped As Byte, _ + ByVal eGrhIndex As Integer, ByVal eObjType As Integer, ByVal eMaxHit As Integer, ByVal eMinHit As Integer, _ + ByVal MaxDef As Integer, ByVal MinDef As Integer, ByVal eValor As Single, ByVal eName As String) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 12/04/06 +'Sets all data for a given inventory slot +'*************************************************** + If Slot < 1 Or Slot > UBound(Inventory) Then Exit Sub + + With Inventory(Slot) + .Amount = eAmount + .MaxDef = MaxDef + .MinDef = MinDef + .Equipped = eEquipped + .GrhIndex = eGrhIndex + .MaxHit = eMaxHit + .MinHit = eMinHit + .name = eName + .OBJIndex = eOBJIndex + .OBJType = eObjType + .Valor = eValor + End With + + 'If InventoryWindow.Visible = False Then InventoryWindow.Visible = True + + 'Render inventory slot (we don't need to render the whole inventory) + Call DrawInventorySlot(Slot) +End Sub + +Private Function ClickItem(ByVal X As Long, ByVal Y As Long) As Long +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Selects the item clicked if it's valid and return's it's index +'*************************************************** + Dim TempItem As Long + Dim temp_x As Long + Dim temp_y As Long + + temp_x = X \ ownTilePixelWidth + temp_y = Y \ ownTilePixelHeight + + TempItem = temp_x + (temp_y + InventoryOffset) * (InventoryWindow.ScaleWidth \ ownTilePixelWidth) + 1 + + 'Make sure it's within limits + If TempItem <= UBound(Inventory) Then + 'Make sure slot isn't empty + If Inventory(TempItem).GrhIndex Then + ClickItem = TempItem + Else + ClickItem = 0 + End If + End If +End Function + +Private Sub DrawInventory() +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Renders the inventory to the given PictureBox +'*************************************************** + Dim LoopC As Long + Dim SrcRect As RECT + Dim TempRect As RECT + Dim destRect As RECT + + With TempRect + .Bottom = ownTilePixelHeight + .Right = ownTilePixelWidth + End With + + destRect = TempRect + + 'Clear the inventory window + InventoryWindow.Cls + + For LoopC = InventoryOffset * (InventoryWindow.ScaleWidth \ ownTilePixelWidth) + 1 To UBound(Inventory) + 'Clear the slot area + Call InvSurface.BltColorFill(TempRect, InventoryWindow.BackColor) + + If Inventory(LoopC).GrhIndex Then + 'Get source rect + With SrcRect + .Left = GrhData(Inventory(LoopC).GrhIndex).sX + .Top = GrhData(Inventory(LoopC).GrhIndex).sY + .Right = .Left + ownTilePixelWidth + .Bottom = .Top + ownTilePixelHeight + End With + + 'Render the item grh and the amount + InvSurface.SetForeColor vbWhite + InvSurface.BltFast startdX, startdY, SurfaceDB.Surface(GrhData(Inventory(LoopC).GrhIndex).FileNum), SrcRect, DDBLTFAST_WAIT Or DDBLTFAST_NOCOLORKEY + If Inventory(LoopC).Amount > 0 Then InvSurface.DrawText startdX / 2, startdY / 2, Inventory(LoopC).Amount, False + + 'If equipped we render "E" + If Inventory(LoopC).Equipped Then + InvSurface.SetForeColor vbYellow + InvSurface.DrawText 20, 20, "E", False + End If + + 'Render a box around the selected item + If InvSelectedItem = LoopC Then + If ImgContainer Then + InvSurface.SetForeColor vbGreen + InvSurface.setDrawStyle DrawStyleConstants.vbDot + InvSurface.DrawBox 0, 0, ownTilePixelWidth, ownTilePixelHeight + End If + End If + End If + + 'Render the item to the Inventory Window + Call InvSurface.BltToDC(InventoryWindow.hdc, TempRect, destRect) + + Call InventoryWindow.Refresh + + With destRect + 'Check if we have reached the right end of the inventory picturebox + If .Left = (InventoryWindow.ScaleWidth - (InventoryWindow.ScaleWidth Mod ownTilePixelWidth) - ownTilePixelWidth) Then + .Left = 0 + .Right = ownTilePixelWidth + .Bottom = .Bottom + ownTilePixelHeight + .Top = .Top + ownTilePixelHeight + Else + .Left = .Left + ownTilePixelWidth + .Right = .Right + ownTilePixelWidth + End If + End With + Next LoopC +End Sub + +Private Sub DrawInventorySlot(ByVal Slot As Integer) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 12/04/06 +'Renders a inventory slot to the given PictureBox +'*************************************************** + Dim SrcRect As RECT + Dim TempRect As RECT + Dim destRect As RECT + Dim SrcRectSlot As RECT + + With TempRect + .Bottom = ownTilePixelHeight + .Right = ownTilePixelWidth + End With + + Dim upperLeftSlot As Integer + upperLeftSlot = InventoryOffset * (InventoryWindow.ScaleWidth \ ownTilePixelWidth) + 1 + + 'If not in renderable area we exit + If Slot < upperLeftSlot Then Exit Sub + + With destRect + .Top = ((Slot - upperLeftSlot) \ (InventoryWindow.ScaleWidth \ ownTilePixelWidth)) * ownTilePixelHeight + .Left = ((Slot - 1) Mod (InventoryWindow.ScaleWidth \ ownTilePixelWidth)) * ownTilePixelWidth + .Bottom = .Top + ownTilePixelHeight + .Right = .Left + ownTilePixelWidth + End With + + 'Clear the slot area + Call InvSurface.BltColorFill(TempRect, InventoryWindow.BackColor) + + If Inventory(Slot).GrhIndex Then + 'Get source rect + With SrcRect + .Left = GrhData(Inventory(Slot).GrhIndex).sX + .Top = GrhData(Inventory(Slot).GrhIndex).sY + .Right = .Left + ownTilePixelWidth + .Bottom = .Top + ownTilePixelHeight + End With + With SrcRectSlot + .Left = GrhData(Inventory(Slot).GrhIndex).sX + .Top = GrhData(Inventory(Slot).GrhIndex).sY + .Right = .Left + TilePixelWidth + .Bottom = .Top + TilePixelHeight + End With + + 'Render the item grh and the amount + InvSurface.SetForeColor vbWhite + InvSurface.BltFast startdX, startdY, SurfaceDB.Surface(CLng(GrhData(Inventory(Slot).GrhIndex).FileNum)), SrcRectSlot, DDBLTFAST_WAIT Or DDBLTFAST_NOCOLORKEY + If Inventory(Slot).Amount > 0 Then InvSurface.DrawText startdX / 2, startdY / 2, Inventory(Slot).Amount, False + 'If ShowValue Then InvSurface.DrawText startdX / 2, startdY / 2, Inventory(slot).Amount, False + + + 'If equipped we render "E" + If Inventory(Slot).Equipped Then + InvSurface.SetForeColor vbYellow + InvSurface.DrawText 20, 20, "E", False + End If + + 'Render a box around the selected item + If InvSelectedItem = Slot Then + If ImgContainer Then + InvSurface.SetForeColor vbGreen + InvSurface.setDrawStyle DrawStyleConstants.vbDot + InvSurface.DrawBox 0, 0, ownTilePixelWidth, ownTilePixelHeight + End If + End If + End If + + 'Render the item to the Inventory Window + InvSurface.BltToDC InventoryWindow.hdc, TempRect, destRect + + Call InventoryWindow.Refresh +End Sub + +#If ConMenuesConextuales = 1 Then 'Argument list varies!!! + Public Sub Initialize(ByRef DirectDraw As DirectDraw7, ByRef InvPic As PictureBox, ByVal MaxObjs As Byte, _ + ByRef PopUpMenu As Menu) + +#Else 'Argument list varies!!! + Public Sub Initialize(ByRef DirectDraw As DirectDraw7, ByRef InvPic As PictureBox, ByVal MaxObjs As Byte, _ + Optional ByVal FontSize As Integer = 7, Optional ByVal TileWidth As Integer = 32, _ + Optional ByVal TileHeight As Integer = 32, Optional ByVal startX As Integer = 0, _ + Optional ByVal startY As Integer = 0, Optional ByVal bImgContainer As Boolean = True, _ + Optional ByVal bShowText As Boolean = True) +#End If +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 03/12/09 +'Sets the reference to the picture box on which to render the inventory +'03/12/09: I added the optionals args FontSize, TileWidth, TileHeight, startX and startY. (Budi) +'*************************************************** + Set InventoryWindow = InvPic + + 'Make sure auto-redraw is set to true + InventoryWindow.AutoRedraw = True + + 'Set apropiate scale (pixel) + InventoryWindow.ScaleMode = 3 + + ReDim Inventory(1 To MaxObjs) As Inventory + + 'initialize DX stuff + Dim SurfaceDesc As DDSURFACEDESC2 + + 'Make sure DirectDraw was correctly initialized + If DirectDraw Is Nothing Then Exit Sub + + 'Set surface's description + With SurfaceDesc + .lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH + .ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_SYSTEMMEMORY + .lHeight = TileHeight + .lWidth = TileWidth + End With + + ownTilePixelHeight = TileHeight + ownTilePixelWidth = TileWidth + startdX = startX + startdY = startY + + ImgContainer = bImgContainer + ShowValue = bShowText + + 'Create inventory surface + Set InvSurface = DirectDraw.CreateSurface(SurfaceDesc) + + 'Prepare surfaces for text rendering + InvSurface.SetFontTransparency True +'TODO : Fonts should be in a separate class / collection + Dim font As New StdFont + Dim Ifnt As IFont + + font.name = "Verdana" + font.bold = True + font.italic = False + font.size = FontSize + font.Underline = False + font.Strikethrough = False + + Set Ifnt = font + + InvSurface.SetFont Ifnt +'\TODO + + If ImgContainer Then _ + InvSelectedItem = ClickItem(1, 1) 'If there is anything there we select the top left item + +#If ConMenuesConextuales = 1 Then + Set ItemMenu = PopUpMenu +#End If +End Sub + +Private Sub InventoryWindow_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Implements the mouse move event of the inventory picture box +'Displays a ToolTip of the item under the mouse +'*************************************************** + Dim temp_x As Integer + Dim temp_y As Integer + Dim TempItem As Integer + + 'Exit if it got outside the control's area + If X < 0 Or Y < 0 Or X > InventoryWindow.Width Or Y > InventoryWindow.Height Then _ + Exit Sub + + temp_x = X \ ownTilePixelWidth + temp_y = Y \ ownTilePixelHeight + + TempItem = temp_x + (temp_y + InventoryOffset) * (InventoryWindow.ScaleWidth \ ownTilePixelWidth) + 1 + + If TempItem <= UBound(Inventory) Then + InventoryWindow.ToolTipText = Inventory(TempItem).name + End If +End Sub + +Private Sub InventoryWindow_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) +'*************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 27/07/04 +'Implements the mouse up event of the inventory picture box +'Check outs which item was clicked +'*************************************************** + 'Store previously selected item + Dim prevSelItem As Long + + 'Exit if it got outside the control's area + If X < 0 Or Y < 0 Or X > InventoryWindow.Width Or Y > InventoryWindow.Height Then _ + Exit Sub + + prevSelItem = InvSelectedItem + + 'Get the currently clickced item + InvSelectedItem = ClickItem(CInt(X), CInt(Y)) + + 'Update needed inventory slots + If prevSelItem <> InvSelectedItem Then + If prevSelItem <> 0 And prevSelItem <> FLAGORO Then Call DrawInventorySlot(prevSelItem) + If InvSelectedItem Then Call DrawInventorySlot(InvSelectedItem) + End If + +#If ConMenuesConextuales = 1 Then + 'If it was a right click on the same item we had selected before, show popup menu + If Button = vbRightButton And prevSelItem = InvSelectedItem Then + 'Show the provided menu as a popup + Call InventoryWindow.Parent.PopUpMenu(ItemMenu, , X, Y) + End If +#End If +End Sub diff --git a/CODIGO/clsGraphicalButton.cls b/CODIGO/clsGraphicalButton.cls new file mode 100644 index 0000000..882107e --- /dev/null +++ b/CODIGO/clsGraphicalButton.cls @@ -0,0 +1,174 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "clsGraphicalButton" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +'***************************************************** +'Graphical Button +'Designed and implemented by ZaMa +'zaxtor@gmail.com +'***************************************************** + +'************************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the GNU General Public License as published by +'the Free Software Foundation; either version 2 of the License, or +'(at your option) any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the GNU General Public License +'along with this program; if not, write to the Free Software +'Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +'************************************************************************** +Option Explicit + +Private WithEvents ButtonHolder As Image +Attribute ButtonHolder.VB_VarHelpID = -1 + +Private RollOverButtonImage As Picture 'img holder +Private NormalButtonImage As Picture 'img holder +Private ClickButtonImage As Picture 'img holder +Private DisabledButtonImage As Picture 'img holder + +Private SoundClick As Boolean + +Private FormActual As Form ' Form owner + +Private OverButton As Boolean 'Indicates wether the mouse is over the button or not +Private Disabled As Boolean 'Indicates wether it's enabled or not + +Public Sub Initialize(ByRef imgButton As Image, ByVal imgNormalPath As String, _ + ByVal imgRollOverPath As String, ByVal imgClickPath As String, ByRef Formulario As Form, _ + Optional ByVal imgDisabledPath As String, Optional ByVal StartDisabled As Boolean = False, _ + Optional ByVal MakeClickSound As Boolean = True, Optional ByVal ShowHandPointer As Boolean = True) +'*************************************************** +'Author: ZaMa +'Last Modify Date: 22/12/09 +'Sets the reference to the image container +'*************************************************** + Set ButtonHolder = imgButton + Set FormActual = Formulario + + Set RollOverButtonImage = LoadPicture(imgRollOverPath) + Set NormalButtonImage = LoadPicture(imgNormalPath) + Set ClickButtonImage = LoadPicture(imgClickPath) + Set DisabledButtonImage = LoadPicture(imgDisabledPath) + + SoundClick = MakeClickSound + + With ButtonHolder + If ShowHandPointer Then + .MousePointer = vbCustom + .MouseIcon = picMouseIcon + End If + + If StartDisabled Then + Disabled = True + .Picture = DisabledButtonImage + Else + .Picture = NormalButtonImage + End If + End With + +End Sub + +Private Sub ButtonHolder_Click() +'*************************************************** +'Author: ZaMa +'Last Modify Date: 02/01/2010 +'Implements the mouse click event of the image button. +'Plays the Click Sound. +'*************************************************** + If Disabled Then Exit Sub + If Not SoundClick Then Exit Sub + + Call Audio.PlayWave(SND_CLICK) +End Sub + +Private Sub ButtonHolder_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) +'*************************************************** +'Author: ZaMa +'Last Modify Date: 29/12/09 +'Implements the mouse down event of the image button. +'Toggle to Click image button. +'*************************************************** + If Disabled Then Exit Sub + + ButtonHolder.Picture = ClickButtonImage +End Sub + +Private Sub ButtonHolder_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) +'*************************************************** +'Author: ZaMa +'Last Modify Date: 22/12/09 +'Implements the mouse move event of the image button. +'Toggle to pressed image button. +'*************************************************** + If Disabled Then Exit Sub + + If Not OverButton Then + + 'This helps when two buttons are close + FormActual.LastPressed.ToggleToNormal + + ButtonHolder.Picture = RollOverButtonImage + OverButton = True + + Set FormActual.LastPressed = Me + End If +End Sub + +Public Sub ToggleToNormal() +'*************************************************** +'Author: ZaMa +'Last Modify Date: 22/12/09 +'Toggle to normal image button. +'*************************************************** + If Disabled Then Exit Sub + + If Not OverButton Then Exit Sub + + ButtonHolder.Picture = NormalButtonImage + OverButton = False +End Sub + +Private Sub ButtonHolder_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) +'*************************************************** +'Author: ZaMa +'Last Modify Date: 29/12/09 +'Implements the mouse up event of the image button. +'Toggle to RollOver image button. +'*************************************************** + If Disabled Then Exit Sub + + ButtonHolder.Picture = RollOverButtonImage +End Sub + +Public Sub EnableButton(Optional ByVal ToogleEnable As Boolean = True) + If Disabled = Not ToogleEnable Then Exit Sub + + OverButton = False + Disabled = Not ToogleEnable + If Disabled Then + ButtonHolder.Picture = DisabledButtonImage + Else + ButtonHolder.Picture = NormalButtonImage + End If + +End Sub + +Public Function IsEnabled() As Boolean + IsEnabled = Not Disabled +End Function diff --git a/CODIGO/clsIniReader.cls b/CODIGO/clsIniReader.cls new file mode 100644 index 0000000..d26233b --- /dev/null +++ b/CODIGO/clsIniReader.cls @@ -0,0 +1,445 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "clsIniReader" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +'************************************************************** +' clsIniReader.cls - Loads INI files into memory and applies Binary Search to get values at high speed. +' Use it instead of GetVar when reading several values form the same file at once, otherwise it's not usefull. +' Based in the idea of AlejoLP and his clsLeerInis. +' +' Designed and implemented by Juan Martín Sotuyo Dodero (Maraxus) +' (juansotuyo@gmail.com) +'************************************************************** + +'************************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +'************************************************************************** + +'' +'Loads a complete INI file into memory and sorts it's data and keys for faster searches. +'It is MUCH faster than GetPrivateProfileStringA if you search for several values within a file, otherwise stick to the API. +'It's particularly usefull when you can keep a whole file in memory such as NPCs.dat' +' Based in the idea of AlejoLP and his clsLeerInis. +' +' @author Juan Martín Sotuyo Dodero (Maraxus) juansotuyo@gmail.com +' @version 1.1.0 +' @date 20060501 + +'01/05/2006 - Juan Martín Sotuyo Dodero (Maraxus) - (juansotuyo@gmail.com) +' - First Release +' +'01/04/2008 - Juan Martín Sotuyo Dodero (Maraxus) - (juansotuyo@gmail.com) +' - Add: KeyExists method allows to check for valid section keys. + + +Option Explicit +Option Base 0 + + +'' +'Structure that contains a value and it's key in a INI file +' +' @param key String containing the key associated to the value. +' @param value String containing the value of the INI entry. +' @see MainNode +' + +Private Type ChildNode + Key As String + Value As String +End Type + +'' +'Structure that contains all info under a tag in a INI file. +'Such tags are indicated with the "[" and "]" characters. +' +' @param name String containing the text within the "[" and "]" characters. +'It's the key used when searching for a main section of the INI data. +' @param values Array of ChildNodes, each containing a value entry along with it's key. +' @param numValues Number of entrys in the main node. + +Private Type MainNode + name As String + values() As ChildNode + numValues As Integer +End Type + +'' +'Containts all Main sections of the loaded INI file +Private fileData() As MainNode + +'' +'Stores the total number of main sections in the loaded INI file +Private MainNodes As Long + +'' +'Default constructor. Does nothing. + +Private Sub Class_Initialize() +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 5/01/2006 +' +'************************************************************** +End Sub + +'' +'Destroy every array and deallocates al memory. +' + +Private Sub Class_Terminate() +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 5/01/2006 +' +'************************************************************** + Dim i As Long + + 'Clean up + If MainNodes Then + For i = 1 To MainNodes - 1 + Erase fileData(i).values + Next i + + Erase fileData + End If + + MainNodes = 0 +End Sub + +'' +'Loads a INI file so it's values can be read. Must be called before being able to use GetValue. +' +' @param file Complete path of the INI file to be loaded. +' @see GetValue + +Public Sub Initialize(ByVal file As String) +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 27/07/2006 +'Opens the requested file and loads it's data into memory +'************************************************************** + Dim handle As Integer + Dim Text As String + Dim Pos As Long + + 'Prevent memory losses if we are attempting to reload a file.... + Call Class_Terminate + + 'Get a free handle and start reading line by line until the end + handle = FreeFile + + Open file For Input As handle + + Do Until EOF(handle) + Line Input #handle, Text + + 'Is it null?? + If Len(Text) Then + 'If it starts with '[' it is a main node or nothing (GetPrivateProfileStringA works this way), otherwise it's a value + If Left$(Text, 1) = "[" Then + 'If it has an ending ']' it's a main node, otherwise it's nothing + Pos = InStr(2, Text, "]") + If Pos Then + 'Add a main node + ReDim Preserve fileData(MainNodes) As MainNode + + fileData(MainNodes).name = UCase$(Trim$(mid$(Text, 2, Pos - 2))) + + MainNodes = MainNodes + 1 + End If + Else + 'So it's a value. Check if it has a '=', otherwise it's nothing + Pos = InStr(2, Text, "=") + If Pos Then + 'Is it under any main node?? + If MainNodes Then + With fileData(MainNodes - 1) + 'Add it to the main node's value + ReDim Preserve .values(.numValues) As ChildNode + + .values(.numValues).Value = Right$(Text, Len(Text) - Pos) + .values(.numValues).Key = UCase$(Left$(Text, Pos - 1)) + + .numValues = .numValues + 1 + End With + End If + End If + End If + End If + Loop + + Close handle + + Dim i As Long + + If MainNodes Then + 'Sort main nodes to allow binary search + Call SortMainNodes(0, MainNodes - 1) + + 'Sort values of each node to allow binary search + For i = 0 To MainNodes - 1 + If fileData(i).numValues Then _ + Call SortChildNodes(fileData(i), 0, fileData(i).numValues - 1) + Next i + End If +End Sub + +'' +'Sorts all child nodes within the given MainNode alphabetically by their keys. Uses quicksort. +' +' @param Node The MainNode whose values are to be sorted. +' @param first The first index to consider when sorting. +' @param last The last index to be considered when sorting. + +Private Sub SortChildNodes(ByRef Node As MainNode, ByVal First As Integer, ByVal Last As Integer) +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 5/01/2006 +'Sorts the list of values in a given MainNode using quicksort, +'this allows the use of Binary Search for faster searches +'************************************************************** + Dim min As Integer 'First item in the list + Dim max As Integer 'Last item in the list + Dim comp As String 'Item used to compare + Dim temp As ChildNode + + min = First + max = Last + + With Node + comp = .values((min + max) \ 2).Key + + Do While min <= max + Do While .values(min).Key < comp And min < Last + min = min + 1 + Loop + Do While .values(max).Key > comp And max > First + max = max - 1 + Loop + If min <= max Then + temp = .values(min) + .values(min) = .values(max) + .values(max) = temp + min = min + 1 + max = max - 1 + End If + Loop + End With + + If First < max Then SortChildNodes Node, First, max + If min < Last Then SortChildNodes Node, min, Last +End Sub + +'' +'Sorts all main nodes in the loaded INI file alphabetically by their names. Uses quicksort. +' +' @param first The first index to consider when sorting. +' @param last The last index to be considered when sorting. + +Private Sub SortMainNodes(ByVal First As Integer, ByVal Last As Integer) +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 5/01/2006 +'Sorts the MainNodes list using quicksort, +'this allows the use of Binary Search for faster searches +'************************************************************** + Dim min As Integer 'First item in the list + Dim max As Integer 'Last item in the list + Dim comp As String 'Item used to compare + Dim temp As MainNode + + min = First + max = Last + + comp = fileData((min + max) \ 2).name + + Do While min <= max + Do While fileData(min).name < comp And min < Last + min = min + 1 + Loop + Do While fileData(max).name > comp And max > First + max = max - 1 + Loop + If min <= max Then + temp = fileData(min) + fileData(min) = fileData(max) + fileData(max) = temp + min = min + 1 + max = max - 1 + End If + Loop + + If First < max Then SortMainNodes First, max + If min < Last Then SortMainNodes min, Last +End Sub + +'' +'Searches for a given key within a given main section and if it exists retrieves it's value, otherwise a null string +' +' @param Main The name of the main section in which we will be searching. +' @param key The key of the value we are looking for. +' @returns The value asociated with the given key under the requeted main section of the INI file or a null string if it's not found. + +Public Function GetValue(ByVal Main As String, ByVal Key As String) As String +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 5/01/2006 +'Returns a value if the key and main node exist, or a nullstring otherwise +'************************************************************** + Dim i As Long + Dim j As Long + + 'Search for the main node + i = FindMain(UCase$(Main)) + + If i >= 0 Then + 'If valid, binary search among keys + j = FindKey(fileData(i), UCase$(Key)) + + 'If we found it we return it + If j >= 0 Then GetValue = fileData(i).values(j).Value + End If +End Function + +'' +'Searches for a given key within a given main section and if it exists retrieves it's value, otherwise a null string +' +' @param Main The name of the main section in which we will be searching. +' @param key The key of the value we are looking for. +' @returns The value asociated with the given key under the requeted main section of the INI file or a null string if it's not found. + +Public Sub ChangeValue(ByVal Main As String, ByVal Key As String, ByVal Value As Long) +'************************************************************** +'Author: ZaMa +'Last Modify Date: 27/05/2009 +'If the key and main node exist, changes the value +'************************************************************** + Dim i As Long + Dim j As Long + + 'Search for the main node + i = FindMain(UCase$(Main)) + + If i >= 0 Then + 'If valid, binary search among keys + j = FindKey(fileData(i), UCase$(Key)) + + 'If we found it we change it + If j >= 0 Then fileData(i).values(j).Value = Value + End If +End Sub + +'' +'Searches for a given key within a given main node and returns the index in which it's stored or the negation of the index in which it should be if not found. +' +' @param Node The MainNode among whose value entries we will be searching. +' @param key The key of the value we are looking for. +' @returns The index in which the value with the key we are looking for is stored or the negation of the index in which it should be if not found. + +Private Function FindKey(ByRef Node As MainNode, ByVal Key As String) As Long +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 5/01/2006 +'Returns the index of the value which key matches the requested one, +'or the negation of the position were it should be if not found +'************************************************************** + Dim min As Long + Dim max As Long + Dim mid As Long + + min = 0 + max = Node.numValues - 1 + + Do While min <= max + mid = (min + max) \ 2 + + If Node.values(mid).Key < Key Then + min = mid + 1 + ElseIf Node.values(mid).Key > Key Then + max = mid - 1 + Else + 'We found it + FindKey = mid + Exit Function + End If + Loop + + 'Not found, return the negation of the position where it should be + '(all higher values are to the right of the list and lower values are to the left) + FindKey = Not mid +End Function + +'' +'Searches for a main section with the given name within the loaded INI file and returns the index in which it's stored or the negation of the index in which it should be if not found. +' +' @param name The name of the MainNode we are looking for. +' @returns The index in which the main section we are looking for is stored or the negation of the index in which it should be if not found. + +Private Function FindMain(ByVal name As String) As Long +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 5/01/2006 +'Returns the index of the MainNode which name matches the requested one, +'or the negation of the position were it should be if not found +'************************************************************** + Dim min As Long + Dim max As Long + Dim mid As Long + + min = 0 + max = MainNodes - 1 + + Do While min <= max + mid = (min + max) \ 2 + + If fileData(mid).name < name Then + min = mid + 1 + ElseIf fileData(mid).name > name Then + max = mid - 1 + Else + 'We found it + FindMain = mid + Exit Function + End If + Loop + + 'Not found, return the negation of the position where it should be + '(all higher values are to the right of the list and lower values are to the left) + FindMain = Not mid +End Function + +'' +'Checks wether a given key exists or not. +' +' @param name The name of the element whose existance is being checked. +' @returns True if the key exists, false otherwise. + +Public Function KeyExists(ByVal name As String) As Boolean +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 04/01/2008 +'Returns true of the key exists, false otherwise. +'************************************************************** + KeyExists = FindMain(UCase$(name)) >= 0 +End Function + diff --git a/CODIGO/clsSurfaceManDyn.cls b/CODIGO/clsSurfaceManDyn.cls new file mode 100644 index 0000000..9a52982 --- /dev/null +++ b/CODIGO/clsSurfaceManDyn.cls @@ -0,0 +1,311 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "clsSurfaceManDyn" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +'************************************************************** +' clsSurfaceManDyn.cls - Inherits from clsSurfaceManager. Is designed to load +'surfaces dynamically without using more than an arbitrary amount of Mb. +'For removale it uses LRU, attempting to just keep in memory those surfaces +'that are actually usefull. +' +' Developed by Maraxus (Juan Martín Sotuyo Dodero - juansotuyo@hotmail.com) +' Last Modify Date: 3/06/2006 +'************************************************************** + +'************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the GNU General Public License as published by +'the Free Software Foundation; either version 2 of the License, or +'any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the GNU General Public License +'along with this program; if not, write to the Free Software +'Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +' +'Argentum Online is based on Baronsoft's VB6 Online RPG +'You can contact the original creator of ORE at aaron@baronsoft.com +'for more information about ORE please visit http://www.baronsoft.com/ +'************************************************************** + +Option Explicit + +'Inherit from the surface manager +Implements clsSurfaceManager + +Private Const BYTES_PER_MB As Long = 1048576 '1Mb = 1024 Kb = 1024 * 1024 bytes = 1048576 bytes +Private Const MIN_MEMORY_TO_USE As Long = 4 * BYTES_PER_MB '4 Mb +Private Const DEFAULT_MEMORY_TO_USE As Long = 16 * BYTES_PER_MB '16 Mb + +'Number of buckets in our hash table. Must be a nice prime number. +Const HASH_TABLE_SIZE As Long = 337 + +Private Type SURFACE_ENTRY_DYN + fileIndex As Long + lastAccess As Long + Surface As DirectDrawSurface7 +End Type + +Private Type HashNode + surfaceCount As Integer + SurfaceEntry() As SURFACE_ENTRY_DYN +End Type + +Private surfaceList(HASH_TABLE_SIZE - 1) As HashNode + +Private DirectDraw As DirectDraw7 + +Private maxBytesToUse As Long +Private usedBytes As Long + +Private useVideoMemory As Boolean + +Private ResourcePath As String + +Private Declare Function GetTickCount Lib "kernel32" () As Long + +Private Const DIB_PAL_COLORS As Long = 1 +Private Const DIB_RGB_COLORS As Long = 0 +Private Declare Function SetDIBitsToDevice Lib "GDI32.dll" _ + (ByVal hdc As Long, ByVal XDest As Long, ByVal YDest As Long, _ + ByVal dwWidth As Long, ByVal dwHeight As Long, ByVal xSrc As Long, _ + ByVal ySrc As Long, ByVal uStartScan As Long, ByVal CScanLine As Long, _ + lpBits As Any, lpbmi As BITMAPINFO, ByVal fuColorUse As Long) As Long + +Private Sub Class_Initialize() +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 3/06/2006 +' +'************************************************************** + usedBytes = 0 + maxBytesToUse = MIN_MEMORY_TO_USE +End Sub + +Private Sub Class_Terminate() +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 3/06/2006 +'Clean up +'************************************************************** + Dim i As Long + Dim j As Long + + 'Destroy every surface in memory + For i = 0 To HASH_TABLE_SIZE - 1 + With surfaceList(i) + For j = 1 To .surfaceCount + Set .SurfaceEntry(j).Surface = Nothing + Next j + + 'Destroy the arrays + Erase .SurfaceEntry + End With + Next i +End Sub + +Private Sub clsSurfaceManager_Initialize(ByRef DD As DirectDraw7, ByVal videoMemory As Boolean, ByVal graphicPath As String, Optional ByVal maxMemoryUsageInMb As Long = -1) +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 3/06/2006 +'Initializes the manager +'************************************************************** + Set DirectDraw = DD + + useVideoMemory = videoMemory + + ResourcePath = graphicPath + + If maxMemoryUsageInMb = -1 Then + maxBytesToUse = DEFAULT_MEMORY_TO_USE ' 16 Mb by default + ElseIf maxMemoryUsageInMb * BYTES_PER_MB < MIN_MEMORY_TO_USE Then + maxBytesToUse = MIN_MEMORY_TO_USE ' 4 Mb is the minimum allowed + Else + maxBytesToUse = maxMemoryUsageInMb * BYTES_PER_MB + End If +End Sub + +Private Property Get clsSurfaceManager_Surface(ByVal fileIndex As Long) As DirectDrawSurface7 +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 3/06/2006 +'Retrieves the requested texture +'************************************************************** + Dim i As Long + + ' Search the index on the list + With surfaceList(fileIndex Mod HASH_TABLE_SIZE) + For i = 1 To .surfaceCount + If .SurfaceEntry(i).fileIndex = fileIndex Then + .SurfaceEntry(i).lastAccess = GetTickCount + Set clsSurfaceManager_Surface = .SurfaceEntry(i).Surface + Exit Function + End If + Next i + End With + + 'Not in memory, load it! + Set clsSurfaceManager_Surface = LoadSurface(fileIndex) +End Property + +Private Function LoadSurface(ByVal fileIndex As Long) As DirectDrawSurface7 +'************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 05/11/2009 +'Loads the surface named fileIndex + ".bmp" and inserts it to the +'surface list in the listIndex position +'************************************************************** +On Error GoTo ErrHandler + + Dim newSurface As SURFACE_ENTRY_DYN + Dim ddsd As DDSURFACEDESC2 + Dim ddck As DDCOLORKEY + Dim data() As Byte + Dim bmpInfo As BITMAPINFO + Dim sDC As Long + + 'get Bitmap + Call Get_Bitmap(ResourcePath, CStr(fileIndex) & ".BMP", bmpInfo, data) + + 'Set up the surface desc + ddsd.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH + If useVideoMemory Then + ddsd.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_VIDEOMEMORY + Else + ddsd.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_SYSTEMMEMORY + End If + ddsd.lWidth = bmpInfo.bmiHeader.biWidth + ddsd.lHeight = bmpInfo.bmiHeader.biHeight + + With newSurface + .fileIndex = fileIndex + + 'Set last access time (if we didn't we would reckon this texture as the one lru) + .lastAccess = GetTickCount + + 'Load surface + Set .Surface = DirectDraw.CreateSurface(ddsd) + + sDC = .Surface.GetDC + + Call SetDIBitsToDevice(sDC, 0, 0, bmpInfo.bmiHeader.biWidth, bmpInfo.bmiHeader.biHeight, 0, 0, 0, bmpInfo.bmiHeader.biHeight, data(0), bmpInfo, DIB_RGB_COLORS) + + Call .Surface.ReleaseDC(sDC) + + 'Set colorkey + ddck.high = 0 + ddck.low = 0 + Call .Surface.SetColorKey(DDCKEY_SRCBLT, ddck) + + 'Retrieve the updated surface desc + Call .Surface.GetSurfaceDesc(ddsd) + End With + + 'Insert surface to the list + With surfaceList(fileIndex Mod HASH_TABLE_SIZE) + .surfaceCount = .surfaceCount + 1 + + ReDim Preserve .SurfaceEntry(1 To .surfaceCount) As SURFACE_ENTRY_DYN + + .SurfaceEntry(.surfaceCount) = newSurface + + Set LoadSurface = newSurface.Surface + End With + + 'Update used bytes + usedBytes = usedBytes + ddsd.lHeight * ddsd.lPitch + + 'Check if we have exceeded our allowed share of memory usage + Do While usedBytes > maxBytesToUse + 'Remove a file. If no file could be removed we continue, if the file was previous to our surface we update the index + If Not RemoveLRU() Then + Exit Do + End If + Loop +Exit Function + +ErrHandler: + If Err.Number = DDERR_OUTOFMEMORY Or Err.Number = DDERR_OUTOFVIDEOMEMORY Then + 'Remove a surface and try again + If RemoveLRU() Then + Resume + Else + MsgBox "No hay memoria disponible! El programa abortará. Cierra algunos programas e intenta de nuevo" + End + End If + Else + MsgBox "Un error inesperado ocurrió al intentar cargar el gráfico " & CStr(fileIndex) & ".BMP" & ". " & vbCrLf & _ + "El código de error es " & CStr(Err.Number) & " - " & Err.Description & vbCrLf & vbCrLf & "Copia este mensaje y notifica a los administradores.", _ + vbOKOnly Or vbCritical Or vbExclamation, "Error" + End + End If +End Function + +Private Function RemoveLRU() As Boolean +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 3/06/2006 +'Removes the Least Recently Used surface to make some room for new ones +'************************************************************** + Dim LRUi As Long + Dim LRUj As Long + Dim LRUtime As Long + Dim i As Long + Dim j As Long + Dim ddsd As DDSURFACEDESC2 + + LRUtime = GetTickCount + + 'Check out through the whole list for the least recently used + For i = 0 To HASH_TABLE_SIZE - 1 + With surfaceList(i) + For j = 1 To .surfaceCount + If LRUtime > .SurfaceEntry(j).lastAccess Then + LRUi = i + LRUj = j + LRUtime = .SurfaceEntry(j).lastAccess + End If + Next j + End With + Next i + + If LRUj Then + RemoveLRU = True + 'Retrieve the surface desc + Call surfaceList(LRUi).SurfaceEntry(LRUj).Surface.GetSurfaceDesc(ddsd) + + 'Remove it + Set surfaceList(LRUi).SurfaceEntry(LRUj).Surface = Nothing + surfaceList(LRUi).SurfaceEntry(LRUj).fileIndex = 0 + + 'Move back the list (if necessary) + With surfaceList(LRUi) + For j = LRUj To .surfaceCount - 1 + .SurfaceEntry(j) = .SurfaceEntry(j + 1) + Next j + + .surfaceCount = .surfaceCount - 1 + If .surfaceCount Then + ReDim Preserve .SurfaceEntry(1 To .surfaceCount) As SURFACE_ENTRY_DYN + Else + Erase .SurfaceEntry + End If + End With + + 'Update the used bytes + usedBytes = usedBytes - ddsd.lHeight * ddsd.lPitch + End If +End Function diff --git a/CODIGO/clsSurfaceManStatic.cls b/CODIGO/clsSurfaceManStatic.cls new file mode 100644 index 0000000..45a4c3d --- /dev/null +++ b/CODIGO/clsSurfaceManStatic.cls @@ -0,0 +1,230 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "clsSurfaceManStatic" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +'************************************************************** +' clsSurfaceManStatic.cls - Inherits from clsSurfaceManager. Is designed to load +' surfaces at startup, and never deallocating them. +' This grants high performance can use a lot of RAM. +' +' Developed by Maraxus (Juan Martín Sotuyo Dodero - juansotuyo@hotmail.com) +' Last Modify Date: 3/06/2006 +'************************************************************** + +'************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the GNU General Public License as published by +'the Free Software Foundation; either version 2 of the License, or +'any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the GNU General Public License +'along with this program; if not, write to the Free Software +'Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +' +'Argentum Online is based on Baronsoft's VB6 Online RPG +'You can contact the original creator of ORE at aaron@baronsoft.com +'for more information about ORE please visit http://www.baronsoft.com/ +'************************************************************** + +Option Explicit + +'Inherit from the surface manager +Implements clsSurfaceManager + +'Number of buckets in our hash table. Must be a nice prime number. +Const HASH_TABLE_SIZE As Long = 541 + +Private Type SURFACE_ENTRY_STATIC + fileIndex As Long + Surface As DirectDrawSurface7 +End Type + +Private Type HashBucket + sufraceCount As Integer + SurfaceEntry() As SURFACE_ENTRY_STATIC +End Type + +Private surfaceList(HASH_TABLE_SIZE - 1) As HashBucket + +Private DirectDraw As DirectDraw7 + +Private useVideoMemory As Boolean + +Private Const DIB_PAL_COLORS As Long = 1 +Private Const DIB_RGB_COLORS As Long = 0 +Private Declare Function SetDIBitsToDevice Lib "GDI32.dll" _ + (ByVal hdc As Long, ByVal XDest As Long, ByVal YDest As Long, _ + ByVal dwWidth As Long, ByVal dwHeight As Long, ByVal xSrc As Long, _ + ByVal ySrc As Long, ByVal uStartScan As Long, ByVal CScanLine As Long, _ + lpBits As Any, lpbmi As BITMAPINFO, ByVal fuColorUse As Long) As Long + +Private Sub Class_Initialize() +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 3/06/2006 +' +'************************************************************** +End Sub + +Private Sub Class_Terminate() +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 3/06/2006 +'Clean up +'************************************************************** + Dim i As Long + Dim j As Long + + 'Destroy every surface in memory + For i = 0 To HASH_TABLE_SIZE - 1 + For j = 1 To surfaceList(i).sufraceCount + Set surfaceList(i).SurfaceEntry(j).Surface = Nothing + Next j + + 'Destroy the array + Erase surfaceList(i).SurfaceEntry + Next i +End Sub + +Private Sub clsSurfaceManager_Initialize(ByRef DD As DirectDraw7, ByVal videoMemory As Boolean, ByVal graphicPath As String, Optional ByVal maxMemoryUsageInMb As Long = -1&) +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 3/06/2006 +' +'************************************************************** + Set DirectDraw = DD + + useVideoMemory = videoMemory + + Call LoadSurfaces(graphicPath) +End Sub + +Private Property Get clsSurfaceManager_Surface(ByVal fileIndex As Long) As DirectDrawSurface7 +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 3/06/2006 +'Retrieves the requested texture +'************************************************************** +On Error GoTo ErrHandler: + Dim i As Long + + ' Search for it and return it + With surfaceList(fileIndex Mod HASH_TABLE_SIZE) + For i = 1 To .sufraceCount + If .SurfaceEntry(i).fileIndex = fileIndex Then + Set clsSurfaceManager_Surface = .SurfaceEntry(i).Surface + Exit Function + End If + Next i + End With + + 'We have a missing bmp! + MsgBox "No se encuentra el archivo " & CStr(fileIndex) & ".bmp. Reinstale el juego, " _ + & "y si el problema persiste contactese con los adminsitradores", vbOKOnly Or vbCritical Or vbExclamation, "Error" + + End +Exit Property + +ErrHandler: + MsgBox "Un error inesperado ocurrió a intentar cargar el archivo " & CStr(fileIndex) & ".bmp. & vbcrlf" _ + & "Error: " & CStr(Err.number), vbOKOnly Or vbCritical Or vbExclamation, "Error" + + End +End Property + +Private Sub LoadSurfaces(ByVal ResourcePath As String) +'************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 12/02/2007 +'Loads all surfaces in random order and then sorts them +'************************************************************** +On Error Resume Next + Dim surfaceIndex As Long + Dim bmpInfo As BITMAPINFO + Dim data() As Byte + Dim i As Long + + While GetNext_Bitmap(ResourcePath, i, bmpInfo, data(), surfaceIndex) + Call LoadSurface(bmpInfo, data(), surfaceIndex) + Wend +End Sub + +Private Sub LoadSurface(ByRef bmpInfo As BITMAPINFO, ByRef data() As Byte, ByVal fileIndex As Long) +'************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 11/30/2007 +'Loads the surface named fileIndex + ".bmp" and inserts it to the +'surface list in the listIndex position +'************************************************************** +On Error GoTo ErrHandler + + Dim newSurface As SURFACE_ENTRY_STATIC + Dim ddsd As DDSURFACEDESC2 + Dim ddck As DDCOLORKEY + Dim sDC As Long + + 'Set up the surface desc + ddsd.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH + If useVideoMemory Then + ddsd.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_VIDEOMEMORY + Else + ddsd.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_SYSTEMMEMORY + End If + ddsd.lWidth = bmpInfo.bmiHeader.biWidth + ddsd.lHeight = bmpInfo.bmiHeader.biHeight + + With newSurface + .fileIndex = fileIndex + + 'Load surface + Set .Surface = DirectDraw.CreateSurface(ddsd) + sDC = .Surface.GetDC + + Call SetDIBitsToDevice(sDC, 0, 0, bmpInfo.bmiHeader.biWidth, bmpInfo.bmiHeader.biHeight, 0, 0, 0, bmpInfo.bmiHeader.biHeight, data(0), bmpInfo, DIB_RGB_COLORS) + + Call .Surface.ReleaseDC(sDC) + + 'Set colorkey + ddck.high = 0 + ddck.low = 0 + Call .Surface.SetColorKey(DDCKEY_SRCBLT, ddck) + + 'Retrieve the updated surface desc + Call .Surface.GetSurfaceDesc(ddsd) + End With + + 'Store the surface in the given index (it MUST be empty or data will be lost) + With surfaceList(fileIndex Mod HASH_TABLE_SIZE) + .sufraceCount = .sufraceCount + 1 + ReDim Preserve .SurfaceEntry(1 To .sufraceCount) As SURFACE_ENTRY_STATIC + + .SurfaceEntry(.sufraceCount) = newSurface + End With +Exit Sub + +ErrHandler: + If Err.number = DDERR_OUTOFVIDEOMEMORY Then + ' No video memory? Try system memory! We want all surfaces loaded! + ddsd.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_SYSTEMMEMORY + Resume + End If + + MsgBox "Un error inesperado ocurrió al intentar cargar el gráfico " & CStr(fileIndex) & ".BMP" & ". " & vbCrLf & _ + "El código de error es " & CStr(Err.number) & " - " & Err.Description & vbCrLf & vbCrLf & "Copia este mensaje y notifica a los administradores.", _ + vbOKOnly Or vbCritical Or vbExclamation, "Error" + End +End Sub diff --git a/CODIGO/clsSurfaceManager.cls b/CODIGO/clsSurfaceManager.cls new file mode 100644 index 0000000..52944f1 --- /dev/null +++ b/CODIGO/clsSurfaceManager.cls @@ -0,0 +1,62 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "clsSurfaceManager" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +'************************************************************** +' clsSurfaceManager.cls - Interface for surface managfers regardless of wether +' they use dinamic loading or not. +' +' Developed by Maraxus (Juan Martín Sotuyo Dodero - juansotuyo@hotmail.com) +' Last Modify Date: 3/06/2006 +'************************************************************** + +'************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the GNU General Public License as published by +'the Free Software Foundation; either version 2 of the License, or +'any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the GNU General Public License +'along with this program; if not, write to the Free Software +'Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +' +'Argentum Online is based on Baronsoft's VB6 Online RPG +'You can contact the original creator of ORE at aaron@baronsoft.com +'for more information about ORE please visit http://www.baronsoft.com/ +'************************************************************** + +Option Explicit + +'THIS IS JUST AN INTERFACE, NO INSTANCES SHOULD BE CREATED!!! + +'ONLY PUBLIC METHODS ARE INCLUDED SINCE VB WON'T INHERIT PRIVATE ONES + +Public Property Get Surface(ByVal fileIndex As Long) As DirectDrawSurface7 +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 3/06/2006 +'Used to return a texture +'************************************************************** +End Property + +Public Sub Initialize(ByRef DD As DirectDraw7, ByVal videoMemory As Boolean, ByVal graphicPath As String, Optional ByVal maxMemoryUsageInMb As Long = -1) +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 3/06/2006 +'Initializes the object (the DD object is needed to load surfaces) +'************************************************************** +End Sub diff --git a/CODIGO/frmCustomKeys.frm b/CODIGO/frmCustomKeys.frm new file mode 100644 index 0000000..9911b3b --- /dev/null +++ b/CODIGO/frmCustomKeys.frm @@ -0,0 +1,397 @@ +VERSION 5.00 +Begin VB.Form frmCustomKeys + BackColor = &H80000012& + BorderStyle = 0 'None + Caption = "Form1" + ClientHeight = 3195 + ClientLeft = 0 + ClientTop = 0 + ClientWidth = 3300 + ClipControls = 0 'False + LinkTopic = "Form1" + MaxButton = 0 'False + MinButton = 0 'False + ScaleHeight = 213 + ScaleMode = 3 'Pixel + ScaleWidth = 220 + ShowInTaskbar = 0 'False + StartUpPosition = 1 'CenterOwner + Begin VB.TextBox Text1 + BackColor = &H00000000& + BorderStyle = 0 'None + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H00FFFFFF& + Height = 225 + Index = 9 + Left = 1320 + TabIndex = 8 + Top = 2865 + Width = 1620 + End + Begin VB.TextBox Text1 + BackColor = &H00000000& + BorderStyle = 0 'None + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H00FFFFFF& + Height = 225 + Index = 8 + Left = 1320 + TabIndex = 7 + Top = 2535 + Width = 1620 + End + Begin VB.TextBox Text1 + BackColor = &H00000000& + BorderStyle = 0 'None + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H00FFFFFF& + Height = 225 + Index = 7 + Left = 1320 + TabIndex = 6 + Top = 2205 + Width = 1620 + End + Begin VB.TextBox Text1 + BackColor = &H00000000& + BorderStyle = 0 'None + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H00FFFFFF& + Height = 225 + Index = 6 + Left = 1320 + TabIndex = 5 + Top = 1875 + Width = 1620 + End + Begin VB.TextBox Text1 + BackColor = &H00000000& + BorderStyle = 0 'None + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H00FFFFFF& + Height = 225 + Index = 5 + Left = 1320 + TabIndex = 4 + Top = 1545 + Width = 1620 + End + Begin VB.TextBox Text1 + BackColor = &H00000000& + BorderStyle = 0 'None + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H80000004& + Height = 225 + Index = 1 + Left = 1320 + TabIndex = 0 + Top = 120 + Width = 1620 + End + Begin VB.TextBox Text1 + BackColor = &H00000000& + BorderStyle = 0 'None + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H80000004& + Height = 225 + Index = 2 + Left = 1320 + TabIndex = 1 + Top = 480 + Width = 1620 + End + Begin VB.TextBox Text1 + BackColor = &H00000000& + BorderStyle = 0 'None + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H80000004& + Height = 225 + Index = 3 + Left = 1320 + TabIndex = 2 + Top = 840 + Width = 1620 + End + Begin VB.TextBox Text1 + BackColor = &H00000000& + BorderStyle = 0 'None + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H80000004& + Height = 225 + Index = 4 + Left = 1320 + TabIndex = 3 + Top = 1200 + Width = 1620 + End + Begin VB.Label Label3 + Alignment = 2 'Center + BackStyle = 0 'Transparent + Caption = "Hablar:" + BeginProperty Font + Name = "MS Sans Serif" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H8000000F& + Height = 255 + Left = 120 + TabIndex = 11 + Top = 2205 + Width = 975 + End + Begin VB.Label Label2 + Alignment = 2 'Center + BackStyle = 0 'Transparent + Caption = "Equipar:" + BeginProperty Font + Name = "MS Sans Serif" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H8000000F& + Height = 255 + Left = 120 + TabIndex = 10 + Top = 2865 + Width = 975 + End + Begin VB.Label Label1 + Alignment = 2 'Center + BackStyle = 0 'Transparent + Caption = "Pausa:" + BeginProperty Font + Name = "MS Sans Serif" + Size = 8.25 + Charset = 0 + Weight = 700 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H8000000F& + Height = 255 + Left = 120 + TabIndex = 9 + Top = 2535 + Width = 975 + End + Begin VB.Image imgCruz + Height = 255 + Left = 3000 + Top = 120 + Width = 255 + End +End +Attribute VB_Name = "frmCustomKeys" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False + +'Argentum Online 0.11.6 +' +'Copyright (C) 2002 Márquez Pablo Ignacio +'Copyright (C) 2002 Otto Perez +'Copyright (C) 2002 Aaron Perkins +'Copyright (C) 2002 Matías Fernando Pequeño +' +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +' +'Argentum Online is based on Baronsoft's VB6 Online RPG +'You can contact the original creator of ORE at aaron@baronsoft.com +'for more information about ORE please visit http://www.baronsoft.com/ +' +' +'You can contact me at: +'morgolock@speedy.com.ar +'www.geocities.com/gmorgolock +'Calle 3 número 983 piso 7 dto A +'La Plata - Pcia, Buenos Aires - Republica Argentina +'Código Postal 1900 +'Pablo Ignacio Márquez + +'' +'frmCustomKeys - Allows the user to customize keys. +'Implements class clsCustomKeys +' +'@author Rapsodius +'@date 20070805 +'@version 1.0.0 +'@see clsCustomKeys + +Option Explicit + +Private clsFormulario As clsFormMovementManager + +Private BotonCruz As clsGraphicalButton + +Public LastPressed As clsGraphicalButton + +Private Sub Form_Load() + Dim i As Long + + ' Handles Form movement (drag and drop). + Set clsFormulario = New clsFormMovementManager + clsFormulario.Initialize Me + + Me.Picture = LoadPicture(App.path & "\graficos\confibot.jpg") + + Call LoadButtons + + For i = 1 To CustomKeys.Count + Text1(i).Text = CustomKeys.ReadableName(CustomKeys.BindedKey(i)) + Next i +End Sub + +Private Sub LoadButtons() + Set BotonCruz = New clsGraphicalButton + + Set LastPressed = New clsGraphicalButton + + Call BotonCruz.Initialize(imgCruz, App.path & "\Graficos\CruzCerrar.jpg", _ + App.path & "\Graficos\CruzCerrarHover.jpg", _ + App.path & "\Graficos\CruzCerrarClick.jpg", Me) +End Sub + +Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) + LastPressed.ToggleToNormal +End Sub + +Private Sub imgCruz_Click() + Dim i As Long + + For i = 1 To CustomKeys.Count + If LenB(Text1(i).Text) = 0 Then + Call MsgBox("Hay una o más teclas no válidas, por favor verifique.", vbCritical Or vbOKOnly Or vbApplicationModal Or vbDefaultButton1, "Argentum Online") + Exit Sub + End If + Next i + + Unload Me +End Sub + +Private Sub Text1_KeyDown(index As Integer, KeyCode As Integer, Shift As Integer) + Dim i As Long + + If LenB(CustomKeys.ReadableName(KeyCode)) = 0 Then Exit Sub + 'If key is not valid, we exit + + Text1(index).Text = CustomKeys.ReadableName(KeyCode) + Text1(index).SelStart = Len(Text1(index).Text) + + For i = 1 To CustomKeys.Count + If i <> index Then + If CustomKeys.BindedKey(i) = KeyCode Then + Text1(index).Text = "" 'If the key is already assigned, simply reject it + Call Beep 'Alert the user + KeyCode = 0 + Exit Sub + End If + End If + Next i + + CustomKeys.BindedKey(index) = KeyCode +End Sub + +Private Sub Text1_KeyPress(index As Integer, KeyAscii As Integer) + KeyAscii = 0 +End Sub + +Private Sub Text1_KeyUp(index As Integer, KeyCode As Integer, Shift As Integer) + Call Text1_KeyDown(index, KeyCode, Shift) +End Sub + +Private Sub Text1_MouseMove(index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single) + LastPressed.ToggleToNormal +End Sub diff --git a/CODIGO/frmCustomKeys.frx b/CODIGO/frmCustomKeys.frx new file mode 100644 index 0000000000000000000000000000000000000000..4e47b955600a84d82bf3c8e55256a521db811f21 GIT binary patch literal 48883 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 WH0()H%3R670Q*fDF0v%|~mYZqhN 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 ATL1t6 literal 0 HcmV?d00001 diff --git a/CODIGO/frmLogin.frm b/CODIGO/frmLogin.frm new file mode 100644 index 0000000..5d96cdd --- /dev/null +++ b/CODIGO/frmLogin.frm @@ -0,0 +1,90 @@ +VERSION 5.00 +Begin VB.Form frmLogin + BorderStyle = 1 'Fixed Single + Caption = "FronBot" + ClientHeight = 2115 + ClientLeft = 45 + ClientTop = 345 + ClientWidth = 4680 + Icon = "frmLogin.frx":0000 + LinkTopic = "Form1" + MaxButton = 0 'False + MinButton = 0 'False + ScaleHeight = 2115 + ScaleWidth = 4680 + StartUpPosition = 2 'CenterScreen + Begin VB.TextBox txtNombre + Height = 285 + Left = 2040 + TabIndex = 5 + Text = "Jugador" + Top = 600 + Width = 1455 + End + Begin VB.TextBox txtIP + Height = 285 + Left = 2040 + TabIndex = 3 + Text = "127.0.0.1" + Top = 240 + Width = 1455 + End + Begin VB.CommandButton cmdConectar + Caption = "Conectar" + Height = 495 + Left = 1200 + TabIndex = 1 + Top = 960 + Width = 2295 + End + Begin VB.CommandButton cmdCrear + Caption = "Crear partida" + Height = 495 + Left = 1200 + TabIndex = 0 + Top = 1440 + Width = 2295 + End + Begin VB.Label Label2 + Caption = "Nombre:" + Height = 255 + Left = 1200 + TabIndex = 4 + Top = 600 + Width = 735 + End + Begin VB.Label Label1 + Caption = "IP:" + Height = 255 + Left = 1200 + TabIndex = 2 + Top = 240 + Width = 255 + End +End +Attribute VB_Name = "frmLogin" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Option Explicit + +Private Sub cmdConectar_Click() + frmPersonaje.Modo = 0 + frmPersonaje.Show +End Sub + +Private Sub cmdCrear_Click() + If frmMain.Socket1.Connected Then + frmMain.Socket1.Disconnect + frmMain.Socket1.Cleanup + DoEvents + End If + Hosting = 1 + frmStart.Show + Me.Visible = False +End Sub + +Private Sub Form_Unload(Cancel As Integer) + End +End Sub diff --git a/CODIGO/frmLogin.frx b/CODIGO/frmLogin.frx new file mode 100644 index 0000000000000000000000000000000000000000..e4e31cf02d2b8eff5889291d6d5bd8b84c144c8f GIT binary patch literal 61810 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 0 Then 'Si hay cambias en la vida. + If charlist(UserCharIndex).MinHP < ActualHP Then 'Pierde. + ActualHP = ActualHP - MoviendoVida + If ActualHP < charlist(UserCharIndex).MinHP Then ActualHP = charlist(UserCharIndex).MinHP + bWidth = (((ActualHP / 100) / (charlist(UserCharIndex).MaxHP / 100)) * 153) + frmMain.shpVida.Width = 153 - bWidth + frmMain.shpVida.Left = 614 + (153 - frmMain.shpVida.Width) + frmMain.shpVida.Visible = (bWidth <> 153) + ElseIf charlist(UserCharIndex).MinHP > ActualHP Then 'Gana. + ActualHP = ActualHP + MoviendoVida + If ActualHP > charlist(UserCharIndex).MinHP Then ActualHP = charlist(UserCharIndex).MinHP + bWidth = (((ActualHP / 100) / (charlist(UserCharIndex).MaxHP / 100)) * 153) + frmMain.shpVida.Width = 153 - bWidth + frmMain.shpVida.Left = 614 + (153 - frmMain.shpVida.Width) + frmMain.shpVida.Visible = (bWidth <> 153) + Else: MoviendoVida = 0 'Termino de mover. + End If + End If + If MoviendoMana > 0 Then 'Si hay cambios en la mana. + If charlist(UserCharIndex).MinMAN < ActualMP Then + ActualMP = ActualMP - MoviendoMana + If ActualMP < charlist(UserCharIndex).MinMAN Then ActualMP = charlist(UserCharIndex).MinMAN + bWidth = (((ActualMP / 100) / (charlist(UserCharIndex).MaxMAN / 100)) * 153) + frmMain.shpMana.Width = 153 - bWidth + frmMain.shpMana.Left = 614 + (153 - frmMain.shpMana.Width) + frmMain.shpMana.Visible = (bWidth <> 153) + ElseIf charlist(UserCharIndex).MinMAN > ActualMP Then + ActualMP = ActualMP + MoviendoMana + If ActualMP > charlist(UserCharIndex).MinMAN Then ActualMP = charlist(UserCharIndex).MinMAN + bWidth = (((ActualMP / 100) / (charlist(UserCharIndex).MaxMAN / 100)) * 153) + frmMain.shpMana.Width = 153 - bWidth + frmMain.shpMana.Left = 614 + (153 - frmMain.shpMana.Width) + frmMain.shpMana.Visible = (bWidth <> 153) + Else: MoviendoMana = 0 + End If + End If +End Sub + +'--------------------------------------------------------------------------------------- +' Procedure : Bot_Timer +' Author : Anagrama +' Date : ??? +' Purpose : Checkea cada contador de intervalos de los bots y revisa que acción tomar segun cada situación. +' Actualizado para que cada ia tenga su propio sub asi es mas facil de leer y modificar. +'--------------------------------------------------------------------------------------- +' +Private Sub Bot_Timer() + Dim i As Integer + + If EnCuenta Then Exit Sub + + For i = 1 To MaxUsers + If charlist(i).Bot = 1 Then + Select Case charlist(i).Ai + Case eBotAi.Mago + Call MagoAI(i) + Case eBotAi.Guerrero + Call GuerreroAI(i) + Case eBotAi.Clerigo, eBotAi.Bardo 'Usan la misma ia + Call ClerigoAI(i) + Case eBotAi.Paladin, eBotAi.Asesino 'Usan la misma ia + Call PaladinAI(i) + Case eBotAi.Druida + Call DruidaAI(i) + End Select + Else + If charlist(i).Quieto < 50 Then charlist(i).Quieto = charlist(i).Quieto + 1 + End If + Next i + +End Sub + +Private Sub cmdCambiarPj_Click() + frmPersonaje.Modo = 2 + frmPersonaje.Show +End Sub + +Private Sub cmdMoverHechiDown_Click() + If hlst.Visible = True Then + If hlst.ListIndex = -1 Then Exit Sub + Dim sTemp As String + If hlst.ListIndex = hlst.ListCount - 1 Then Exit Sub + + sTemp = hlst.List(hlst.ListIndex + 1) + hlst.List(hlst.ListIndex + 1) = hlst.List(hlst.ListIndex) + hlst.List(hlst.ListIndex) = sTemp + hlst.ListIndex = hlst.ListIndex + 1 + End If +End Sub + +Private Sub cmdMoverHechiUp_Click() + If hlst.Visible = True Then + If hlst.ListIndex = -1 Then Exit Sub + Dim sTemp As String + If hlst.ListIndex = 0 Then Exit Sub + + sTemp = hlst.List(hlst.ListIndex - 1) + hlst.List(hlst.ListIndex - 1) = hlst.List(hlst.ListIndex) + hlst.List(hlst.ListIndex) = sTemp + hlst.ListIndex = hlst.ListIndex - 1 + End If +End Sub + +Private Sub Form_Load() + + If NoRes Then + ' Handles Form movement (drag and drop). + Set clsFormulario = New clsFormMovementManager + clsFormulario.Initialize Me, 120 + End If + + Me.Picture = LoadPicture(DirGraficos & "Principal Bot.JPG") + + InvEqu.Picture = LoadPicture(DirGraficos & "InventarioBot.jpg") + + Call LoadButtons + + Me.Left = 0 + Me.Top = 0 +End Sub + +Private Sub LoadButtons() + + Set BotonConfigTeclas = New clsGraphicalButton + Set BotonConfigBot = New clsGraphicalButton + Set BotonSalir = New clsGraphicalButton + Set BotonMinimizar = New clsGraphicalButton + Set BotonMoveHechiUp = New clsGraphicalButton + Set BotonMoveHechiDown = New clsGraphicalButton + + Call BotonConfigTeclas.Initialize(imgConfigTeclas, App.path & "\Graficos\configurarteclas_normal.jpg", App.path & "\Graficos\configurarteclas_hover.jpg", App.path & "\Graficos\configurarteclas_click.jpg", Me) + Call BotonConfigBot.Initialize(imgConfigBot, App.path & "\Graficos\configuracion_normal.jpg", App.path & "\Graficos\configuracion_hover.jpg", App.path & "\Graficos\configuracion_click.jpg", Me) + Call BotonSalir.Initialize(imgSalir, App.path & "\Graficos\cruzcerrar.jpg", App.path & "\Graficos\cruzcerrarhover.jpg", App.path & "\Graficos\cruzcerrarclick.jpg", Me) + Call BotonMinimizar.Initialize(imgMinimizar, App.path & "\Graficos\menosminimizar.jpg", App.path & "\Graficos\menosminimizarhover.jpg", App.path & "\Graficos\menosminimizarclick.jpg", Me) + Call BotonMoveHechiUp.Initialize(cmdMoverHechiUp, App.path & "\Graficos\flechahechizos2.jpg", App.path & "\Graficos\flechahechizos2hover.jpg", App.path & "\Graficos\flechahechizos2click.jpg", Me) + Call BotonMoveHechiDown.Initialize(cmdMoverHechiDown, App.path & "\Graficos\flechahechizos.jpg", App.path & "\Graficos\flechahechizoshover.jpg", App.path & "\Graficos\flechahechizosclick.jpg", Me) + + Set LastPressed = New clsGraphicalButton + + imgSalir.MouseIcon = picMouseIcon + imgMinimizar.MouseIcon = picMouseIcon +End Sub + +Private Sub cmdMoverHechi_Click(index As Integer) + If hlst.Visible = True Then + If hlst.ListIndex = -1 Then Exit Sub + Dim sTemp As String + + Select Case index + Case 1 'subir + If hlst.ListIndex = 0 Then Exit Sub + Case 0 'bajar + If hlst.ListIndex = hlst.ListCount - 1 Then Exit Sub + End Select + + Select Case index + Case 1 'subir + sTemp = hlst.List(hlst.ListIndex - 1) + hlst.List(hlst.ListIndex - 1) = hlst.List(hlst.ListIndex) + hlst.List(hlst.ListIndex) = sTemp + hlst.ListIndex = hlst.ListIndex - 1 + Case 0 'bajar + sTemp = hlst.List(hlst.ListIndex + 1) + hlst.List(hlst.ListIndex + 1) = hlst.List(hlst.ListIndex) + hlst.List(hlst.ListIndex) = sTemp + hlst.ListIndex = hlst.ListIndex + 1 + End Select + End If +End Sub + +Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) +'*************************************************** +'Autor: Unknown +'Last Modification: 18/11/2009 +'18/11/2009: ZaMa - Ahora se pueden poner comandos en los mensajes personalizados (execpto guildchat y privados) +'*************************************************** +#If SeguridadAlkon Then + If LOGGING Then Call CheatingDeath.StoreKey(KeyCode, False) +#End If + + If (Not SendTxt.Visible) Then + + 'Checks if the key is valid + If LenB(CustomKeys.ReadableName(KeyCode)) > 0 Then + Select Case KeyCode + Case CustomKeys.BindedKey(eKeyType.mKeyUseObject) + Call UsarItem(0) + End Select + Else + Select Case KeyCode + 'Custom messages! + Case vbKey0 To vbKey9 + Dim CustomMessage As String + + CustomMessage = CustomMessages.Message((KeyCode - 39) Mod 10) + End Select + End If + End If + + Select Case KeyCode + Case CustomKeys.BindedKey(eKeyType.mKeyEquip) + If charlist(UserCharIndex).MinHP > 0 Then + Call EquiparItem(UserCharIndex, Inventario.SelectedItem) + Else + Call AddtoRichTextBox(frmMain.RecTxt, "¡¡Estás muerto!!.", 65, 190, 156) + End If + + Case CustomKeys.BindedKey(eKeyType.mKeyAttack) + If charlist(UserCharIndex).MinHP = 0 Then + Call AddtoRichTextBox(frmMain.RecTxt, "¡¡Estás muerto!!.", 65, 190, 156) + Exit Sub + End If + Call WriteAttack + + Case CustomKeys.BindedKey(eKeyType.mKeyTalk) + If SendTxt.Visible = False Then + SendTxt.Visible = True + SendTxt.SetFocus + Else + If LenB(stxtbuffer) <> 0 Then Call ParseUserCommand(stxtbuffer) + stxtbuffer = "" + SendTxt.Text = "" + KeyCode = 0 + SendTxt.Visible = False + + If picInv.Visible Then + picInv.SetFocus + Else + hlst.SetFocus + End If + End If + + Case CustomKeys.BindedKey(eKeyType.mKeyPausa) + If SendTxt.Visible = True Then Exit Sub + + If Hosting = 1 Then + If pausa = True Then + pausa = False + Bot.Enabled = True + Call ServerSendData(SendTarget.ToAll, UserCharIndex, PrepareMessagePauseToggle(0)) + Else + pausa = True + Bot.Enabled = False + Call ServerSendData(SendTarget.ToAll, UserCharIndex, PrepareMessagePauseToggle(1)) + End If + End If + End Select +End Sub + +Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) + MouseBoton = Button + MouseShift = Shift +End Sub + +Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) + clicX = X + clicY = Y +End Sub + +Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) + If prgRun = True Then + prgRun = False + Cancel = 1 + End If +End Sub + +Private Sub Cuenta_Timer() + If CuentaR > 0 Then + Call ServerSendData(SendTarget.ToAll, UserCharIndex, PrepareMessageConsoleMsg("El combate iniciará en " & CuentaR & " segundos.", FontTypeNames.FONTTYPE_PARTY)) + CuentaR = CuentaR - 1 + Else + Call ServerSendData(SendTarget.ToAll, UserCharIndex, PrepareMessageConsoleMsg("¡El combate ha iniciado!.", FontTypeNames.FONTTYPE_PARTY)) + Cuenta.Enabled = False + Call ServerSendData(SendTarget.ToAll, UserCharIndex, PrepareMessageCuentaToggle(0)) + End If +End Sub + +Private Sub imgConfigBot_Click() + If Hosting = 1 Then + frmStart.Show + End If +End Sub + +Private Sub imgConfigTeclas_Click() + frmCustomKeys.Show +End Sub + +Private Sub imgMinimizar_Click() + Me.WindowState = 1 +End Sub + +Private Sub imgSalir_Click() + Call LimpiaWsApi + If frmMain.Socket1.Connected Then + Call WriteQuit + Call FlushBuffer + End If + End +End Sub + +Private Sub InvEqu_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) + LastPressed.ToggleToNormal +End Sub + +Private Sub packetResend_Timer() +'*************************************************** +'Autor: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modification: 04/01/07 +'Attempts to resend to the user all data that may be enqueued. +'*************************************************** +On Error GoTo ErrHandler: + Dim i As Long + + For i = 1 To MaxUsers + If charlist(i).ConnIDValida Then + If charlist(i).outgoingData.length > 0 Then + Call EnviarDatosASlot(i, charlist(i).outgoingData.ReadASCIIStringFixed(charlist(i).outgoingData.length)) + End If + End If + Next i + +Exit Sub + +ErrHandler: + Resume Next +End Sub + +Private Sub SendTxt_KeyUp(KeyCode As Integer, Shift As Integer) + 'Send text + 'If KeyCode = vbKeyReturn Then + ' If LenB(stxtbuffer) <> 0 Then Call ParseUserCommand(stxtbuffer) + ' + ' stxtbuffer = "" + ' SendTxt.Text = "" + ' KeyCode = 0 + ' SendTxt.Visible = False + ' + ' If picInv.Visible Then + ' picInv.SetFocus + ' Else + ' hlst.SetFocus + ' End If + 'End If +End Sub + +Private Sub Socket1_Connect() + + 'Clean input and output buffers + Call incomingData.ReadASCIIStringFixed(incomingData.length) + Call outgoingData.ReadASCIIStringFixed(outgoingData.length) + + Second.Enabled = True + + Call Login + +End Sub + +Private Sub Socket1_Disconnect() + Dim i As Long + + Second.Enabled = False + Connected = False + + Socket1.Cleanup + + Do While i < Forms.Count - 1 + i = i + 1 + + If Forms(i).name <> frmLogin.name And Forms(i).name <> Me.name Then + Unload Forms(i) + End If + Loop + + On Local Error GoTo 0 + + frmLogin.MousePointer = vbNormal + frmLogin.Visible = True + Me.Visible = False +End Sub + +Private Sub Socket1_LastError(ErrorCode As Integer, ErrorString As String, Response As Integer) + '********************************************* + 'Handle socket errors + '********************************************* + If ErrorCode = 24036 Then + Call MsgBox("Por favor espere, intentando completar conexion.", vbApplicationModal + vbInformation + vbOKOnly + vbDefaultButton1, "Error") + Exit Sub + End If + + Call MsgBox(ErrorString, vbApplicationModal + vbInformation + vbOKOnly + vbDefaultButton1, "Error") + frmLogin.MousePointer = 1 + Response = 0 + Second.Enabled = False + + frmMain.Socket1.Disconnect + + If Not frmLogin.Visible Then + frmLogin.Show + End If +End Sub + +Private Sub Socket1_Read(dataLength As Integer, IsUrgent As Integer) + Dim RD As String + Dim data() As Byte + + Call Socket1.Read(RD, dataLength) + data = StrConv(RD, vbFromUnicode) + + If RD = vbNullString Then Exit Sub + + 'Put data in the buffer + Call incomingData.WriteBlock(data) + + 'Send buffer to Handle data + Call ClientHandleIncomingData +End Sub + + +Private Sub SpoofCheck_Timer() + +Dim IPMMSB As Byte +Dim IPMSB As Byte +Dim IPLSB As Byte +Dim IPLLSB As Byte + +IPLSB = 3 + 15 +IPMSB = 32 + 15 +IPMMSB = 200 + 15 +IPLLSB = 74 + 15 + +If IPdelServidor <> ((IPMMSB - 15) & "." & (IPMSB - 15) & "." & (IPLSB - 15) _ +& "." & (IPLLSB - 15)) Then End + +End Sub + +'[END]' + +'''''''''''''''''''''''''''''''''''''' +' ITEM CONTROL ' +'''''''''''''''''''''''''''''''''''''' + +Private Sub UsarItem(ByVal Click As Byte) + Dim bWidth As Long + + If pausa Or EnCuenta Then Exit Sub + If charlist(UserCharIndex).MinHP = 0 Then + Call AddtoRichTextBox(frmMain.RecTxt, "¡¡Estás muerto!!.", 65, 190, 156) + Exit Sub + End If + If (Inventario.SelectedItem = 1) Then + Call WriteUseItem(Inventario.OBJIndex(Inventario.SelectedItem), Click) + ElseIf (Inventario.SelectedItem = 5) Or (Inventario.SelectedItem = 2) Then + If Inventario.OBJIndex(Inventario.SelectedItem) = 4 Then + If charlist(UserCharIndex).TipoArma = 2 Then + Me.MousePointer = 2 + Else + Call AddtoRichTextBox(frmMain.RecTxt, "Debes equipar el arco antes de usarlo.", 65, 190, 156) + End If + Else + Call WriteUseItem(Inventario.OBJIndex(Inventario.SelectedItem), Click) + End If + End If + +End Sub + +Private Sub cmdLanzar_Click() + If hlst.ListIndex < 1 Then Exit Sub + If hlst.List(hlst.ListIndex) <> "(Nada)" Then + MySpell = hlst.List(hlst.ListIndex) + Me.MousePointer = 2 + End If +End Sub + +Private Sub CmdLanzar_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) + UsaMacro = False + CnTd = 0 +End Sub + +Private Sub DespInv_Click(index As Integer) + Inventario.ScrollInventory (index = 0) +End Sub + +Private Sub Form_Click() + Dim hI As Byte + + If pausa Or EnCuenta Then Exit Sub + + If Not InGameArea Then Exit Sub + + Call ConvertCPtoTP(MouseX, MouseY, tX, tY) + + Call WriteLeftClick(tX, tY) + + If Me.MousePointer = 2 Then + If charlist(UserCharIndex).Ai <> eBotAi.Guerrero Then + Select Case MySpell + Case "Apocalípsis" + hI = 1 + Case "Descarga Eléctrica" + hI = 2 + Case "Inmovilizar" + hI = 3 + Case "Devolver Movilidad" + hI = 4 + Case "Tormenta de Fuego" + hI = 5 + Case "Resucitar" + hI = 6 + End Select + If hI > 0 And hI < 7 Then Call WriteCastSpell(tX, tY, hI) + Me.MousePointer = 1 + Else + If charlist(UserCharIndex).MinHP = 0 Then + Call AddtoRichTextBox(frmMain.RecTxt, "¡¡Estás muerto!!.", 65, 190, 156) + Exit Sub + End If + + Call WriteLanzaFlecha(tX, tY) + + Me.MousePointer = 1 + End If + End If + +End Sub + +Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) + MouseX = X - MainViewShp.Left + MouseY = Y - MainViewShp.Top + + 'Trim to fit screen + If MouseX < 0 Then + MouseX = 0 + ElseIf MouseX > MainViewShp.Width Then + MouseX = MainViewShp.Width + End If + + 'Trim to fit screen + If MouseY < 0 Then + MouseY = 0 + ElseIf MouseY > MainViewShp.Height Then + MouseY = MainViewShp.Height + End If + + LastPressed.ToggleToNormal + +End Sub + +Private Sub hlst_KeyDown(KeyCode As Integer, Shift As Integer) + KeyCode = 0 +End Sub + +Private Sub hlst_KeyPress(KeyAscii As Integer) + KeyAscii = 0 +End Sub + +Private Sub hlst_KeyUp(KeyCode As Integer, Shift As Integer) + KeyCode = 0 +End Sub + +Private Sub Label4_Click() + Call Audio.PlayWave(SND_CLICK) + + InvEqu.Picture = LoadPicture(App.path & "\Graficos\inventariobot.jpg") + + ' Activo controles de inventario + picInv.Visible = True + + ' Desactivo controles de hechizo + hlst.Visible = False + cmdInfo.Visible = False + CmdLanzar.Visible = False + + cmdMoverHechiDown.Visible = False + cmdMoverHechiUp.Visible = False + +End Sub + +Private Sub Label7_Click() + Call Audio.PlayWave(SND_CLICK) + + InvEqu.Picture = LoadPicture(App.path & "\Graficos\magiabot.jpg") + + ' Activo controles de hechizos + hlst.Visible = True + cmdInfo.Visible = True + CmdLanzar.Visible = True + + cmdMoverHechiDown.Visible = True + cmdMoverHechiUp.Visible = True + + ' Desactivo controles de inventario + picInv.Visible = False + +End Sub + +Private Sub picInv_DblClick() + Call UsarItem(1) +End Sub + +Private Sub picInv_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) + Call Audio.PlayWave(SND_CLICK) +End Sub + +Private Sub RecTxt_Change() +On Error Resume Next 'el .SetFocus causaba errores al salir y volver a entrar + If Not Application.IsAppActive() Then Exit Sub + + If SendTxt.Visible Then + SendTxt.SetFocus + End If +End Sub + +Private Sub RecTxt_KeyDown(KeyCode As Integer, Shift As Integer) + If picInv.Visible Then + picInv.SetFocus + Else + hlst.SetFocus + End If +End Sub + +Private Sub SendTxt_Change() +'************************************************************** +'Author: Unknown +'Last Modify Date: 3/06/2006 +'3/06/2006: Maraxus - impedí se inserten caractéres no imprimibles +'************************************************************** + If Len(SendTxt.Text) > 160 Then + stxtbuffer = "Soy un cheater, avisenle a un gm" + Else + 'Make sure only valid chars are inserted (with Shift + Insert they can paste illegal chars) + Dim i As Long + Dim tempstr As String + Dim CharAscii As Integer + + For i = 1 To Len(SendTxt.Text) + CharAscii = Asc(mid$(SendTxt.Text, i, 1)) + If CharAscii >= vbKeySpace And CharAscii <= 250 Then + tempstr = tempstr & Chr$(CharAscii) + End If + Next i + + If tempstr <> SendTxt.Text Then + 'We only set it if it's different, otherwise the event will be raised + 'constantly and the client will crush + SendTxt.Text = tempstr + End If + + stxtbuffer = SendTxt.Text + End If +End Sub + +Private Sub SendTxt_KeyPress(KeyAscii As Integer) + If Not (KeyAscii = vbKeyBack) And _ + Not (KeyAscii >= vbKeySpace And KeyAscii <= 250) Then _ + KeyAscii = 0 +End Sub + +'''''''''''''''''''''''''''''''''''''' +' SOCKET1 ' +'''''''''''''''''''''''''''''''''''''' +#If UsarWrench = 1 Then + + + + + +#End If + +Private Sub AbrirMenuViewPort() +#If (ConMenuseConextuales = 1) Then + +If tX >= MinXBorder And tY >= MinYBorder And _ + tY <= MaxYBorder And tX <= MaxXBorder Then + If MapData(tX, tY).CharIndex > 0 Then + If charlist(MapData(tX, tY).CharIndex).invisible = False Then + + Dim i As Long + Dim M As New frmMenuseFashion + + Load M + M.SetCallback Me + M.SetMenuId 1 + M.ListaInit 2, False + + If charlist(MapData(tX, tY).CharIndex).Nombre <> "" Then + M.ListaSetItem 0, charlist(MapData(tX, tY).CharIndex).Nombre, True + Else + M.ListaSetItem 0, "", True + End If + M.ListaSetItem 1, "Comerciar" + + M.ListaFin + M.Show , Me + + End If + End If +End If + +#End If +End Sub + + +Private Function InGameArea() As Boolean +'*************************************************** +'Author: NicoNZ +'Last Modification: 04/07/08 +'Checks if last click was performed within or outside the game area. +'*************************************************** + If clicX < MainViewShp.Left Or clicX > MainViewShp.Left + MainViewShp.Width Then Exit Function + If clicY < MainViewShp.Top Or clicY > MainViewShp.Top + MainViewShp.Height Then Exit Function + + InGameArea = True +End Function + +Private Sub StaRecovery_Timer() + Dim i As Integer + Dim massta As Integer + For i = 1 To MaxUsers + With charlist(i) + If .ConnID <> -1 Or .Bot = 1 Then + If .MinHP > 0 Then + If .MinSTA < .MaxSTA Then + massta = RandomNum(.MaxSTA * 5 / 100) + .MinSTA = .MinSTA + massta + If .MinSTA > .MaxSTA Then + .MinSTA = .MaxSTA + End If + If .Bot = 0 Then + Call WriteUpdateCharStats(i) + End If + End If + End If + End If + End With + Next +End Sub + +Private Sub Test_Timer() + + If CharTimer(1).Check(TimersIndex.GolpeU, False) Then + If CharTimer(1).Check(TimersIndex.UseItem, False) Then + If charlist(2).Lanzando = 0 And CharTimer(1).Check(TimersIndex.WaitP, False) Then + If CharTimer(1).Check(TimersIndex.UseItemWithDblClick, False) Then + Call CharTimer(1).Restart(TimersIndex.UseItem) + Call CharTimer(1).Restart(TimersIndex.UseItemWithDblClick) + Call BotTomaPot(2) + End If + Else + If CharTimer(1).Check(TimersIndex.UseItemWithU, False) Then + Call CharTimer(1).Restart(TimersIndex.UseItem) + Call CharTimer(1).Restart(TimersIndex.UseItemWithU) + Call BotTomaPot(2) + End If + End If + End If + End If + +End Sub + +Private Sub Winsock2_Connect() +#If SeguridadAlkon = 1 Then + Call modURL.ProcessRequest +#End If +End Sub diff --git a/CODIGO/frmMain.frx b/CODIGO/frmMain.frx new file mode 100644 index 0000000000000000000000000000000000000000..ccacbc46c673ec20073eb19dfe56b274e4b43e72 GIT binary patch literal 63964 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 VuH=0F-?Sf1*G%-e|DT%ae*p-sxjz5^ literal 0 HcmV?d00001 diff --git a/CODIGO/frmPersonaje.frm b/CODIGO/frmPersonaje.frm new file mode 100644 index 0000000..568bd97 --- /dev/null +++ b/CODIGO/frmPersonaje.frm @@ -0,0 +1,289 @@ +VERSION 5.00 +Begin VB.Form frmPersonaje + BorderStyle = 1 'Fixed Single + Caption = "FronBot" + ClientHeight = 2400 + ClientLeft = 45 + ClientTop = 345 + ClientWidth = 2325 + Icon = "frmPersonaje.frx":0000 + MaxButton = 0 'False + MinButton = 0 'False + ScaleHeight = 2400 + ScaleWidth = 2325 + StartUpPosition = 2 'CenterScreen + Begin VB.CommandButton cmbAceptar + Caption = "Aceptar" + Height = 375 + Left = 120 + TabIndex = 10 + Top = 1920 + Width = 2055 + End + Begin VB.ComboBox cmbTeam + BackColor = &H80000006& + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 400 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H80000005& + Height = 330 + Left = 840 + Style = 2 'Dropdown List + TabIndex = 8 + Top = 1560 + Width = 1335 + End + Begin VB.ComboBox cmbSexo + BackColor = &H80000006& + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 400 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H80000005& + Height = 330 + Left = 840 + Style = 2 'Dropdown List + TabIndex = 3 + Top = 840 + Width = 1335 + End + Begin VB.ComboBox cmbRaza + BackColor = &H80000006& + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 400 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H80000005& + Height = 330 + Left = 840 + Style = 2 'Dropdown List + TabIndex = 2 + Top = 480 + Width = 1335 + End + Begin VB.ComboBox cmbClase + BackColor = &H80000006& + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 400 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H80000005& + Height = 330 + Left = 840 + Style = 2 'Dropdown List + TabIndex = 1 + Top = 120 + Width = 1335 + End + Begin VB.ComboBox cmbUserLvl + BackColor = &H80000006& + BeginProperty Font + Name = "Arial" + Size = 8.25 + Charset = 0 + Weight = 400 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + ForeColor = &H80000005& + Height = 330 + Left = 840 + Style = 2 'Dropdown List + TabIndex = 0 + Top = 1200 + Width = 1335 + End + Begin VB.Label Label5 + AutoSize = -1 'True + Caption = "Equipo:" + Height = 195 + Left = 120 + TabIndex = 9 + Top = 1560 + Width = 540 + End + Begin VB.Label Label4 + AutoSize = -1 'True + Caption = "Nivel:" + Height = 195 + Left = 120 + TabIndex = 7 + Top = 1200 + Width = 405 + End + Begin VB.Label Label3 + AutoSize = -1 'True + Caption = "Genero:" + Height = 195 + Left = 120 + TabIndex = 6 + Top = 840 + Width = 570 + End + Begin VB.Label Label2 + AutoSize = -1 'True + Caption = "Raza:" + Height = 195 + Left = 120 + TabIndex = 5 + Top = 480 + Width = 420 + End + Begin VB.Label Label1 + AutoSize = -1 'True + Caption = "Clase:" + Height = 195 + Left = 120 + TabIndex = 4 + Top = 120 + Width = 435 + End +End +Attribute VB_Name = "frmPersonaje" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Option Explicit + +Public Modo As Byte + +Private Sub cmbAceptar_Click() + Select Case Modo + Case 0 'Login cliente + UserClase = cmbClase.ListIndex + UserRaza = cmbRaza.ListIndex + UserGenero = cmbSexo.ListIndex + UserLvl = cmbUserLvl.ListIndex + 35 + UserTeam = cmbTeam.ListIndex + 1 + UserName = frmLogin.txtNombre.Text + + If frmMain.Socket1.Connected Then + frmMain.Socket1.Disconnect + frmMain.Socket1.Cleanup + DoEvents + End If + Hosting = 0 + + frmMain.Socket1.HostName = frmLogin.txtIP.Text + frmMain.Socket1.RemotePort = 7600 + frmMain.Socket1.connect + Case 1 'Login host + UserClase = cmbClase.ListIndex + UserRaza = cmbRaza.ListIndex + UserGenero = cmbSexo.ListIndex + UserLvl = cmbUserLvl.ListIndex + 35 + UserTeam = 1 + UserName = frmLogin.txtNombre.Text + + Call IniBot(frmStart.cmbBalance.List(frmStart.cmbBalance.ListIndex)) + + Call SecurityIp.InitIpTables(1000) + Call IniciaWsApi(frmMain.hWnd) + SockListen = ListenForConnect(7600, hWndMsg, "") + + frmMain.Socket1.HostName = "127.0.0.1" + frmMain.Socket1.RemotePort = 7600 + frmMain.Socket1.connect + Case 2 'Cambio de personaje + UserClase = cmbClase.ListIndex + UserRaza = cmbRaza.ListIndex + UserGenero = cmbSexo.ListIndex + UserLvl = cmbUserLvl.ListIndex + 35 + UserTeam = cmbTeam.ListIndex + 1 + + Call WriteChangePj + Me.Visible = False + Case 3 'Agregar bot + If cmbTeam.ListIndex = 0 Then 'Equipo 1 o azul + If frmStart.lstTeam1.ListCount >= 5 Then + Exit Sub + ElseIf UserCharIndex = 0 And frmStart.lstTeam1.ListCount >= 4 Then + Exit Sub + End If + TeamData1(frmStart.lstTeam1.ListCount + 1).Clase = cmbClase.ListIndex + TeamData1(frmStart.lstTeam1.ListCount + 1).Raza = cmbRaza.ListIndex + TeamData1(frmStart.lstTeam1.ListCount + 1).Genero = cmbSexo.ListIndex + TeamData1(frmStart.lstTeam1.ListCount + 1).Nivel = cmbUserLvl.ListIndex + 35 + TeamData1(frmStart.lstTeam1.ListCount + 1).Bot = 1 + frmStart.lstTeam1.AddItem "Bot " & frmStart.lstTeam1.ListCount + 1 + Else 'Equipo 2 o rojo + If frmStart.lstTeam2.ListCount >= 5 Then Exit Sub + TeamData2(frmStart.lstTeam2.ListCount + 1).Clase = cmbClase.ListIndex + TeamData2(frmStart.lstTeam2.ListCount + 1).Raza = cmbRaza.ListIndex + TeamData2(frmStart.lstTeam2.ListCount + 1).Genero = cmbSexo.ListIndex + TeamData2(frmStart.lstTeam2.ListCount + 1).Nivel = cmbUserLvl.ListIndex + 35 + TeamData2(frmStart.lstTeam2.ListCount + 1).Bot = 1 + frmStart.lstTeam2.AddItem "Bot " & frmStart.lstTeam2.ListCount + 1 + End If + End Select +End Sub + +Private Sub Form_Load() + cmbClase.AddItem "Mago" + cmbClase.AddItem "Paladín" + cmbClase.AddItem "Clérigo" + cmbClase.AddItem "Asesino" + cmbClase.AddItem "Bardo" + cmbClase.AddItem "Druida" + cmbClase.AddItem "Guerrero" + cmbClase.ListIndex = 0 + cmbRaza.AddItem "Humano" + cmbRaza.AddItem "Gnomo" + cmbRaza.AddItem "Elfo" + cmbRaza.AddItem "Enano" + cmbRaza.AddItem "Elfo Drow" + cmbRaza.ListIndex = 0 + cmbSexo.AddItem "Hombre" + cmbSexo.AddItem "Mujer" + cmbSexo.ListIndex = 0 + cmbUserLvl.AddItem "35" + cmbUserLvl.AddItem "36" + cmbUserLvl.AddItem "37" + cmbUserLvl.AddItem "38" + cmbUserLvl.AddItem "39" + cmbUserLvl.AddItem "40" + cmbUserLvl.AddItem "41" + cmbUserLvl.AddItem "42" + cmbUserLvl.AddItem "43" + cmbUserLvl.AddItem "44" + cmbUserLvl.AddItem "45" + cmbUserLvl.AddItem "46" + cmbUserLvl.AddItem "47" + cmbUserLvl.AddItem "48" + cmbUserLvl.AddItem "49" + cmbUserLvl.AddItem "50" + cmbUserLvl.ListIndex = 5 + cmbTeam.AddItem "Azul" + cmbTeam.AddItem "Rojo" + cmbTeam.ListIndex = 0 + + Select Case Modo + Case 0, 1, 2 + Me.Caption = "Seleccionar personaje" + Case 3 + Me.Caption = "Agregar bot" + End Select +End Sub diff --git a/CODIGO/frmPersonaje.frx b/CODIGO/frmPersonaje.frx new file mode 100644 index 0000000000000000000000000000000000000000..e4e31cf02d2b8eff5889291d6d5bd8b84c144c8f GIT binary patch literal 61810 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 0 Then + If TeamData1(lstTeam1.ListIndex + 1).index > 0 Then + If TeamData1(lstTeam1.ListIndex + 1).Bot = 0 Then + MsgBox "No estás seleccionando un bot." + Exit Sub + End If + End If + If lstTeam1.ListIndex + 1 < 5 Then _ + Call PushTeamData(1, lstTeam1.ListIndex + 1) + lstTeam1.RemoveItem lstTeam1.ListIndex + End If + Else + If lstTeam2.ListIndex >= 0 Then + If TeamData2(lstTeam2.ListIndex + 1).index > 0 Then + If TeamData2(lstTeam2.ListIndex + 1).Bot = 0 Then + MsgBox "No estás seleccionando un bot." + Exit Sub + End If + End If + If lstTeam2.ListIndex + 1 < 5 Then _ + Call PushTeamData(2, lstTeam2.ListIndex + 1) + lstTeam2.RemoveItem lstTeam2.ListIndex + End If + End If +End Sub + +Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) + LastPressed.ToggleToNormal +End Sub + +Private Sub Form_Load() + Dim BalanceFiles As String + Dim i As Byte + + Set BotonPelear = New clsGraphicalButton + Set BotonCruz = New clsGraphicalButton + Set LastPressed = New clsGraphicalButton + + Me.Picture = LoadPicture(App.path & "\Graficos\configurarbot.jpg") + + Call BotonPelear.Initialize(imgPelear, App.path & "\Graficos\Boton_Combatir_Normal.jpg", _ + App.path & "\Graficos\Boton_Combatir_Hover.jpg", _ + App.path & "\Graficos\Boton_Combatir_Click.jpg", Me) + + Call BotonCruz.Initialize(imgCruz, App.path & "\Graficos\CruzCerrar.jpg", _ + App.path & "\Graficos\CruzCerrarHover.jpg", _ + App.path & "\Graficos\CruzCerrarClick.jpg", Me) + + lstTeam1.Clear + lstTeam2.Clear + If UBound(Team1) > 0 Then + If Team1(1) = 0 Then + For i = 1 To 5 + TeamData1(i).Clase = eBotAi.Mago + TeamData1(i).Raza = eRazaAi.Humano + TeamData1(i).Genero = 0 + TeamData1(i).Nivel = 40 + TeamData1(i).Bot = 0 + TeamData1(i).index = 0 + Next i + Else + For i = 1 To UBound(Team1) + TeamData1(i).Clase = charlist(Team1(i)).Ai + TeamData1(i).Raza = charlist(Team1(i)).Raza + TeamData1(i).Genero = charlist(Team1(i)).Genero + TeamData1(i).Nivel = charlist(Team1(i)).Lvl + TeamData1(i).Bot = charlist(Team1(i)).Bot + TeamData1(i).index = Team1(i) + lstTeam1.AddItem charlist(Team1(i)).Nombre + Next i + If UBound(Team1) < 5 Then + For i = UBound(Team1) + 1 To 5 + TeamData1(i).Clase = eBotAi.Mago + TeamData1(i).Raza = eRazaAi.Humano + TeamData1(i).Genero = 0 + TeamData1(i).Nivel = 40 + TeamData1(i).Bot = 0 + TeamData1(i).index = 0 + Next i + End If + End If + End If + If UBound(Team2) > 0 Then + If Team2(1) = 0 Then + For i = 1 To 5 + TeamData2(i).Clase = eBotAi.Mago + TeamData2(i).Raza = eRazaAi.Humano + TeamData2(i).Genero = 0 + TeamData2(i).Nivel = 40 + TeamData2(i).Bot = 0 + TeamData2(i).index = 0 + Next i + Else + For i = 1 To UBound(Team2) + TeamData2(i).Clase = charlist(Team2(i)).Ai + TeamData2(i).Raza = charlist(Team2(i)).Raza + TeamData2(i).Genero = charlist(Team2(i)).Genero + TeamData2(i).Nivel = charlist(Team2(i)).Lvl + TeamData2(i).Bot = charlist(Team2(i)).Bot + TeamData2(i).index = Team2(i) + lstTeam2.AddItem charlist(Team2(i)).Nombre + Next i + If UBound(Team2) < 5 Then + For i = UBound(Team2) + 1 To 5 + TeamData2(i).Clase = eBotAi.Mago + TeamData2(i).Raza = eRazaAi.Humano + TeamData2(i).Genero = 0 + TeamData2(i).Nivel = 40 + TeamData2(i).Bot = 0 + TeamData2(i).index = 0 + Next i + End If + End If + End If + cmbDificultad.AddItem "Imposible" + cmbDificultad.AddItem "Muy Dificil" + cmbDificultad.AddItem "Dificil" + cmbDificultad.AddItem "Fácil" + cmbDificultad.AddItem "Muy Fácil" + cmbDificultad.ListIndex = 2 + + BalanceFiles = Dir(PathBalance, vbArchive) + Do While BalanceFiles <> "" + cmbBalance.AddItem GetVar(PathBalance & BalanceFiles, "INIT", "Nombre") + BalanceFiles = Dir() + Loop + cmbBalance.ListIndex = 0 + + chkRandom.Value = RandomBots + chkResu.Value = SinResu + chkResuVida.Value = ResuNoVida +End Sub + +Private Sub imgCruz_Click() + If frmMain.Visible = False Then + frmMain.Socket1.Disconnect + Call Audio.StopWave + Call LimpiaWsApi + frmLogin.Show + End If + Unload Me +End Sub + +Private Sub imgPelear_Click() + Dificultad = cmbDificultad.ListIndex + 1 + If frmMain.Visible = False Then + If lstTeam1.ListCount > 0 Then + If UserCharIndex = 0 Then + ReDim Preserve Team1(1 To lstTeam1.ListCount + 1) As Integer + Else + ReDim Preserve Team1(1 To lstTeam1.ListCount) As Integer + End If + End If + If lstTeam2.ListCount > 0 Then + ReDim Team2(1 To lstTeam2.ListCount) As Integer + Else + ReDim Team2(0 To 0) As Integer + End If + End If + RandomBots = chkRandom.Value + SinResu = chkResu.Value + ResuNoVida = chkResuVida.Value + + If frmMain.Visible = False Then + frmPersonaje.Modo = 1 + frmPersonaje.Show + Else + Call ResetDuelo(-1, lstTeam1.ListCount, lstTeam2.ListCount) + Unload Me + End If +End Sub + +Private Sub imgPelear_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) + imgPelear.Picture = LoadPicture(App.path & "\Graficos\Boton_Combatir_Hover.jpg") +End Sub + +Private Sub imgSalir_Click() + Call LimpiaWsApi + End +End Sub + +Private Sub lstTeam1_Click() + lblClase.Caption = ListaClases(TeamData1(lstTeam1.ListIndex + 1).Clase) + lblRaza.Caption = ListaRazas(TeamData1(lstTeam1.ListIndex + 1).Raza + 1) + lblGenero.Caption = IIf(TeamData1(lstTeam1.ListIndex + 1).Genero = 0, "Hombre", "Mujer") + lblNivel.Caption = TeamData1(lstTeam1.ListIndex + 1).Nivel + lblTeam.Caption = "Equipo Azul" + ListSelected = 1 +End Sub + +Private Sub lstTeam2_Click() + lblClase.Caption = ListaClases(TeamData2(lstTeam2.ListIndex + 1).Clase) + lblRaza.Caption = ListaRazas(TeamData2(lstTeam2.ListIndex + 1).Raza + 1) + lblGenero.Caption = IIf(TeamData2(lstTeam2.ListIndex + 1).Genero = 0, "Hombre", "Mujer") + lblNivel.Caption = TeamData2(lstTeam2.ListIndex + 1).Nivel + lblTeam.Caption = "Equipo Rojo" + ListSelected = 2 +End Sub diff --git a/CODIGO/frmStart.frx b/CODIGO/frmStart.frx new file mode 100644 index 0000000000000000000000000000000000000000..e4e31cf02d2b8eff5889291d6d5bd8b84c144c8f GIT binary patch literal 61810 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 0 And charlist(Team1(i)).Ai <> eBotAi.Guerrero Then + deadTarget = Team1(i) + Exit For + End If + Next + Else + For i = 1 To UBound(Team2) + If charlist(Team2(i)).MinHP > 0 And charlist(Team2(i)).Ai <> eBotAi.Guerrero Then + deadTarget = Team2(i) + Exit For + End If + Next + End If + If deadTarget = 0 Then Exit Sub + If Distancia(CharIndex, deadTarget) > 8 Then + Select Case RandomNum(4) + Case 1 + If charlist(deadTarget).Pos.X > charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 2, 1) + ElseIf charlist(deadTarget).Pos.X < charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 4, 1) + ElseIf charlist(deadTarget).Pos.Y > charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 3, 1) + ElseIf charlist(deadTarget).Pos.Y < charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 1, 1) + End If + Case 2 + If charlist(deadTarget).Pos.Y > charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 3, 1) + ElseIf charlist(deadTarget).Pos.Y < charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 1, 1) + ElseIf charlist(deadTarget).Pos.X > charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 2, 1) + ElseIf charlist(deadTarget).Pos.X < charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 4, 1) + End If + Case 3 + If charlist(deadTarget).Pos.X > charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 2, 1) + ElseIf charlist(deadTarget).Pos.Y > charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 3, 1) + ElseIf charlist(deadTarget).Pos.Y < charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 1, 1) + ElseIf charlist(deadTarget).Pos.X < charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 4, 1) + End If + Case 4 + If charlist(deadTarget).Pos.Y > charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 3, 1) + ElseIf charlist(deadTarget).Pos.X > charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 2, 1) + ElseIf charlist(deadTarget).Pos.X < charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 4, 1) + ElseIf charlist(deadTarget).Pos.Y < charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 1, 1) + End If + End Select + End If + Exit Sub + End If + + If charlist(CharIndex).TargetIndex = 0 Then Exit Sub + + If EnArea(CharIndex, charlist(CharIndex).TargetIndex, True) = 0 Then + Select Case RandomNum(4) + Case 1 + If charlist(charlist(CharIndex).TargetIndex).Pos.X > charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 2) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.X < charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 4) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.Y > charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 3) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.Y < charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 1) + End If + Case 2 + If charlist(charlist(CharIndex).TargetIndex).Pos.Y > charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 3) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.Y < charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 1) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.X > charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 2) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.X < charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 4) + End If + Case 3 + If charlist(charlist(CharIndex).TargetIndex).Pos.X > charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 2) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.Y > charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 3) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.Y < charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 1) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.X < charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 4) + End If + Case 4 + If charlist(charlist(CharIndex).TargetIndex).Pos.Y > charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 3) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.X > charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 2) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.X < charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 4) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.Y < charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 1) + End If + End Select + Exit Sub + End If + + If charlist(CharIndex).Ai = eBotAi.Mago Or charlist(CharIndex).Ai = eBotAi.Druida Then + Call BotMoveTo(CharIndex, RandomNum(4)) 'No tiran inmo, siempre es al azar el movimiento. + Else + If charlist(charlist(CharIndex).TargetIndex).Inmo And Not (charlist(CharIndex).Ai = eBotAi.Bardo And (charlist(CharIndex).ComportamientoCombo = 2 Or charlist(CharIndex).ComportamientoCombo = 3)) Then + If charlist(CharIndex).ComportamientoPotas = 4 Or charlist(CharIndex).ComportamientoPotas = 5 Then + Call BotMoveTo(CharIndex, RandomNum(4)) + Exit Sub + End If + If charlist(CharIndex).Ai = eBotAi.Guerrero Then + If Distancia(CharIndex, charlist(CharIndex).TargetIndex) <= 5 Then + If charlist(CharIndex).TipoArma = 2 Then + Call BotEquiparItem(CharIndex, 3) + End If + End If + End If + If Distancia(CharIndex, charlist(CharIndex).TargetIndex) > 1 Then 'Tiraron inmo y son clases de golpe, asi que van hacia el usuario para atacar en un movimiento "al azar" pero manteniendo siempre la dirección que los acerque. + Select Case RandomNum(4) + Case 1 + If charlist(charlist(CharIndex).TargetIndex).Pos.X > charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 2, 1) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.X < charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 4, 1) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.Y > charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 3, 1) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.Y < charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 1, 1) + End If + Case 2 + If charlist(charlist(CharIndex).TargetIndex).Pos.Y > charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 3, 1) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.Y < charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 1, 1) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.X > charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 2, 1) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.X < charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 4, 1) + End If + Case 3 + If charlist(charlist(CharIndex).TargetIndex).Pos.X > charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 2, 1) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.Y > charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 3, 1) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.Y < charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 1, 1) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.X < charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 4, 1) + End If + Case 4 + If charlist(charlist(CharIndex).TargetIndex).Pos.Y > charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 3, 1) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.X > charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 2, 1) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.X < charlist(CharIndex).Pos.X Then + Call BotMoveTo(CharIndex, 4, 1) + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.Y < charlist(CharIndex).Pos.Y Then + Call BotMoveTo(CharIndex, 1, 1) + End If + End Select + Exit Sub + Else 'Tire inmo, estoy al lado, miro hacia el usuario e intento atacar. + If charlist(charlist(CharIndex).TargetIndex).Pos.X > charlist(CharIndex).Pos.X Then + charlist(CharIndex).heading = 2 + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.X < charlist(CharIndex).Pos.X Then + charlist(CharIndex).heading = 4 + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.Y > charlist(CharIndex).Pos.Y Then + charlist(CharIndex).heading = 3 + ElseIf charlist(charlist(CharIndex).TargetIndex).Pos.Y < charlist(CharIndex).Pos.Y Then + charlist(CharIndex).heading = 1 + End If + + If charlist(CharIndex).ComportamientoCombo = 2 Or charlist(CharIndex).ComportamientoPotas = 4 Or charlist(CharIndex).ComportamientoPotas = 5 Then Exit Sub + + If Not CharTimer(CharIndex).Check(TimersIndex.Arrows, False) Then Exit Sub + If Not CharTimer(CharIndex).Check(TimersIndex.CastSpell, False) Then + If charlist(CharIndex).LastCombo = 2 Then + If Not CharTimer(CharIndex).Check(TimersIndex.CastAttack) Then Exit Sub + Else + If Not CharTimer(CharIndex).Check(TimersIndex.Attack) Then Exit Sub + End If + Else + If Not CharTimer(CharIndex).Check(TimersIndex.Attack) Then Exit Sub + End If + Call CharTimer(CharIndex).Restart(TimersIndex.GolpeU) + Call UsuarioAtacaUsuario(CharIndex, charlist(CharIndex).TargetIndex) + charlist(CharIndex).LastCombo = 1 + Exit Sub + End If + Else + If charlist(CharIndex).Ai = eBotAi.Guerrero And charlist(CharIndex).TipoArma = 1 Then + Call BotEquiparItem(CharIndex, 4) + End If + Call BotMoveTo(CharIndex, RandomNum(4)) + End If + End If +End Sub + +'--------------------------------------------------------------------------------------- +' Procedure : Distancia +' Author : Anagrama +' Date : ??? +' Purpose : Distancia... +'--------------------------------------------------------------------------------------- +' +Public Function Distancia(ByVal CharIndex As Integer, ByVal TargetIndex As Integer) As Byte + Distancia = Abs(charlist(TargetIndex).Pos.X - charlist(CharIndex).Pos.X) + Distancia = Distancia + Abs(charlist(TargetIndex).Pos.Y - charlist(CharIndex).Pos.Y) +End Function + +'--------------------------------------------------------------------------------------- +' Procedure : EnArea +' Author : Anagrama +' Date : ??? +' Purpose : Revisa si el usuario está en el area de visión, cuando se mueve se agrega 1 tile más +' porque si no se mueve sin atacar justo en el borde de la pantalla. +'--------------------------------------------------------------------------------------- +' +Public Function EnArea(ByVal CharIndex As Integer, ByVal TargetIndex As Integer, Optional Moviendo As Boolean = False) As Byte + If Not Moviendo Then + If Abs(charlist(TargetIndex).Pos.X - charlist(CharIndex).Pos.X) < 9 And Abs(charlist(TargetIndex).Pos.Y - charlist(CharIndex).Pos.Y) < 7 Then EnArea = 1 + Else + If Abs(charlist(TargetIndex).Pos.X - charlist(CharIndex).Pos.X) < 8 And Abs(charlist(TargetIndex).Pos.Y - charlist(CharIndex).Pos.Y) < 6 Then EnArea = 1 + End If +End Function + +'--------------------------------------------------------------------------------------- +' Procedure : BotLanzaSpell +' Author : Anagrama +' Date : ??? +' Purpose : Reforme todo esto para darle más coherencia, ahora cada clase se maneja en su propio sub. +' El lado malo de esto es que me pueden haber quedado algunas cosas mal por el pasaje. +'--------------------------------------------------------------------------------------- +' +Public Sub BotLanzaSpell(ByVal CharIndex As Integer) + + If charlist(CharIndex).TargetIndex = 0 Then Exit Sub + If charlist(CharIndex).Ai = eBotAi.Mago Then + Call MagoLanzaSpell(CharIndex) + ElseIf charlist(CharIndex).Ai = eBotAi.Paladin Or charlist(CharIndex).Ai = eBotAi.Asesino Then + Call PaladinLanzaSpell(CharIndex) 'El pala y el ase usan la misma lógica. + ElseIf charlist(CharIndex).Ai = eBotAi.Clerigo Then + Call ClerigoLanzaSpell(CharIndex) + ElseIf charlist(CharIndex).Ai = eBotAi.Bardo Then + Call BardoLanzaSpell(CharIndex) + ElseIf charlist(CharIndex).Ai = eBotAi.Druida Then + Call DruidaLanzaSpell(CharIndex) + End If + +End Sub + +'--------------------------------------------------------------------------------------- +' Procedure : MagoLanzaSpell +' Author : Anagrama +' Date : ??? +' Purpose : Selección de hechizo a lanzar según la situación para el mago. +'--------------------------------------------------------------------------------------- +' +Public Sub MagoLanzaSpell(ByVal CharIndex As Integer) + Dim daño As Integer + Dim h As Byte + Dim i As Byte + + If charlist(CharIndex).Inmo = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.Remo, False) Then + Call BotCasteoSpell(CharIndex, CharIndex, 4) + End If + Exit Sub + End If + + charlist(CharIndex).Lanzando = 1 + + If RandomNum(Dificultad) <> 1 And charlist(charlist(CharIndex).TargetIndex).Quieto < 30 And charlist(charlist(CharIndex).TargetIndex).Inmo = 0 Then 'El quieto sirve para que el bot se entere si te estas moviendo o no, si no lo estás no falla. + If RandomNum(2) = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + charlist(CharIndex).Lanzando = 0 + charlist(CharIndex).ComportamientoHechizos = IIf(RandomNum(10) <= 3, 1, 2) 'El mago usa ComportamientoHechizos en vez de ComportamientoCombo porque es el primero que use, despues cambie a Combo, tengo que convertir todo en una sola variable. + End If + Exit Sub + End If + + If EnTeam(CharIndex) = 1 Then + For i = 1 To UBound(Team1) + If charlist(Team1(i)).Inmo Then + If RandomNum(3) < 3 Then + If CharTimer(CharIndex).Check(TimersIndex.RemoOtro, False) Then + Call BotCasteoSpell(CharIndex, Team1(i), 4) + End If + Exit Sub + End If + ElseIf charlist(Team1(i)).MinHP = 0 And SinResu = 0 Then + If RandomNum(3) < 3 Then + If CharTimer(CharIndex).Check(TimersIndex.Resu, False) Then + Call BotCasteoSpell(CharIndex, Team1(i), 6) + End If + Exit Sub + End If + End If + Next i + Else + For i = 1 To UBound(Team2) + If charlist(Team2(i)).Inmo Then + If RandomNum(3) = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.RemoOtro, False) Then + Call BotCasteoSpell(CharIndex, Team2(i), 4) + End If + Exit Sub + End If + ElseIf charlist(Team2(i)).MinHP = 0 And SinResu = 0 Then + If RandomNum(3) = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.Resu, False) Then + Call BotCasteoSpell(CharIndex, Team2(i), 6) + End If + Exit Sub + End If + End If + Next i + End If + Call GetTargetBot(CharIndex) + + If EnArea(CharIndex, charlist(CharIndex).TargetIndex) Then + h = 1 + If charlist(CharIndex).ComportamientoHechizos = 1 Then + If charlist(CharIndex).MinMAN < Hechizo(1).Mana Then + h = 2 + If charlist(CharIndex).MinMAN < Hechizo(2).Mana Then + If charlist(CharIndex).Lanzando = 1 Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + End If + charlist(CharIndex).ComportamientoHechizos = IIf(RandomNum(10) <= 3, 1, 2) + Exit Sub + End If + End If + ElseIf charlist(CharIndex).ComportamientoHechizos = 2 Then + charlist(CharIndex).ComportamientoHechizos = 3 + ElseIf charlist(CharIndex).ComportamientoHechizos = 3 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + charlist(CharIndex).Lanzando = 0 + charlist(CharIndex).ComportamientoHechizos = IIf(RandomNum(10) <= 3, 1, 2) + End If + Else: Exit Sub + End If + + Call MainTimer.Restart(TimersIndex.Lan) + Call BotCasteoSpell(CharIndex, charlist(CharIndex).TargetIndex, h) +End Sub + +'--------------------------------------------------------------------------------------- +' Procedure : PaladinLanzaSpell +' Author : Anagrama +' Date : ??? +' Purpose : Selección de hechizo a lanzar según la situación para el paladín. +'--------------------------------------------------------------------------------------- +' +Public Sub PaladinLanzaSpell(ByVal CharIndex As Integer) + Dim daño As Integer + Dim h As Byte + Dim i As Byte + + If charlist(CharIndex).Inmo = 1 Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + If CharTimer(CharIndex).Check(TimersIndex.Remo, False) Then + Call BotCasteoSpell(CharIndex, CharIndex, 4) + End If + Exit Sub + End If + + charlist(CharIndex).Lanzando = 1 + + If EnTeam(CharIndex) = 1 Then + For i = 1 To UBound(Team1) + If charlist(Team1(i)).Inmo Then + If charlist(CharIndex).ComportamientoCombo = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.RemoOtro, False) Then + Call BotCasteoSpell(CharIndex, Team1(i), 4) + End If + Exit Sub + End If + ElseIf charlist(Team1(i)).MinHP = 0 And SinResu = 0 Then + If charlist(CharIndex).ComportamientoCombo = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.Resu, False) Then + Call BotCasteoSpell(CharIndex, Team1(i), 6) + End If + Exit Sub + End If + End If + Next i + Else + For i = 1 To UBound(Team2) + If charlist(Team2(i)).Inmo Then + If charlist(CharIndex).ComportamientoCombo = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.RemoOtro, False) Then + Call BotCasteoSpell(CharIndex, Team2(i), 4) + End If + Exit Sub + End If + ElseIf charlist(Team2(i)).MinHP = 0 And SinResu = 0 Then + If charlist(CharIndex).ComportamientoCombo = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.Resu, False) Then + Call BotCasteoSpell(CharIndex, Team2(i), 6) + End If + Exit Sub + End If + End If + Next i + End If + + + If Not MainTimer.Check(TimersIndex.Lan) Then Exit Sub + + Call GetTargetBot(CharIndex) + + If EnArea(CharIndex, charlist(CharIndex).TargetIndex) Then + If charlist(charlist(CharIndex).TargetIndex).Inmo Then + h = 2 + If charlist(CharIndex).ComportamientoCombo = 2 Then + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + h = 5 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + charlist(CharIndex).Lanzando = 0 + charlist(CharIndex).ComportamientoCombo = 1 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + Exit Sub + End If + End If + charlist(CharIndex).ComportamientoCombo = 1 + Else: Exit Sub + End If + Else + h = 2 + If charlist(CharIndex).ComportamientoCombo = 1 Then + h = 3 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + Exit Sub + End If + If RandomNum(Dificultad) <> 1 And charlist(charlist(CharIndex).TargetIndex).Quieto < 30 And charlist(charlist(CharIndex).TargetIndex).Inmo = 0 Then + If charlist(CharIndex).Lanzando = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + charlist(CharIndex).Lanzando = 0 + End If + Exit Sub + End If + Call BotCasteoSpell(CharIndex, charlist(CharIndex).TargetIndex, h) + Exit Sub + ElseIf charlist(CharIndex).ComportamientoCombo = 2 Then + charlist(CharIndex).ComportamientoCombo = 1 + If RandomNum(Dificultad) <> 1 And charlist(charlist(CharIndex).TargetIndex).Quieto < 30 And charlist(charlist(CharIndex).TargetIndex).Inmo = 0 Then + If charlist(CharIndex).Lanzando = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + charlist(CharIndex).Lanzando = 0 + End If + Exit Sub + End If + h = 2 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + h = 5 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + charlist(CharIndex).Lanzando = 0 + charlist(CharIndex).ComportamientoCombo = 1 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + Exit Sub + End If + End If + Else + charlist(CharIndex).ComportamientoCombo = 1 + Exit Sub + End If + End If + Else: Exit Sub + End If + + Call MainTimer.Restart(TimersIndex.Lan) + Call BotCasteoSpell(CharIndex, charlist(CharIndex).TargetIndex, h) +End Sub + +'--------------------------------------------------------------------------------------- +' Procedure : ClerigoLanzaSpell +' Author : Anagrama +' Date : ??? +' Purpose : Selección de hechizo a lanzar según la situación para el clérigo. +'--------------------------------------------------------------------------------------- +' +Public Sub ClerigoLanzaSpell(ByVal CharIndex As Integer) + Dim daño As Integer + Dim h As Byte + Dim i As Byte + + If charlist(CharIndex).Inmo = 1 Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + If CharTimer(CharIndex).Check(TimersIndex.Remo, False) Then + Call BotCasteoSpell(CharIndex, CharIndex, 4) + End If + Exit Sub + End If + + If EnTeam(CharIndex) = 1 Then + For i = 1 To UBound(Team1) + If charlist(Team1(i)).Inmo Then + If charlist(CharIndex).ComportamientoCombo <> 3 Then + If CharTimer(CharIndex).Check(TimersIndex.RemoOtro, False) Then + Call BotCasteoSpell(CharIndex, Team1(i), 4) + End If + Exit Sub + End If + ElseIf charlist(Team1(i)).MinHP = 0 And SinResu = 0 Then + If charlist(CharIndex).ComportamientoCombo <> 3 Then + If CharTimer(CharIndex).Check(TimersIndex.Resu, False) Then + Call BotCasteoSpell(CharIndex, Team1(i), 6) + End If + Exit Sub + End If + End If + Next i + Else + For i = 1 To UBound(Team2) + If charlist(Team2(i)).Inmo Then + If charlist(CharIndex).ComportamientoCombo <> 3 Then + If CharTimer(CharIndex).Check(TimersIndex.RemoOtro, False) Then + Call BotCasteoSpell(CharIndex, Team2(i), 4) + End If + Exit Sub + End If + ElseIf charlist(Team2(i)).MinHP = 0 And SinResu = 0 Then + If charlist(CharIndex).ComportamientoCombo <> 3 Then + If CharTimer(CharIndex).Check(TimersIndex.Resu, False) Then + Call BotCasteoSpell(CharIndex, Team2(i), 6) + End If + Exit Sub + End If + End If + Next i + End If + + Call GetTargetBot(CharIndex) + + If EnArea(CharIndex, charlist(CharIndex).TargetIndex) Then + If charlist(charlist(CharIndex).TargetIndex).Inmo Then + h = 1 + If charlist(CharIndex).ComportamientoCombo = 3 Then + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + h = 2 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + charlist(CharIndex).Lanzando = 0 + charlist(CharIndex).ComportamientoCombo = 1 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + Exit Sub + End If + End If + charlist(CharIndex).ComportamientoCombo = 1 + If charlist(CharIndex).ComportamientoPotas = 4 Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + End If + Else: Exit Sub + End If + Else + If charlist(CharIndex).ComportamientoCombo = 1 Then + h = 3 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + Exit Sub + End If + If RandomNum(Dificultad) <> 1 And charlist(charlist(CharIndex).TargetIndex).Quieto < 30 And charlist(charlist(CharIndex).TargetIndex).Inmo = 0 Then + If charlist(CharIndex).Lanzando = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + charlist(CharIndex).Lanzando = 0 + End If + charlist(CharIndex).ComportamientoCombo = IIf(RandomNum(4) = 1, 2, 1) + Exit Sub + End If + Call BotCasteoSpell(CharIndex, charlist(CharIndex).TargetIndex, h) + Exit Sub + ElseIf charlist(CharIndex).ComportamientoCombo = 2 Then + If RandomNum(Dificultad) <> 1 And charlist(charlist(CharIndex).TargetIndex).Quieto < 30 And charlist(charlist(CharIndex).TargetIndex).Inmo = 0 Then + If charlist(CharIndex).Lanzando = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + charlist(CharIndex).Lanzando = 0 + End If + charlist(CharIndex).ComportamientoCombo = 1 + Exit Sub + End If + h = 1 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + h = 2 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + charlist(CharIndex).Lanzando = 0 + charlist(CharIndex).ComportamientoCombo = 1 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + Exit Sub + End If + End If + charlist(CharIndex).ComportamientoCombo = 3 + ElseIf charlist(CharIndex).ComportamientoCombo = 3 Then + If RandomNum(Dificultad) <> 1 And charlist(charlist(CharIndex).TargetIndex).Quieto < 30 And charlist(charlist(CharIndex).TargetIndex).Inmo = 0 Then + If charlist(CharIndex).Lanzando = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + charlist(CharIndex).Lanzando = 0 + End If + charlist(CharIndex).ComportamientoCombo = 1 + Exit Sub + End If + h = 1 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + h = 2 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + charlist(CharIndex).Lanzando = 0 + charlist(CharIndex).ComportamientoCombo = 1 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + Exit Sub + End If + End If + Else + charlist(CharIndex).ComportamientoCombo = 1 + Exit Sub + End If + End If + Else: Exit Sub + End If + + Call MainTimer.Restart(TimersIndex.Lan) + Call BotCasteoSpell(CharIndex, charlist(CharIndex).TargetIndex, h) +End Sub + +'--------------------------------------------------------------------------------------- +' Procedure : BardoLanzaSpell +' Author : Anagrama +' Date : ??? +' Purpose : Selección de hechizo a lanzar según la situación para el bardo. +'--------------------------------------------------------------------------------------- +' +Public Sub BardoLanzaSpell(ByVal CharIndex As Integer) + Dim daño As Integer + Dim h As Byte + Dim i As Byte + + If charlist(CharIndex).Inmo = 1 Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + If CharTimer(CharIndex).Check(TimersIndex.Remo, False) Then + Call BotCasteoSpell(CharIndex, CharIndex, 4) + End If + Exit Sub + End If + + charlist(CharIndex).Lanzando = 1 + + If EnTeam(CharIndex) = 1 Then + For i = 1 To UBound(Team1) + If charlist(Team1(i)).Inmo Then + If charlist(CharIndex).ComportamientoCombo <> 3 Then + If CharTimer(CharIndex).Check(TimersIndex.RemoOtro, False) Then + Call BotCasteoSpell(CharIndex, Team1(i), 4) + End If + Exit Sub + End If + ElseIf charlist(Team1(i)).MinHP = 0 And SinResu = 0 Then + If charlist(CharIndex).ComportamientoCombo <> 3 Then + If CharTimer(CharIndex).Check(TimersIndex.Resu, False) Then + Call BotCasteoSpell(CharIndex, Team1(i), 6) + End If + Exit Sub + End If + End If + Next i + Else + For i = 1 To UBound(Team2) + If charlist(Team2(i)).Inmo Then + If charlist(CharIndex).ComportamientoCombo <> 3 Then + If CharTimer(CharIndex).Check(TimersIndex.RemoOtro, False) Then + Call BotCasteoSpell(CharIndex, Team2(i), 4) + End If + Exit Sub + End If + ElseIf charlist(Team2(i)).MinHP = 0 And SinResu = 0 Then + If charlist(CharIndex).ComportamientoCombo <> 3 Then + If CharTimer(CharIndex).Check(TimersIndex.Resu, False) Then + Call BotCasteoSpell(CharIndex, Team2(i), 6) + End If + Exit Sub + End If + End If + Next i + End If + + Call GetTargetBot(CharIndex) + + If EnArea(CharIndex, charlist(CharIndex).TargetIndex) Then + If charlist(charlist(CharIndex).TargetIndex).Inmo Then + h = 1 + If charlist(CharIndex).ComportamientoCombo <> 1 Then + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + h = 2 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + charlist(CharIndex).Lanzando = 0 + charlist(CharIndex).ComportamientoCombo = IIf(RandomNum(10) = 1, 1, 2) + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + Exit Sub + End If + End If + charlist(CharIndex).ComportamientoCombo = 3 + Else: Exit Sub + End If + Else + If charlist(CharIndex).ComportamientoCombo = 1 Then + h = 3 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + Exit Sub + End If + If RandomNum(Dificultad) <> 1 And charlist(charlist(CharIndex).TargetIndex).Quieto < 30 And charlist(charlist(CharIndex).TargetIndex).Inmo = 0 Then + If charlist(CharIndex).Lanzando = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + charlist(CharIndex).Lanzando = 0 + End If + charlist(CharIndex).ComportamientoCombo = IIf(RandomNum(10) = 1, 1, 2) + Exit Sub + End If + Call BotCasteoSpell(CharIndex, charlist(CharIndex).TargetIndex, h) + Exit Sub + ElseIf charlist(CharIndex).ComportamientoCombo = 2 Then + If RandomNum(Dificultad) <> 1 And charlist(charlist(CharIndex).TargetIndex).Quieto < 30 And charlist(charlist(CharIndex).TargetIndex).Inmo = 0 Then + If charlist(CharIndex).Lanzando = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + charlist(CharIndex).Lanzando = 0 + End If + charlist(CharIndex).ComportamientoCombo = IIf(RandomNum(10) = 1, 1, 2) + Exit Sub + End If + h = 1 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + h = 2 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + charlist(CharIndex).Lanzando = 0 + charlist(CharIndex).ComportamientoCombo = IIf(RandomNum(10) = 1, 1, 2) + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + Exit Sub + End If + End If + charlist(CharIndex).ComportamientoCombo = 3 + ElseIf charlist(CharIndex).ComportamientoCombo = 3 Then + If RandomNum(Dificultad) <> 1 And charlist(charlist(CharIndex).TargetIndex).Quieto < 30 And charlist(charlist(CharIndex).TargetIndex).Inmo = 0 Then + If charlist(CharIndex).Lanzando = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + charlist(CharIndex).Lanzando = 0 + End If + charlist(CharIndex).ComportamientoCombo = IIf(RandomNum(10) = 1, 1, 2) + Exit Sub + End If + h = 1 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + h = 2 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + charlist(CharIndex).Lanzando = 0 + charlist(CharIndex).ComportamientoCombo = IIf(RandomNum(10) = 1, 1, 2) + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + Exit Sub + End If + End If + Else + charlist(CharIndex).ComportamientoCombo = IIf(RandomNum(10) = 1, 1, 2) + Exit Sub + End If + End If + Else: Exit Sub + End If + + Call MainTimer.Restart(TimersIndex.Lan) + Call BotCasteoSpell(CharIndex, charlist(CharIndex).TargetIndex, h) +End Sub + +'--------------------------------------------------------------------------------------- +' Procedure : DruidaLanzaSpell +' Author : Anagrama +' Date : ??? +' Purpose : Selección de hechizo a lanzar según la situación para el druida. +'--------------------------------------------------------------------------------------- +' +Public Sub DruidaLanzaSpell(ByVal CharIndex As Integer) + Dim daño As Integer + Dim h As Byte + Dim i As Byte + + If charlist(CharIndex).Inmo = 1 Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + If CharTimer(CharIndex).Check(TimersIndex.Remo, False) Then + Call BotCasteoSpell(CharIndex, CharIndex, 4) + End If + Exit Sub + End If + + charlist(CharIndex).Lanzando = 1 + + If EnTeam(CharIndex) = 1 Then + For i = 1 To UBound(Team1) + If charlist(Team1(i)).Inmo Then + If charlist(CharIndex).ComportamientoCombo = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.RemoOtro, False) Then + Call BotCasteoSpell(CharIndex, Team1(i), 4) + End If + Exit Sub + End If + ElseIf charlist(Team1(i)).MinHP = 0 And SinResu = 0 Then + If charlist(CharIndex).ComportamientoCombo = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.Resu, False) Then + Call BotCasteoSpell(CharIndex, Team1(i), 6) + End If + Exit Sub + End If + End If + Next i + Else + For i = 1 To UBound(Team2) + If charlist(Team2(i)).Inmo Then + If charlist(CharIndex).ComportamientoCombo = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.RemoOtro, False) Then + Call BotCasteoSpell(CharIndex, Team2(i), 4) + End If + Exit Sub + End If + ElseIf charlist(Team2(i)).MinHP = 0 And SinResu = 0 Then + If charlist(CharIndex).ComportamientoCombo = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.Resu, False) Then + Call BotCasteoSpell(CharIndex, Team2(i), 6) + End If + Exit Sub + End If + End If + Next i + End If + + Call GetTargetBot(CharIndex) + + If EnArea(CharIndex, charlist(CharIndex).TargetIndex) Then + If charlist(CharIndex).ComportamientoCombo = 1 Then + If RandomNum(Dificultad) <> 1 And charlist(charlist(CharIndex).TargetIndex).Quieto < 30 And charlist(charlist(CharIndex).TargetIndex).Inmo = 0 Then + If charlist(CharIndex).Lanzando = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + charlist(CharIndex).Lanzando = 0 + End If + Exit Sub + End If + h = 1 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + h = 2 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + Exit Sub + End If + End If + charlist(CharIndex).ComportamientoCombo = 2 + ElseIf charlist(CharIndex).ComportamientoCombo = 2 Then + If RandomNum(Dificultad) <> 1 And charlist(charlist(CharIndex).TargetIndex).Quieto < 30 And charlist(charlist(CharIndex).TargetIndex).Inmo = 0 Then + If charlist(CharIndex).Lanzando = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + charlist(CharIndex).Lanzando = 0 + End If + charlist(CharIndex).ComportamientoCombo = 1 + Exit Sub + End If + h = 1 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + h = 2 + If charlist(CharIndex).MinMAN < Hechizo(h).Mana Then + charlist(CharIndex).Lanzando = 0 + charlist(CharIndex).ComportamientoCombo = 1 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + Exit Sub + End If + End If + Else + charlist(CharIndex).ComportamientoCombo = IIf(RandomNum(10) = 1, 1, 2) + Exit Sub + End If + Else: Exit Sub + End If + + Call MainTimer.Restart(TimersIndex.Lan) + Call BotCasteoSpell(CharIndex, charlist(CharIndex).TargetIndex, h) +End Sub + +'--------------------------------------------------------------------------------------- +' Procedure : BotTomaPot +' Author : Anagrama +' Date : ??? +' Purpose : Revisa las condiciones necesarias para tomar una poción, segun cual necesita, si está en inventario, +' si está en hechizos, si está pasando de H a I, si está usando nada más U, si usa U CLICK, etc. +'--------------------------------------------------------------------------------------- +' +Public Sub BotTomaPot(ByVal CharIndex As Integer) + 'Rojas. + If charlist(CharIndex).MinHP < charlist(CharIndex).MaxHP And (charlist(CharIndex).TipoPocion = 1 Or (charlist(CharIndex).Lanzando = 0 And CharTimer(CharIndex).Check(TimersIndex.WaitP, False))) Then + charlist(CharIndex).TipoPocion = 1 + charlist(CharIndex).MinHP = charlist(CharIndex).MinHP + 30 + If charlist(CharIndex).MinHP > charlist(CharIndex).MaxHP Then charlist(CharIndex).MinHP = charlist(CharIndex).MaxHP + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessagePlayWave(46, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + If charlist(CharIndex).MinHP >= charlist(CharIndex).MaxHP * 0.7 And UserParalizado = False Then + If charlist(CharIndex).ComportamientoPotas = 3 Or charlist(CharIndex).ComportamientoPotas = 4 Then + charlist(CharIndex).ComportamientoPotas = IIf(RandomNum(10) <= 3, 1, 2) + End If + ElseIf charlist(CharIndex).MinHP <= charlist(CharIndex).MaxHP * 0.7 And charlist(CharIndex).Inmo = 1 And charlist(CharIndex).Ai <> eBotAi.Guerrero Then + If RandomNum(10) > Dificultad Then + If charlist(CharIndex).ComportamientoPotas = 3 Or charlist(CharIndex).ComportamientoPotas = 4 Then + charlist(CharIndex).ComportamientoPotas = IIf(RandomNum(10) <= 3, 1, 2) + End If + End If + End If + If charlist(CharIndex).MinHP = charlist(CharIndex).MaxHP Then + If charlist(CharIndex).ComportamientoPotas = 3 Or charlist(CharIndex).ComportamientoPotas = 4 Then + charlist(CharIndex).ComportamientoPotas = IIf(RandomNum(10) <= 3, 1, 2) + End If + If charlist(CharIndex).Ai <> eBotAi.Guerrero Then + charlist(CharIndex).TipoPocion = 2 + End If + If charlist(CharIndex).Lanzando = 0 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitH, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitH) + End If + charlist(CharIndex).Lanzando = 1 + End If + End If + 'Azules. + ElseIf charlist(CharIndex).MinMAN < charlist(CharIndex).MaxMAN And (charlist(CharIndex).TipoPocion = 2 Or (charlist(CharIndex).Lanzando = 0 And CharTimer(CharIndex).Check(TimersIndex.WaitP, False))) Then + charlist(CharIndex).TipoPocion = 2 + If charlist(CharIndex).MinHP < charlist(CharIndex).MaxHP / 2 Then + If charlist(CharIndex).Lanzando = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + charlist(CharIndex).Lanzando = 0 + End If + End If + charlist(CharIndex).MinMAN = charlist(CharIndex).MinMAN + (charlist(CharIndex).MaxMAN * 4) / 100 + UserLvl \ 2 + 40 / UserLvl + If charlist(CharIndex).MinMAN > charlist(CharIndex).MaxMAN Then charlist(CharIndex).MinMAN = charlist(CharIndex).MaxMAN + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessagePlayWave(46, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + If charlist(CharIndex).MinMAN = charlist(CharIndex).MaxMAN Then + If charlist(CharIndex).Lanzando = 0 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitH, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitH) + End If + If charlist(CharIndex).MinHP = charlist(CharIndex).MaxHP Then charlist(CharIndex).Lanzando = 1 + End If + If charlist(CharIndex).ComportamientoPotas = 5 Then charlist(CharIndex).ComportamientoPotas = IIf(RandomNum(10) <= 3, 1, 2) + End If + End If +End Sub + +'--------------------------------------------------------------------------------------- +' Procedure : BotCasteoSpell +' Author : Anagrama +' Date : ??? +' Purpose : En un intento de hacer un poco mas legible el sub BotLanzaSpell, pase la parte de efectos y la verdadera +' mecánica de los hechizos aca, de algo sirvió. +'--------------------------------------------------------------------------------------- +' +Public Sub BotCasteoSpell(ByVal CharIndex As Integer, ByVal TargetIndex As Integer, ByVal HIndex As Byte) + Dim daño As Integer + Dim i As Byte + + If HIndex = 0 Then Exit Sub 'Imposible que pase pero nunca se sabe. + + If charlist(CharIndex).MinMAN < Hechizo(HIndex).Mana Then Exit Sub 'Revisa el costo de mana. + If charlist(CharIndex).MinSTA < Hechizo(HIndex).Sta Then Exit Sub 'Revisa el costo de energia. + If charlist(CharIndex).MinHP < charlist(CharIndex).MaxHP Then charlist(CharIndex).Lanzando = 1 'Si pasa a inventario ahora. + + If HIndex = 4 Then 'Remo + If EnArea(CharIndex, TargetIndex) = 0 Then Exit Sub + charlist(TargetIndex).Inmo = 0 + If charlist(TargetIndex).Bot = 0 Then + Call WriteParalizeOK(TargetIndex, charlist(TargetIndex).Inmo) + Call WriteConsoleMsg(TargetIndex, charlist(CharIndex).Nombre & " te ha lanzado " & Hechizo(HIndex).name & ".", FontTypeNames.FONTTYPE_FIGHT) + End If + ElseIf HIndex = 3 Then 'Inmo + charlist(TargetIndex).Inmo = 1 + If charlist(TargetIndex).Bot = 0 Then + Call WriteParalizeOK(TargetIndex, charlist(TargetIndex).Inmo) + Call WriteConsoleMsg(TargetIndex, charlist(CharIndex).Nombre & " te ha lanzado " & Hechizo(HIndex).name & ".", FontTypeNames.FONTTYPE_FIGHT) + Else + Call CharTimer(TargetIndex).SetInterval(TimersIndex.Remo, INT_REMO + RandomNumber(100 * Dificultad, 200 * Dificultad)) + Call CharTimer(TargetIndex).Restart(TimersIndex.Remo) + End If + Call GetTargetBotTeam(EnTeam(CharIndex)) + If EnTeam(CharIndex) = 1 Then + For i = 1 To UBound(Team2) + Call CharTimer(Team2(i)).SetInterval(TimersIndex.RemoOtro, INT_REMOOTRO + RandomNumber(100 * Dificultad, 200 * Dificultad)) + Call CharTimer(Team2(i)).Restart(TimersIndex.RemoOtro) + Next i + Else + If UBound(Team1) > 1 Then + For i = 2 To UBound(Team1) + Call CharTimer(Team1(i)).SetInterval(TimersIndex.RemoOtro, INT_REMOOTRO + RandomNumber(100 * Dificultad, 200 * Dificultad)) + Call CharTimer(Team1(i)).Restart(TimersIndex.RemoOtro) + Next i + End If + End If + ElseIf HIndex = 6 Then 'Resu + If EnArea(CharIndex, TargetIndex) = 0 Then Exit Sub + daño = charlist(CharIndex).MaxHP - charlist(CharIndex).MinHP * (1 - charlist(TargetIndex).Lvl * 0.015) + If ResuNoVida = 0 Then + If charlist(CharIndex).MinHP <= daño Then Exit Sub + charlist(CharIndex).MinHP = charlist(CharIndex).MinHP - daño + End If + charlist(TargetIndex).MinHP = 1 + charlist(TargetIndex).MinMAN = 0 + charlist(TargetIndex).body = BodyData(BodyClaseRaza(charlist(TargetIndex).Ai, charlist(TargetIndex).Raza)) + charlist(TargetIndex).Head = HeadData(HeadRazaGenero(charlist(TargetIndex).Raza, charlist(TargetIndex).Genero)) + charlist(TargetIndex).Arma = WeaponAnimData(ArmaClase(charlist(TargetIndex).Ai)) + charlist(TargetIndex).Escudo = ShieldAnimData(EscudoClase(charlist(TargetIndex).Ai)) + charlist(TargetIndex).Casco = CascoAnimData(CascoClase(charlist(TargetIndex).Ai)) + If charlist(CharIndex).MinHP <= 0 Then + charlist(CharIndex).MinHP = 0 + Call CharDie(CharIndex) + End If + If charlist(TargetIndex).Bot = 1 Then + charlist(TargetIndex).ComportamientoPotas = 4 + charlist(TargetIndex).Lanzando = 0 + Else + Call WriteUpdateCharStats(TargetIndex) + End If + Call ServerSendData(SendTarget.ToAllButIndex, UserCharIndex, PrepareMessageCharacterChange(charlist(TargetIndex).iBody, charlist(TargetIndex).iHead, charlist(TargetIndex).heading, TargetIndex _ + , charlist(TargetIndex).iArma, charlist(TargetIndex).iEscudo, charlist(TargetIndex).FxIndex, charlist(TargetIndex).FX.Loops, charlist(TargetIndex).iCasco)) + Call DarPrioridadTarget(EnTeam(TargetIndex)) + Else 'Apoca, desca, tormenta + daño = RandomNumber(Hechizo(HIndex).MinHP, Hechizo(HIndex).MaxHP) + daño = daño + (daño * 3 * charlist(CharIndex).Lvl) / 100 + daño = daño * charlist(CharIndex).DM + daño = daño - RandomNumber(charlist(TargetIndex).MinRM, charlist(TargetIndex).MaxRM) + charlist(TargetIndex).MinHP = charlist(TargetIndex).MinHP - daño + If charlist(TargetIndex).MinHP < 0 Then charlist(TargetIndex).MinHP = 0 + If charlist(TargetIndex).Bot = 0 Then + Call WriteConsoleMsg(TargetIndex, charlist(CharIndex).Nombre & " te ha lanzado " & Hechizo(HIndex).name & ".", FontTypeNames.FONTTYPE_FIGHT) + Call WriteConsoleMsg(TargetIndex, charlist(CharIndex).Nombre & " te ha pegado por " & daño & " puntos de vida.", FontTypeNames.FONTTYPE_FIGHT) + Call WriteUpdateCharStats(TargetIndex) + End If + If charlist(TargetIndex).MinHP <= 0 Then + charlist(TargetIndex).MinHP = 0 + If charlist(TargetIndex).Bot = 0 Then + Call WriteConsoleMsg(TargetIndex, charlist(CharIndex).Nombre & " te ha matado.", FontTypeNames.FONTTYPE_FIGHT) + End If + + Call ServerSendData(SendTarget.ToAllButIndex, TargetIndex, PrepareMessageConsoleMsg(charlist(CharIndex).Nombre & " ha matado a " & charlist(TargetIndex).Nombre & ".", FontTypeNames.FONTTYPE_FIGHT)) + + Call CharDie(TargetIndex) + Call ResetDuelo(CharIndex) + Call GetTargetBotTeam(EnTeam(CharIndex)) + End If + End If + + Call ServerSendData(SendTarget.ToAll, TargetIndex, PrepareMessageChatOverHead(Hechizo(HIndex).Palabras, CharIndex, vbCyan)) 'Palabras mágicas. + Call ServerSendData(SendTarget.ToAll, TargetIndex, PrepareMessagePlayWave(Hechizo(HIndex).WAV, charlist(TargetIndex).Pos.X, charlist(TargetIndex).Pos.Y)) 'Sonido. + Call ServerSendData(SendTarget.ToAll, TargetIndex, PrepareMessageCreateFX(TargetIndex, Hechizo(HIndex).FX, 0)) 'Gráfico al objetivo. + charlist(CharIndex).MinMAN = charlist(CharIndex).MinMAN - Hechizo(HIndex).Mana 'Le saca la mana. + charlist(CharIndex).MinSTA = charlist(CharIndex).MinSTA - Hechizo(HIndex).Sta 'Le saca la energia. +End Sub + +Public Sub GetTargetBot(ByVal CharIndex As Integer) +'--------------------------------------------------------------------------------------- +' Procedure : GetTargetBot +' Author : Anagrama +' Date : ??? +' Purpose : Verifica equipos y decide el objetivo del bot. +'--------------------------------------------------------------------------------------- +' + Dim i As Byte + Dim a As Byte + Dim b As Byte + Dim MaxPrioridad As Byte + Dim MinPrioridad As Byte + Dim tmpChar() As Byte + Dim num As Byte + + If EnTeam(CharIndex) = 1 Then + If UBound(Team2) = 0 Then + charlist(CharIndex).TargetIndex = 0 + Exit Sub + End If + For i = 1 To UBound(Team2) + If Team2(i) > 0 Then + If charlist(Team2(i)).MinHP > 0 Then + If charlist(Team2(i)).Inmo = 1 Then + charlist(CharIndex).TargetIndex = Team2(i) + Exit Sub + End If + End If + End If + Next i + For a = 1 To UBound(Team2) + If Prioridad2(a).Char > 0 Then + If MaxPrioridad = 0 Then + If charlist(Prioridad2(a).Char).MinHP > 0 Then MaxPrioridad = a + Else + If charlist(Prioridad2(a).Char).MinHP > 0 Then MinPrioridad = a + Exit For + End If + End If + Next + If MinPrioridad = 0 Then + charlist(CharIndex).TargetIndex = Prioridad2(MaxPrioridad).Char + ElseIf UBound(Team2) = 2 Then + If num > Prioridad2(MaxPrioridad).Probabilidad Then + charlist(CharIndex).TargetIndex = Prioridad2(MinPrioridad).Char + Else + charlist(CharIndex).TargetIndex = Prioridad2(MaxPrioridad).Char + End If + Else + num = RandomNum(100) + If num > Prioridad2(MinPrioridad).Probabilidad + Prioridad2(MaxPrioridad).Probabilidad Then + For b = 1 To UBound(Team2) + ReDim tmpChar(1 To 1) As Byte + If b <> MaxPrioridad And b <> MinPrioridad And charlist(Prioridad2(b).Char).MinHP > 0 Then + If tmpChar(1) <> 0 Then + ReDim Preserve tmpChar(1 To UBound(tmpChar) + 1) As Byte + tmpChar(UBound(tmpChar)) = b + Else + tmpChar(1) = b + End If + End If + Next + If tmpChar(1) > 0 Then + charlist(CharIndex).TargetIndex = Prioridad2(tmpChar(RandomNum(UBound(tmpChar)))).Char + Else: charlist(CharIndex).TargetIndex = MinPrioridad + End If + ElseIf num < Prioridad2(MinPrioridad).Probabilidad Then + charlist(CharIndex).TargetIndex = Prioridad2(MinPrioridad).Char + Else + charlist(CharIndex).TargetIndex = Prioridad2(MaxPrioridad).Char + End If + End If + Else + If UBound(Team1) = 0 Then + charlist(CharIndex).TargetIndex = 0 + Exit Sub + End If + For i = 1 To UBound(Team1) + If Team1(i) > 0 Then + If charlist(Team1(i)).MinHP > 0 Then + If charlist(Team1(i)).Inmo = 1 Then + charlist(CharIndex).TargetIndex = Team1(i) + Exit Sub + End If + End If + End If + Next i + For a = 1 To UBound(Team1) + If Prioridad1(a).Char > 0 Then + If MaxPrioridad = 0 Then + If charlist(Prioridad1(a).Char).MinHP > 0 Then MaxPrioridad = a + Else + If charlist(Prioridad1(a).Char).MinHP > 0 Then MinPrioridad = a + Exit For + End If + End If + Next + If MinPrioridad = 0 Then + charlist(CharIndex).TargetIndex = Prioridad1(MaxPrioridad).Char + ElseIf UBound(Team1) = 2 Then + If num > Prioridad1(MaxPrioridad).Probabilidad Then + charlist(CharIndex).TargetIndex = Prioridad1(MinPrioridad).Char + Else + charlist(CharIndex).TargetIndex = Prioridad1(MaxPrioridad).Char + End If + Else + num = RandomNum(100) + If num > Prioridad1(MinPrioridad).Probabilidad + Prioridad1(MaxPrioridad).Probabilidad Then + For b = 1 To UBound(Team1) + ReDim tmpChar(1 To 1) As Byte + If b <> MaxPrioridad And b <> MinPrioridad And charlist(Prioridad1(b).Char).MinHP > 0 Then + If tmpChar(1) <> 0 Then + ReDim Preserve tmpChar(1 To UBound(tmpChar) + 1) As Byte + tmpChar(UBound(tmpChar)) = b + Else + tmpChar(1) = b + End If + End If + Next + If tmpChar(1) > 0 Then + charlist(CharIndex).TargetIndex = Prioridad1(tmpChar(RandomNum(UBound(tmpChar)))).Char + Else: charlist(CharIndex).TargetIndex = MinPrioridad + End If + ElseIf num < Prioridad1(MinPrioridad).Probabilidad Then + charlist(CharIndex).TargetIndex = Prioridad1(MinPrioridad).Char + Else + charlist(CharIndex).TargetIndex = Prioridad1(MaxPrioridad).Char + End If + End If + End If +End Sub + +Public Sub GetTargetBotTeam(ByVal Team As Byte) +'--------------------------------------------------------------------------------------- +' Procedure : GetTargetBotTeam +' Author : Anagrama +' Date : ??? +' Purpose : Cuando alguien muere se revisa el siguiente objetivo para los bots. +'--------------------------------------------------------------------------------------- +' + + Dim i As Byte + + If Team = 1 Then + For i = 1 To UBound(Team1) + If Team1(i) > 0 Then + If charlist(Team1(i)).MinHP > 0 And charlist(Team1(i)).Bot = 1 Then Call GetTargetBot(Team1(i)) + End If + Next i + Else + For i = 1 To UBound(Team2) + If Team2(i) > 0 Then + If charlist(Team2(i)).MinHP > 0 And charlist(Team2(i)).Bot = 1 Then Call GetTargetBot(Team2(i)) + End If + Next i + End If +End Sub + +Public Sub BotLanzaFlecha(ByVal CharIndex As Integer) +'--------------------------------------------------------------------------------------- +' Procedure : BotLanzaFlecha +' Author : Anagrama +' Date : ??? +' Purpose : Lanza la flecha si puede hacerlo y si no falla. +'--------------------------------------------------------------------------------------- +' + + If Not CharTimer(CharIndex).Check(TimersIndex.Attack, False) Then Exit Sub 'Check if arrows interval has finished. + If Not CharTimer(CharIndex).Check(TimersIndex.Arrows) Then Exit Sub + + Call GetTargetBot(CharIndex) + + If charlist(CharIndex).ComportamientoPotas < 3 Then + If EnArea(CharIndex, charlist(CharIndex).TargetIndex) Then + If RandomNum(Dificultad) = 1 Or charlist(charlist(CharIndex).TargetIndex).Quieto >= 30 Or charlist(charlist(CharIndex).TargetIndex).Inmo = 1 Then + Call UsuarioAtacaUsuario(CharIndex, charlist(CharIndex).TargetIndex) + charlist(CharIndex).Lanzando = 1 + End If + End If + End If +End Sub + +Public Sub BotEquiparItem(ByVal CharIndex As Integer, ByVal Item As Byte) +'--------------------------------------------------------------------------------------- +' Procedure : BotEquiparItem +' Author : Anagrama +' Date : ??? +' Purpose : Equipa el item que se le solicita. +'--------------------------------------------------------------------------------------- +' + + Select Case Item + Case 3 + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessagePlayWave(25, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + charlist(CharIndex).Arma = WeaponAnimData(3) + charlist(CharIndex).ArmaMinHit = ItemData(1).MinHit + charlist(CharIndex).ArmaMaxHit = ItemData(1).MaxHit + charlist(CharIndex).Refuerzo = 0 + charlist(CharIndex).TipoArma = 1 + Case 4 + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessagePlayWave(25, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + charlist(CharIndex).Arma = WeaponAnimData(5) + charlist(CharIndex).ArmaMinHit = ItemData(2).MinHit + charlist(CharIndex).ArmaMaxHit = ItemData(2).MaxHit + charlist(CharIndex).Refuerzo = ItemData(2).Refuerzo + charlist(CharIndex).TipoArma = 2 + Case 5 + charlist(CharIndex).MinRM = ItemData(3).MinRM + charlist(CharIndex).MaxRM = ItemData(3).MaxRM + charlist(CharIndex).DM = ItemData(3).DM + Case 6 + charlist(CharIndex).MinRM = ItemData(4).MinRM + charlist(CharIndex).MaxRM = ItemData(4).MaxRM + charlist(CharIndex).DM = ItemData(4).DM + End Select +End Sub + +Public Sub GuerreroAI(ByVal CharIndex As Integer) +'--------------------------------------------------------------------------------------- +' Procedure : GuerreroAI +' Author : Anagrama +' Date : ??? +' Purpose : Nucleo de la IA del guerrero, decide si moverse, atacar o potear. +'--------------------------------------------------------------------------------------- +' + + If charlist(CharIndex).Moving = 0 Then + If charlist(CharIndex).Inmo = 0 Then + Call MoveBot(CharIndex) + End If + End If + If charlist(CharIndex).MinHP > 0 Then + If charlist(CharIndex).TipoArma = 2 Then + If MainTimer.Check(TimersIndex.Lan, False) = True Then + If charlist(CharIndex).ComportamientoPotas < 3 Then + Call BotLanzaFlecha(CharIndex) + End If + End If + End If + If CharTimer(CharIndex).Check(TimersIndex.GolpeU, False) Then + If CharTimer(CharIndex).Check(TimersIndex.UseItem, False) Then + If charlist(CharIndex).Lanzando = 0 And CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + If CharTimer(CharIndex).Check(TimersIndex.UseItemWithDblClick, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.UseItem) + Call CharTimer(CharIndex).Restart(TimersIndex.UseItemWithDblClick) + Call BotTomaPot(CharIndex) + End If + Else + If CharTimer(CharIndex).Check(TimersIndex.UseItemWithU, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.UseItem) + Call CharTimer(CharIndex).Restart(TimersIndex.UseItemWithU) + Call BotTomaPot(CharIndex) + End If + End If + End If + End If + End If +End Sub + +Public Sub MagoAI(ByVal CharIndex As Integer) +'--------------------------------------------------------------------------------------- +' Procedure : MagoAI +' Author : Anagrama +' Date : ??? +' Purpose : Nucleo de la IA del mago, decide si moverse, atacar o potear. +'--------------------------------------------------------------------------------------- +' + If charlist(CharIndex).Moving = 0 Then + If charlist(CharIndex).Inmo = 0 Then + Call MoveBot(CharIndex) + End If + End If + If charlist(CharIndex).MinHP > 0 Then + If charlist(CharIndex).Inmo = 1 Or MainTimer.Check(TimersIndex.Lan, False) = True Then + If charlist(CharIndex).ComportamientoPotas <> 3 Or charlist(CharIndex).MinHP > charlist(CharIndex).MaxHP * 0.7 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitH, False) Then + If charlist(CharIndex).ComportamientoHechizos = 2 Then + If charlist(CharIndex).MaxMAN >= 1790 Then + If charlist(CharIndex).MinMAN >= 1790 Then + If CharTimer(CharIndex).Check(TimersIndex.CastSpell) Then + Call BotLanzaSpell(CharIndex) + End If + Else + If charlist(CharIndex).Lanzando = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + charlist(CharIndex).Lanzando = 0 + End If + End If + End If + Else + If charlist(CharIndex).MinMAN >= 1200 Then + If CharTimer(CharIndex).Check(TimersIndex.CastSpell) Then + Call BotLanzaSpell(CharIndex) + End If + Else + If charlist(CharIndex).Lanzando = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + charlist(CharIndex).Lanzando = 0 + End If + End If + End If + End If + ElseIf charlist(CharIndex).ComportamientoHechizos = 3 Then + If charlist(CharIndex).MinMAN >= 1000 Then + If CharTimer(CharIndex).Check(TimersIndex.CastSpell) Then + Call BotLanzaSpell(CharIndex) + End If + End If + Else + If CharTimer(CharIndex).Check(TimersIndex.CastSpell) Then + Call BotLanzaSpell(CharIndex) + End If + End If + Call CharTimer(CharIndex).Restart(TimersIndex.WaitH) + End If + End If + End If + If CharTimer(CharIndex).Check(TimersIndex.GolpeU, False) Then + If CharTimer(CharIndex).Check(TimersIndex.UseItem, False) Then + If charlist(CharIndex).Lanzando = 0 And CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + If CharTimer(CharIndex).Check(TimersIndex.UseItemWithDblClick, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.UseItem) + Call CharTimer(CharIndex).Restart(TimersIndex.UseItemWithDblClick) + Call BotTomaPot(CharIndex) + End If + Else + If CharTimer(CharIndex).Check(TimersIndex.UseItemWithU, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.UseItem) + Call CharTimer(CharIndex).Restart(TimersIndex.UseItemWithU) + Call BotTomaPot(CharIndex) + End If + End If + End If + End If + End If +End Sub + +Public Sub PaladinAI(ByVal CharIndex As Integer) +'--------------------------------------------------------------------------------------- +' Procedure : PaladinAI +' Author : Anagrama +' Date : ??? +' Purpose : Nucleo de la IA del paladin, decide si moverse, atacar o potear. +'--------------------------------------------------------------------------------------- +' + If charlist(CharIndex).Moving = 0 Then + If charlist(CharIndex).Inmo = 0 Then + Call MoveBot(CharIndex) + End If + End If + If charlist(CharIndex).MinHP > 0 Then + If charlist(CharIndex).Inmo = 1 Or MainTimer.Check(TimersIndex.Lan, False) = True Then + If CharTimer(CharIndex).Check(TimersIndex.WaitH, False) Then + If (charlist(CharIndex).ComportamientoPotas = 4 And charlist(CharIndex).ComportamientoCombo = 2) Or (charlist(CharIndex).ComportamientoPotas <> 4 And charlist(CharIndex).ComportamientoPotas <> 5) Then + If (charlist(CharIndex).ComportamientoCombo <> 2 And charlist(CharIndex).MinMAN >= 400) Or charlist(CharIndex).ComportamientoCombo = 2 Then + If Not CharTimer(CharIndex).Check(TimersIndex.Attack, False) Then 'Check if attack interval has finished. + If charlist(CharIndex).LastCombo = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.AttackCast) Then + Call BotLanzaSpell(CharIndex) + charlist(CharIndex).LastCombo = 2 + End If + End If + Else + If CharTimer(CharIndex).Check(TimersIndex.CastSpell) Then + Call BotLanzaSpell(CharIndex) + charlist(CharIndex).LastCombo = 2 + End If + End If + Else + If charlist(CharIndex).Lanzando = 1 Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + End If + End If + End If + End If + End If + If CharTimer(CharIndex).Check(TimersIndex.GolpeU, False) Then + If CharTimer(CharIndex).Check(TimersIndex.UseItem, False) Then + If charlist(CharIndex).Lanzando = 0 And CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + If CharTimer(CharIndex).Check(TimersIndex.UseItemWithDblClick, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.UseItem) + Call CharTimer(CharIndex).Restart(TimersIndex.UseItemWithDblClick) + Call BotTomaPot(CharIndex) + End If + Else + If CharTimer(CharIndex).Check(TimersIndex.UseItemWithU, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.UseItem) + Call CharTimer(CharIndex).Restart(TimersIndex.UseItemWithU) + Call BotTomaPot(CharIndex) + End If + End If + End If + End If + End If +End Sub + +Public Sub ClerigoAI(ByVal CharIndex As Integer) +'--------------------------------------------------------------------------------------- +' Procedure : ClerigoAI +' Author : Anagrama +' Date : ??? +' Purpose : Nucleo de la IA del clerigo, decide si moverse, atacar o potear. +'--------------------------------------------------------------------------------------- +' + If charlist(CharIndex).Moving = 0 Then + If charlist(CharIndex).Inmo = 0 Then + Call MoveBot(CharIndex) + End If + End If + If charlist(CharIndex).MinHP > 0 Then + If charlist(CharIndex).Inmo = 1 Or MainTimer.Check(TimersIndex.Lan, False) = True Then + If CharTimer(CharIndex).Check(TimersIndex.WaitH, False) Then + If (charlist(CharIndex).ComportamientoPotas = 4 And charlist(CharIndex).ComportamientoCombo = 3) Or (charlist(CharIndex).ComportamientoPotas <> 4 And charlist(CharIndex).ComportamientoPotas <> 5) Then + If charlist(CharIndex).ComportamientoCombo = 3 Or (charlist(CharIndex).MaxMAN > 1200 And charlist(CharIndex).MinMAN >= 1200) Or (charlist(CharIndex).MaxMAN < 1200 And charlist(CharIndex).MinMAN >= 1000) Then + If Not CharTimer(CharIndex).Check(TimersIndex.Attack, False) Then 'Check if attack interval has finished. + If charlist(CharIndex).LastCombo = 1 Then + If CharTimer(CharIndex).Check(TimersIndex.AttackCast) Then + Call BotLanzaSpell(CharIndex) + charlist(CharIndex).LastCombo = 2 + End If + End If + Else + If CharTimer(CharIndex).Check(TimersIndex.CastSpell) Then + Call BotLanzaSpell(CharIndex) + charlist(CharIndex).LastCombo = 2 + End If + End If + Else + If charlist(CharIndex).Lanzando = 1 Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + End If + End If + End If + End If + End If + If CharTimer(CharIndex).Check(TimersIndex.GolpeU, False) Then + If CharTimer(CharIndex).Check(TimersIndex.UseItem, False) Then + If charlist(CharIndex).Lanzando = 0 And CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + If CharTimer(CharIndex).Check(TimersIndex.UseItemWithDblClick, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.UseItem) + Call CharTimer(CharIndex).Restart(TimersIndex.UseItemWithDblClick) + Call BotTomaPot(CharIndex) + End If + Else + If CharTimer(CharIndex).Check(TimersIndex.UseItemWithU, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.UseItem) + Call CharTimer(CharIndex).Restart(TimersIndex.UseItemWithU) + Call BotTomaPot(CharIndex) + End If + End If + End If + End If + End If +End Sub + +Public Sub DruidaAI(ByVal CharIndex As Integer) +'--------------------------------------------------------------------------------------- +' Procedure : DruidaAI +' Author : Anagrama +' Date : ??? +' Purpose : Nucleo de la IA del druida, decide si moverse, atacar o potear. +'--------------------------------------------------------------------------------------- +' + If charlist(CharIndex).Moving = 0 Then + If charlist(CharIndex).Inmo = 0 Then + Call MoveBot(CharIndex) + End If + End If + If charlist(CharIndex).MinHP > 0 Then + If charlist(CharIndex).Inmo = 1 Or MainTimer.Check(TimersIndex.Lan, False) = True Then + If CharTimer(CharIndex).Check(TimersIndex.WaitH, False) Then + If charlist(CharIndex).ComportamientoCombo = 2 Or charlist(CharIndex).MinMAN >= 1200 Then + If CharTimer(CharIndex).Check(TimersIndex.CastSpell) Then + Call BotLanzaSpell(CharIndex) + charlist(CharIndex).LastCombo = 2 + End If + Else + If charlist(CharIndex).Lanzando = 1 Then + charlist(CharIndex).Lanzando = 0 + If CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.WaitP) + End If + End If + End If + End If + End If + If CharTimer(CharIndex).Check(TimersIndex.GolpeU, False) Then + If CharTimer(CharIndex).Check(TimersIndex.UseItem, False) Then + If charlist(CharIndex).Lanzando = 0 And CharTimer(CharIndex).Check(TimersIndex.WaitP, False) Then + If CharTimer(CharIndex).Check(TimersIndex.UseItemWithDblClick, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.UseItem) + Call CharTimer(CharIndex).Restart(TimersIndex.UseItemWithDblClick) + Call BotTomaPot(CharIndex) + End If + Else + If CharTimer(CharIndex).Check(TimersIndex.UseItemWithU, False) Then + Call CharTimer(CharIndex).Restart(TimersIndex.UseItem) + Call CharTimer(CharIndex).Restart(TimersIndex.UseItemWithU) + Call BotTomaPot(CharIndex) + End If + End If + End If + End If + End If +End Sub diff --git a/CODIGO/modCombate.bas b/CODIGO/modCombate.bas new file mode 100644 index 0000000..fe69126 --- /dev/null +++ b/CODIGO/modCombate.bas @@ -0,0 +1,351 @@ +Attribute VB_Name = "modCombate" +'--------------------------------------------------------------------------------------- +' Module : modCombate +' Author : Anagrama +' Date : ??? +' Purpose : Adaptación del modulo de combate del servidor al cliente. +'--------------------------------------------------------------------------------------- + +Option Explicit + +Public Function MinimoInt(ByVal a As Integer, ByVal b As Integer) As Integer + If a > b Then + MinimoInt = b + Else + MinimoInt = a + End If +End Function + +Public Function MaximoInt(ByVal a As Integer, ByVal b As Integer) As Integer + If a > b Then + MaximoInt = a + Else + MaximoInt = b + End If +End Function + +Private Function PoderEvasionEscudo(ByVal CharIndex As Integer) As Long + PoderEvasionEscudo = (100 * charlist(CharIndex).ModEscudo) / 2 +End Function + +Private Function PoderEvasion(ByVal CharIndex As Integer) As Long + Dim lTemp As Long + With charlist(CharIndex) + lTemp = (100 + _ + 100 / 33 * .Agilidad) * .ModEvasion + + PoderEvasion = (lTemp + (2.5 * MaximoInt(40 - 12, 0))) + End With +End Function + +Private Function PoderAtaqueArma(ByVal CharIndex As Integer) As Long + Dim PoderAtaqueTemp As Long + + With charlist(CharIndex) + If .TipoArma = 1 Then + PoderAtaqueTemp = (100 + 3 * .Agilidad) * .ModAtaqueArma + Else + PoderAtaqueTemp = (100 + 3 * .Agilidad) * .ModAtaqueProyectil + End If + + PoderAtaqueArma = (PoderAtaqueTemp + (2.5 * MaximoInt(40 - 12, 0))) + End With +End Function + +Public Function CalcularDaño(ByVal CharIndex As Integer) As Long + Dim DañoArma As Long + Dim DañoUsuario As Long + Dim ModifClase As Single + Dim DañoMaxArma As Long + Dim DañoMinArma As Long + + With charlist(CharIndex) + + DañoArma = RandomNumber(.ArmaMinHit, .ArmaMaxHit) + DañoMaxArma = .ArmaMaxHit + + DañoUsuario = RandomNumber(.MinHit, .MaxHit) + + If .TipoArma = 1 Then + CalcularDaño = (3 * DañoArma + ((DañoMaxArma / 5) * MaximoInt(0, .Fuerza - 15)) + DañoUsuario) * .ModDañoArma + Else + CalcularDaño = (3 * DañoArma + ((DañoMaxArma / 5) * MaximoInt(0, .Fuerza - 15)) + DañoUsuario) * .ModDañoProyectil + End If + End With + +End Function + +Public Function UsuarioImpacto(ByVal AtacanteIndex As Integer, ByVal VictimaIndex As Integer) As Boolean + + Dim ProbRechazo As Long + Dim Rechazo As Boolean + Dim ProbExito As Long + + ProbExito = MaximoInt(10, MinimoInt(90, 50 + (PoderAtaqueArma(AtacanteIndex) - (PoderEvasion(VictimaIndex) + PoderEvasionEscudo(VictimaIndex))) * 0.4)) + + UsuarioImpacto = (RandomNumber(1, 100) <= ProbExito) + + If Not UsuarioImpacto Then + If charlist(VictimaIndex).ModEscudo > 0 Then + ProbRechazo = MaximoInt(10, MinimoInt(90, 100 * 100 / (100 + 100))) + Rechazo = (RandomNumber(1, 100) <= ProbRechazo) + If Rechazo Then + Call ServerSendData(SendTarget.ToAll, AtacanteIndex, PrepareMessagePlayWave(37, charlist(VictimaIndex).Pos.X, charlist(VictimaIndex).Pos.Y)) + Else + Call ServerSendData(SendTarget.ToAll, AtacanteIndex, PrepareMessagePlayWave(2, charlist(AtacanteIndex).Pos.X, charlist(AtacanteIndex).Pos.Y)) + End If + Else: Call ServerSendData(SendTarget.ToAll, AtacanteIndex, PrepareMessagePlayWave(2, charlist(AtacanteIndex).Pos.X, charlist(AtacanteIndex).Pos.Y)) + End If + End If + + If charlist(VictimaIndex).Bot = 1 Then + If UsuarioImpacto = True Then + If (charlist(VictimaIndex).ComportamientoPotas = 2 Or charlist(VictimaIndex).MinHP < charlist(VictimaIndex).MaxHP / 2) Then + charlist(VictimaIndex).ComportamientoPotas = 3 + If charlist(VictimaIndex).Lanzando = 1 Then + charlist(VictimaIndex).Lanzando = 0 + If CharTimer(VictimaIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(VictimaIndex).Restart(TimersIndex.WaitP) + End If + End If + End If + If charlist(VictimaIndex).Ai = eBotAi.Paladin Or charlist(VictimaIndex).Ai = eBotAi.Asesino Or charlist(VictimaIndex).Ai = eBotAi.Clerigo Or charlist(VictimaIndex).Ai = eBotAi.Bardo Then + If charlist(charlist(VictimaIndex).TargetIndex).Inmo = 1 And charlist(VictimaIndex).Inmo = 0 Then + charlist(VictimaIndex).ComportamientoPotas = 4 + If charlist(VictimaIndex).Lanzando = 1 Then + charlist(VictimaIndex).Lanzando = 0 + If CharTimer(VictimaIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(VictimaIndex).Restart(TimersIndex.WaitP) + End If + End If + ElseIf charlist(charlist(VictimaIndex).TargetIndex).Inmo = 1 And charlist(VictimaIndex).Inmo = 1 Then + If charlist(VictimaIndex).ComportamientoPotas <> 4 And charlist(VictimaIndex).MinHP < charlist(VictimaIndex).MaxHP Then + charlist(VictimaIndex).ComportamientoPotas = 4 + If charlist(VictimaIndex).Lanzando = 1 Then + charlist(VictimaIndex).Lanzando = 0 + If CharTimer(VictimaIndex).Check(TimersIndex.WaitP, False) Then + Call CharTimer(VictimaIndex).Restart(TimersIndex.WaitP) + End If + End If + End If + End If + End If + End If + End If + If charlist(AtacanteIndex).Bot = 1 Then + If charlist(AtacanteIndex).Ai = eBotAi.Paladin Then + If charlist(AtacanteIndex).MinMAN >= 250 And UsuarioImpacto = True Then + charlist(AtacanteIndex).ComportamientoCombo = IIf(RandomNumber(1, 3) <= 2, 2, 1) + ElseIf charlist(AtacanteIndex).MinMAN < 250 And (charlist(VictimaIndex).Ai = eBotAi.Mago Or charlist(VictimaIndex).Ai = eBotAi.Druida) Then + If RandomNumber(1, 2) = 1 Then + charlist(AtacanteIndex).ComportamientoPotas = 5 + charlist(AtacanteIndex).ComportamientoCombo = 1 + Else + charlist(AtacanteIndex).ComportamientoCombo = IIf(RandomNumber(1, 3) <= 2, 2, 1) + End If + ElseIf charlist(AtacanteIndex).MinMAN < 250 Then + charlist(AtacanteIndex).ComportamientoPotas = 5 + charlist(AtacanteIndex).ComportamientoCombo = 1 + End If + ElseIf charlist(AtacanteIndex).Ai = eBotAi.Clerigo Or charlist(AtacanteIndex).Ai = eBotAi.Bardo Then + If charlist(AtacanteIndex).MinMAN >= 460 And UsuarioImpacto = True Then + charlist(AtacanteIndex).ComportamientoCombo = IIf(RandomNumber(1, 3) <= 2, 3, 1) + ElseIf charlist(AtacanteIndex).MinMAN < 460 And (charlist(VictimaIndex).Ai = eBotAi.Mago Or charlist(VictimaIndex).Ai = eBotAi.Druida) Then + If RandomNumber(1, 2) = 1 Then + charlist(AtacanteIndex).ComportamientoPotas = 5 + charlist(AtacanteIndex).ComportamientoCombo = 1 + Else + charlist(AtacanteIndex).ComportamientoCombo = IIf(RandomNumber(1, 3) <= 2, 3, 1) + End If + ElseIf charlist(AtacanteIndex).MinMAN < 460 Then + charlist(AtacanteIndex).ComportamientoPotas = 5 + charlist(AtacanteIndex).ComportamientoCombo = 1 + End If + End If + End If + +End Function + +Public Function UsuarioAtacaUsuario(ByVal AtacanteIndex As Integer, ByVal VictimaIndex As Integer) As Boolean + + With charlist(AtacanteIndex) + If EnTeam(AtacanteIndex) = EnTeam(VictimaIndex) Then + Call WriteConsoleMsg(AtacanteIndex, "No puedes atacar a tus compañeros.", FontTypeNames.FONTTYPE_FIGHT) + Exit Function + End If + If UsuarioImpacto(AtacanteIndex, VictimaIndex) Then + Call UserDañoUser(AtacanteIndex, VictimaIndex) + Else + If charlist(AtacanteIndex).Bot = 0 Then + Call WriteConsoleMsg(AtacanteIndex, "¡¡Has fallado!!.", FontTypeNames.FONTTYPE_FIGHT) + End If + If charlist(VictimaIndex).Bot = 0 Then + Call WriteConsoleMsg(VictimaIndex, "¡¡" & charlist(AtacanteIndex).Nombre & " ha fallado!!.", FontTypeNames.FONTTYPE_FIGHT) + End If + End If + + End With + + UsuarioAtacaUsuario = True +End Function + +Public Sub UserDañoUser(ByVal AtacanteIndex As Integer, ByVal VictimaIndex As Integer) + + Dim daño As Long + Dim Lugar As Byte + Dim absorbido As Long + Dim Suerte As Integer + + daño = CalcularDaño(AtacanteIndex) + + With charlist(AtacanteIndex) + + Lugar = RandomNum(6) + + If Lugar <> 6 Then + absorbido = RandomNumber(charlist(VictimaIndex).MinDef, charlist(VictimaIndex).MaxDef) + absorbido = absorbido - .Refuerzo + daño = daño - absorbido + Else + absorbido = RandomNumber(charlist(VictimaIndex).MinDefH, charlist(VictimaIndex).MaxDefH) + absorbido = absorbido - .Refuerzo + daño = daño - absorbido + End If + + If daño <= 0 Then daño = 1 + + If .Ai = eBotAi.Asesino Or .Ai = eBotAi.Bardo Then + If .Ai = eBotAi.Asesino Then + Suerte = Int(((0.00003 * 100 - 0.002) * 100 + 0.098) * 100 + 4.25) + ElseIf .Ai = eBotAi.Bardo Then + Suerte = Int(((0.000002 * 100 + 0.0002) * 100 + 0.032) * 100 + 4.81) + End If + + If RandomNum(101) - 1 < Suerte Then + If .Ai = eBotAi.Asesino Then + daño = daño + Round(daño * 1.4, 0) + charlist(AtacanteIndex).ComportamientoCombo = 2 + ElseIf .Ai = eBotAi.Bardo Then + daño = daño + Round(daño * 1.5, 0) + charlist(AtacanteIndex).ComportamientoCombo = 2 + End If + + If .Bot = 0 Then + Call WriteConsoleMsg(AtacanteIndex, "¡¡Has apuñalado a " & charlist(VictimaIndex).Nombre & "!!.", FontTypeNames.FONTTYPE_FIGHT) + End If + If charlist(VictimaIndex).Bot = 0 Then + Call WriteConsoleMsg(VictimaIndex, "¡¡" & charlist(VictimaIndex).Nombre & " te ha apuñalado!!.", FontTypeNames.FONTTYPE_FIGHT) + End If + Else + If .Bot = 0 Then _ + Call WriteConsoleMsg(AtacanteIndex, "¡No has logrado apuñalar a tu enemigo!.", FontTypeNames.FONTTYPE_FIGHT) + End If + End If + + Call ServerSendData(SendTarget.ToAll, AtacanteIndex, PrepareMessagePlayWave(10, charlist(VictimaIndex).Pos.X, charlist(VictimaIndex).Pos.Y)) + + charlist(VictimaIndex).MinHP = charlist(VictimaIndex).MinHP - daño + If charlist(VictimaIndex).MinHP < 0 Then charlist(VictimaIndex).MinHP = 0 + + If .Bot = 0 Then + Call WriteConsoleMsg(AtacanteIndex, "Le has pegado a " & charlist(VictimaIndex).Nombre & " por " & daño, FontTypeNames.FONTTYPE_FIGHT) + Call WriteUpdateCharStats(AtacanteIndex) + If charlist(VictimaIndex).Bot = 0 Then + Call WriteConsoleMsg(VictimaIndex, charlist(AtacanteIndex).Nombre & " Te ha pegado por " & daño, FontTypeNames.FONTTYPE_FIGHT) + Call WriteUpdateCharStats(VictimaIndex) + If charlist(VictimaIndex).MinHP <= 0 Then + Call WriteConsoleMsg(VictimaIndex, charlist(AtacanteIndex).Nombre & " te ha matado.", FontTypeNames.FONTTYPE_FIGHT) + End If + End If + If charlist(VictimaIndex).MinHP <= 0 Then + Call WriteConsoleMsg(AtacanteIndex, "Has matado a " & charlist(VictimaIndex).Nombre, FontTypeNames.FONTTYPE_FIGHT) + Call ServerSendData(SendTarget.ToAllButIndex, AtacanteIndex, PrepareMessageConsoleMsg(charlist(AtacanteIndex).Nombre & " ha matado a " & charlist(VictimaIndex).Nombre & ".", FontTypeNames.FONTTYPE_FIGHT)) + + Call CharDie(VictimaIndex) + Call ResetDuelo(AtacanteIndex) + Call GetTargetBotTeam(EnTeam(AtacanteIndex)) + End If + ElseIf charlist(VictimaIndex).Bot = 0 Then + Call WriteConsoleMsg(VictimaIndex, charlist(AtacanteIndex).Nombre & " Te ha pegado por " & daño, FontTypeNames.FONTTYPE_FIGHT) + Call WriteUpdateCharStats(VictimaIndex) + If charlist(VictimaIndex).MinHP <= 0 Then + Call WriteConsoleMsg(VictimaIndex, charlist(AtacanteIndex).Nombre & " te ha matado.", FontTypeNames.FONTTYPE_FIGHT) + Call ServerSendData(SendTarget.ToAllButIndex, VictimaIndex, PrepareMessageConsoleMsg(charlist(AtacanteIndex).Nombre & " ha matado a " & charlist(VictimaIndex).Nombre & ".", FontTypeNames.FONTTYPE_FIGHT)) + Call CharDie(VictimaIndex) + Call ResetDuelo(AtacanteIndex) + Call GetTargetBotTeam(EnTeam(AtacanteIndex)) + End If + Else + If charlist(VictimaIndex).MinHP <= 0 Then + Call ServerSendData(SendTarget.ToAllButIndex, VictimaIndex, PrepareMessageConsoleMsg(charlist(AtacanteIndex).Nombre & " ha matado a " & charlist(VictimaIndex).Nombre & ".", FontTypeNames.FONTTYPE_FIGHT)) + Call CharDie(VictimaIndex) + Call ResetDuelo(AtacanteIndex) + Call GetTargetBotTeam(EnTeam(AtacanteIndex)) + End If + End If + + End With + +End Sub + +Public Sub UsuarioAtaca(ByVal CharIndex As Integer) + + Dim index As Integer + Dim AttackPos As WorldPos + + If Not CharTimer(CharIndex).Check(TimersIndex.Arrows, False) Then Exit Sub 'Check if arrows interval has finished. + If Not CharTimer(CharIndex).Check(TimersIndex.CastSpell, False) Then 'Check if spells interval has finished. + If charlist(CharIndex).LastCombo = 2 Then + If Not CharTimer(CharIndex).Check(TimersIndex.CastAttack) Then Exit Sub + Else + If Not CharTimer(CharIndex).Check(TimersIndex.Attack) Then Exit Sub + End If + Else + If Not CharTimer(CharIndex).Check(TimersIndex.Attack) Then Exit Sub + End If + + With charlist(CharIndex) + 'Quitamos stamina + If .MinSTA >= 10 Then + .MinSTA = .MinSTA - RandomNum(10) + Else + If .Genero = 0 Then + Call WriteConsoleMsg(CharIndex, "Estás muy cansado para luchar.", FontTypeNames.FONTTYPE_INFO) + Else + Call WriteConsoleMsg(CharIndex, "Estás muy cansada para luchar.", FontTypeNames.FONTTYPE_INFO) + End If + Exit Sub + End If + + Select Case charlist(CharIndex).heading + Case 1 + If MapData(charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y - 1).CharIndex > 0 Then + Call UsuarioAtacaUsuario(CharIndex, MapData(charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y - 1).CharIndex) + Else + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessagePlayWave(2, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + End If + Case 2 + If MapData(charlist(CharIndex).Pos.X + 1, charlist(CharIndex).Pos.Y).CharIndex > 0 Then + Call UsuarioAtacaUsuario(CharIndex, MapData(charlist(CharIndex).Pos.X + 1, charlist(CharIndex).Pos.Y).CharIndex) + Else + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessagePlayWave(2, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + End If + Case 3 + If MapData(charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y + 1).CharIndex > 0 Then + Call UsuarioAtacaUsuario(CharIndex, MapData(charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y + 1).CharIndex) + Else + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessagePlayWave(2, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + End If + Case 4 + If MapData(charlist(CharIndex).Pos.X - 1, charlist(CharIndex).Pos.Y).CharIndex > 0 Then + Call UsuarioAtacaUsuario(CharIndex, MapData(charlist(CharIndex).Pos.X - 1, charlist(CharIndex).Pos.Y).CharIndex) + Else + Call ServerSendData(SendTarget.ToAll, CharIndex, PrepareMessagePlayWave(2, charlist(CharIndex).Pos.X, charlist(CharIndex).Pos.Y)) + End If + End Select + Call CharTimer(CharIndex).Restart(TimersIndex.GolpeU) + charlist(CharIndex).LastCombo = 1 + + End With +End Sub + diff --git a/CODIGO/modCompression.bas b/CODIGO/modCompression.bas new file mode 100644 index 0000000..19439a5 --- /dev/null +++ b/CODIGO/modCompression.bas @@ -0,0 +1,1425 @@ +Attribute VB_Name = "modCompression" +Option Explicit + +Public Const GRH_SOURCE_FILE_EXT As String = ".bmp" +Public Const GRH_RESOURCE_FILE As String = "Graphics.AO" +Public Const GRH_PATCH_FILE As String = "Graphics.PATCH" + +'This structure will describe our binary file's +'size, number and version of contained files +Public Type FILEHEADER + lngNumFiles As Long 'How many files are inside? + lngFileSize As Long 'How big is this file? (Used to check integrity) + lngFileVersion As Long 'The resource version (Used to patch) +End Type + +'This structure will describe each file contained +'in our binary file +Public Type INFOHEADER + lngFileSize As Long 'How big is this chunk of stored data? + lngFileStart As Long 'Where does the chunk start? + strFileName As String * 16 'What's the name of the file this data came from? + lngFileSizeUncompressed As Long 'How big is the file compressed + +#If SeguridadAlkon Then + lngCheckSum As Long +#End If +End Type + +Private Enum PatchInstruction + Delete_File + Create_File + Modify_File +End Enum + +Private Declare Function compress Lib "zlib.dll" (dest As Any, destlen As Any, Src As Any, ByVal srclen As Long) As Long +Private Declare Function uncompress Lib "zlib.dll" (dest As Any, destlen As Any, Src As Any, ByVal srclen As Long) As Long + +Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef dest As Any, ByRef source As Any, ByVal byteCount As Long) + +'BitMaps Strucures +Public Type BITMAPFILEHEADER + bfType As Integer + bfSize As Long + bfReserved1 As Integer + bfReserved2 As Integer + bfOffBits As Long +End Type +Public Type BITMAPINFOHEADER + biSize As Long + biWidth As Long + biHeight As Long + biPlanes As Integer + biBitCount As Integer + biCompression As Long + biSizeImage As Long + biXPelsPerMeter As Long + biYPelsPerMeter As Long + biClrUsed As Long + biClrImportant As Long +End Type +Public Type RGBQUAD + rgbBlue As Byte + rgbGreen As Byte + rgbRed As Byte + rgbReserved As Byte +End Type +Public Type BITMAPINFO + bmiHeader As BITMAPINFOHEADER + bmiColors(255) As RGBQUAD +End Type + +Private Const BI_RGB As Long = 0 +Private Const BI_RLE8 As Long = 1 +Private Const BI_RLE4 As Long = 2 +Private Const BI_BITFIELDS As Long = 3 +Private Const BI_JPG As Long = 4 +Private Const BI_PNG As Long = 5 + + +'To get free bytes in drive +Private Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceExA" (ByVal lpRootPathName As String, FreeBytesToCaller As Currency, bytesTotal As Currency, FreeBytesTotal As Currency) As Long + +Private Function General_Drive_Get_Free_Bytes(ByVal DriveName As String) As Currency +'************************************************************** +'Author: Juan Martín Sotuyo Dodero +'Last Modify Date: 6/07/2004 +' +'************************************************************** + Dim retval As Long + Dim FB As Currency + Dim BT As Currency + Dim FBT As Currency + + retval = GetDiskFreeSpace(Left$(DriveName, 2), FB, BT, FBT) + + General_Drive_Get_Free_Bytes = FB * 10000 'convert result to actual size in bytes +End Function + +'' +' Sorts the info headers by their file name. Uses QuickSort. +' +' @param InfoHead() The array of headers to be ordered. +' @param first The first index in the list. +' @param last The last index in the list. + +Private Sub Sort_Info_Headers(ByRef InfoHead() As INFOHEADER, ByVal first As Long, ByVal last As Long) +'***************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 08/20/2007 +'Sorts the info headers by their file name using QuickSort. +'***************************************************************** + Dim aux As INFOHEADER + Dim min As Long + Dim max As Long + Dim comp As String + + min = first + max = last + + comp = InfoHead((min + max) \ 2).strFileName + + Do While min <= max + Do While InfoHead(min).strFileName < comp And min < last + min = min + 1 + Loop + Do While InfoHead(max).strFileName > comp And max > first + max = max - 1 + Loop + If min <= max Then + aux = InfoHead(min) + InfoHead(min) = InfoHead(max) + InfoHead(max) = aux + min = min + 1 + max = max - 1 + End If + Loop + + If first < max Then Call Sort_Info_Headers(InfoHead, first, max) + If min < last Then Call Sort_Info_Headers(InfoHead, min, last) +End Sub + +'' +' Searches for the specified InfoHeader. +' +' @param ResourceFile A handler to the data file. +' @param InfoHead The header searched. +' @param FirstHead The first head to look. +' @param LastHead The last head to look. +' @param FileHeaderSize The bytes size of a FileHeader. +' @param InfoHeaderSize The bytes size of a InfoHeader. +' +' @return True if found. +' +' @remark File must be already open. +' @remark InfoHead must have set its file name to perform the search. + +Private Function BinarySearch(ByRef ResourceFile As Integer, ByRef InfoHead As INFOHEADER, ByVal FirstHead As Long, ByVal LastHead As Long, ByVal FileHeaderSize As Long, ByVal InfoHeaderSize As Long) As Boolean +'***************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 08/21/2007 +'Searches for the specified InfoHeader +'***************************************************************** + Dim ReadingHead As Long + Dim ReadInfoHead As INFOHEADER + + Do Until FirstHead > LastHead + ReadingHead = (FirstHead + LastHead) \ 2 + + Get ResourceFile, FileHeaderSize + InfoHeaderSize * (ReadingHead - 1) + 1, ReadInfoHead + + If InfoHead.strFileName = ReadInfoHead.strFileName Then + InfoHead = ReadInfoHead + BinarySearch = True + Exit Function + Else + If InfoHead.strFileName < ReadInfoHead.strFileName Then + LastHead = ReadingHead - 1 + Else + FirstHead = ReadingHead + 1 + End If + End If + Loop +End Function + +'' +' Retrieves the InfoHead of the specified graphic file. +' +' @param ResourcePath The resource file folder. +' @param FileName The graphic file name. +' @param InfoHead The InfoHead where data is returned. +' +' @return True if found. + +Private Function Get_InfoHeader(ByRef ResourcePath As String, ByRef FileName As String, ByRef InfoHead As INFOHEADER) As Boolean +'***************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 08/21/2007 +'Retrieves the InfoHead of the specified graphic file +'***************************************************************** + Dim ResourceFile As Integer + Dim ResourceFilePath As String + Dim FileHead As FILEHEADER + +On Local Error GoTo ErrHandler + + ResourceFilePath = ResourcePath & GRH_RESOURCE_FILE + + 'Set InfoHeader we are looking for + InfoHead.strFileName = UCase$(FileName) + +#If SeguridadAlkon Then + Call Secure_Info_Header(InfoHead) +#End If + + 'Open the binary file + ResourceFile = FreeFile() + Open ResourceFilePath For Binary Access Read Lock Write As ResourceFile + 'Extract the FILEHEADER + Get ResourceFile, 1, FileHead + +#If SeguridadAlkon Then + Call Secure_File_Header(FileHead) +#End If + + 'Check the file for validity + If LOF(ResourceFile) <> FileHead.lngFileSize Then + MsgBox "Archivo de recursos dañado. " & ResourceFilePath, , "Error" + Close ResourceFile + Exit Function + End If + + 'Search for it! + If BinarySearch(ResourceFile, InfoHead, 1, FileHead.lngNumFiles, Len(FileHead), Len(InfoHead)) Then +#If SeguridadAlkon Then + Call Secure_Info_Header(InfoHead) +#End If + + Get_InfoHeader = True + End If + + Close ResourceFile +Exit Function + +ErrHandler: + Close ResourceFile + + Call MsgBox("Error al intentar leer el archivo " & ResourceFilePath & ". Razón: " & Err.Number & " : " & Err.Description, vbOKOnly, "Error") +End Function + +'' +' Compresses binary data avoiding data loses. +' +' @param data() The data array. + +Private Sub Compress_Data(ByRef data() As Byte) +'***************************************************************** +'Author: Juan Martín Dotuyo Dodero +'Last Modify Date: 10/13/2004 +'Compresses binary data avoiding data loses +'***************************************************************** + Dim Dimensions As Long + Dim DimBuffer As Long + Dim BufTemp() As Byte + Dim loopc As Long + + Dimensions = UBound(data) + 1 + + ' The worst case scenario, compressed info is 1.06 times the original - see zlib's doc for more info. + DimBuffer = Dimensions * 1.06 + + ReDim BufTemp(DimBuffer) + + Call compress(BufTemp(0), DimBuffer, data(0), Dimensions) + + Erase data + + ReDim data(DimBuffer - 1) + ReDim Preserve BufTemp(DimBuffer - 1) + + data = BufTemp + + Erase BufTemp + +#If SeguridadAlkon Then + Call Secure_Compressed_Data(data) +#End If +End Sub + +'' +' Decompresses binary data. +' +' @param data() The data array. +' @param OrigSize The original data size. + +Private Sub Decompress_Data(ByRef data() As Byte, ByVal OrigSize As Long) +'***************************************************************** +'Author: Juan Martín Dotuyo Dodero +'Last Modify Date: 10/13/2004 +'Decompresses binary data +'***************************************************************** + Dim BufTemp() As Byte + + ReDim BufTemp(OrigSize - 1) + +#If SeguridadAlkon Then + Call Secure_Compressed_Data(data) +#End If + + Call uncompress(BufTemp(0), OrigSize, data(0), UBound(data) + 1) + + ReDim data(OrigSize - 1) + + data = BufTemp + + Erase BufTemp +End Sub + +'' +' Compresses all graphic files to a resource file. +' +' @param SourcePath The graphic files folder. +' @param OutputPath The resource file folder. +' @param version The resource file version. +' @param PrgBar The control that shows the process state. +' +' @return True if no error occurred. + +Public Function Compress_Files(ByRef SourcePath As String, ByRef OutputPath As String, ByVal version As Long, ByRef prgBar As ProgressBar) As Boolean +'***************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 08/19/2007 +'Compresses all graphic files to a resource file +'***************************************************************** + Dim SourceFileName As String + Dim OutputFilePath As String + Dim SourceFile As Long + Dim OutputFile As Long + Dim SourceData() As Byte + Dim FileHead As FILEHEADER + Dim InfoHead() As INFOHEADER + Dim loopc As Long + +On Local Error GoTo ErrHandler + OutputFilePath = OutputPath & GRH_RESOURCE_FILE + SourceFileName = Dir(SourcePath & "*" & GRH_SOURCE_FILE_EXT, vbNormal) + + ' Create list of all files to be compressed + While SourceFileName <> "" + FileHead.lngNumFiles = FileHead.lngNumFiles + 1 + + ReDim Preserve InfoHead(FileHead.lngNumFiles - 1) + InfoHead(FileHead.lngNumFiles - 1).strFileName = UCase$(SourceFileName) + +#If SeguridadAlkon Then + 'We want the list ordered considering encryption + Call Secure_Info_Header(InfoHead(FileHead.lngNumFiles - 1)) +#End If + + 'Search new file + SourceFileName = Dir() + Wend + + If FileHead.lngNumFiles = 0 Then + MsgBox "No se encontraron archivos de extención " & GRH_SOURCE_FILE_EXT & " en " & SourcePath & ".", , "Error" + Exit Function + End If + + If Not prgBar Is Nothing Then + prgBar.max = FileHead.lngNumFiles + prgBar.Value = 0 + End If + + 'Destroy file if it previuosly existed + If Dir(OutputFilePath, vbNormal) <> "" Then + Kill OutputFilePath + End If + + 'Finish setting the FileHeader data + FileHead.lngFileVersion = version + FileHead.lngFileSize = Len(FileHead) + FileHead.lngNumFiles * Len(InfoHead(0)) + + 'Order the InfoHeads + Call Sort_Info_Headers(InfoHead(), 0, FileHead.lngNumFiles - 1) + + 'Open a new file + OutputFile = FreeFile() + Open OutputFilePath For Binary Access Read Write As OutputFile + ' Move to the end of the headers, where the file data will actually start + Seek OutputFile, FileHead.lngFileSize + 1 + + ' Process every file! + For loopc = 0 To FileHead.lngNumFiles - 1 + +#If SeguridadAlkon Then + Call Secure_Info_Header(InfoHead(loopc)) +#End If + + SourceFile = FreeFile() + Open SourcePath & InfoHead(loopc).strFileName For Binary Access Read Lock Write As SourceFile + + 'Find out how large the file is and resize the data array appropriately + InfoHead(loopc).lngFileSizeUncompressed = LOF(SourceFile) + ReDim SourceData(LOF(SourceFile) - 1) + + 'Get the data from the file + Get SourceFile, , SourceData + + 'Compress it + Call Compress_Data(SourceData) + + 'Store it in the resource file + Put OutputFile, , SourceData + + With InfoHead(loopc) + 'Set up the info headers + .lngFileSize = UBound(SourceData) + 1 + .lngFileStart = FileHead.lngFileSize + 1 + + 'Update the file header + FileHead.lngFileSize = FileHead.lngFileSize + .lngFileSize + End With + +#If SeguridadAlkon Then + Call Secure_Info_Header(InfoHead(loopc)) +#End If + + Erase SourceData + + Close SourceFile + + 'Update progress bar + If Not prgBar Is Nothing Then prgBar.Value = prgBar.Value + 1 + DoEvents + Next loopc + +#If SeguridadAlkon Then + Call Secure_File_Header(FileHead) +#End If + + 'Store the headers in the file + Seek OutputFile, 1 + Put OutputFile, , FileHead + Put OutputFile, , InfoHead + + 'Close the file + Close OutputFile + + Erase InfoHead + Erase SourceData + + Compress_Files = True +Exit Function + +ErrHandler: + Erase SourceData + Erase InfoHead + Close OutputFile + + Call MsgBox("No se pudo crear el archivo binario. Razón: " & Err.Number & " : " & Err.Description, vbOKOnly, "Error") +End Function + +'' +' Retrieves a byte array with the compressed data from the specified file. +' +' @param ResourcePath The resource file folder. +' @param InfoHead The header specifiing the graphic file info. +' @param data() The byte array to return data. +' +' @return True if no error occurred. +' +' @remark InfoHead must not be encrypted. +' @remark Data is not desencrypted. + +Public Function Get_File_RawData(ByRef ResourcePath As String, ByRef InfoHead As INFOHEADER, ByRef data() As Byte) As Boolean +'***************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 08/24/2007 +'Retrieves a byte array with the compressed data from the specified file +'***************************************************************** + Dim ResourceFilePath As String + Dim ResourceFile As Integer + +On Local Error GoTo ErrHandler + ResourceFilePath = ResourcePath & GRH_RESOURCE_FILE + + 'Size the Data array + ReDim data(InfoHead.lngFileSize - 1) + + 'Open the binary file + ResourceFile = FreeFile + Open ResourceFilePath For Binary Access Read Lock Write As ResourceFile + 'Get the data + Get ResourceFile, InfoHead.lngFileStart, data + 'Close the binary file + Close ResourceFile + + Get_File_RawData = True +Exit Function + +ErrHandler: + Close ResourceFile +End Function + +'' +' Extract the specific file from a resource file. +' +' @param ResourcePath The resource file folder. +' @param InfoHead The header specifiing the graphic file info. +' @param data() The byte array to return data. +' +' @return True if no error occurred. +' +' @remark Data is desencrypted. + +Public Function Extract_File(ByRef ResourcePath As String, ByRef InfoHead As INFOHEADER, ByRef data() As Byte) As Boolean +'***************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 08/20/2007 +'Extract the specific file from a resource file +'***************************************************************** +On Local Error GoTo ErrHandler + + If Get_File_RawData(ResourcePath, InfoHead, data) Then + 'Decompress all data + If InfoHead.lngFileSize < InfoHead.lngFileSizeUncompressed Then + Call Decompress_Data(data, InfoHead.lngFileSizeUncompressed) + End If + + Extract_File = True + End If +Exit Function + +ErrHandler: + Call MsgBox("Error al intentar decodificar recursos. Razon: " & Err.Number & " : " & Err.Description, vbOKOnly, "Error") +End Function + +'' +' Extracts all files from a resource file. +' +' @param ResourcePath The resource file folder. +' @param OutputPath The folder where graphic files will be extracted. +' @param PrgBar The control that shows the process state. +' +' @return True if no error occurred. + +Public Function Extract_Files(ByRef ResourcePath As String, ByRef OutputPath As String, ByRef prgBar As ProgressBar) As Boolean +'***************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 08/20/2007 +'Extracts all files from a resource file +'***************************************************************** + Dim loopc As Long + Dim ResourceFile As Integer + Dim ResourceFilePath As String + Dim OutputFile As Integer + Dim SourceData() As Byte + Dim FileHead As FILEHEADER + Dim InfoHead() As INFOHEADER + Dim RequiredSpace As Currency + +On Local Error GoTo ErrHandler + ResourceFilePath = ResourcePath & GRH_RESOURCE_FILE + + 'Open the binary file + ResourceFile = FreeFile() + Open ResourceFilePath For Binary Access Read Lock Write As ResourceFile + 'Extract the FILEHEADER + Get ResourceFile, 1, FileHead + +#If SeguridadAlkon Then + Call Secure_File_Header(FileHead) +#End If + + 'Check the file for validity + If LOF(ResourceFile) <> FileHead.lngFileSize Then + Call MsgBox("Archivo de recursos dañado. " & ResourceFilePath, , "Error") + Close ResourceFile + Exit Function + End If + + 'Size the InfoHead array + ReDim InfoHead(FileHead.lngNumFiles - 1) + + 'Extract the INFOHEADER + Get ResourceFile, , InfoHead + + 'Check if there is enough hard drive space to extract all files + For loopc = 0 To UBound(InfoHead) +#If SeguridadAlkon Then + Call Secure_Info_Header(InfoHead(loopc)) +#End If + + RequiredSpace = RequiredSpace + InfoHead(loopc).lngFileSizeUncompressed + Next loopc + + If RequiredSpace >= General_Drive_Get_Free_Bytes(Left$(App.Path, 3)) Then + Erase InfoHead + Close ResourceFile + Call MsgBox("No hay suficiente espacio en el disco para extraer los archivos.", , "Error") + Exit Function + End If + Close ResourceFile + + 'Update progress bar + If Not prgBar Is Nothing Then + prgBar.max = FileHead.lngNumFiles + prgBar.Value = 0 + End If + + 'Extract all of the files from the binary file + For loopc = 0 To UBound(InfoHead) + 'Extract this file + If Extract_File(ResourcePath, InfoHead(loopc), SourceData) Then + 'Destroy file if it previuosly existed + If FileExist(OutputPath & InfoHead(loopc).strFileName, vbNormal) Then + Call Kill(OutputPath & InfoHead(loopc).strFileName) + End If + + 'Save it! + OutputFile = FreeFile() + Open OutputPath & InfoHead(loopc).strFileName For Binary As OutputFile + Put OutputFile, , SourceData + Close OutputFile + + Erase SourceData + Else + Erase SourceData + Erase InfoHead + + Call MsgBox("No se pudo extraer el archivo " & InfoHead(loopc).strFileName, vbOKOnly, "Error") + Exit Function + End If + + 'Update progress bar + If Not prgBar Is Nothing Then prgBar.Value = prgBar.Value + 1 + DoEvents + Next loopc + + Erase InfoHead + Extract_Files = True +Exit Function + +ErrHandler: + Close ResourceFile + Erase SourceData + Erase InfoHead + + Call MsgBox("No se pudo extraer el archivo binario correctamente. Razon: " & Err.Number & " : " & Err.Description, vbOKOnly, "Error") +End Function + +'' +' Retrieves a byte array with the specified file data. +' +' @param ResourcePath The resource file folder. +' @param FileName The graphic file name. +' @param data() The byte array to return data. +' +' @return True if no error occurred. +' +' @remark Data is desencrypted. + +Public Function Get_File_Data(ByRef ResourcePath As String, ByRef FileName As String, ByRef data() As Byte) As Boolean +'***************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 08/21/2007 +'Retrieves a byte array with the specified file data +'***************************************************************** + Dim InfoHead As INFOHEADER + + If Get_InfoHeader(ResourcePath, FileName, InfoHead) Then + 'Extract! + Get_File_Data = Extract_File(ResourcePath, InfoHead, data) + Else + Call MsgBox("No se se encontro el recurso " & FileName) + End If +End Function + +'' +' Retrieves bitmap file data. +' +' @param ResourcePath The resource file folder. +' @param FileName The graphic file name. +' @param bmpInfo The bitmap info structure. +' @param data() The byte array to return data. +' +' @return True if no error occurred. + +Public Function Get_Bitmap(ByRef ResourcePath As String, ByRef FileName As String, ByRef bmpInfo As BITMAPINFO, ByRef data() As Byte) As Boolean +'***************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 11/30/2007 +'Retrieves bitmap file data +'***************************************************************** + Dim InfoHead As INFOHEADER + Dim rawData() As Byte + Dim offBits As Long + Dim bitmapSize As Long + Dim colorCount As Long + + If Get_InfoHeader(ResourcePath, FileName, InfoHead) Then + 'Extract the file and create the bitmap data from it. + If Extract_File(ResourcePath, InfoHead, rawData) Then + Call CopyMemory(offBits, rawData(10), 4) + Call CopyMemory(bmpInfo.bmiHeader, rawData(14), 40) + + With bmpInfo.bmiHeader + bitmapSize = AlignScan(.biWidth, .biBitCount) * Abs(.biHeight) + + If .biBitCount < 24 Or .biCompression = BI_BITFIELDS Or (.biCompression <> BI_RGB And .biBitCount = 32) Then + If .biClrUsed < 1 Then + colorCount = 2 ^ .biBitCount + Else + colorCount = .biClrUsed + End If + + ' When using bitfields on 16 or 32 bits images, bmiColors has a 3-longs mask. + If .biBitCount >= 16 And .biCompression = BI_BITFIELDS Then colorCount = 3 + + Call CopyMemory(bmpInfo.bmiColors(0), rawData(54), colorCount * 4) + End If + End With + + ReDim data(bitmapSize - 1) As Byte + Call CopyMemory(data(0), rawData(offBits), bitmapSize) + + Get_Bitmap = True + End If + Else + Call MsgBox("No se encontro el recurso " & FileName) + End If +End Function + +'' +' Compare two byte arrays to detect any difference. +' +' @param data1() Byte array. +' @param data2() Byte array. +' +' @return True if are equals. + +Private Function Compare_Datas(ByRef data1() As Byte, ByRef data2() As Byte) As Boolean +'***************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 02/11/2007 +'Compare two byte arrays to detect any difference +'***************************************************************** + Dim length As Long + Dim act As Long + + length = UBound(data1) + 1 + + If (UBound(data2) + 1) = length Then + While act < length + If data1(act) Xor data2(act) Then Exit Function + + act = act + 1 + Wend + + Compare_Datas = True + End If +End Function + +'' +' Retrieves the next InfoHeader. +' +' @param ResourceFile A handler to the resource file. +' @param FileHead The reource file header. +' @param InfoHead The returned header. +' @param ReadFiles The number of headers that have already been read. +' +' @return False if there are no more headers tu read. +' +' @remark File must be already open. +' @remark Used to walk through the resource file info headers. +' @remark The number of read files will increase although there is nothing else to read. +' @remark InfoHead is encrypted. + +Private Function ReadNext_InfoHead(ByRef ResourceFile As Integer, ByRef FileHead As FILEHEADER, ByRef InfoHead As INFOHEADER, ByRef ReadFiles As Long) As Boolean +'***************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 08/24/2007 +'Reads the next InfoHeader +'***************************************************************** + + If ReadFiles < FileHead.lngNumFiles Then + 'Read header + Get ResourceFile, Len(FileHead) + Len(InfoHead) * ReadFiles + 1, InfoHead + + 'Update + ReadNext_InfoHead = True + End If + + ReadFiles = ReadFiles + 1 +End Function + +'' +' Retrieves the next bitmap. +' +' @param ResourcePath The resource file folder. +' @param ReadFiles The number of bitmaps that have already been read. +' @param bmpInfo The bitmap info structure. +' @param data() The byte array to return data. +' +' @return False if there are no more bitmaps tu get. +' +' @remark Used to walk through the resource file bitmaps. + +Public Function GetNext_Bitmap(ByRef ResourcePath As String, ByRef ReadFiles As Long, ByRef bmpInfo As BITMAPINFO, ByRef data() As Byte, ByRef fileIndex As Long) As Boolean +'***************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 12/02/2007 +'Reads the next InfoHeader +'***************************************************************** +On Error Resume Next + + Dim ResourceFile As Integer + Dim FileHead As FILEHEADER + Dim InfoHead As INFOHEADER + Dim FileName As String + + ResourceFile = FreeFile + Open ResourcePath & GRH_RESOURCE_FILE For Binary Access Read Lock Write As ResourceFile + Get ResourceFile, 1, FileHead + +#If SeguridadAlkon Then + Call Secure_File_Header(FileHead) +#End If + + If ReadNext_InfoHead(ResourceFile, FileHead, InfoHead, ReadFiles) Then +#If SeguridadAlkon Then + Call Secure_Info_Header(InfoHead) +#End If + + Call Get_Bitmap(ResourcePath, InfoHead.strFileName, bmpInfo, data()) + FileName = Trim$(InfoHead.strFileName) + fileIndex = CLng(Left$(FileName, Len(FileName) - 4)) + + GetNext_Bitmap = True + End If + + Close ResourceFile +End Function + +'' +' Compares two resource versions and makes a patch file. +' +' @param NewResourcePath The actual reource file folder. +' @param OldResourcePath The previous reource file folder. +' @param OutputPath The patchs file folder. +' @param PrgBar The control that shows the process state. +' +' @return True if no error occurred. + +Public Function Make_Patch(ByRef NewResourcePath As String, ByRef OldResourcePath As String, ByRef OutputPath As String, ByRef prgBar As ProgressBar) As Boolean +'***************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 08/24/2007 +'Compares two resource versions and make a patch file +'***************************************************************** + Dim NewResourceFile As Integer + Dim NewResourceFilePath As String + Dim NewFileHead As FILEHEADER + Dim NewInfoHead As INFOHEADER + Dim NewReadFiles As Long + Dim NewReadNext As Boolean + + Dim OldResourceFile As Integer + Dim OldResourceFilePath As String + Dim OldFileHead As FILEHEADER + Dim OldInfoHead As INFOHEADER + Dim OldReadFiles As Long + Dim OldReadNext As Boolean + + Dim OutputFile As Integer + Dim OutputFilePath As String + Dim data() As Byte + Dim auxData() As Byte + Dim Instruction As Byte + +'Set up the error handler +'On Local Error GoTo ErrHandler + + NewResourceFilePath = NewResourcePath & GRH_RESOURCE_FILE + OldResourceFilePath = OldResourcePath & GRH_RESOURCE_FILE + OutputFilePath = OutputPath & GRH_PATCH_FILE + + 'Open the old binary file + OldResourceFile = FreeFile + Open OldResourceFilePath For Binary Access Read Lock Write As OldResourceFile + + 'Get the old FileHeader + Get OldResourceFile, 1, OldFileHead + +#If SeguridadAlkon Then + Call Secure_File_Header(OldFileHead) +#End If + + 'Check the file for validity + If LOF(OldResourceFile) <> OldFileHead.lngFileSize Then + Call MsgBox("Archivo de recursos anterior dañado. " & OldResourceFilePath, , "Error") + Close OldResourceFile + Exit Function + End If + + 'Open the new binary file + NewResourceFile = FreeFile() + Open NewResourceFilePath For Binary Access Read Lock Write As NewResourceFile + + 'Get the new FileHeader + Get NewResourceFile, 1, NewFileHead + +#If SeguridadAlkon Then + Call Secure_File_Header(NewFileHead) +#End If + + 'Check the file for validity + If LOF(NewResourceFile) <> NewFileHead.lngFileSize Then + Call MsgBox("Archivo de recursos anterior dañado. " & NewResourceFilePath, , "Error") + Close NewResourceFile + Close OldResourceFile + Exit Function + End If + + 'Destroy file if it previuosly existed + If Dir(OutputFilePath, vbNormal) <> "" Then Kill OutputFilePath + + 'Open the patch file + OutputFile = FreeFile() + Open OutputFilePath For Binary Access Read Write As OutputFile + + If Not prgBar Is Nothing Then + prgBar.max = OldFileHead.lngNumFiles + NewFileHead.lngNumFiles + prgBar.Value = 0 + End If + + 'put previous file version (unencrypted) + Put OutputFile, , OldFileHead.lngFileVersion + + 'Put the new file header +#If SeguridadAlkon Then + Call Secure_File_Header(NewFileHead) +#End If + + Put OutputFile, , NewFileHead + +#If SeguridadAlkon Then + Call Secure_File_Header(NewFileHead) +#End If + + 'Try to read old and new first files + If ReadNext_InfoHead(OldResourceFile, OldFileHead, OldInfoHead, OldReadFiles) _ + And ReadNext_InfoHead(NewResourceFile, NewFileHead, NewInfoHead, NewReadFiles) Then + + 'Update + prgBar.Value = prgBar.Value + 2 + + Do 'Main loop + 'Comparisons are between encrypted names, for ordering issues + If OldInfoHead.strFileName = NewInfoHead.strFileName Then + +#If SeguridadAlkon Then + Call Secure_Info_Header(OldInfoHead) + Call Secure_Info_Header(NewInfoHead) +#End If + + 'Get old file data + Call Get_File_RawData(OldResourcePath, OldInfoHead, auxData) + + 'Get new file data + Call Get_File_RawData(NewResourcePath, NewInfoHead, data) + + If Not Compare_Datas(data, auxData) Then + 'File was modified + Instruction = PatchInstruction.Modify_File + Put OutputFile, , Instruction + + 'Write header +#If SeguridadAlkon Then + Call Secure_Info_Header(NewInfoHead) +#End If + Put OutputFile, , NewInfoHead + + 'Write data + Put OutputFile, , data + End If + + 'Read next OldResource + If Not ReadNext_InfoHead(OldResourceFile, OldFileHead, OldInfoHead, OldReadFiles) Then + Exit Do + End If + + 'Read next NewResource + If Not ReadNext_InfoHead(NewResourceFile, NewFileHead, NewInfoHead, NewReadFiles) Then + 'Reread last OldInfoHead + OldReadFiles = OldReadFiles - 1 + Exit Do + End If + + 'Update + If Not prgBar Is Nothing Then prgBar.Value = prgBar.Value + 2 + + ElseIf OldInfoHead.strFileName < NewInfoHead.strFileName Then + + 'File was deleted + Instruction = PatchInstruction.Delete_File + Put OutputFile, , Instruction + Put OutputFile, , OldInfoHead + + 'Read next OldResource + If Not ReadNext_InfoHead(OldResourceFile, OldFileHead, OldInfoHead, OldReadFiles) Then + 'Reread last NewInfoHead + NewReadFiles = NewReadFiles - 1 + Exit Do + End If + + 'Update + If Not prgBar Is Nothing Then prgBar.Value = prgBar.Value + 1 + + Else + + 'New file + Instruction = PatchInstruction.Create_File + Put OutputFile, , Instruction + Put OutputFile, , NewInfoHead + +#If SeguridadAlkon Then + Call Secure_Info_Header(NewInfoHead) +#End If + + 'Get file data + Call Get_File_RawData(NewResourcePath, NewInfoHead, data) + + 'Write data + Put OutputFile, , data + + 'Read next NewResource + If Not ReadNext_InfoHead(NewResourceFile, NewFileHead, NewInfoHead, NewReadFiles) Then + 'Reread last OldInfoHead + OldReadFiles = OldReadFiles - 1 + Exit Do + End If + + 'Update + If Not prgBar Is Nothing Then prgBar.Value = prgBar.Value + 1 + End If + + DoEvents + Loop + + Else + 'if at least one is empty + OldReadFiles = 0 + NewReadFiles = 0 + End If + + 'Read everything? + While ReadNext_InfoHead(OldResourceFile, OldFileHead, OldInfoHead, OldReadFiles) + 'Delete file + Instruction = PatchInstruction.Delete_File + Put OutputFile, , Instruction + Put OutputFile, , OldInfoHead + + 'Update + If Not prgBar Is Nothing Then prgBar.Value = prgBar.Value + 1 + DoEvents + Wend + + 'Read everything? + While ReadNext_InfoHead(NewResourceFile, NewFileHead, NewInfoHead, NewReadFiles) + 'Create file + Instruction = PatchInstruction.Create_File + Put OutputFile, , Instruction + Put OutputFile, , NewInfoHead + + 'Get file data +#If SeguridadAlkon Then + Call Secure_Info_Header(NewInfoHead) +#End If + Call Get_File_RawData(NewResourcePath, NewInfoHead, data) + 'Write data + Put OutputFile, , data + + 'Update + If Not prgBar Is Nothing Then prgBar.Value = prgBar.Value + 1 + DoEvents + Wend + + 'Close the patch file + Close OutputFile + + 'Close the new binary file + Close NewResourceFile + + 'Close the old binary file + Close OldResourceFile + + Make_Patch = True +Exit Function + +ErrHandler: + Close OutputFile + Close NewResourceFile + Close OldResourceFile + + Call MsgBox("No se pudo terminar de crear el parche. Razon: " & Err.Number & " : " & Err.Description, vbOKOnly, "Error") +End Function + +'' +' Follows patches instructions to update a resource file. +' +' @param ResourcePath The reource file folder. +' @param PatchPath The patch file folder. +' @param PrgBar The control that shows the process state. +' +' @return True if no error occurred. +#If SeguridadAlkon Then +Public Function Apply_Patch(ByRef ResourcePath As String, ByRef PatchPath As String, ByVal CheckSum As String, ByRef prgBar As ProgressBar) As Boolean +#Else +Public Function Apply_Patch(ByRef ResourcePath As String, ByRef PatchPath As String, ByRef prgBar As ProgressBar) As Boolean +#End If +'***************************************************************** +'Author: Nicolas Matias Gonzalez (NIGO) +'Last Modify Date: 08/24/2007 +'Follows patches instructions to update a resource file +'***************************************************************** + Dim ResourceFile As Integer + Dim ResourceFilePath As String + Dim FileHead As FILEHEADER + Dim InfoHead As INFOHEADER + Dim ResourceReadFiles As Long + Dim EOResource As Boolean + + Dim PatchFile As Integer + Dim PatchFilePath As String + Dim PatchFileHead As FILEHEADER + Dim PatchInfoHead As INFOHEADER + Dim Instruction As Byte + Dim OldResourceVersion As Long + + Dim OutputFile As Integer + Dim OutputFilePath As String + Dim data() As Byte + Dim WrittenFiles As Long + Dim DataOutputPos As Long + +On Local Error GoTo ErrHandler + + ResourceFilePath = ResourcePath & GRH_RESOURCE_FILE + PatchFilePath = PatchPath & GRH_PATCH_FILE + OutputFilePath = ResourcePath & GRH_RESOURCE_FILE & "tmp" + + 'Open the old binary file + ResourceFile = FreeFile() + Open ResourceFilePath For Binary Access Read Lock Write As ResourceFile + + 'Read the old FileHeader + Get ResourceFile, , FileHead +#If SeguridadAlkon Then + Call Secure_File_Header(FileHead) +#End If + + 'Check the file for validity + If LOF(ResourceFile) <> FileHead.lngFileSize Then + Call MsgBox("Archivo de recursos anterior dañado. " & ResourceFilePath, , "Error") + Close ResourceFile + Exit Function + End If + + 'Open the patch file + PatchFile = FreeFile() + Open PatchFilePath For Binary Access Read Lock Write As PatchFile + + 'Get previous file version + Get PatchFile, , OldResourceVersion + + 'Check the file version + If OldResourceVersion <> FileHead.lngFileVersion Then + Call MsgBox("Incongruencia en versiones.", , "Error") + Close ResourceFile + Close PatchFile + Exit Function + End If + + 'Read the new FileHeader + Get PatchFile, , PatchFileHead + + 'Destroy file if it previuosly existed + If FileExist(OutputFilePath, vbNormal) Then Call Kill(OutputFilePath) + + 'Open the patch file + OutputFile = FreeFile() + Open OutputFilePath For Binary Access Read Write As OutputFile + + 'Save the file header + Put OutputFile, , PatchFileHead +#If SeguridadAlkon Then + Call Secure_File_Header(PatchFileHead) +#End If + + If Not prgBar Is Nothing Then + prgBar.max = PatchFileHead.lngNumFiles + prgBar.Value = 0 + End If + + 'Update + DataOutputPos = Len(FileHead) + Len(InfoHead) * PatchFileHead.lngNumFiles + 1 + + 'Process loop + While Loc(PatchFile) < LOF(PatchFile) + + 'Get the instruction + Get PatchFile, , Instruction + 'Get the InfoHead + Get PatchFile, , PatchInfoHead + + Do + EOResource = Not ReadNext_InfoHead(ResourceFile, FileHead, InfoHead, ResourceReadFiles) + + 'Comparison is performed among encrypted names for ordering issues + If Not EOResource And InfoHead.strFileName < PatchInfoHead.strFileName Then + +#If SeguridadAlkon Then + Call Secure_Info_Header(InfoHead) +#End If + + 'GetData and update InfoHead + Call Get_File_RawData(ResourcePath, InfoHead, data) + InfoHead.lngFileStart = DataOutputPos + +#If SeguridadAlkon Then + Call Secure_Info_Header(InfoHead) +#End If + + 'Save file! + Put OutputFile, Len(FileHead) + Len(InfoHead) * WrittenFiles + 1, InfoHead + Put OutputFile, DataOutputPos, data + + 'Update + DataOutputPos = DataOutputPos + UBound(data) + 1 + WrittenFiles = WrittenFiles + 1 + If Not prgBar Is Nothing Then prgBar.Value = WrittenFiles + Else + Exit Do + End If + Loop + + Select Case Instruction + 'Delete + Case PatchInstruction.Delete_File + If InfoHead.strFileName <> PatchInfoHead.strFileName Then + Err.Description = "Incongruencia en archivos de recurso" + GoTo ErrHandler + End If + + 'Create + Case PatchInstruction.Create_File + If (InfoHead.strFileName > PatchInfoHead.strFileName) Or EOResource Then + +#If SeguridadAlkon Then + Call Secure_Info_Header(PatchInfoHead) +#End If + + 'Get file data + ReDim data(PatchInfoHead.lngFileSize - 1) + Get PatchFile, , data + +#If SeguridadAlkon Then + Call Secure_Info_Header(PatchInfoHead) +#End If + + 'Save it + Put OutputFile, Len(FileHead) + Len(InfoHead) * WrittenFiles + 1, PatchInfoHead + Put OutputFile, DataOutputPos, data + + 'Reanalize last Resource InfoHead + EOResource = False + ResourceReadFiles = ResourceReadFiles - 1 + + 'Update + DataOutputPos = DataOutputPos + UBound(data) + 1 + WrittenFiles = WrittenFiles + 1 + If Not prgBar Is Nothing Then prgBar.Value = WrittenFiles + Else + Err.Description = "Incongruencia en archivos de recurso" + GoTo ErrHandler + End If + + 'Modify + Case PatchInstruction.Modify_File + If InfoHead.strFileName = PatchInfoHead.strFileName Then + +#If SeguridadAlkon Then + Call Secure_Info_Header(PatchInfoHead) +#End If + + 'Get file data + ReDim data(PatchInfoHead.lngFileSize - 1) + Get PatchFile, , data + +#If SeguridadAlkon Then + Call Secure_Info_Header(PatchInfoHead) +#End If + + 'Save it + Put OutputFile, Len(FileHead) + Len(InfoHead) * WrittenFiles + 1, PatchInfoHead + Put OutputFile, DataOutputPos, data + + 'Update + DataOutputPos = DataOutputPos + UBound(data) + 1 + WrittenFiles = WrittenFiles + 1 + If Not prgBar Is Nothing Then prgBar.Value = WrittenFiles + Else + Err.Description = "Incongruencia en archivos de recurso" + GoTo ErrHandler + End If + End Select + + DoEvents + Wend + + 'Read everything? + While ReadNext_InfoHead(ResourceFile, FileHead, InfoHead, ResourceReadFiles) +#If SeguridadAlkon Then + Call Secure_Info_Header(InfoHead) +#End If + 'GetData and update InfoHeader + Call Get_File_RawData(ResourcePath, InfoHead, data) + InfoHead.lngFileStart = DataOutputPos + +#If SeguridadAlkon Then + Call Secure_Info_Header(InfoHead) +#End If + + 'Save file! + Put OutputFile, Len(FileHead) + Len(InfoHead) * WrittenFiles + 1, InfoHead + Put OutputFile, DataOutputPos, data + + 'Update + DataOutputPos = DataOutputPos + UBound(data) + 1 + WrittenFiles = WrittenFiles + 1 + If Not prgBar Is Nothing Then prgBar.Value = WrittenFiles + DoEvents + Wend + + 'Close the patch file + Close OutputFile + + 'Close the new binary file + Close PatchFile + + 'Close the old binary file + Close ResourceFile + + 'Check integrity + If (PatchFileHead.lngNumFiles = WrittenFiles) Then +#If SeguridadAlkon Then + Dim md5 As New clsMD5 + md5.MD5Reset + Debug.Print md5.GetMD5File(OutputFilePath) + md5.MD5Reset + If md5.GetMD5File(OutputFilePath) = CheckSum Then +#End If + 'Replace File + Call Kill(ResourceFilePath) + Name OutputFilePath As ResourceFilePath +#If SeguridadAlkon Then + Else + Err.Description = "Checksum Incorrecto" + GoTo ErrHandler + End If +#End If + Else + Err.Description = "Falla al procesar parche" + GoTo ErrHandler + End If + + Apply_Patch = True +Exit Function + +ErrHandler: + Close OutputFile + Close PatchFile + Close ResourceFile + 'Destroy file if created + If FileExist(OutputFilePath, vbNormal) Then Call Kill(OutputFilePath) + + Call MsgBox("No se pudo parchear. Razon: " & Err.Number & " : " & Err.Description, vbOKOnly, "Error") +End Function + +Private Function AlignScan(ByVal inWidth As Long, ByVal inDepth As Integer) As Long +'***************************************************************** +'Author: Unknown +'Last Modify Date: Unknown +'***************************************************************** + AlignScan = (((inWidth * inDepth) + &H1F) And Not &H1F&) \ &H8 +End Function + +'' +' Retrieves the version number of a given resource file. +' +' @param ResourceFilePath The resource file complete path. +' +' @return The version number of the given file. + +Public Function GetVersion(ByVal ResourceFilePath As String) As Long +'***************************************************************** +'Author: Juan Martín Sotuyo Dodero (Maraxus) +'Last Modify Date: 11/23/2008 +' +'***************************************************************** + Dim ResourceFile As Integer + Dim FileHead As FILEHEADER + + ResourceFile = FreeFile() + Open ResourceFilePath For Binary Access Read Lock Write As ResourceFile + 'Extract the FILEHEADER + Get ResourceFile, 1, FileHead + +#If SeguridadAlkon Then + Call Secure_File_Header(FileHead) +#End If + Close ResourceFile + + GetVersion = FileHead.lngFileVersion +End Function diff --git a/CODIGO/modSendData.bas b/CODIGO/modSendData.bas new file mode 100644 index 0000000..8f8bb3c --- /dev/null +++ b/CODIGO/modSendData.bas @@ -0,0 +1,95 @@ +Attribute VB_Name = "modSendData" + +Option Explicit + +Public Enum SendTarget + ToAll = 1 + ToAllButIndex + ToAllButIndexAndHost + ToPCArea + ToDeadArea +End Enum + +Public Sub ServerSendData(ByVal sndRoute As SendTarget, ByVal sndIndex As Integer, ByVal sndData As String) + +On Error Resume Next + Dim LoopC As Long + Dim Map As Integer + + Select Case sndRoute + Case SendTarget.ToPCArea + Call SendToCharArea(sndIndex, sndData) + Exit Sub + + Case SendTarget.ToAll + For LoopC = 1 To LastUser + If charlist(LoopC).ConnID <> -1 Then + If charlist(LoopC).Logged Then 'Esta logeado como usuario? + Call EnviarDatosASlot(LoopC, sndData) + End If + End If + Next LoopC + Exit Sub + + Case SendTarget.ToAllButIndex + For LoopC = 1 To LastUser + If charlist(LoopC).ConnID <> -1 Then + If LoopC <> sndIndex Then + If charlist(LoopC).Logged Then 'Esta logeado como usuario? + Call EnviarDatosASlot(LoopC, sndData) + End If + End If + End If + Next LoopC + Exit Sub + + Case SendTarget.ToAllButIndexAndHost + For LoopC = 1 To LastUser + If charlist(LoopC).ConnID <> -1 Then + If LoopC <> UserCharIndex Then + If LoopC <> sndIndex Then + If charlist(LoopC).Logged Then 'Esta logeado como usuario? + Call EnviarDatosASlot(LoopC, sndData) + End If + End If + End If + End If + Next LoopC + Exit Sub + + Case SendTarget.ToDeadArea + Call SendToDeadCharArea(sndIndex, sndData) + Exit Sub + End Select +End Sub + +Private Sub SendToCharArea(ByVal CharIndex As Integer, ByVal sdData As String) + + Dim LoopC As Long + + For LoopC = 1 To MaxUsers + If charlist(LoopC).Bot = 0 Then + If charlist(LoopC).ConnID <> -1 Then + If EnArea(CharIndex, LoopC) Then + Call EnviarDatosASlot(LoopC, sdData) + End If + End If + End If + Next LoopC +End Sub + +Private Sub SendToDeadCharArea(ByVal CharIndex As Integer, ByVal sdData As String) + Dim LoopC As Long + + For LoopC = 1 To MaxUsers + If charlist(LoopC).Bot = 0 Then + If charlist(LoopC).MinHP = 0 Then + If charlist(LoopC).ConnID <> -1 Then + If EnArea(CharIndex, LoopC) Then + Call EnviarDatosASlot(LoopC, sdData) + End If + End If + End If + End If + Next LoopC +End Sub diff --git a/CODIGO/wskapiAO.bas b/CODIGO/wskapiAO.bas new file mode 100644 index 0000000..b0c5e07 --- /dev/null +++ b/CODIGO/wskapiAO.bas @@ -0,0 +1,537 @@ +Attribute VB_Name = "wskapiAO" +'************************************************************** +' wskapiAO.bas +' +'************************************************************** + +'************************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +'************************************************************************** + +Option Explicit + +'' +' Modulo para manejar Winsock +' + +'Si la variable esta en TRUE , al iniciar el WsApi se crea +'una ventana LABEL para recibir los mensajes. Al detenerlo, +'se destruye. +'Si es FALSE, los mensajes se envian al form frmMain (o el +'que sea). +Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long) + +#Const WSAPI_CREAR_LABEL = True + +Private Const SD_BOTH As Long = &H2 + +Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) + +Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long +Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long +Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long + +Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hwndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long +Private Declare Function DestroyWindow Lib "user32" (ByVal hWnd As Long) As Long + +Private Const WS_CHILD = &H40000000 +Public Const GWL_WNDPROC = (-4) + +Private Const SIZE_RCVBUF As Long = 8192 +Private Const SIZE_SNDBUF As Long = 8192 + +'' +'Esto es para agilizar la busqueda del slot a partir de un socket dado, +'sino, la funcion BuscaSlotSock se nos come todo el uso del CPU. +' +' @param Sock sock +' @param slot slot +' +Public Type tSockCache + Sock As Long + Slot As Long +End Type + +Public WSAPISock2Usr As New Collection + +' ==================================================================================== +' ==================================================================================== + +Public OldWProc As Long +Public ActualWProc As Long +Public hWndMsg As Long + +' ==================================================================================== +' ==================================================================================== + +Public SockListen As Long + +' ==================================================================================== +' ==================================================================================== + + +Public Sub IniciaWsApi(ByVal hwndParent As Long) + +Debug.Print "IniciaWsApi" + +#If WSAPI_CREAR_LABEL Then +hWndMsg = CreateWindowEx(0, "STATIC", "AOMSG", WS_CHILD, 0, 0, 0, 0, hwndParent, 0, App.hInstance, ByVal 0&) +#Else +hWndMsg = hwndParent +#End If 'WSAPI_CREAR_LABEL + +OldWProc = SetWindowLong(hWndMsg, GWL_WNDPROC, AddressOf WndProc) +ActualWProc = GetWindowLong(hWndMsg, GWL_WNDPROC) + +Dim desc As String +Call StartWinsock(desc) + +End Sub + +Public Sub LimpiaWsApi() + +Call LogApiSock("LimpiaWsApi") + +If WSAStartedUp Then + Call EndWinsock +End If + +If OldWProc <> 0 Then + SetWindowLong hWndMsg, GWL_WNDPROC, OldWProc + OldWProc = 0 +End If + +#If WSAPI_CREAR_LABEL Then +If hWndMsg <> 0 Then + DestroyWindow hWndMsg +End If +#End If + +End Sub + +Public Function BuscaSlotSock(ByVal S As Long) As Long + +On Error GoTo hayerror + + BuscaSlotSock = WSAPISock2Usr.Item(CStr(S)) +Exit Function + +hayerror: + BuscaSlotSock = -1 + +End Function + +Public Sub AgregaSlotSock(ByVal Sock As Long, ByVal Slot As Long) +Debug.Print "AgregaSockSlot" + +If WSAPISock2Usr.Count > MaxUsers Then + Call CloseSocket(Slot) + Exit Sub +End If + +WSAPISock2Usr.Add CStr(Slot), CStr(Sock) + +'Dim Pri As Long, Ult As Long, Med As Long +'Dim LoopC As Long +' +'If WSAPISockChacheCant > 0 Then +' Pri = 1 +' Ult = WSAPISockChacheCant +' Med = Int((Pri + Ult) / 2) +' +' Do While (Pri <= Ult) And (Ult > 1) +' If Sock < WSAPISockChache(Med).Sock Then +' Ult = Med - 1 +' Else +' Pri = Med + 1 +' End If +' Med = Int((Pri + Ult) / 2) +' Loop +' +' Pri = IIf(Sock < WSAPISockChache(Med).Sock, Med, Med + 1) +' Ult = WSAPISockChacheCant +' For LoopC = Ult To Pri Step -1 +' WSAPISockChache(LoopC + 1) = WSAPISockChache(LoopC) +' Next LoopC +' Med = Pri +'Else +' Med = 1 +'End If +'WSAPISockChache(Med).Slot = Slot +'WSAPISockChache(Med).Sock = Sock +'WSAPISockChacheCant = WSAPISockChacheCant + 1 + +End Sub + +Public Sub BorraSlotSock(ByVal Sock As Long) +Dim cant As Long + +cant = WSAPISock2Usr.Count +On Error Resume Next +WSAPISock2Usr.Remove CStr(Sock) + +Debug.Print "BorraSockSlot " & cant & " -> " & WSAPISock2Usr.Count + +End Sub + + + +Public Function WndProc(ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long + +On Error Resume Next + + Dim Ret As Long + Dim Tmp() As Byte + Dim S As Long + Dim E As Long + Dim N As Integer + Dim UltError As Long + + Select Case msg + Case 1025 + S = wParam + E = WSAGetSelectEvent(lParam) + + Select Case E + Case FD_ACCEPT + If S = SockListen Then + Call EventoSockAccept(S) + End If + + ' Case FD_WRITE + ' N = BuscaSlotSock(s) + ' If N < 0 And s <> SockListen Then + ' 'Call apiclosesocket(s) + ' call WSApiCloseSocket(s) + ' Exit Function + ' End If + ' + + ' Call IntentarEnviarDatosEncolados(N) + ' + ' Dale = UserList(N).ColaSalida.Count > 0 + ' Do While Dale + ' Ret = WsApiEnviar(N, UserList(N).ColaSalida.Item(1), False) + ' If Ret <> 0 Then + ' If Ret = WSAEWOULDBLOCK Then + ' Dale = False + ' Else + ' 'y aca que hacemo' ?? help! i need somebody, help! + ' Dale = False + ' Debug.Print "ERROR AL ENVIAR EL DATO DESDE LA COLA " & Ret & ": " & GetWSAErrorString(Ret) + ' End If + ' Else + ' ' Debug.Print "Dato de la cola enviado" + ' UserList(N).ColaSalida.Remove 1 + ' Dale = (UserList(N).ColaSalida.Count > 0) + ' End If + ' Loop + + Case FD_READ + N = BuscaSlotSock(S) + If N < 0 And S <> SockListen Then + 'Call apiclosesocket(s) + Call WSApiCloseSocket(S) + Exit Function + End If + + 'create appropiate sized buffer + ReDim Preserve Tmp(SIZE_RCVBUF - 1) As Byte + + Ret = recv(S, Tmp(0), SIZE_RCVBUF, 0) + ' Comparo por = 0 ya que esto es cuando se cierra + ' "gracefully". (mas abajo) + If Ret < 0 Then + UltError = Err.LastDllError + If UltError = WSAEMSGSIZE Then + Debug.Print "WSAEMSGSIZE" + Ret = SIZE_RCVBUF + Else + Debug.Print "Error en Recv: " & GetWSAErrorString(UltError) + Call LogApiSock("Error en Recv: N=" & N & " S=" & S & " Str=" & GetWSAErrorString(UltError)) + + 'no hay q llamar a CloseSocket() directamente, + 'ya q pueden abusar de algun error para + 'desconectarse sin los 10segs. CREEME. + Call CloseSocketSL(N) + Exit Function + End If + ElseIf Ret = 0 Then + Call CloseSocketSL(N) + End If + + ReDim Preserve Tmp(Ret - 1) As Byte + + Call EventoSockRead(N, Tmp) + + Case FD_CLOSE + N = BuscaSlotSock(S) + If S <> SockListen Then Call apiclosesocket(S) + + If N > 0 Then + Call BorraSlotSock(S) + charlist(N).ConnID = -1 + charlist(N).ConnIDValida = False + Call EventoSockClose(N) + End If + End Select + + Case Else + WndProc = CallWindowProc(OldWProc, hWnd, msg, wParam, lParam) + End Select +End Function + +'Retorna 0 cuando se envió o se metio en la cola, +'retorna <> 0 cuando no se pudo enviar o no se pudo meter en la cola +Public Function WsApiEnviar(ByVal Slot As Integer, ByRef str As String) As Long + Dim Ret As String + Dim Retorno As Long + Dim data() As Byte + + ReDim Preserve data(Len(str) - 1) As Byte + + data = StrConv(str, vbFromUnicode) + + Retorno = 0 + + If charlist(Slot).ConnID <> -1 And charlist(Slot).ConnIDValida Then + Ret = send(ByVal charlist(Slot).ConnID, data(0), ByVal UBound(data()) + 1, ByVal 0) + If Ret < 0 Then + Ret = Err.LastDllError + If Ret = WSAEWOULDBLOCK Then + + ' WSAEWOULDBLOCK, put the data again in the outgoingData Buffer + Call charlist(Slot).outgoingData.WriteASCIIStringFixed(str) + End If + End If + ElseIf charlist(Slot).ConnID <> -1 And Not charlist(Slot).ConnIDValida Then + Retorno = -1 + End If + + WsApiEnviar = Retorno +End Function + +Public Sub LogApiSock(ByVal str As String) + +On Error GoTo Errhandler + +Dim nfile As Integer +nfile = FreeFile ' obtenemos un canal +Open App.path & "\logs\wsapi.log" For Append Shared As #nfile +Print #nfile, Date & " " & Time & " " & str +Close #nfile + +Exit Sub + +Errhandler: + +End Sub + +Public Sub EventoSockAccept(ByVal SockID As Long) +'========================================================== +'USO DE LA API DE WINSOCK +'======================== + + Dim NewIndex As Integer + Dim Ret As Long + Dim Tam As Long, sa As sockaddr + Dim NuevoSock As Long + Dim i As Long + Dim tStr As String + + Tam = sockaddr_size + + '============================================= + 'SockID es en este caso es el socket de escucha, + 'a diferencia de socketwrench que es el nuevo + 'socket de la nueva conn + +'Modificado por Maraxus + 'Ret = WSAAccept(SockID, sa, Tam, AddressOf CondicionSocket, 0) + Ret = accept(SockID, sa, Tam) + + If Ret = INVALID_SOCKET Then + Exit Sub + End If + + If Not SecurityIp.IpSecurityAceptarNuevaConexion(sa.sin_addr) Then + Call WSApiCloseSocket(NuevoSock) + Exit Sub + End If + + 'If Ret = INVALID_SOCKET Then + ' If Err.LastDllError = 11002 Then + ' ' We couldn't decide if to accept or reject the connection + ' 'Force reject so we can get it out of the queue + ' Ret = WSAAccept(SockID, sa, Tam, AddressOf CondicionSocket, 1) + ' Call LogCriticEvent("Error en WSAAccept() API 11002: No se pudo decidir si aceptar o rechazar la conexión.") + ' Else + ' i = Err.LastDllError + ' Call LogCriticEvent("Error en WSAAccept() API " & i & ": " & GetWSAErrorString(i)) + ' Exit Sub + ' End If + 'End If + + NuevoSock = Ret + + 'Seteamos el tamaño del buffer de entrada + If setsockopt(NuevoSock, SOL_SOCKET, SO_RCVBUFFER, SIZE_RCVBUF, 4) <> 0 Then + i = Err.LastDllError + End If + 'Seteamos el tamaño del buffer de salida + If setsockopt(NuevoSock, SOL_SOCKET, SO_SNDBUFFER, SIZE_SNDBUF, 4) <> 0 Then + i = Err.LastDllError + End If + + 'If SecurityIp.IPSecuritySuperaLimiteConexiones(sa.sin_addr) Then + 'tStr = "Limite de conexiones para su IP alcanzado." + 'Call send(ByVal NuevoSock, ByVal tStr, ByVal Len(tStr), ByVal 0) + 'Call WSApiCloseSocket(NuevoSock) + 'Exit Sub + 'End If + + ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + ' BIENVENIDO AL SERVIDOR!!!!!!!! + ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + + 'Mariano: Baje la busqueda de slot abajo de CondicionSocket y limite x ip + NewIndex = NextOpenUser ' Nuevo indice + + If NewIndex <= MaxUsers Then + + 'Make sure both outgoing and incoming data buffers are clean + Call charlist(NewIndex).incomingData.ReadASCIIStringFixed(charlist(NewIndex).incomingData.length) + Call charlist(NewIndex).outgoingData.ReadASCIIStringFixed(charlist(NewIndex).outgoingData.length) + + charlist(NewIndex).ip = GetAscIP(sa.sin_addr) + + If NewIndex > LastUser Then LastUser = NewIndex + + charlist(NewIndex).ConnID = NuevoSock + charlist(NewIndex).ConnIDValida = True + + Call AgregaSlotSock(NuevoSock, NewIndex) + Else + Dim str As String + Dim data() As Byte + + str = Protocol.PrepareMessageErrorMsg("El servidor se encuentra lleno en este momento. Disculpe las molestias ocasionadas.") + + ReDim Preserve data(Len(str) - 1) As Byte + + data = StrConv(str, vbFromUnicode) + + Call send(ByVal NuevoSock, data(0), ByVal UBound(data()) + 1, ByVal 0) + Call WSApiCloseSocket(NuevoSock) + End If + +End Sub + +Public Sub EventoSockRead(ByVal Slot As Integer, ByRef Datos() As Byte) + +With charlist(Slot) + + Call .incomingData.WriteBlock(Datos) + + If .ConnID <> -1 Then + Call ServerHandleIncomingData(Slot) + Else + Exit Sub + End If +End With + +End Sub + +Public Sub EventoSockClose(ByVal Slot As Integer) + + If charlist(Slot).Logged Then + Call CloseSocketSL(Slot) + Else + Call CloseSocket(Slot) + End If +End Sub + + +Public Sub WSApiReiniciarSockets() +Dim i As Long + 'Cierra el socket de escucha + If SockListen >= 0 Then Call apiclosesocket(SockListen) + + 'Cierra todas las conexiones + For i = 1 To MaxUsers + If charlist(i).ConnID <> -1 And charlist(i).ConnIDValida Then + Call CloseSocket(i) + End If + + 'Call ResetUserSlot(i) + Next i + + For i = 1 To MaxUsers + Set charlist(i).incomingData = Nothing + Set charlist(i).outgoingData = Nothing + Next i + + ' No 'ta el PRESERVE :p + ReDim UserList(1 To MaxUsers) + For i = 1 To MaxUsers + charlist(i).ConnID = -1 + charlist(i).ConnIDValida = False + + Set charlist(i).incomingData = New clsByteQueue + Set charlist(i).outgoingData = New clsByteQueue + Next i + + LastUser = 1 + + Call LimpiaWsApi + Call Sleep(100) + Call IniciaWsApi(frmMain.hWnd) + SockListen = ListenForConnect(7600, hWndMsg, "") + +End Sub + +Public Sub WSApiCloseSocket(ByVal Socket As Long) +Call WSAAsyncSelect(Socket, hWndMsg, ByVal 1025, ByVal (FD_CLOSE)) +Call ShutDown(Socket, SD_BOTH) +End Sub + +Public Function CondicionSocket(ByRef lpCallerId As WSABUF, ByRef lpCallerData As WSABUF, ByRef lpSQOS As FLOWSPEC, ByVal Reserved As Long, ByRef lpCalleeId As WSABUF, ByRef lpCalleeData As WSABUF, ByRef Group As Long, ByVal dwCallbackData As Long) As Long + Dim sa As sockaddr + + 'Check if we were requested to force reject + + If dwCallbackData = 1 Then + CondicionSocket = CF_REJECT + Exit Function + End If + + 'Get the address + + CopyMemory sa, ByVal lpCallerId.lpBuffer, lpCallerId.dwBufferLen + + + 'If Not SecurityIp.IpSecurityAceptarNuevaConexion(sa.sin_addr) Then + ' CondicionSocket = CF_REJECT + ' Exit Function + 'End If + + If Not SecurityIp.IpSecurityAceptarNuevaConexion(sa.sin_addr) Then + CondicionSocket = CF_REJECT + Exit Function + End If + + CondicionSocket = CF_ACCEPT 'En realdiad es al pedo, porque CondicionSocket se inicializa a 0, pero así es más claro.... + +End Function diff --git a/CODIGO/wsksock.bas b/CODIGO/wsksock.bas new file mode 100644 index 0000000..3ec9a00 --- /dev/null +++ b/CODIGO/wsksock.bas @@ -0,0 +1,953 @@ +Attribute VB_Name = "WSKSOCK" +'************************************************************** +' WSKSOCK.bas +' +'************************************************************** + +'************************************************************************** +'This program is free software; you can redistribute it and/or modify +'it under the terms of the Affero General Public License; +'either version 1 of the License, or any later version. +' +'This program is distributed in the hope that it will be useful, +'but WITHOUT ANY WARRANTY; without even the implied warranty of +'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +'Affero General Public License for more details. +' +'You should have received a copy of the Affero General Public License +'along with this program; if not, you can find it at http://www.affero.org/oagpl.html +'************************************************************************** + +'date stamp: sept 1, 1996 (for version control, please don't remove) + +'Visual Basic 4.0 Winsock "Header" +' Alot of the information contained inside this file was originally +' obtained from ALT.WINSOCK.PROGRAMMING and most of it has since been +' modified in some way. +' +'Disclaimer: This file is public domain, updated periodically by +' Topaz, SigSegV@mail.utexas.edu, Use it at your own risk. +' Neither myself(Topaz) or anyone related to alt.programming.winsock +' may be held liable for its use, or misuse. +' +'Declare check Aug 27, 1996. (Topaz, SigSegV@mail.utexas.edu) +' All 16 bit declarations appear correct, even the odd ones that +' pass longs inplace of in_addr and char buffers. 32 bit functions +' also appear correct. Some are declared to return integers instead of +' longs (breaking MS's rules.) however after testing these functions I +' have come to the conclusion that they do not work properly when declared +' following MS's rules. +' +'NOTES: +' (1) I have never used WS_SELECT (select), therefore I must warn that I do +' not know if fd_set and timeval are properly defined. +' (2) Alot of the functions are declared with "buf as any", when calling these +' functions you may either pass strings, byte arrays or UDT's. For 32bit I +' I recommend Byte arrays and the use of memcopy to copy the data back out +' (3) The async functions (wsaAsync*) require the use of a message hook or +' message window control to capture messages sent by the winsock stack. This +' is not to be confused with a CallBack control, The only function that uses +' callbacks is WSASetBlockingHook() +' (4) Alot of "helper" functions are provided in the file for various things +' before attempting to figure out how to call a function, look and see if +' there is already a helper function for it. +' (5) Data types (hostent etc) have kept there 16bit definitions, even under 32bit +' windows due to the problem of them not working when redfined following the +' suggested rules. +Option Explicit + +Public Const FD_SETSIZE = 64 +Type fd_set + fd_count As Integer + fd_array(FD_SETSIZE) As Integer +End Type + +Type timeval + tv_sec As Long + tv_usec As Long +End Type + +Type HostEnt + h_name As Long + h_aliases As Long + h_addrtype As Integer + h_length As Integer + h_addr_list As Long +End Type +Public Const hostent_size = 16 + +Type servent + s_name As Long + s_aliases As Long + s_port As Integer + s_proto As Long +End Type +Public Const servent_size = 14 + +Type protoent + p_name As Long + p_aliases As Long + p_proto As Integer +End Type +Public Const protoent_size = 10 + +Public Const IPPROTO_TCP = 6 +Public Const IPPROTO_UDP = 17 + +Public Const INADDR_NONE = &HFFFFFFFF +Public Const INADDR_ANY = &H0 + +Type sockaddr + sin_family As Integer + sin_port As Integer + sin_addr As Long + sin_zero As String * 8 +End Type +Public Const sockaddr_size = 16 +Public saZero As sockaddr + + +Public Const WSA_DESCRIPTIONLEN = 256 +Public Const WSA_DescriptionSize = WSA_DESCRIPTIONLEN + 1 + +Public Const WSA_SYS_STATUS_LEN = 128 +Public Const WSA_SysStatusSize = WSA_SYS_STATUS_LEN + 1 + +Type WSADataType + wVersion As Integer + wHighVersion As Integer + szDescription As String * WSA_DescriptionSize + szSystemStatus As String * WSA_SysStatusSize + iMaxSockets As Integer + iMaxUdpDg As Integer + lpVendorInfo As Long +End Type + +'Agregado por Maraxus +Type WSABUF + dwBufferLen As Long + lpBuffer As Long +End Type + +'Agregado por Maraxus +Type FLOWSPEC + TokenRate As Long 'In Bytes/sec + TokenBucketSize As Long 'In Bytes + PeakBandwidth As Long 'In Bytes/sec + Latency As Long 'In microseconds + DelayVariation As Long 'In microseconds + ServiceType As Integer 'Guaranteed, Predictive, + 'Best Effort, etc. + MaxSduSize As Long 'In Bytes + MinimumPolicedSize As Long 'In Bytes +End Type + +'Agregado por Maraxus +Public Const WSA_FLAG_OVERLAPPED = &H1 + +'Agregados por Maraxus +Public Const CF_ACCEPT = &H0 +Public Const CF_REJECT = &H1 + +'Agregado por Maraxus +Public Const SD_RECEIVE As Long = &H0& +Public Const SD_SEND As Long = &H1& +Public Const SD_BOTH As Long = &H2& + +Public Const INVALID_SOCKET = -1 +Public Const SOCKET_ERROR = -1 + +Public Const SOCK_STREAM = 1 +Public Const SOCK_DGRAM = 2 + +Public Const MAXGETHOSTSTRUCT = 1024 + +Public Const AF_INET = 2 +Public Const PF_INET = 2 + +Type LingerType + l_onoff As Integer + l_linger As Integer +End Type +' Windows Sockets definitions of regular Microsoft C error constants +Global Const WSAEINTR = 10004 +Global Const WSAEBADF = 10009 +Global Const WSAEACCES = 10013 +Global Const WSAEFAULT = 10014 +Global Const WSAEINVAL = 10022 +Global Const WSAEMFILE = 10024 +' Windows Sockets definitions of regular Berkeley error constants +Global Const WSAEWOULDBLOCK = 10035 +Global Const WSAEINPROGRESS = 10036 +Global Const WSAEALREADY = 10037 +Global Const WSAENOTSOCK = 10038 +Global Const WSAEDESTADDRREQ = 10039 +Global Const WSAEMSGSIZE = 10040 +Global Const WSAEPROTOTYPE = 10041 +Global Const WSAENOPROTOOPT = 10042 +Global Const WSAEPROTONOSUPPORT = 10043 +Global Const WSAESOCKTNOSUPPORT = 10044 +Global Const WSAEOPNOTSUPP = 10045 +Global Const WSAEPFNOSUPPORT = 10046 +Global Const WSAEAFNOSUPPORT = 10047 +Global Const WSAEADDRINUSE = 10048 +Global Const WSAEADDRNOTAVAIL = 10049 +Global Const WSAENETDOWN = 10050 +Global Const WSAENETUNREACH = 10051 +Global Const WSAENETRESET = 10052 +Global Const WSAECONNABORTED = 10053 +Global Const WSAECONNRESET = 10054 +Global Const WSAENOBUFS = 10055 +Global Const WSAEISCONN = 10056 +Global Const WSAENOTCONN = 10057 +Global Const WSAESHUTDOWN = 10058 +Global Const WSAETOOMANYREFS = 10059 +Global Const WSAETIMEDOUT = 10060 +Global Const WSAECONNREFUSED = 10061 +Global Const WSAELOOP = 10062 +Global Const WSAENAMETOOLONG = 10063 +Global Const WSAEHOSTDOWN = 10064 +Global Const WSAEHOSTUNREACH = 10065 +Global Const WSAENOTEMPTY = 10066 +Global Const WSAEPROCLIM = 10067 +Global Const WSAEUSERS = 10068 +Global Const WSAEDQUOT = 10069 +Global Const WSAESTALE = 10070 +Global Const WSAEREMOTE = 10071 +' Extended Windows Sockets error constant definitions +Global Const WSASYSNOTREADY = 10091 +Global Const WSAVERNOTSUPPORTED = 10092 +Global Const WSANOTINITIALISED = 10093 +Global Const WSAHOST_NOT_FOUND = 11001 +Global Const WSATRY_AGAIN = 11002 +Global Const WSANO_RECOVERY = 11003 +Global Const WSANO_DATA = 11004 +Global Const WSANO_ADDRESS = 11004 +'---ioctl Constants + Public Const FIONREAD = &H8004667F + Public Const FIONBIO = &H8004667E + Public Const FIOASYNC = &H8004667D + +#If Win16 Then +'---Windows System functions + Public Declare Function PostMessage Lib "User" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, lParam As Any) As Integer + Public Declare Sub MemCopy Lib "Kernel" Alias "hmemcpy" (Dest As Any, Src As Any, ByVal cb&) + Public Declare Function lstrlen Lib "Kernel" (ByVal lpString As Any) As Integer +'---async notification constants + Public Const SOL_SOCKET = &HFFFF + Public Const SO_LINGER = &H80 + Public Const SO_RCVBUFFER = &H1002 ' Agregado por Maraxus + Public Const SO_SNDBUFFER = &H1001 ' Agregado por Maraxus + Public Const SO_CONDITIONAL_ACCEPT = &H3002 ' Agregado por Maraxus + Public Const FD_READ = &H1 + Public Const FD_WRITE = &H2 + Public Const FD_OOB = &H4 + Public Const FD_ACCEPT = &H8 + Public Const FD_CONNECT = &H10 + Public Const FD_CLOSE = &H20 +'---SOCKET FUNCTIONS + Public Declare Function accept Lib "ws2_32.DLL" (ByVal S As Integer, addr As sockaddr, AddrLen As Integer) As Integer + Public Declare Function bind Lib "ws2_32.DLL" (ByVal S As Integer, addr As sockaddr, ByVal namelen As Integer) As Integer + Public Declare Function apiclosesocket Lib "ws2_32.DLL" Alias "closesocket" (ByVal S As Integer) As Integer + Public Declare Function connect Lib "ws2_32.DLL" (ByVal S As Integer, addr As sockaddr, ByVal namelen As Integer) As Integer + Public Declare Function ioctlsocket Lib "ws2_32.DLL" (ByVal S As Integer, ByVal Cmd As Long, argp As Long) As Integer + Public Declare Function getpeername Lib "ws2_32.DLL" (ByVal S As Integer, sName As sockaddr, namelen As Integer) As Integer + Public Declare Function getsockname Lib "ws2_32.DLL" (ByVal S As Integer, sName As sockaddr, namelen As Integer) As Integer + Public Declare Function getsockopt Lib "ws2_32.DLL" (ByVal S As Integer, ByVal level As Integer, ByVal optname As Integer, optval As Any, optlen As Integer) As Integer + Public Declare Function htonl Lib "ws2_32.DLL" (ByVal hostlong As Long) As Long + Public Declare Function htons Lib "ws2_32.DLL" (ByVal hostshort As Integer) As Integer + Public Declare Function inet_addr Lib "ws2_32.DLL" (ByVal cp As String) As Long + Public Declare Function inet_ntoa Lib "ws2_32.DLL" (ByVal inn As Long) As Long + Public Declare Function listen Lib "ws2_32.DLL" (ByVal S As Integer, ByVal backlog As Integer) As Integer + Public Declare Function ntohl Lib "ws2_32.DLL" (ByVal netlong As Long) As Long + Public Declare Function ntohs Lib "ws2_32.DLL" (ByVal netshort As Integer) As Integer + Public Declare Function recv Lib "ws2_32.DLL" (ByVal S As Integer, ByRef buf As Any, ByVal buflen As Integer, ByVal flags As Integer) As Integer + Public Declare Function recvfrom Lib "ws2_32.DLL" (ByVal S As Integer, buf As Any, ByVal buflen As Integer, ByVal flags As Integer, from As sockaddr, fromlen As Integer) As Integer + Public Declare Function ws_select Lib "ws2_32.DLL" Alias "select" (ByVal nfds As Integer, readfds As Any, writefds As Any, exceptfds As Any, timeout As timeval) As Integer + Public Declare Function send Lib "ws2_32.DLL" (ByVal S As Integer, buf As Any, ByVal buflen As Integer, ByVal flags As Integer) As Integer + Public Declare Function sendto Lib "ws2_32.DLL" (ByVal S As Integer, buf As Any, ByVal buflen As Integer, ByVal flags As Integer, to_addr As sockaddr, ByVal tolen As Integer) As Integer + Public Declare Function setsockopt Lib "ws2_32.DLL" (ByVal S As Integer, ByVal level As Integer, ByVal optname As Integer, optval As Any, ByVal optlen As Integer) As Integer + Public Declare Function ShutDown Lib "ws2_32.DLL" Alias "shutdown" (ByVal S As Integer, ByVal how As Integer) As Integer + Public Declare Function Socket Lib "ws2_32.DLL" Alias "socket" (ByVal af As Integer, ByVal s_type As Integer, ByVal Protocol As Integer) As Integer +'---DATABASE FUNCTIONS + Public Declare Function gethostbyaddr Lib "ws2_32.DLL" (addr As Long, ByVal addr_len As Integer, ByVal addr_type As Integer) As Long + Public Declare Function gethostbyname Lib "ws2_32.DLL" (ByVal host_name As String) As Long + Public Declare Function gethostname Lib "ws2_32.DLL" (ByVal host_name As String, ByVal namelen As Integer) As Integer + Public Declare Function getservbyport Lib "ws2_32.DLL" (ByVal Port As Integer, ByVal proto As String) As Long + Public Declare Function getservbyname Lib "ws2_32.DLL" (ByVal serv_name As String, ByVal proto As String) As Long + Public Declare Function getprotobynumber Lib "ws2_32.DLL" (ByVal proto As Integer) As Long + Public Declare Function getprotobyname Lib "ws2_32.DLL" (ByVal proto_name As String) As Long +'---WINDOWS EXTENSIONS + Public Declare Function WSAStartup Lib "ws2_32.DLL" (ByVal wVR As Integer, lpWSAD As WSADataType) As Integer + Public Declare Function WSACleanup Lib "ws2_32.DLL" () As Integer + Public Declare Sub WSASetLastError Lib "ws2_32.DLL" (ByVal iError As Integer) + Public Declare Function WSAGetLastError Lib "ws2_32.DLL" () As Integer + Public Declare Function WSAIsBlocking Lib "ws2_32.DLL" () As Integer + Public Declare Function WSAUnhookBlockingHook Lib "ws2_32.DLL" () As Integer + Public Declare Function WSASetBlockingHook Lib "ws2_32.DLL" (ByVal lpBlockFunc As Long) As Long + Public Declare Function WSACancelBlockingCall Lib "ws2_32.DLL" () As Integer + Public Declare Function WSAAsyncGetServByName Lib "ws2_32.DLL" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal serv_name As String, ByVal proto As String, buf As Any, ByVal buflen As Integer) As Integer + Public Declare Function WSAAsyncGetServByPort Lib "ws2_32.DLL" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal Port As Integer, ByVal proto As String, buf As Any, ByVal buflen As Integer) As Integer + Public Declare Function WSAAsyncGetProtoByName Lib "ws2_32.DLL" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal proto_name As String, buf As Any, ByVal buflen As Integer) As Integer + Public Declare Function WSAAsyncGetProtoByNumber Lib "ws2_32.DLL" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal Number As Integer, buf As Any, ByVal buflen As Integer) As Integer + Public Declare Function WSAAsyncGetHostByName Lib "ws2_32.DLL" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal host_name As String, buf As Any, ByVal buflen As Integer) As Integer + Public Declare Function WSAAsyncGetHostByAddr Lib "ws2_32.DLL" (ByVal hWnd As Integer, ByVal wMsg As Integer, addr As Long, ByVal addr_len As Integer, ByVal addr_type As Integer, buf As Any, ByVal buflen As Integer) As Integer + Public Declare Function WSACancelAsyncRequest Lib "ws2_32.DLL" (ByVal hAsyncTaskHandle As Integer) As Integer + Public Declare Function WSAAsyncSelect Lib "ws2_32.DLL" (ByVal S As Integer, ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal lEvent As Long) As Integer + Public Declare Function WSARecvEx Lib "ws2_32.DLL" (ByVal S As Integer, buf As Any, ByVal buflen As Integer, ByVal flags As Integer) As Integer +'Agregado por Maraxus + Declare Function WSAAccept Lib "ws2_32.DLL" (ByVal S As Integer, pSockAddr As sockaddr, AddrLen As Integer, ByVal lpfnCondition As Long, ByVal dwCallbackData As Long) As Integer + + Public Const SOMAXCONN As Integer = &H7FFF ' Agregado por Maraxus + +#ElseIf Win32 Then +'---Windows System Functions + Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long + Public Declare Sub MemCopy Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal cb&) + Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Any) As Long +'---async notification constants + Public Const SOL_SOCKET = &HFFFF& + Public Const SO_LINGER = &H80& + Public Const SO_RCVBUFFER = &H1002& ' Agregado por Maraxus + Public Const SO_SNDBUFFER = &H1001& ' Agregado por Maraxus + Public Const SO_CONDITIONAL_ACCEPT = &H3002& ' Agregado por Maraxus + Public Const FD_READ = &H1& + Public Const FD_WRITE = &H2& + Public Const FD_OOB = &H4& + Public Const FD_ACCEPT = &H8& + Public Const FD_CONNECT = &H10& + Public Const FD_CLOSE = &H20& +'---SOCKET FUNCTIONS + Public Declare Function accept Lib "wsock32.dll" (ByVal S As Long, addr As sockaddr, AddrLen As Long) As Long + Public Declare Function bind Lib "wsock32.dll" (ByVal S As Long, addr As sockaddr, ByVal namelen As Long) As Long + Public Declare Function apiclosesocket Lib "wsock32.dll" Alias "closesocket" (ByVal S As Long) As Long + Public Declare Function connect Lib "wsock32.dll" (ByVal S As Long, addr As sockaddr, ByVal namelen As Long) As Long + Public Declare Function ioctlsocket Lib "wsock32.dll" (ByVal S As Long, ByVal Cmd As Long, argp As Long) As Long + Public Declare Function getpeername Lib "wsock32.dll" (ByVal S As Long, sName As sockaddr, namelen As Long) As Long + Public Declare Function getsockname Lib "wsock32.dll" (ByVal S As Long, sName As sockaddr, namelen As Long) As Long + Public Declare Function getsockopt Lib "wsock32.dll" (ByVal S As Long, ByVal level As Long, ByVal optname As Long, optval As Any, optlen As Long) As Long + Public Declare Function htonl Lib "wsock32.dll" (ByVal hostlong As Long) As Long + Public Declare Function htons Lib "wsock32.dll" (ByVal hostshort As Long) As Integer + Public Declare Function inet_addr Lib "wsock32.dll" (ByVal cp As String) As Long + Public Declare Function inet_ntoa Lib "wsock32.dll" (ByVal inn As Long) As Long + Public Declare Function listen Lib "wsock32.dll" (ByVal S As Long, ByVal backlog As Long) As Long + Public Declare Function ntohl Lib "wsock32.dll" (ByVal netlong As Long) As Long + Public Declare Function ntohs Lib "wsock32.dll" (ByVal netshort As Long) As Integer + Public Declare Function recv Lib "wsock32.dll" (ByVal S As Long, ByRef buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long + Public Declare Function recvfrom Lib "wsock32.dll" (ByVal S As Long, buf As Any, ByVal buflen As Long, ByVal flags As Long, from As sockaddr, fromlen As Long) As Long + Public Declare Function ws_select Lib "wsock32.dll" Alias "select" (ByVal nfds As Long, readfds As fd_set, writefds As fd_set, exceptfds As fd_set, timeout As timeval) As Long + Public Declare Function send Lib "wsock32.dll" (ByVal S As Long, buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long + Public Declare Function sendto Lib "wsock32.dll" (ByVal S As Long, buf As Any, ByVal buflen As Long, ByVal flags As Long, to_addr As sockaddr, ByVal tolen As Long) As Long + Public Declare Function setsockopt Lib "wsock32.dll" (ByVal S As Long, ByVal level As Long, ByVal optname As Long, optval As Any, ByVal optlen As Long) As Long + Public Declare Function ShutDown Lib "wsock32.dll" Alias "shutdown" (ByVal S As Long, ByVal how As Long) As Long + Public Declare Function Socket Lib "wsock32.dll" Alias "socket" (ByVal af As Long, ByVal s_type As Long, ByVal Protocol As Long) As Long +'---DATABASE FUNCTIONS + Public Declare Function gethostbyaddr Lib "wsock32.dll" (addr As Long, ByVal addr_len As Long, ByVal addr_type As Long) As Long + Public Declare Function gethostbyname Lib "wsock32.dll" (ByVal host_name As String) As Long + Public Declare Function gethostname Lib "wsock32.dll" (ByVal host_name As String, ByVal namelen As Long) As Long + Public Declare Function getservbyport Lib "wsock32.dll" (ByVal Port As Long, ByVal proto As String) As Long + Public Declare Function getservbyname Lib "wsock32.dll" (ByVal serv_name As String, ByVal proto As String) As Long + Public Declare Function getprotobynumber Lib "wsock32.dll" (ByVal proto As Long) As Long + Public Declare Function getprotobyname Lib "wsock32.dll" (ByVal proto_name As String) As Long +'---WINDOWS EXTENSIONS + Public Declare Function WSAStartup Lib "wsock32.dll" (ByVal wVR As Long, lpWSAD As WSADataType) As Long + Public Declare Function WSACleanup Lib "wsock32.dll" () As Long + Public Declare Sub WSASetLastError Lib "wsock32.dll" (ByVal iError As Long) + Public Declare Function WSAGetLastError Lib "wsock32.dll" () As Long + Public Declare Function WSAIsBlocking Lib "wsock32.dll" () As Long + Public Declare Function WSAUnhookBlockingHook Lib "wsock32.dll" () As Long + Public Declare Function WSASetBlockingHook Lib "wsock32.dll" (ByVal lpBlockFunc As Long) As Long + Public Declare Function WSACancelBlockingCall Lib "wsock32.dll" () As Long + Public Declare Function WSAAsyncGetServByName Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal serv_name As String, ByVal proto As String, buf As Any, ByVal buflen As Long) As Long + Public Declare Function WSAAsyncGetServByPort Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal Port As Long, ByVal proto As String, buf As Any, ByVal buflen As Long) As Long + Public Declare Function WSAAsyncGetProtoByName Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal proto_name As String, buf As Any, ByVal buflen As Long) As Long + Public Declare Function WSAAsyncGetProtoByNumber Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal Number As Long, buf As Any, ByVal buflen As Long) As Long + Public Declare Function WSAAsyncGetHostByName Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal host_name As String, buf As Any, ByVal buflen As Long) As Long + Public Declare Function WSAAsyncGetHostByAddr Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, addr As Long, ByVal addr_len As Long, ByVal addr_type As Long, buf As Any, ByVal buflen As Long) As Long + Public Declare Function WSACancelAsyncRequest Lib "wsock32.dll" (ByVal hAsyncTaskHandle As Long) As Long + Public Declare Function WSAAsyncSelect Lib "wsock32.dll" (ByVal S As Long, ByVal hWnd As Long, ByVal wMsg As Long, ByVal lEvent As Long) As Long + Public Declare Function WSARecvEx Lib "wsock32.dll" (ByVal S As Long, buf As Any, ByVal buflen As Long, ByVal flags As Long) As Long +'Agregado por Maraxus + Declare Function WSAAccept Lib "ws2_32.DLL" (ByVal S As Long, pSockAddr As sockaddr, AddrLen As Long, ByVal lpfnCondition As Long, ByVal dwCallbackData As Long) As Long + Public Const SOMAXCONN As Long = &H7FFFFFFF ' Agregado por Maraxus + + +#End If + + +'SOME STUFF I ADDED +Public MySocket% +Public SockReadBuffer$ +Public Const WSA_NoName = "Unknown" +Public WSAStartedUp As Boolean 'Flag to keep track of whether winsock WSAStartup wascalled + + +Public Function WSAGetAsyncBufLen(ByVal lParam As Long) As Long + If (lParam And &HFFFF&) > &H7FFF Then + WSAGetAsyncBufLen = (lParam And &HFFFF&) - &H10000 + Else + WSAGetAsyncBufLen = lParam And &HFFFF& + End If +End Function + +Public Function WSAGetSelectEvent(ByVal lParam As Long) As Integer + If (lParam And &HFFFF&) > &H7FFF Then + WSAGetSelectEvent = (lParam And &HFFFF&) - &H10000 + Else + WSAGetSelectEvent = lParam And &HFFFF& + End If +End Function + + + +Public Function WSAGetAsyncError(ByVal lParam As Long) As Integer + WSAGetAsyncError = (lParam And &HFFFF0000) \ &H10000 +End Function + + + +Public Function AddrToIP(ByVal AddrOrIP$) As String +Dim T() As String +Dim Tmp As String + +Tmp = GetAscIP(GetHostByNameAlias(AddrOrIP$)) +T = Split(Tmp, ".") +AddrToIP = T(3) & "." & T(2) & "." & T(1) & "." & T(0) + +End Function + +'this function should work on 16 and 32 bit systems +#If Win16 Then + Function ConnectSock(ByVal Host$, ByVal Port%, retIpPort$, ByVal HWndToMsg%, ByVal Async%) As Integer + Dim S%, SelectOps%, dummy% +#ElseIf Win32 Then + Function ConnectSock(ByVal Host$, ByVal Port&, retIpPort$, ByVal HWndToMsg&, ByVal Async%) As Long + Dim S&, SelectOps&, dummy& +#End If + Dim sockin As sockaddr + SockReadBuffer$ = vbNullString + sockin = saZero + sockin.sin_family = AF_INET + sockin.sin_port = htons(Port) + If sockin.sin_port = INVALID_SOCKET Then + ConnectSock = INVALID_SOCKET + Exit Function + End If + + sockin.sin_addr = GetHostByNameAlias(Host$) + If sockin.sin_addr = INADDR_NONE Then + ConnectSock = INVALID_SOCKET + Exit Function + End If + retIpPort$ = GetAscIP$(sockin.sin_addr) & ":" & ntohs(sockin.sin_port) + + S = Socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) + If S < 0 Then + ConnectSock = INVALID_SOCKET + Exit Function + End If + If SetSockLinger(S, 1, 0) = SOCKET_ERROR Then + If S > 0 Then + dummy = apiclosesocket(S) + End If + ConnectSock = INVALID_SOCKET + Exit Function + End If + If Not Async Then + If Not connect(S, sockin, sockaddr_size) = 0 Then + If S > 0 Then + dummy = apiclosesocket(S) + End If + ConnectSock = INVALID_SOCKET + Exit Function + End If + If HWndToMsg <> 0 Then + SelectOps = FD_READ Or FD_WRITE Or FD_CONNECT Or FD_CLOSE + If WSAAsyncSelect(S, HWndToMsg, ByVal 1025, ByVal SelectOps) Then + If S > 0 Then + dummy = apiclosesocket(S) + End If + ConnectSock = INVALID_SOCKET + Exit Function + End If + End If + Else + SelectOps = FD_READ Or FD_WRITE Or FD_CONNECT Or FD_CLOSE + If WSAAsyncSelect(S, HWndToMsg, ByVal 1025, ByVal SelectOps) Then + If S > 0 Then + dummy = apiclosesocket(S) + End If + ConnectSock = INVALID_SOCKET + Exit Function + End If + If connect(S, sockin, sockaddr_size) <> -1 Then + If S > 0 Then + dummy = apiclosesocket(S) + End If + ConnectSock = INVALID_SOCKET + Exit Function + End If + End If + ConnectSock = S +End Function + +#If Win32 Then + Public Function SetSockLinger(ByVal SockNum&, ByVal OnOff%, ByVal LingerTime%) As Long +#Else + Public Function SetSockLinger(ByVal SockNum%, ByVal OnOff%, ByVal LingerTime%) As Integer +#End If + Dim Linger As LingerType + Linger.l_onoff = OnOff + Linger.l_linger = LingerTime + If setsockopt(SockNum, SOL_SOCKET, SO_LINGER, Linger, 4) Then + Debug.Print "Error setting linger info: " & WSAGetLastError() + SetSockLinger = SOCKET_ERROR + Else + If getsockopt(SockNum, SOL_SOCKET, SO_LINGER, Linger, 4) Then + Debug.Print "Error getting linger info: " & WSAGetLastError() + SetSockLinger = SOCKET_ERROR + Else + Debug.Print "Linger is on if nonzero: "; Linger.l_onoff + Debug.Print "Linger time if linger is on: "; Linger.l_linger + End If + End If +End Function + +Sub EndWinsock() + Dim Ret& + If WSAIsBlocking() Then + Ret = WSACancelBlockingCall() + End If + Ret = WSACleanup() + WSAStartedUp = False +End Sub + +Public Function GetAscIP(ByVal inn As Long) As String + #If Win32 Then + Dim nStr& + #Else + Dim nStr% + #End If + Dim lpStr& + Dim retString$ + retString = String(32, 0) + lpStr = inet_ntoa(inn) + If lpStr Then + nStr = lstrlen(lpStr) + If nStr > 32 Then nStr = 32 + MemCopy ByVal retString, ByVal lpStr, nStr + retString = Left$(retString, nStr) + GetAscIP = retString + Else + GetAscIP = "255.255.255.255" + End If +End Function + +Public Function GetHostByAddress(ByVal addr As Long) As String + Dim phe& + Dim heDestHost As HostEnt + Dim HostName$ + phe = gethostbyaddr(addr, 4, PF_INET) + If phe Then + MemCopy heDestHost, ByVal phe, hostent_size + HostName = String(256, 0) + MemCopy ByVal HostName, ByVal heDestHost.h_name, 256 + GetHostByAddress = Left$(HostName, InStr(HostName, Chr$(0)) - 1) + Else + GetHostByAddress = WSA_NoName + End If +End Function + +'returns IP as long, in network byte order +Public Function GetHostByNameAlias(ByVal HostName$) As Long + 'Return IP address as a long, in network byte order + Dim phe& + Dim heDestHost As HostEnt + Dim addrList& + Dim retIP& + retIP = inet_addr(HostName$) + If retIP = INADDR_NONE Then + phe = gethostbyname(HostName$) + If phe <> 0 Then + MemCopy heDestHost, ByVal phe, hostent_size + MemCopy addrList, ByVal heDestHost.h_addr_list, 4 + MemCopy retIP, ByVal addrList, heDestHost.h_length + Else + retIP = INADDR_NONE + End If + End If + GetHostByNameAlias = retIP +End Function + +'returns your local machines name +Public Function GetLocalHostName() As String + Dim sName$ + sName = String(256, 0) + If gethostname(sName, 256) Then + sName = WSA_NoName + Else + If InStr(sName, Chr$(0)) Then + sName = Left$(sName, InStr(sName, Chr$(0)) - 1) + End If + End If + GetLocalHostName = sName +End Function + +#If Win16 Then + Public Function GetPeerAddress(ByVal S%) As String + Dim AddrLen% +#ElseIf Win32 Then + Public Function GetPeerAddress(ByVal S&) As String + Dim AddrLen& +#End If + Dim sa As sockaddr + AddrLen = sockaddr_size + If getpeername(S, sa, AddrLen) Then + GetPeerAddress = vbNullString + Else + GetPeerAddress = SockAddressToString(sa) + End If +End Function + +#If Win16 Then + Public Function GetPortFromString(ByVal PortStr$) As Integer +#ElseIf Win32 Then + Public Function GetPortFromString(ByVal PortStr$) As Long +#End If + 'sometimes users provide ports outside the range of a VB + 'integer, so this function returns an integer for a string + 'just to keep an error from happening, it converts the + 'number to a negative if needed + If Val(PortStr$) > 32767 Then + GetPortFromString = CInt(Val(PortStr$) - &H10000) + Else + GetPortFromString = Val(PortStr$) + End If + If Err Then GetPortFromString = 0 +End Function + +#If Win16 Then + Function GetProtocolByName(ByVal Protocol$) As Integer + Dim tmpShort% +#ElseIf Win32 Then + Function GetProtocolByName(ByVal Protocol$) As Long + Dim tmpShort& +#End If + Dim ppe& + Dim peDestProt As protoent + ppe = getprotobyname(Protocol) + If ppe Then + MemCopy peDestProt, ByVal ppe, protoent_size + GetProtocolByName = peDestProt.p_proto + Else + tmpShort = Val(Protocol) + If tmpShort Then + GetProtocolByName = htons(tmpShort) + Else + GetProtocolByName = SOCKET_ERROR + End If + End If +End Function + +#If Win16 Then + Function GetServiceByName(ByVal service$, ByVal Protocol$) As Integer + Dim Serv% +#ElseIf Win32 Then + Function GetServiceByName(ByVal service$, ByVal Protocol$) As Long + Dim Serv& +#End If + Dim pse& + Dim seDestServ As servent + pse = getservbyname(service, Protocol) + If pse Then + MemCopy seDestServ, ByVal pse, servent_size + GetServiceByName = seDestServ.s_port + Else + Serv = Val(service) + If Serv Then + GetServiceByName = htons(Serv) + Else + GetServiceByName = INVALID_SOCKET + End If + End If +End Function + +'this function DOES work on 16 and 32 bit systems +#If Win16 Then + Function GetSockAddress(ByVal S%) As String + Dim AddrLen% + Dim Ret% +#ElseIf Win32 Then + Function GetSockAddress(ByVal S&) As String + Dim AddrLen& + Dim Ret& +#End If + Dim sa As sockaddr + Dim szRet$ + szRet = String(32, 0) + AddrLen = sockaddr_size + If getsockname(S, sa, AddrLen) Then + GetSockAddress = vbNullString + Else + GetSockAddress = SockAddressToString(sa) + End If +End Function + +'this function should work on 16 and 32 bit systems +Function GetWSAErrorString(ByVal errnum&) As String + On Error Resume Next + Select Case errnum + Case 10004: GetWSAErrorString = "Interrupted system call." + Case 10009: GetWSAErrorString = "Bad file number." + Case 10013: GetWSAErrorString = "Permission Denied." + Case 10014: GetWSAErrorString = "Bad Address." + Case 10022: GetWSAErrorString = "Invalid Argument." + Case 10024: GetWSAErrorString = "Too many open files." + Case 10035: GetWSAErrorString = "Operation would block." + Case 10036: GetWSAErrorString = "Operation now in progress." + Case 10037: GetWSAErrorString = "Operation already in progress." + Case 10038: GetWSAErrorString = "Socket operation on nonsocket." + Case 10039: GetWSAErrorString = "Destination address required." + Case 10040: GetWSAErrorString = "Message too long." + Case 10041: GetWSAErrorString = "Protocol wrong type for socket." + Case 10042: GetWSAErrorString = "Protocol not available." + Case 10043: GetWSAErrorString = "Protocol not supported." + Case 10044: GetWSAErrorString = "Socket type not supported." + Case 10045: GetWSAErrorString = "Operation not supported on socket." + Case 10046: GetWSAErrorString = "Protocol family not supported." + Case 10047: GetWSAErrorString = "Address family not supported by protocol family." + Case 10048: GetWSAErrorString = "Address already in use." + Case 10049: GetWSAErrorString = "Can't assign requested address." + Case 10050: GetWSAErrorString = "Network is down." + Case 10051: GetWSAErrorString = "Network is unreachable." + Case 10052: GetWSAErrorString = "Network dropped connection." + Case 10053: GetWSAErrorString = "Software caused connection abort." + Case 10054: GetWSAErrorString = "Connection reset by peer." + Case 10055: GetWSAErrorString = "No buffer space available." + Case 10056: GetWSAErrorString = "Socket is already connected." + Case 10057: GetWSAErrorString = "Socket is not connected." + Case 10058: GetWSAErrorString = "Can't send after socket shutdown." + Case 10059: GetWSAErrorString = "Too many references: can't splice." + Case 10060: GetWSAErrorString = "Connection timed out." + Case 10061: GetWSAErrorString = "Connection refused." + Case 10062: GetWSAErrorString = "Too many levels of symbolic links." + Case 10063: GetWSAErrorString = "File name too long." + Case 10064: GetWSAErrorString = "Host is down." + Case 10065: GetWSAErrorString = "No route to host." + Case 10066: GetWSAErrorString = "Directory not empty." + Case 10067: GetWSAErrorString = "Too many processes." + Case 10068: GetWSAErrorString = "Too many users." + Case 10069: GetWSAErrorString = "Disk quota exceeded." + Case 10070: GetWSAErrorString = "Stale NFS file handle." + Case 10071: GetWSAErrorString = "Too many levels of remote in path." + Case 10091: GetWSAErrorString = "Network subsystem is unusable." + Case 10092: GetWSAErrorString = "Winsock DLL cannot support this application." + Case 10093: GetWSAErrorString = "Winsock not initialized." + Case 10101: GetWSAErrorString = "Disconnect." + Case 11001: GetWSAErrorString = "Host not found." + Case 11002: GetWSAErrorString = "Nonauthoritative host not found." + Case 11003: GetWSAErrorString = "Nonrecoverable error." + Case 11004: GetWSAErrorString = "Valid name, no data record of requested type." + Case Else: + End Select +End Function + +'this function DOES work on 16 and 32 bit systems +Function IpToAddr(ByVal AddrOrIP$) As String + On Error Resume Next + IpToAddr = GetHostByAddress(GetHostByNameAlias(AddrOrIP$)) + If Err Then IpToAddr = WSA_NoName +End Function + +'this function DOES work on 16 and 32 bit systems +Function IrcGetAscIp(ByVal IPL$) As String + 'this function is IRC specific, it expects a long ip stored in Network byte order, in a string + 'the kind that would be parsed out of a DCC command string + On Error GoTo IrcGetAscIPError: + Dim lpStr& +#If Win16 Then + Dim nStr% +#ElseIf Win32 Then + Dim nStr& +#End If + Dim retString$ + Dim inn& + If Val(IPL) > 2147483647 Then + inn = Val(IPL) - 4294967296# + Else + inn = Val(IPL) + End If + inn = ntohl(inn) + retString = String(32, 0) + lpStr = inet_ntoa(inn) + If lpStr = 0 Then + IrcGetAscIp = "0.0.0.0" + Exit Function + End If + nStr = lstrlen(lpStr) + If nStr > 32 Then nStr = 32 + MemCopy ByVal retString, ByVal lpStr, nStr + retString = Left$(retString, nStr) + IrcGetAscIp = retString + Exit Function +IrcGetAscIPError: + IrcGetAscIp = "0.0.0.0" + Exit Function + Resume +End Function + +Public Function GetLongIp(ByVal IPS As String) As Long + GetLongIp = inet_addr(IPS) +End Function + + +'this function DOES work on 16 and 32 bit systems +Function IrcGetLongIp(ByVal AscIp$) As String + 'this function converts an ascii ip string into a long ip in network byte order + 'and stick it in a string suitable for use in a DCC command. + On Error GoTo IrcGetLongIpError: + Dim inn& + inn = inet_addr(AscIp) + inn = htonl(inn) + If inn < 0 Then + IrcGetLongIp = CVar(inn + 4294967296#) + Exit Function + Else + IrcGetLongIp = CVar(inn) + Exit Function + End If + Exit Function +IrcGetLongIpError: + IrcGetLongIp = "0" + Exit Function + Resume +End Function + +'this function should work on 16 and 32 bit systems +#If Win16 Then +Public Function ListenForConnect(ByVal Port%, ByVal HWndToMsg%, ByVal Enlazar As String) As Integer + Dim S%, dummy% + Dim SelectOps% +#ElseIf Win32 Then +Public Function ListenForConnect(ByVal Port&, ByVal HWndToMsg&, ByVal Enlazar As String) As Long + Dim S&, dummy& + Dim SelectOps& +#End If + Dim sockin As sockaddr + sockin = saZero 'zero out the structure + sockin.sin_family = AF_INET + sockin.sin_port = htons(Port) + If sockin.sin_port = INVALID_SOCKET Then + ListenForConnect = INVALID_SOCKET + Exit Function + End If + If LenB(Enlazar) = 0 Then + sockin.sin_addr = htonl(INADDR_ANY) + Else + sockin.sin_addr = inet_addr(Enlazar) + End If + If sockin.sin_addr = INADDR_NONE Then + ListenForConnect = INVALID_SOCKET + Exit Function + End If + S = Socket(PF_INET, SOCK_STREAM, 0) + If S < 0 Then + ListenForConnect = INVALID_SOCKET + Exit Function + End If + +'Agregado por Maraxus + 'If setsockopt(s, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, True, 2) Then + ' LogApiSock ("Error seteando conditional accept") + ' Debug.Print "Error seteando conditional accept" + 'Else + ' LogApiSock ("Conditional accept seteado") + ' Debug.Print "Conditional accept seteado ^^" + 'End If + + If bind(S, sockin, sockaddr_size) Then + If S > 0 Then + dummy = apiclosesocket(S) + End If + ListenForConnect = INVALID_SOCKET + Exit Function + End If +' SelectOps = FD_READ Or FD_WRITE Or FD_CLOSE Or FD_ACCEPT + SelectOps = FD_READ Or FD_CLOSE Or FD_ACCEPT + If WSAAsyncSelect(S, HWndToMsg, ByVal 1025, ByVal SelectOps) Then + If S > 0 Then + dummy = apiclosesocket(S) + End If + ListenForConnect = SOCKET_ERROR + Exit Function + End If + + 'If listen(s, 5) Then + If listen(S, SOMAXCONN) Then + If S > 0 Then + dummy = apiclosesocket(S) + End If + ListenForConnect = INVALID_SOCKET + Exit Function + End If + ListenForConnect = S +End Function + +'this function should work on 16 and 32 bit systems +#If Win16 Then +Public Function kSendData(ByVal S%, vMessage As Variant) As Integer +#ElseIf Win32 Then +Public Function kSendData(ByVal S&, vMessage As Variant) As Long +#End If + Dim TheMsg() As Byte, sTemp$ + TheMsg = vbNullString + Select Case VarType(vMessage) + Case 8209 'byte array + sTemp = vMessage + TheMsg = sTemp + Case 8 'string, if we recieve a string, its assumed we are linemode + #If Win32 Then + sTemp = StrConv(vMessage, vbFromUnicode) + #Else + sTemp = vMessage + #End If + Case Else + sTemp = CStr(vMessage) + #If Win32 Then + sTemp = StrConv(vMessage, vbFromUnicode) + #Else + sTemp = vMessage + #End If + End Select + TheMsg = sTemp + If UBound(TheMsg) > -1 Then + kSendData = send(S, TheMsg(0), UBound(TheMsg) + 1, 0) + End If +End Function + +Public Function SockAddressToString(sa As sockaddr) As String + SockAddressToString = GetAscIP(sa.sin_addr) & ":" & ntohs(sa.sin_port) +End Function + +Public Function StartWinsock(sDescription As String) As Boolean + Dim StartupData As WSADataType + If Not WSAStartedUp Then + 'If Not WSAStartup(&H101, StartupData) Then + If Not WSAStartup(&H202, StartupData) Then 'Use sockets v2.2 instead of 1.1 (Maraxus) + WSAStartedUp = True +' Debug.Print "wVersion="; StartupData.wVersion, "wHighVersion="; StartupData.wHighVersion +' Debug.Print "If wVersion == 257 then everything is kewl" +' Debug.Print "szDescription="; StartupData.szDescription +' Debug.Print "szSystemStatus="; StartupData.szSystemStatus +' Debug.Print "iMaxSockets="; StartupData.iMaxSockets, "iMaxUdpDg="; StartupData.iMaxUdpDg + sDescription = StartupData.szDescription + Else + WSAStartedUp = False + End If + End If + StartWinsock = WSAStartedUp +End Function + +Public Function WSAMakeSelectReply(TheEvent%, TheError%) As Long + WSAMakeSelectReply = (TheError * &H10000) + (TheEvent And &HFFFF&) +End Function diff --git a/Client.vbp b/Client.vbp new file mode 100644 index 0000000..3dc6d44 --- /dev/null +++ b/Client.vbp @@ -0,0 +1,83 @@ +Type=Exe +Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINDOWS\system32\stdole2.tlb#OLE Automation +Reference=*\G{E1211242-8E94-11D1-8808-00C04FC2C602}#1.0#0#..\..\..\..\..\..\Program Files\Aodrag\DX7VB.dll#DirectX 7 for Visual Basic Type Library +Reference=*\G{00025E01-0000-0000-C000-000000000046}#4.0#0#C:\Program Files\Common Files\Microsoft Shared\DAO\DAO350.DLL#Microsoft DAO 3.51 Object Library +Reference=*\G{56A868B0-0AD4-11CE-B03A-0020AF0BA770}#1.0#0#C:\WINDOWS\system32\quartz.dll#ActiveMovie control type library +Object={3B7C8863-D78F-101B-B9B5-04021C009402}#1.2#0; RICHTX32.ocx +Object={48E59290-9880-11CF-9754-00AA00C00908}#1.0#0; MSINET.ocx +Object={33101C00-75C3-11CF-A8A0-444553540000}#1.0#0; CSWSK32.ocx +Object={248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0; MSWINSCK.ocx +Object={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0; MSCOMCTL.ocx +Form=CODIGO\frmMain.frm +Module=Mod_Declaraciones; CODIGO\Declares.bas +Module=Mod_General; CODIGO\General.bas +Module=Mod_TileEngine; CODIGO\TileEngine.bas +Module=GameIni; codigo\GameIni.bas +Class=clsAudio; CODIGO\clsAudio.cls +Class=clsGrapchicalInventory; CODIGO\clsGrapchicalInventory.cls +Module=ModAreas; CODIGO\ModAreas.bas +Class=clsSurfaceManDyn; CODIGO\clsSurfaceManDyn.cls +Class=clsSurfaceManager; CODIGO\clsSurfaceManager.cls +Class=clsSurfaceManStatic; CODIGO\clsSurfaceManStatic.cls +Class=clsByteQueue; CODIGO\clsByteQueue.cls +Class=clsTimer; CODIGO\MainTimer.cls +Class=cDIBSection; CODIGO\cDIBSection.cls +Class=clsCustomMessages; CODIGO\clsCustomMessages.cls +Class=clsDialogs; CODIGO\clsDialogs.cls +Class=clsCustomKeys; CODIGO\clsCustomKeys.cls +Form=CODIGO\frmCustomKeys.frm +Module=Resolution; CODIGO\Resolution.bas +Module=Application; CODIGO\Application.bas +Module=modCompression; CODIGO\modCompression.bas +Class=clsGraphicalButton; CODIGO\clsGraphicalButton.cls +Class=clsFormMovementManager; CODIGO\clsFormMovementManager.cls +Module=modBot; CODIGO\modBot.bas +Module=modCombate; CODIGO\modCombate.bas +Form=CODIGO\frmStart.frm +Class=clsIniReader; CODIGO\clsIniReader.cls +Form=CODIGO\frmLogin.frm +Module=Protocol; CODIGO\Protocol.bas +Module=ProtocolCmdParse; CODIGO\ProtocolCmdParse.bas +Module=wskapiAO; CODIGO\wskapiAO.bas +Module=WSKSOCK; CODIGO\wsksock.bas +Module=TCP; CODIGO\TCP.bas +Module=modSendData; CODIGO\modSendData.bas +Module=SecurityIp; CODIGO\SecurityIp.bas +Form=CODIGO\frmPersonaje.frm +IconForm="frmMain" +Startup="Sub Main" +HelpFile="" +Title="FronBot" +ExeName32="FronBot.exe" +Command32="" +Name="FronBot" +HelpContextID="0" +CompatibleMode="0" +MajorVer=0 +MinorVer=2 +RevisionVer=1 +AutoIncrementVer=0 +ServerSupportFiles=0 +VersionCompanyName="AnaGGrama Inc." +VersionLegalCopyright="Creado por Anagrama, genio indiscutible del universo." +VersionProductName="FronBot" +CondComp="UsarWrench = 1 : ConMenuseConextuales = 0 : ConAlfaB = 0 : ModoDebug = 0" +CompilationType=0 +OptimizationType=0 +FavorPentiumPro(tm)=0 +CodeViewDebugInfo=0 +NoAliasing=0 +BoundsCheck=0 +OverflowCheck=0 +FlPointCheck=0 +FDIVCheck=0 +UnroundedFP=0 +StartMode=0 +Unattended=0 +Retained=0 +ThreadPerObject=0 +MaxNumberOfThreads=1 +DebugStartupOption=0 + +[MS Transaction Server] +AutoRefresh=1 diff --git a/Client.vbw b/Client.vbw new file mode 100644 index 0000000..82f8f2a --- /dev/null +++ b/Client.vbw @@ -0,0 +1,36 @@ +frmMain = 126, 160, 859, 729, , 46, 46, 779, 615, C +Mod_Declaraciones = 69, 69, 961, 470, +Mod_General = 46, 46, 779, 615, +Mod_TileEngine = 207, 207, 940, 776, +GameIni = 115, 115, 848, 684, +clsAudio = 138, 138, 871, 707, +clsGrapchicalInventory = 198, 207, 925, 837, +ModAreas = 0, 0, 609, 458, +clsSurfaceManDyn = 0, 0, 0, 0, C +clsSurfaceManager = 0, 0, 0, 0, C +clsSurfaceManStatic = 0, 0, 0, 0, C +clsByteQueue = 110, 115, 928, 681, +clsTimer = 154, 196, 763, 654, +cDIBSection = 220, 280, 1021, 910, +clsCustomMessages = 0, 0, 801, 630, +clsDialogs = 0, 0, 697, 399, +clsCustomKeys = 88, 112, 889, 742, +frmCustomKeys = 176, 224, 977, 854, , 46, 46, 779, 615, C +Resolution = 23, 23, 756, 592, +Application = 132, 168, 744, 626, +modCompression = 23, 23, 756, 592, +clsGraphicalButton = 176, 224, 1066, 735, +clsFormMovementManager = 0, 0, 0, 0, C +modBot = 110, 115, 833, 741, +modCombate = 132, 138, 855, 764, +frmStart = 198, 207, 921, 833, , 176, 184, 899, 810, C +clsIniReader = 66, 69, 878, 635, +frmLogin = 236, 373, 967, 1003, , 198, 207, 929, 837, C +Protocol = 327, 251, 1058, 881, +ProtocolCmdParse = 242, 253, 973, 883, +wskapiAO = 286, 299, 1017, 929, +WSKSOCK = 0, 0, 730, 630, +TCP = 233, 65, 963, 695, +modSendData = 44, 46, 775, 676, +SecurityIp = 88, 92, 819, 722, +frmPersonaje = 198, 207, 930, 837, , 132, 138, 864, 768, C diff --git a/Graficos/._principal bot.jpg b/Graficos/._principal bot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d49c03fe684991447493e57f46dd5a5b4a7c382d GIT binary patch literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v%6q<8 z3!;PJ08qIanii1hAaMZ(2C3xyT)o7Cf}B*noW$ai(&E&Vl*E!$<$z$Qo(n))jDbNE zp{}qru_!UGBr`9S!Lf5`3`m`4MxO+THZZU-vNlalG_|laF|rOQN-fJwEw={AjDpb+ z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C;T{5vKo5d27|4ZWWELwFr55Lx7A2=D yq~#Z7D`e)CqyoE>`FV*sIh6`Isc9t&NjZsm*}%RqRM(KEQ2h`0iVTC?|Nj8rtvcKQ literal 0 HcmV?d00001 diff --git a/Graficos/Boton_Combatir_Click.jpg b/Graficos/Boton_Combatir_Click.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9064339d6c8b8483db8ca8ee48bb0f74766592c6 GIT binary patch literal 14319 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 literal 0 HcmV?d00001 diff --git a/Graficos/Boton_Combatir_Hover.jpg b/Graficos/Boton_Combatir_Hover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c1d1fa178ea044b448cddf3d862c04f1724b67ff GIT binary patch literal 14954 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 TEW4lDFsF>1)w|}NmXH1m7TWWq literal 0 HcmV?d00001 diff --git a/Graficos/CruzCerrarClick.jpg b/Graficos/CruzCerrarClick.jpg new file mode 100644 index 0000000000000000000000000000000000000000..64a571eec86eda26d6e6ff991a58b7ca5915bdc5 GIT binary patch literal 12487 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 R4?MoFZ2lF@9pjT9{S6R(;$8p% literal 0 HcmV?d00001 diff --git a/Graficos/FlechaHechizos.jpg b/Graficos/FlechaHechizos.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb58da0ed14cb6f8b59a864e8e9e7a00c4002fad GIT binary patch literal 13510 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 Jw;d}V{cnArJyHMw literal 0 HcmV?d00001 diff --git a/Graficos/FlechaHechizos2Click.jpg b/Graficos/FlechaHechizos2Click.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92c0ce99b7a5385046e83b2655c848f3afb0e24c GIT binary patch literal 12357 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 G9QYsNci_(e literal 0 HcmV?d00001 diff --git a/Graficos/FlechaHechizosClick.jpg b/Graficos/FlechaHechizosClick.jpg new file mode 100644 index 0000000000000000000000000000000000000000..97bed2f40ac92242ba235212bd8fc7e84744cf4b GIT binary patch literal 13150 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 SY&)5`bHxLHzT%HcFaI}T)XDe& literal 0 HcmV?d00001 diff --git a/Graficos/FlechaHechizosHover.jpg b/Graficos/FlechaHechizosHover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2d8e79f2c6d7e230ebc76fa474df95f8c9aaa5b GIT binary patch literal 13287 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 Qdw5&pi~E+nGydZL0QQkFGynhq literal 0 HcmV?d00001 diff --git a/Graficos/Graphics.AO b/Graficos/Graphics.AO new file mode 100644 index 0000000000000000000000000000000000000000..69f61144e0b5c29082beaa371e92594f28312b6c GIT binary patch literal 580076 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%0DwIff>10Q-WCSeV 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 z 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