Tutorial Damage Scaling

OP

ShinLucho

EMD Legend
Mensajes
1.562
Reacciones
815
Puntos
892
Damage Scaling

¿Qué es el Damage Scaling?

El Damage Scaling (Ajuste de Daño), tambien conocido como Proration o Damage Dampening, es una mecánica de los juego de pelea que hace que los últimos hits en un combo realicen menos daño con el mismo ataque que se utilizo al principio del combo.

¿Para qué es útil?

Es una manera de balancear personajes que pueden combinar movimientos en una cadena de ataques. Si un ataque hace una cantidad constante de daño, agregarlo a combos largos va a ser imposible sin arruinar el balance del juego. Veamos un ejemplo muy básico. Si un personaje puede hacer 50 de daño en promedio con cada ataque, la cual es una cantidad razonable, y quieres que el personaje pueda enlanzar hasta 12 ataques, esto resultara en 600 de daño. Haciendo mas de la mitad de la vida total del oponente sin que el pueda recuperar el control, o liberarse. Por supuesto que puedes decidir cuanto quieres que la cadena de 12 movimientos haga en total, por ejemplo, decides en 300, la cual es una cantidad justa siempre que el combo no sea muy fácil de hacer. Para lograr esto, reduces el daño de los ataques de una manera que el total sea 300, ¿pero cual es el resultado? Los ataques ahora hacen solamente 25 de daño en promedio sin un combo. En resumen, hacer combos no premiara a los mejores jugadores con mas daño, ahora es la única manera de hacer una cantidad razonable de daño y tener una oportunidad de ganar. Esto solo hace al personaje mas débil y difícil de jugar. Si tu personaje puede hacer combos de mas de 2-3 movimientos, deberías considerar añadir el damage scaling, y si puede alcanzar 5+ golpes, o puede combinar en especiales o supers, absolutamente necesitas agregarlo para mantener el personaje balanceado. Y un efecto secundario adicional del damage scaling es, si el personaje puede hacer combos mucho mas largo de lo que intentaste de una manera inesperada (como combinar con un proyectil o con un ayudante), esto no sera un problema dado que el damage scaling asegurara que el daño se mantenga razonable. Esto es especialmente común si tienes movimientos que tienen resultados al azar que no pueden ser predecidos, como proyectiles que son invocados en ubicaciones o intervalos de tiempo aleatorio, moverse aleatoriamente o tener la habilidad de ser dirigido.

¿Como agrego el Damage Scaling a mi personaje?

Aunque hallan algunas soluciones simples que solo requieren agregar un solo controlador en tus estados negativos, obviamente, dichas soluciones son muy limitadas para usar, y no pueden ser personalizadas. En general, un codigo de damage scaling consta de tres partes: Una que cuenta la cantidad de ajuste que necesita ser aplicado en una variable, una que aplica esto a la cantidad de daño hecho, y una que reinicia esta variable cuando el combo haya terminado y uno nuevo comienza. Voy a usar fvar(39) como el valor del ajuste, y sera un multiplicador (esto significa que almacena cuanto debe multiplicarse el daño)

Parte 1: Aplicando el ajuste

Esta parte puede hacerse de dos maneras. Si tu personaje no posee helpers o ataques de proyectiles, puedes añadir un controlador Attackmulset en tu state -3 que aplica el valor del ajuste.
INI:
[State -3]
Type=Attackmulset
Trigger1=1
value=fvar(39)
ignorehitpause=1
Ten en cuenta que cuando se use este metodo, tienes que colocarlo debajo de tu codigo de reiniciar el valor del ajuste. Si tienes movimientos con proyectiles o helpers, o no quieres usar Attackmulset porque ya esta siendo usado en otro estado, entonces tienes que agregar el ajuste directamente al valor del daño de tus ataques hitdefs (y proyectiles)
INI:
damage=floor(fvar(39)*x)
donde x es tu daño original. Ten en cuenta que un controlador Hitdef es generalmente ejecutado solo una vez, pero el valor del ajuste puede cambiar antes de que el golpe se realize si otra fuente (helper o proyectil) golpea al oponente. Si tu ataque posee una duracion mas larga para el Hitdef estando activo, es recomendado reactivarlo para aplicar el valor del ajuste actualizado cada tick. Esto es especialmente importante para proyectilos hechos con helpers, los cuales generalmente tienen sus propios hitdef activos durante toda la duracion de la animacion (excepto los frames de comienzo), y si golpeas al oponente con un combo antes de que el proyectil lo alcanze, el ajuste no sera aplicado almenos que el hitdef este reactivado. Para reactivar el Hitdef usa un codigo como este:
INI:
Type=Hitdef
Triggerall=!movecontact
Triggerall=!movereversed
Trigger1=time>0
damage=floor(fvar(39)*x)
...
En el caso de un controlador de proyectil, este siempre va a usar el valor del ajuste del instante en el que el proyectil fue generado, por eso evita usar controladores de proyectil para proyectiles lo suficientemente lentos que permitan atacar al oponente con algo mas antes de que estos golpeen. En su lugar usa helpers para esos proyectiles. Ten en cuenta que en lugar de Floor(), Ceil() tambien puede ser usado, pero recomiendo usar Floor por una razon: Si hay un infinito en el personaje, si Floor es usado, los golpes eventualmente haran 0 de daño cada uno en lugar de 1, por lo tanto el total de daño que puede realizarce estara limitado. Por supuesto, deberias concentrarte en no tener infinitos, pero usando floor servira para seguridad contra ellos. Tambien es util si hay factores involucrados que pueden terminar extendiendo el combo de una manera no planeada, como proyectiles dirigidos que pueden golpear al oponente mucho mas tarde que cuando fueron disparados.

Parte 2: Actualizando el valor del ajuste

Para actualizar el valor del ajuste tienes que añadir uno de los siguientes codigos:

En el caso de un ataque comun realizado por el jugador
INI:
Type=Varset
Trigger1=movehit=1
fvar(39)=fvar(39)*x
donde x es la cantidad que quieres que el golpe se ajuste a todos los futuros golpes en el combo. Por ejemplo si quieres que todos los futuros golpes hagan 10% menos de daño, escribe 0.9 para x. Los valores recomendados son 0.9-0.95 para ataques debiles (~20 de daño), 0.8-0.9 para medios (~50 de daño), 0.8 o menos para ataques fuertes (mas de 70 de daño). Si quieres asegurarte de que no se realize mas daño luego de un ataque poderoso como un movimiento super, usa 0. En general, usa 0.1-0.7 para movimientos super dependiendo del daño realizado. Esto necesita ser colocado en el estado del ataque en un lugar que se ejecute antes de que el ataque termine (por lo tanto encima de cualquier controlador Changestate del estado). En el caso de que el jugador deje el estado de ataque inmediatamente cuando el golpe se halla realizado (encadenar/hacer combos de movimientos pueden conducir a esto), este codigo necesita ser colocado en el state -3 con un trigger stateno incluido, porque de esta manera se ejecutara antes de que el changestate en -1 haga efecto.

En el caso de un ataque realizado por un proyectil
INI:
[State -2]
Type=Varset
Trigger1=projhittime(y)=0
fvar(39)=fvar(39)*x
ignorehitpause=1
Como el proyectil puede golpear luego de que tu personaje termine el ataque de proyectil, y deje ese estado, esto necesita ser colocado en el state -2. Y es el ID del proyectil. Es necesario agregar para todo tipo de proyectiles que tu personaje pueda usar un controlador similar. Necesita ser agregado encima del codigo de reinicio del ajuste.

En el caso de un helper
INI:
Type=Parentvarset
Trigger1=movehit=1
fvar(39)=parent,fvar(39)*x
Necesitas colocar esto encima de cualquier controlador Destroyself o Changestate que el helper pueda tener. Si el helper es invocado por otro helper, y no por el root, tienes que asegurarte de que el valor alcanze al root. Para esto, necesitas colocar este codigo en todos los state del helper invocado (y su parent), y asegurarte de que no sea destruido hasta que el ataque termine:
INI:
[State 1081]
Type=Parentvarset
Trigger1=time>0
fvar(39)=parent,fvar(39)*fvar(39)

[State 1081]
Type=VarSet
Trigger1=1
fvar(39)=1

El codigo para resetear el ajuste

El codigo para resetear el ajuste es el responsable de volver a configurar tu variable para multiplicar en 1 cuando no halla un combo activo. Abajo hay un ejemplo de lo que estoy usando:
INI:
[State -2]
Type=VarSet
Trigger1=Roundstate<2
Trigger2=P2Stateno=[120,160]
Trigger3=enemynear,ctrl
Trigger4=P2StateType!=A
Trigger4=P2MoveType!=H
fvar(39)=1
ignorehitpause=1
Esto va en state -2

Golpes simultaneos

Este es un caso especial de helpers. Si varios de ellos golpean al oponente al mismo tiempo (usualmente ocurre si son invocados al mismo tiempo en el mismo lugar en el que el oponente puede encontrarse, como un movimiento que crea 4 bolas de fuego que se mueven en 4 direcciones diferentes), el ajuste no se aplicara a los golpes, por lo tanto un movimiento que invoca 12 helpers de 30 de daño cada uno por ejemplo hara 360 de daño. Para aplicar el ajuste en esta situacion, la tecnica "hitdef doble" necesita ser usada. Aunque no voy a postear detalles y es un poco complicado, en resumen, significa hacer 2 golpes, uno para 0 de daño que actualizara el ajuste en un golpe, y otro para el daño verdadero en el siguiente tick si el primer golpe ocurrio.

Otros trucos

Puedes añadir o reducir el ajuste independientemente del ataque y del daño del ataque, cuando quieras modificando el valor almacenado en fvar(39) por ejemplo una habilidad especial puede reducir el efecto del ajuste a la mitad en un modo especifico. También puedes cambiar el valor en el caso de un combo especifico donde la cantidad del ajuste normal pueda ser inapropiada y desees cambiarla. Puedes hacer movimientos que no estén afectados por el ajuste (solamente usados en movimientos super, o si el daño es muy bajo por hit en un ataque multi-hit y ajustarlo puede redondearlo a 0 frecuentemente) simplemente sin agregar el multiplicador fvar(39)* en la linea del daño. También puedes hacer movimientos que sufran menos o mas ajuste que los normales usando un exponente como fvar(39)**0.5 (la mitad del efecto del ajuste) o fvar(39)**2 (para efecto doble).

 
Última edición:

BlackFired

Elite Member
Mensajes
886
Reacciones
332
Puntos
610
Ubicación
Purgatorio
Muy bueno, no lo lei todo es un poco largo pero igual es bueno, yo no sabia eso de usar esos Sctrl pero esta muy bien explicado hasta donde yo lei (Y) quizas lo use en mis combo pero primero terminare el ataque especial :D
 
OP

ShinLucho

EMD Legend
Mensajes
1.562
Reacciones
815
Puntos
892
Me alegro que se entienda. En el tutorial original se usa Damage Dampening pero preferi el Scaling porque hay mas informacion en google sobre esta mecanica aplicada a varios juegos si se busca de esta manera. Por este cambio algunas cosas resultaron un poco rebuscadas como "valor del ajuste" pero creo que la idea general se entiende. Cualquier cosa si no se entiende algo preguntame.

Despues agregare algunos videos para mostrar como funciona el damage scaling en algunos juegos.

Cualquier sugerencia sobre la traduccion es bienvenida :)
 
Arriba Pie