Foro especializado en Warcraft III y su editor
 
BuscarEntrar al ChatboxPortal del foroÍndiceSpellsRegistrarseConectarseGrupos de Usuarios
Eventos Actuales
¡ Bienvenido Invitado !

Editar Perfil

Tus temas
Tus Mensajes ()

Enlaces rápidos








Comparte | .
 

 Mega-Tutorial de mapeo

Ver el tema anterior Ver el tema siguiente Ir abajo 
AutorMensaje
Marcos_M

avatar


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 3124
Reputación Reputación : 522
Monedas de oro : 9720
Monedas de Platino : 0

Inventario :



Mensaje(#) Tema: Mega-Tutorial de mapeo Vie Sep 29, 2017 3:22 pm

Este mega-tutorial busca ayudarte a aprender varias herramientas útiles a la hora de hacer un mapa en donde implementes una mecánica nueva al juego.
Para descargar el mapa dirijanse a este post: Descarga!

Índice:


  • Explicación X: GetLocalPlayer()
  • Explicación L: Fugas de memoria
  • Explicación LA: Variables de punto
  • Explicación LB: Variables de grupo de unidad
  • Explicación LC: Usar grupos de unidad sin variable
  • Explicación U: Usar unidades dummy
  • Explicación I: Instrucciones de uso Unit Indexer
  • Explicación DE: Instrucciones de uso Damage Engine


Explicación X

Esta es la explicación sobre GetLocalPlayer() y los If/Then/Else en JASS debido a su uso en conjunto
Comenzaremos por analizar la primera línea en el map donde uso esto:

[gui]Custom script:   if GetOwningPlayer(GetEnumUnit()) != GetLocalPlayer() then[/gui]

La línea empieza con [ljass]if[/ljass], esto indica que empezará un If/Then/Else, si tienes

conocimientos de GUI básicos, sabes que lo primero que ponemos en un If es la condición, en JASS esto

es igual, así que lo siguiente es la condición
Esta condición es [ljass]GetOwningPlayer(GetEnumUnit()) != GetLocalPlayer()[/ljass], la condición está

dividida a su vez, en 3 partes. el objeto a comparar 1, la "pregunta" y el objeto a comparar 2. En

este caso, el primer objeto es [ljass]GetOwningPlayer(GetEnumUnit())[/ljass], esta es una función que

existe en GUI, en GUI es "Owner of unit". La "pregunta" es [ljass]!=[/ljass] esto en GUI es "No igual

a". Por último, el segundo objeto es [ljass]GetLocalPlayer()[/ljass], una función que solo existe en

JASS. Esta es una función especial que se refiere al jugador local, esto quiere decir, se refiere al

jugador dueño de la computadora, nos permite realizar acciones diferentes para cada jugador en lo que

llamamos "Bloque local" que es todo lo que está por debajo de este "If"
Y esta línea termina con la palabra [ljass]then[/ljass], toda línea que empieza con "if" debe terminar

con "then"
Todo lo que esté debajo del "then" ocurrirá si la condición se cumple. En este caso, todo lo que esté

por debajo es un "Bloque local" acciones que sólo ocurrirán para el jugador dueño de la computadora,

el jugador local
IMPORTANTE: No todas las acciones son compatibles con el bloque local

Explicación L

Esta es la razón por la cual tenemos Fugas de memoria en Warcraft y tenemos que encargarnos de ellas

@WonderWoman escribió:
Porque jass no tiene un framework con garbage collector como un lenguaje real

(C#.NET por ejemplo), en .NET, JVM, el engine de Unity etc. se levanta un proceso de fondo que se

encarga de destruir los objetos que dejan de ser referenciados automaticamente, eso quiere decir que

cuando los sacas de una variable (o si nunca los guardas en una variable) se van a destruir

eventualmente sin que tengas que intervenir.
En este tema nos encargaramos de las 2 fugas de memoria más populares: Variables de Punto y Grupos de

unidad


Explicación LA

Esta es la explicación sobre las variables de Punto y por qué las usamos tanto
Como ya dijimos en la Explicación L, los Puntos dejan una fuga de memoria, por lo tanto debemos

guardarlos en una variable CADA VEZ que vayamos a usar un punto, esto sucede cuando

vayamos a usar un grupo de unidad, vayamos a crear una unidad, un efecto especial, un rayo, un texto

flotante, esta es una variable muy usada en todo mapa de Warcraft
Así que nosotros creamos una variable de Punto en nuestro editor de variables


La usamos de la siguiente forma:
[gui]Ejemplo Punto
   Acontecimientos
   Condiciones
   Acciones
       Set SuperPunto = (Center of (Playable map area))
       Unidad - Create 1 Campesino for Jugador 1 (rojo) at SuperPunto facing Vista edificio

predeterminada (270.0) degrees
       Custom script:   call RemoveLocation(udg_SuperPunto)
[/gui]
Primero se coloca el valor a la variable, y luego debemos destruirlo con la función:
[ljass]RemoveLocation(location)[/ljass]
En "location" nosotros colocamos "udg_", seguido del nombre de nuestra variable, en nuestro ejemplo es

"SuperPunto" y como esta es una función, antes de llamarla hay que escribir [ljass]call[/ljass], y la

línea entera queda
[gui]Custom script:   call RemoveLocation(udg_SuperPunto)[/gui]

Explicación LB

Esta es la explicación sobre las variables de Grupo de unidad y por qué las usamos

Lo primero que debemos entender, es la siguiente función:

Hablo de la segunda ventana que dice "Grupo de unidad"
Todas y cada una de esas funciones crea un nuevo grupo, esto quiere decir que todas las veces que la

llamemos dejaremos una fuga de memoria, por lo que ya dijimos en la explicación L. Por eso, nosotros

recurrimos a una variable de Grupo de unidad
La creamos en el editor de variables primero:


La usamos de la siguiente manera:
[gui]Ejemplo Grupo
   Acontecimientos
   Condiciones
   Acciones
       Set SuperGrupo = (Units in (Playable map area))
       Grupo de unidad - Pick every unit in SuperGrupo and do (Actions)
           Bucle: Acciones
               Unidad - Kill (Picked unit)
       Custom script:   call DestroyGroup(udg_SuperGrupo)
[/gui]
Primero se coloca el valor de la variable, y luego se la destruye con la función: [ljass]DestroyGroup

(group)[/ljass]
En "group" nosotros colocamos "udg_", seguido del nombre de nuestra variable, en nuestro ejemplo es

"SuperGrupo" y como esta es una función, antes de llamarla hay que escribir [ljass]call[/ljass], y la

línea entera queda
[gui]Custom script:   call DestroyGroup(udg_SuperGrupo)[/gui]

Como nota adicional:
Cuando hagamos un bucle de grupo de unidad, debemos usar "Picked unit" para referirnos a cada unidad

del grupo

Explicación LC

Esta es la explicación de la línea [ljass]set bj_wantDestroyGroup = true[/ljass]

Esto se usa en conjunto con la acción:
Grupo de unidad - Pick every unit in unit group and Do (Actions)

La forma en que esta acción funciona es la siguiente:
[jass]function ForGroupBJ takes group whichGroup, code callback returns nothing
   // If the user wants the group destroyed, remember that fact and clear
   // the flag, in case it is used again in the callback.
   local boolean wantDestroy = bj_wantDestroyGroup
   set bj_wantDestroyGroup = false

   call ForGroup(whichGroup, callback)

   // If the user wants the group destroyed, do so now.
   if (wantDestroy) then
       call DestroyGroup(whichGroup)
   endif
endfunction
[/jass]
La mayoría aquí no entiende JASS, pero creanme, no importa. Lo importante es que vean estas líneas
[jass]local boolean wantDestroy = bj_wantDestroyGroup[/jass]
Ahí pueden ver a bj_wantDestroyGroup y una variable booleana [ljass]wantDestroy[/ljass] que toma el

valor de bj_wantDestroyGroup, esta variable luego es usada unas líneas más abajo
[jass]if (wantDestroy) then
   call DestroyGroup(whichGroup)
endif[/jass]
Si miran la explicación LC sabrán que [ljass]DestroyGroup(whichGroup)[/ljass] sirve para eliminar la

fuga de memoria ocasionada por el grupo de unidad, esto significa que no necesitaremos una variable

para el grupo de esta forma

Como wantDestroy es igual al valor de bj_wantDestroyGroup al momento de llamar la función, si nosotros

le damos el valor "true" a esa variable, la acción limpiará el leak por nosotros.
Entonces para usar una línea JASS en GUI, recurrimos a la acción Custom Script, y escribimos

[ljass]set bj_wantDestroyGroup = true[/ljass]
Y luego les quedará algo así:
[gui]Custom script:   set bj_wantDestroyGroup = true
Grupo de unidad - Pick every unit in (Units of type Campesino) and do (Actions)
   Bucle: Acciones
       Unidad - Kill (Picked Unit)
[/gui]

Es sencillo de usar y más rápido que usar variables, pero sepan que esto destruirá su grupo cuando

termine su bucle, si necesitan hacer varias cosas con el grupo de unidad lo mejor es usar una

variable, como siempre, tienen que ser responsables al usar atajos en su código

Explicación U

¿Cómo utilizar unidades dummy en un detonador?
Primero debemos aprender a crear una
http://www.worldofeditors.net/t1423-unidades-dummy

Luego tenemos que crear una habilidad dummy, esta es una habilidad que sólo la usará nuestra unidad dummy, por eso tiene características diferentes, observen:

Observen el coste de maná, el tiempo muerto y el alcance de conjuro.

Ahora veamos unos ejemplos en detonadores:

[gui]Flama interna
   Acontecimientos
       Unidad - A unit Inicia el efecto de una habilidad
   Condiciones
       (Ability being cast) Igual a (==) Llama interna
   Acciones
       Set Punto = (Position of (Triggering unit))
       Unidad - Create 1 DUMMY_CASTER_ID for (Triggering player) at Punto facing Vista edificio predeterminada (270.0) degrees
       Unidad - Add Llama interna (dummy) to (Last created unit)
       Unidad - Add a 2.00 second Generico expiration timer to (Last created unit)
       Unidad - Order (Last created unit) to Humano Sacerdote: Fuego interior (Triggering unit)
       Custom script:   call RemoveLocation(udg_Punto)
[/gui]
Es simple, variable de punto, se crea el dummy, se añade la habilidad, se le da 2 segundos de vida, se le ordena usar la habilidad, se limpia el punto, esto es igual siempre, es super mecánico, tienen que seguir los pasos y no darle más pensamiento.

Explicación I

Instrucciones de uso del sistema Unit Indexer
¿Qué hace Unit Indexer?
Unit Indexer se encarga de asignarle un número único al "Custom value" de cada unidad en el mapa, la

forma más sencilla de entenderlo es pensando que el "Custom value" será el "DNI" de nuestra unidad, o

sea, una forma fácil y sencilla de identificarla y diferenciarla de las demás. Si recordamos lo que es

una variable de formación, sabremos que este tipo de variable nos permite colocar un numerito entre

sus corchetes, así: [gui]Set variable[numerito] = 44.00[/gui]
Con Unit Indexer si nosotros en vez de colocar un numero cualquiera, colocamos [(Custom value of

(Unidad))], así tenemos variables únicas para cada unidad en el mapa, lo que nos facilita el trabajo.

Primero:

Se debe descargar el sistema https://www.hiveworkshop.com/threads/gui-unit-indexer-1-3-0-0.197329/

Segundo:

Abrir el mapa, ir al editor de detonadores, copiar el detonador "Unit Indexer"
Abrir el mapa donde vamos a importar el sistema, ir al editor de detonador, Ctrl+V
Listo! Sistema importado

Tercero:

Por último, la parte importante, aprender a usar este sistema:
Bribe escribió:
Unit Indexer les asigna un valor seguro para los array (1-8190) al custom value de las

unidades, eliminando la necesidad de usar hashtables para guardar información específica de unidades.
Solo usa "Set MiDatoArray[(Custom value of Unit)] = (Algun dato)".
--------
Si quieres obtener la unidad asignada a un índice(observación reversa) usa "UDexUnits[(Index)]".
--------
Si quieres detectar cuando un índice es creado o cuando es liberado, usa "UnitIndexEvent becomes Igual

a 1.00" (creado) o "UnitIndexEvent becomes Igual a 2.00" (liberado). El índice siendo creado/liberado

se llama "UDex".
--------
Puedes habilitar/deshabilitar Unit Indexer para proteger alguna unidad indeseable de ser indexeada de

la siguiente forma:

[gui]Detonador - Turn off Unit Indexer
Unidad - Create 1 Dummy for (Triggering player) at TempPoint facing 0.00 degrees
Detonador - Turn on Unit Indexer [/gui]
--------
Si quieres usar un detonador con evento Map Initialization que use el custom value de las unidades,

para asegurarse de que Unit Indexer haya corrido antes, usa el evento "UnitIndexEvent becomes Igual a

3.00". De otra forma el custom value de las unidades podría ser cero.
--------
Avanzado:
--------
Si quieres bloquear el índice de una unidad, usa "Set UnitIndexLock[(Index)] = (UnitIndexLock[(Index)]

+ 1)". Esto va a prevenir el índice de ser reciclado. Si quieres desbloquearlo y permitir al sistema

que lo libera, corre el detonador Unit Indexer .

Nota: Si añades un bloqueo asegurate de remover el bloqueo eventualmente, de otra forma el índice

nunca va a ser reciclado.

Ejemplos de uso serían:
Cuando una unidad es creada
[gui]Unit Indexed Event
   Acontecimientos
       Partida - UnitIndexEvent becomes Igual a 1.00
   Condiciones
UDexUnits[UDex] es Un héroe Igual a true
   Acciones
       Objeto - Create 1 Tome of Power and give it to UDexUnits[UDex][/gui]

Cuando una unidad es liberada
[gui]Unit Deindexed Event
   Acontecimientos
       Partida - UnitIndexEvent becomes Igual a 2.00
   Condiciones
   Acciones
       Partida - Display to (All Players) the text - Unit (UDex) was deindexed![/gui]

Unit Indexer inicializado
[gui]Unit Indexer Initialized Event
   Acontecimientos
       Partida - UnitIndexEvent becomes Igual a 3.00
   Condiciones
   Acciones
       Unidad - Create 1 Paladin for (Player 1) at TempPoint facing 0.00 degrees
       Objeto - Create 1 Ankh of Reincarnation and give it to (Last created unit)
       Set HeroItem[(Custom value of (Last created unit))] = (Last created item)[/gui]

Explicación DE

Instrucciones de uso del Sistema Damage Engine
¿Qué hace Damage Engine?
Este sistema nos otorga 1 evento faltante al juego "Una unidad recibe daño". Esta es la versión corta
Pero este sistema es más que solo un evento nuevo, nos permite saber que unidad causó el daño, que

unidad recibió el daño, cuanto daño se recibió, diferenciar si el daño es mágico o físico. También nos

permite modificar el daño a voluntad
Hasta hay un evento separado para detectar cuando una unidad recibe 0 de daño(Esto sucede cuando

utilizas fuego faérico sobre una unidad, por ejemplo)

Primero:

Se debe descargar el sistema https://www.hiveworkshop.com/threads/damage-engine-3-7-0-1.201016/

Segundo:

Para importar el sistema seguimos los siguientes pasos

  1. Ir al editor de objetos, en la sección de habilidades

    Estas 2 son las habilidades NECESARIAS para que el sistema funcione, deben copiarlas a su mapa
  2. Ir al editor de detonadores y veremos esto:

    Nosotros copiaremos la primera carpeta para importar el sistema, de la siguiente manera

    Ahora en su mapa, simplemente deben apretar "Ctrl+V" en su editor de detonadores para importar el

    sistema
  3. Configurar las variables iniciales. Para esto deben ir al siguiente detonador

    Estas son las líneas que miraremos
    [gui]-------- Copy the Cheat Death Ability from Object Editor into your map and set the following variable respectively: --------
    -------- - --------
    Set DamageBlockingAbility = Cheat Death Ability (+500,000)
    -------- - --------
    -------- Copy the Detect Spell Damage Ability from Object Editor into your map and set the following variable respectively: --------
    -------- - --------
    Set SpellDamageAbility = Detect Spell Damage
    -------- - --------[/gui]
    Generalmente, ustedes no importan el sistema a un mapa vacío, por lo tanto, estas líneas no se ven

    exactamente así al importar a su map, por lo tanto, deben revisarlas y modificarlas para que queden

    bien configuradas, de otra manera EL SISTEMA NO FUNCIONARÁ CORRECTAMENTE.
  4. Opcional: El sistema provoca "problemas" en algunas habilidades base del juego, estas son:

    • Escudo antimagia (resistencia mágica)
    • Enjambre de langostas
    • Escudo de maná
    • Conjuro reducción de daño
    • Gracia de Elune
    • Dedo de la muerte(la unidad no explotará al morir)

Todas estas habilidades están modificadas desde el editor de objetos y/o desde el editor de

detonadores en el test map del sistema para que funcionen correctamente
En el editor de detonadores pueden copiar la carpeta Spell Fixes y la habilidad especial para arreglar

el Escudo Antimagia de ser necesario. (Nota: El arreglo de Life Drain es innecesario, y no sé porque

Bribe pensó que esta habilidad está bugueada)


Tercero:

Por último, la parte importante, aprender a usar este sistema.
Como ya mencioné este sistema nos sirve para detectar eventos de daño y modificar este daño a

voluntad.
Empezaremos describiendo las variables que se usan para los eventos. Estas son: DamageEvent.

DamageModifierEvent, AfterDamageEvent
Estas variables la usaremos exclusivamente para el evento. Este es:

Y las posibilidades de eventos son estas
[gui]Acontecimientos
   Partida - DamageModifierEvent becomes Igual a 1.00
   Partida - DamageModifierEvent becomes Igual a 2.00
   Partida - DamageModifierEvent becomes Igual a 3.00
   Partida - DamageModifierEvent becomes Igual a 4.00
   Partida - DamageEvent becomes Igual a 1.00
   Partida - DamageEvent becomes Igual a 2.00
   Partida - AfterDamageEvent becomes Igual a 1.00
[/gui]
Lo recomendable es que SOLAMENTE USEN UNO de estos eventos por detonador, porque cada vez que se daña

a una unidad se activan casi todos estos eventos
El orden en que estos eventos se activan es el siguiente

Como ven, AfterDamageEvent sólo se activa si el daño es mayor que 0 después de modificarlo, y

DamageEventModifier se activa antes que DamageEvent


Ahora, las variables que usamos en acciones y condiciones. Estas son: IsDamageSpell,

DamageEventType, NextDamageType, DamageEventPrevAmt, DamageEventTarget, DamageEventSource,

DamageEventAmount


IsDamageSpell es una variable de tipo booleana que nos indicará si el daño fue mágico o no. Esta

variable NO DEBE SER MODIFICADA
Ejemplo:
[gui]IsDamageSpell ejemplo
   Acontecimientos
       Partida - DamageEvent becomes Igual a 1.00
   Condiciones
       IsDamageSpell Igual a (==) True
   Acciones
       Partida - Display to (All players) the text: DAÑO DE HECHIZOS
[/gui]


DamageEventType y NextDamageType son variables de tipo número entero. DamageEventType nos indicará el

tipo de daño causado, esto es para tener Tipos de daño personalizados en nuestro mapa, para hacer uso

de estos tipos de daño simplemente hacemos lo siguiente:
[gui]Finger of Death Fix
   Acontecimientos
       Partida - DamageModifierEvent becomes Igual a 1.00
   Condiciones
       IsDamageSpell Igual a (==) True
       (Current order of DamageEventSource) Igual a (==) (Order(fingerofdeath))
   Acciones
       Set DamageEventType = DamageTypeExplosive
[/gui]
En este ejemplo cambiamos el tipo de daño de Dedo de la muerte por DamageTypeExplosive, una variable

de valor -1 que le indicará al sistema que debe hacer explotar a la unidad en caso de que sea

asesinada por ese daño.
Nota: DamageEventType es igual a 0 para todo daño causado in-game
Para otorgar un tipo al daño que hagamos por detonadores hacemos lo siguiente:
[gui]Set NextDamageType = DamageTypeWhatever
Unidad - Cause (Triggering unit) to damage (Triggering unit), dealing 500.00 damage of attack type Conjuros and damage type Normal
[/gui]
Donde DamageTypeWhatever es cualquier variable de número entera que querramos utilizar como tipo de

daño.
Si no entienden toda esta explicación de tipos de daño, no importa, no deben usarlos si no lo

desean. Yo personalmente no los usé en ningún mapa



DamageEventPrevAmt, esta variable es una variable de tipo real nos permite saber cuál fue el daño

detectado por el juego antes de cualquier modificación hecha por nosotros. Yo no la suelo usar, pero

puede serles de utilidad. Esta variable NO DEBE SER MODIFICADA


DamageEventTarget y DamageEventSource son la unidad objetivo y la unidad fuente del daño,

respectivamente, deberían ser bastante obvias de usar.


DamageEventAmount, esta es la cantidad de daño causado, esta variable se puede modificar a voluntad al

usarse un evento DamageEventModifier.

Bribe escribió:
DamageModifierEvent está dividida en 4 fases. Solo la primera y la cuarta son

importantes, no necesitas la fase 2 y 3. El mapa funcionará exactamente igual sin estas. Sin embargo,

están en el sistema para ordenar más fácilmente el orden en que corren tus detonadores.

Uso recomendado:
- Fase terminal: Igual a 1.00. Si quieres bloquear el daño o cambiarlo a una curación, este es el

mejor momento. Si no quieres el daño modificado más allá, setea DamageEventOverride igual a true. Se

saltará las fases 2 y 3, y hasta la fase 4 si el daño es igual a 0.
- Fase abstracta: Igual a 2.00. Si no necesitas saber la cantidad de daño del evento para modificar el

daño hazlo aquí. Multiplicaciones, divisiones y cálculos logarítmicos son ideales aquí.
- Fase directa: Igual a 3.00. Piel endurecida reduce el daño de los ataques en 13 pero nunca a menos

de 3. Esta es la fase ideal para implementar una mecánica similar
- Fase escudo cuantitativo(Final): Igual a 4.00. Esta es la más interesante. La necesité crear en

orden de hacer un escudo antimágico y escudo de maná que responda a un valor modificado de

DamageEventAmount en lugar de solo al original.

Ejemplos:

En el mapa se utiliza varias veces este sistema, explicaremos algunos detos simples que uso.

[gui]Piel de dragon dmg
   Acontecimientos
       Partida - DamageModifierEvent becomes Igual a 1.00
   Condiciones
       (Level of Piel de dragon (Pasivo) for DamageEventTarget) Mayor que (>) 0
       IsDamageSpell Igual a (==) True
   Acciones
       Set DamageEventAmount = (DamageEventAmount x 0.70)
[/gui]

Empecemos con el acontecimiento
[gui]Partida - DamageModifierEvent becomes Igual a 1.00[/gui]
Al usar DamageModifierEvent estamos haciendo que el detonador corra en la primera fase del sistema

[gui]Condiciones
   (Level of Piel de dragon (Pasivo) for DamageEventTarget) Mayor que (>) 0
   IsDamageSpell Igual a (==) True[/gui]
La primera condición revisa que DamageEventTarget tenga la habilidad "Piel de dragon (Pasivo)"
La segunda condición revisa que el daño recibido sea mágico. IsDamageSpell igual a True entonces

nuestro daño recibido es mágico

[gui]Acciones
   Set DamageEventAmount = (DamageEventAmount x 0.70)[/gui]
Por último, la acción, esta es una habilidad para bloquear daño mágico en un 30% por lo tanto,

nosotros multiplicamos DamageEventAmount por 0.7, así reducimos el daño recibido a 70% de su valor

original. Muy simple

[gui]Tether Dmg
   Acontecimientos
       Partida - DamageModifierEvent becomes Igual a 3.00
   Condiciones
       UE_Protector[(Custom value of DamageEventTarget)] No igual a (!=) Ninguna unidad
       DamageEventType No igual a  (!=) DamageTypeReduced
   Acciones
       Set NextDamageType = DamageTypeReduced
       Unidad - Cause DamageEventSource to damage UE_Protector[(Custom value of DamageEventTarget)], dealing (DamageEventAmount x 0.25) damage of attack type Caos and damage type Universal
       Set DamageEventAmount = (DamageEventAmount x 0.75)[/gui]
Este es un detonador de desviación de daño

El acontecimiento aquí cambió, verán que estamos en la tercera fase del sistema

[gui]Condiciones
   UE_Protector[(Custom value of DamageEventTarget)] No igual a (!=) Ninguna unidad
   DamageEventType No igual a  (!=) DamageTypeReduced[/gui]
En las condiciones usamos una variable que no pertenece al sistema "UE_Protector[(Custom value of

DamageEventTarget)]", esta variable nos indica a qué unidad debemos desviar parte del daño.
La segunda condición es una comparación entre números enteros(Integer Comparison), DamageTypeBlocked

es una variable que le damos un valor en el detonador "Damage Engine Config". Más arriba hablé de la

función de DamageEventType, esta condición sirve para evitar bugs en donde el daño se desvíe entre 2 o

más unidades infinitamente

[gui]Acciones
   Set NextDamageType = DamageTypeReduced
   Unidad - Cause DamageEventSource to damage UE_Protector[(Custom value of DamageEventTarget)],

dealing (DamageEventAmount x 0.25) damage of attack type Caos and damage type Universal[/gui]
Aquí estamos causando 25% del daño recibido al Protector, "desviamos" el daño hacia el protector. Como

ven, le estamos diciendo al sistema que el daño será del tipo "DamageTypeReduced"

Por último
[gui]Set DamageEventAmount = (DamageEventAmount x 0.75)[/gui]
Reducimos el daño recibido en 25%, creando efectivamente un desvío de daño

[gui]Shield Mechanic onDamage
   Acontecimientos
       Partida - DamageModifierEvent becomes Igual a 4.00
   Condiciones
       SS_MaxAmount[(Custom value of DamageEventTarget)] Mayor que o igual a (>=) 0.01
   Acciones
       Set ID = (Custom value of DamageEventTarget)
        Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
           Si: Condiciones
               DamageEventAmount Menor que (<) SS_CurrAmount[ID]
           Entonces: Acciones
               Set SS_CurrAmount[ID] = (SS_CurrAmount[ID] - DamageEventAmount)
               Set DamageEventAmount = 0.00
               -------- You can remove this damage type change if you want, it's mostly for the purpose of the test map. --------
               Set DamageEventType = DamageTypeBlocked
           Otros: Acciones
               Set DamageEventAmount = (DamageEventAmount - SS_CurrAmount[ID])
               Set SS_CurrAmount[ID] = 0.00
               -------- You can remove this damage type change if you want, it's mostly for the purpose of the test map. --------
               Set DamageEventType = DamageTypeReduced
[/gui]

Este es el detonador de la mecánica de escudo del mapa. Utiliza el evento DamageModifierEvent becomes

igual a 4, por lo tanto es la cuarta fase, la fase de escudos

La condición es: SS_MaxAmount[(Custom value of DamageEventTarget)] Mayor que o igual a (>=) 0.01
SS_MaxAmount es una variable externa la sistema, nos indica la cantidad de escudo que tiene la unidad

actualmente.

[gui]Acciones
   Set ID = (Custom value of DamageEventTarget)[/gui]
ID será la identificación de la unidad en el sistema Unit Indexer(explicación I), le asignamos una

variable para que facilitarnos el trabajo más abajo(variables son más rápidas que elegir funciones).

[gui]Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
   Si: Condiciones
       DamageEventAmount Menor que (<) SS_CurrAmount[ID]
   Entonces: Acciones
       Set SS_CurrAmount[ID] = (SS_CurrAmount[ID] - DamageEventAmount)
       Set DamageEventAmount = 0.00
       -------- You can remove this damage type change if you want, it's mostly for the purpose of  the test map. --------
       Set DamageEventType = DamageTypeBlocked
   Otros: Acciones
       Set DamageEventAmount = (DamageEventAmount - SS_CurrAmount[ID])
       Set SS_CurrAmount[ID] = 0.00
       -------- You can remove this damage type change if you want, it's mostly for the purpose of the test map. --------
       Set DamageEventType = DamageTypeReduced[/gui]
El IF es para revisar que la cantidad de daño sea menor que el escudo actual de la unidad.
Si esto es verdadero, reducimos el daño a 0.00 y obviamente, reducimos la cantidad de escudo en la

cantidad de daño bloqueado.
Si esto es falso, reducimos el escudo a 0.00 y obviamente, reducimos la cantidad de daño en la

cantidad de escudo restante
Cambiar el tipo de daño es sólo para que sepan, que eso se puede hacer.

Explicación MUI

Continuará...
Volver arriba Ir abajo
Marcos_M

avatar


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 3124
Reputación Reputación : 522
Monedas de oro : 9720
Monedas de Platino : 0

Inventario :



Mensaje(#) Tema: Re: Mega-Tutorial de mapeo Vie Sep 29, 2017 3:27 pm

Volver arriba Ir abajo
Maty
Capitán
avatar


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 182
Reputación Reputación : 18
Monedas de oro : 610
Monedas de Platino : 0

Inventario :



Mensaje(#) Tema: Re: Mega-Tutorial de mapeo Sáb Sep 30, 2017 11:47 pm

Volver arriba Ir abajo
Contenido patrocinado




Mensaje(#) Tema: Re: Mega-Tutorial de mapeo

Volver arriba Ir abajo
 

Mega-Tutorial de mapeo

Ver el tema anterior Ver el tema siguiente Volver arriba 
Página 1 de 1.

 Temas similares

-
» Mega-Carcassonne 2.0
» Tutorial detallado de como hacer una armadura con Resina,fibra y PVC(ejemplo custom PRE VIZSLA Death watch)
» No puedo descargar con Mega
» Tutorial para descargar música de Goear.com...
» Descargar Digimon World Dawn, Dusk y DS en ESPAÑOL [MEGA]

Permisos de este foro:No puedes responder a temas en este foro.
Warcraft III - WorldEditor :: Academia :: Area GUI :: Mapas-Tutoriales-