

Daño
Armadura y Resistencias
Puntuación Elo - Battlezones
//--------------------------------------- // Constantes que afectan a las fórmulas //--------------------------------------- // Bonus de Atributo (BA). Primero se toma en cuenta la subclase, y si no hay subclase presente, usa la clase. attribute_bonus = Bárbaro: (STR - 20) * 2.0 Guerrero: (STR - 20) * 1.5 Tirador: (DXT - 20) * 1.5 Arquero: (DXT) - 20) * 1 Brujo: (INT - 20) * 1.75 Mago: (INT - 20) * 1.3 //------------------------------ // PASO 1. Obtener Daño de Arma //------------------------------ // a. Obtener el daño mínimo y máximo del daño nominal del arma (visto en el tooltip del arma). Aquí también se agrega todo daño de modificadores "Daño [tipo] +X" (tal como Esgrimes Precisos, por ejemplo). total_damage_min = sum(weapon_damage[type].min) total_damage_max = sum(weapon_damage[type].max) // b. Aplicar el Daño de Arma por Tipo % que se ve en los poderes como "Daño+%". weapon_damage[type].min += weapon_damage[type].min / 100 * weapon_percent_bonus[type] weapon_damage[type].max += weapon_damage[type].max / 100 * weapon_percent_bonus[type] //------------------------- // PASO 2. Factor de Bonus //------------------------- // a. Obtener el daño extra. Este se compone del Bonus de Atributo (BA) y del Bonus de Calidad-Material-Tipo (BCMT, que se ven en el tooltip como (+X)). extra_damage_per_type[type] = attribute_bonus + BCMT // b. El daño extra necesita ser calculado en relación a cada tipo individual de daño, así de esta forma se distribuye proporcionalmente. extra_damage_per_type[type] = extra_damage_per_type[type] * (weapon_damage[type].max / total_damage_max) //------------------------------- // PASO 3. Obtener el daño final //------------------------------- // a. Iterar por todos los tipos de daño (Cortante, Punzante, Aplastante, Fuego, Hielo, Electricidad), haciendo aleatoria la diferencia entre el mínimo y el máximo. resulting_damage[type] = weapon_damage[type].min + random(weapon_damage[type].max - weapon_damage[type].min) // b. Aplicar el modificador Daño de Arma %, encontrado mayormente en poderes como "Daño de Arma +%" y aplica a todos los tipos de daño. resulting_damage[type] += resulting_damage[type] / 100 * weapon_damage_percent // c. Agregar el daño extra por tipo de daño resulting_damage[type] += extra_damage_per_type[type] // d. Agregar los modificadores Bonus de Daño, ambos no porcentual y porcentual. Estos pueden ser encontrados en los poderes como "Bonus de Daño +X" o "Bonus de Daño +%". resulting_damage[type] = (resulting_damage[type] + damage_bonus) * (1 + (damage_bonus_percent / 100)) // e. Sumar todos los tipos de daño y agregar los "Bonus de Daño [tipo] +X" (que se encuentran mayormente en las gemas mágicas engarzadas en los items). Es considerado como "daño especial" y será absorbido sólo por la armadura con un procedimiento aparte y casi al final del cálculo de reducción de daño. resulting_damage[type] = sum(resulting_damage[type]) + sum(special_damage[type]) // f. Redondear el daño resultante resulting_damage[type] = floor(resulting_damage[type]) //------------------------------------------- // Obtener los datos de la Hoja de Personaje //------------------------------------------- Para obtener el daño potencial que se muestra en la Hoja de Personaje, sólo reemplazar el daño inicial en el punto 3.a directamente con el mínimo, continuar calculando hasta obtener el daño resultante mínimo y luego repetir desde el punto 3.a de nuevo con el máximo. //------------------- // Daño: Caso de Uso //------------------- Espada Ancestral de Dos Manos de Magnanita (Arcana) 1.a) total_damage_min = 323 total_damage_max = 351 1.b) weapon_damage[slashing].min = 323 weapon_damage[slashing].max = 351 Agregar pasiva Atlético +10% Daño Cortante: weapon_damage[slashing].min += 323 / 100 * 10 = 355.3 weapon_damage[slashing].max += 351 / 100 * 10 = 386.1 2.a) // Stats del personaje sin equipar el arma 89 DXT + Maestría de Guerra +15% = 102.35 DXT attribute_bonus = (102.35 - 20) * 2 = 164.7 extra_damage_per_type[slashing] = (164.7 + 69) = 233.7 2.b) extra_damage_per_type[slashing] = 233.7 * (386.1 / 351) = 257.07 3.a) resulting_damage[slashing].min = 355.3 resulting_damage[slashing].max = 386.1 3.b) resulting_damage[slashing].min += 355.3 / 100 * 0 = 355.3 resulting_damage[slashing].max += 386.1 / 100 * 0 = 386.1 3.c) resulting_damage[slashing].min += 257.07 = 612.37 resulting_damage[slashing].max += 257.07 = 643.17 3.d) Add Fulminating Active resulting_damage[slashing].min = 612.37 * (1 + (50/100)) = 918.555 resulting_damage[slashing].max = 643.17 * (1 + (50/100)) = 964.755 3.e) resulting_damage[slashing].min = 918.555 + 0 = 918.555 resulting_damage[slashing].max = 964.755 + 0 = 964.755 3.f) resulting_damage[slashing].min = floor(918.555) = 918 resulting_damage[slashing].max = floor(964.755) = 964
Armadura y Resistencias
La Armadura es la primera reducción de daño, tomada como "protección". Esto deriva en "daño protegido", luego el jugador recibe el daño en su cuerpo y la "resistencia" reduce el "daño protegido". //--------------------------------------- // Constantes que afectan a las fórmulas //--------------------------------------- [Clase de Armadura] // Estas no son tan diferentes entre subclases porque ellas se diferencian más a través de los poderes que del equipamiento. Pero esta excepción llegará a un fin, ya que la Clase de Armadura (CA) va a quedar oficializada y será tomada en cuenta para el balance. Guerrero: 1.40 Arquero: 1.30 Mago: 1.20 Bárbaro: 1.40 Caballero: 1.40 Cazador: 1.30 Tirador: 1.35 Conjurador: 1.20 Brujo: 1.20 Por defecto: 1.30 Monstruos: 0.26 [Distribución del Item] // Cada parte contribuye en diferentes porcentajes de los Puntos Base de Armadura (PBA) a los Puntos de Armadura (PA). Torso: 28% Cabeza: 24% Piernas: 20% Brazos: 16% Guanteletes: 12% Escudo: 25% Mano derecha: 20% Pechera: Torso Túnica: Torso, Brazos, Piernas Casco/Sombrero: Cabeza Perneras: Piernas Hombreras: Brazos Guanteletes: Guanteletes Escudo: Escudo Brazalete: Mano derecha [Factores de Calidad de Protección] Muy Mala: 0.2 Mala: 0.35 Normal: 0.5 Buena: 0.65 Muy Buena: 0.8 //---------------------------- // PASO 1. Obtener Protección //---------------------------- // a. Protección por tipo de daño (tipo). Calculado de la PBA ("Armadura: X", como se muestra en el tooltip) fraccionado por el porcentaje de la parte de armadura y cómo contribuye a la armadura total (Distribución de Item) y afectada por el Factor de Protección (FP). protection[type] = ceil(armor_base_points * (item_distribution / 100) * protection_factor) // b. Agregar el Bonus de Calidad-Material-Tipo (BCMT) a todos los tipos de daño. Este valor es encontrado luego del PBA mostrado como "(+X)" protection[type] += BCMT // c. Agregar el bonus porcentual que es específico a cada tipo de daño. Esto se usa en raras ocasiones o no se usa. protection[type] += protection[type] * {Bonus de Protección a (Tipo) %} / 100 // d. Agregar el bonus porcentual relacionado a todos los daños a la vez. Este modificador lo encuentran como "Protección: X%" en el tooltip. protection[type] += protection[type] * {Bonus de Armadura %} / 100 // e. Multiplicar por la CA protection[type] *= armor_class //------------------------------------- // PASO 2. Obtener Resistencias a Daño //------------------------------------- // a. Resistencia a Daño por tipo general. Estas son siempre porcentuales y sus tipos pueden ser Mágico o Físico. general_resistance[general_type] = {Resistencia a Daño Físico/Mágico %} // b. Resistencia a Daño por tipo. Estos son los tipos de daño individual. resistance[type] = {Resistencia a Daño (Tipo) %} //--------------------------- // PASO 3. Reducción de Daño //--------------------------- // a. En el caso de múltiples tipos de daño, se calcula la influencia de cada uno en el total de daño generado para reducir el daño correctamente. También, obtener el daño mínimo, que puede ser de 4% a 8%. Esto aplica a cada daño individual. protection_influence[type] = (100 / total_damage) * damage[type] minimum_damage_percent = 4 + random(0,4) minimum_damage[type] = damage[type] / 100 * minimum_damage_percent // b. Reducir el daño por protección. damage[type] -= protection[type] * (protection_influence / 100) // c. Reducir el daño por tipo general de resistencia porcentual. damage[type] -= damage[type] * general_resistance[general_type] / 100 // d. Reducir el daño por tipo individual porcentual. damage[type] -= damage[type] * resistance[type] / 100 // e. Asegurarse que ya en este paso el daño por tipo no es menor al daño mínimo. if damage[type] < minimum_damage[type] then damage[type] = minimum_damage[type] // f. Reducir el daño especial que proviene de "Bonus de Daño (Type) +X" usualmente encontrado en gemas. Este daño sólo es reducido por la armadura dependiendo en el Factor de Protección y luego agregado al daño normal. special_damage[type] = ceil(special_damage[type] - (special_damage[type] * PF[type])) // g. Obtener el daño total sumando todos los tipos de daño y luego sumarle también el daño especial. total_damage = sum(damage[type]) + sum(special_damage[type]) // h. Reducir el daño por puntos de barrera mágica. Usualmente, la barrera mágica afecta a todos los daños. También reducir el total que ya obtuvimos en el paso anterior. damage[type] -= barrier_points[type] total_barrier_points = sum(barrier_points[type]) total_damage -= total_barrier_points // i. Aplicar la reducción por "Daño de Rango Recibido %" o "Daño Melee Recibido %", si corresponde. (Rango se toma como 3 metros o más). reduced_damage = total_damage - (total_damage * (ranged_damage || melee_damage) / 100)) // j. Redondear el daño total reducido. reduced_damage = ceil(reduced_damage) //--------------------------------------- // Protección, Resistencias: Caso de Uso //--------------------------------------- Armadura Warmaster de Bárbaro de Aleación de Acero (Artesano) - Tipo: Común - Recibiendo Daño: 410 Punzante y 15 Bonus de Daño de Fuego de una gema en el arma. PBA: 235 FP[punzante]: Buena FP[fuego]: Muy Mala BCMT: 11 1.a,b,c,d,e) Yelmo: (ceil(235 * (0.24) * 0.65) + 11) * 1.4 = 67.2 Torso: (ceil(235 * (0.28) * 0.65) + 11) * 1.4 = 75.6 Hombreras: (ceil(235 * (0.16) * 0.65) + 11) * 1.4 = 50.4 Guanteletes: (ceil(235 * (0.12) * 0.65) + 11) * 1.4 = 42 Perneras: (ceil(235 * (0.20) * 0.65) + 11) * 1.4 = 58.8 protection[punzante] = 294 2.a,b) general_resistance[general_type] = 0 Agregar Pasiva Temple de Acero 10% Resistencia a Daño Punzante resistance[punzante] = 10 3.a) protection_influence[punzante] = 100 / 410 * 410 = 1 minimum_damage_percent = 4 + 0 minimum_damage[punzante] = 410 / 100 * 4 = 16.4 3.b) damage[punzante] = 410 damage[punzante] -= 294 * (100/100) = 116 3.c) damage[punzante] -= 116 * 0 / 100 = 116 3.d) damage[punzante] -= 116 * 10 / 100 = 104.4 3.e) 116.4 > 16.4 3.f) special_damage[fire] = special_damage[fire] - (special_damage[fire] * PF[fire]) = 15 - (15 * 0.2) = 12 damage[fire] = 12 3.g) total_damage = 104.4 + 12 = 116.4 3.h) damage[type] -= 0 total_barrier_points = 0 total_damage -= 0 3.i) reduced_damage = 116.4 - (116.4 * 0 / 100) = 116.4 3.j) reduced_damage = ceil(116.4) = 117
Puntuación Elo - Battlezones
El sistema de puntuación Elo fue originalmente creado para el ajedrez y así clasificar a los jugadores de una forma simple y efectiva. Al estar diseñado para partidas de un jugador versus otro jugador, lo hemos adaptado para Regnum y sus Battlezones. Esta puntuación es un número obtenido teniendo en cuenta todas las partidas de Battlezones ganadas o perdidas de un jugador. La puntuación inicial de cada jugador es 1000, es decir, es el valor con el que comienza cuando todavía no tiene ninguna partida jugada. A medida que el jugador juega partidas, se va aumentando o decreciendo este valor inicial de 1000 puntos. Dado que las Battlezones no son un enfrentamiento entre un jugador versus otro jugador, y en cambio son enfrentamientos entre 3 equipos de 4 jugadores, se utiliza la siguiente lógica: - Cada equipo tiene una puntuación Elo, que consiste del promedio de las puntuaciones Elo de cada jugador del equipo. También, cada uno ha jugado una cantidad de partidas y estas también se promedian. Usaremos un equipo de ejemplo que llamaremos Equipo A. (El Equipo A está compuesto de: Jugador 1 tiene 1040,30 y jugó 14 partidas, Jugador 2 tiene 1150,23 y jugó 20 partidas, Jugador 3 tiene 1300,11 y jugó 9 partidas, Jugador 4 tiene 1442,67 y jugó 22 partidas. En promedio el Equipo A tiene un Elo de 1233,33 y 16 partidas jugadas). - Como en una Battlezone hay tres equipos en total, un equipo estará compitiendo con dos equipos a la vez, por lo cual luego de terminada la partida será afectada su puntuación dos veces. Estos otros dos equipos serán Equipo B y Equipo C. (El Equipo B tiene un Elo de 1145,32 y 30 partidas jugadas y el Equipo C tiene un Elo de 1003,56 y 10 partidas jugadas). - Al terminar la partida, se procesan los resultados. - Para obtener el resultado que modifica el Elo de cada jugador del Equipo A, habrá que calcular Equipo A vs Equipo B y Equipo A vs Equipo C y así sucesivamente por equipo. - Ese resultado será sumado a la puntuación Elo actual de cada jugador del equipo. Los pasos y fórmulas para saber qué resultado se ha obtenido son los siguientes: - Primero se obtiene la probabilidad de ganar que tiene cada equipo. En el caso de querer saber la probabilidad de ganar del Equipo A vs el Equipo B, se calcula con la siguiente fórmula: PWA = 1,0 / (1 + math.pow(10, (ELO_B - ELO_A) / 400,0)) PWA = 1,0 / (1 + math.pow(10, (1145,32 - 1233,33) / 400,0)) PWA = 1,0 / (1 + math.pow(10, -88,01 / 400,0)) PWA = 1,0 / (1 + math.pow(10, -0,220025)) PWA = 1,0 / 1,6025249009547 PWA = 0,6240152645392 - Luego se utiliza el K-factor, que es un número que ayuda a establecer qué tan significativo será el cambio al Elo. En jugadores más nuevos es más alto para llegar más rápido a un Elo que los represente y para jugadores más establecidos será más bajo para evitar fluctuaciones que puedan no representarlos correctamente. En jugadores que han jugado menos de 20 partidas, el K-factor es de 40 En jugadores que han jugado al menos 20 partidas y tienen un Elo menor a 1100, el K-factor será de 20 En jugadores que han jugado al menos 20 partidas y tienen un Elo igual o mayor a 1100, el K-factor será de 10 - Como no calculamos sobre jugadores individualmente sino con equipos, será lo mismo que si fueran jugadores individuales pero usando los valores promedio de cada equipo que mencionamos anteriormente. - Ahora se calcula según el resultado de la partida. En el ejemplo actual el equipo A ha ganado la partida. El Equipo C ha quedado en segundo lugar y el Equipo B en tercer lugar. Si queremos calcular cómo será afectado el Elo de cada jugador del Equipo A, procederemos a calcular dos veces, una con cada equipo contrincante: El resultado se representa con 1 si se ganó y 0 si se perdió. En este caso usamos 1 porque se ganó. Como el Equipo A tiene un Elo de 1233,33 y en promedio jugaron 16 partidas, el K-factor es de 40. La formula del cambio de Elo será: changeA = factorkA * (1 - PWA) changeA = 40 * (1 - 0,6240152645392) changeA = 15,04 Entonces, cada jugador del Equipo A incrementará su Elo en 15,04. Pero también le ganó al Equipo C, así que hay que proceder a hacer lo mismo con el Equipo C, que daría un resultado de 8,42. En total, cada jugador incrementará su Elo en 23,46. Entonces, por ejemplo, el jugador 1 pasará de 1040,30 a 1063,76. Estas fórmulas garantizan que al jugar contra un equipo de menor Elo, ganar provee menos puntos, ya que representa menos dificultad hacerlo dada la probabilidad. ¿Y qué pasará con el equipo C, que perdió con ambos equipos? Contra el Equipo A el cambio es de -8,42 y contra el Equipo C es de -12,26. Perdiendo un total de 20,68. Entonces, cuando se pierde con un equipo que tiene mucho más Elo que uno, también se pierden menos puntuación ya que hay mayor dificultad y una baja probabilidad de ganar.

