ItemStatCost.txt

Columna Descripción
code Identificador al que se hace referencia desde otros ficheros.
Stat Es un identificador que se usa como referencia en otros ficheros como por ejemplo Properties.txt, Skills.txt, States.txt e incluso dentro de este mismo fichero ItemStatCost.txt. Este campo debe ser único.
Id Este campo solo sirve de referencia, es como un comentario.
Send Other Un booleano que controla cuando se envia el valor de la estadistica a otros jugadores. Esto es solo semifuncional porque la mayor parte de esta funcionalidad esta escrita a fuego para estadisticas concretas solo. Si vas a modificar este fichero, establece un valor para las estadisticas que están siendo enviadas en el juego original porque el juego necesita actualizar esos valores para funcionar adecuadamente.
Signed Un booleano que controla cuando las estadisticas son positivas o negativas o solo positivas (signed o unsigned, como los integer de C). Parece ser que por la forma en la que se transmite la información por la red esto puede ser importante para hacer la conversión en el otro lado.
Send Bits La cantidad de bits que el juego intentara meter en cada paquete que actualiza la estadistica para el valor de la estadistica si la estadistica se envia a los clientes. Igual que el anterior, no se usa en la mayoria de las estadisticas porque la mayoría están escritas a fuego en el código.
Send Param Lo mismmo que el anterior pero para el parametro de la estadística.
UpdateAnimRate Es un booleano que esta relacionado con la velocidad a la que se realizan ciertas acciones. También en este caso hay muchas cosas escritas a fuego en el código del juego.
Saved Este booleano controla si se guarda el valor de la estadística en el fichero *.d2s de cada personaje despues de abandonar una partida.
CSvSigned Si la columna anterior tiene un 1, este booleano controla si la estadística se guarda como signed o unsigned.
CSvBits Establece cuantos bits se van a usar como máximo para guardar la estadística en el fichero .d2s. Solo se usa si Saved contiene 1. Para unsigned se pueden usar hasta 32 bits para signed hasta 31.
CSvParam Lo mismo que la columna anterior pero para los parámetros.
fCallback Es un booleano que controla cuando se llama la función de callback de asignación de stat si el valor de una stat cambia. Se usa al poner o quitar objetos, al usar habilidades, cuando afectan auras, estados y cualquier otra cosa que afecte a los personajes o monstruos. Al crear nuevos efectos especiales hay que cambiar esta función de callback. Aunque va a funcionar bien para nuevas stats que lancen el evento en objetos.
fMin Este booleano controla cuando el juego intentar guardar el stat en un rango llamando a una función especial (por ejemplo cuando las stats se modifican con un aura), esto previene que las stats como la fuerza, la destreza, la energía o la vitalidad se modifiquen de manera que queden con un valor inferior a cero.
MinAccr Este campo (que es un DWORD) controla el valor minimo a la que la stat se limita, lo que parece es que trabaja mano a mano con FMin, sin embargo, cuando el autor original de esta guía vió el código accediendo al flag "inline" no ha visto que se use esta columna, sino que se usaba un valor a fuego en el código. (Quiero recordar en este punto, que esta guía no es original, sino una traducción de la que hay en The Phrozen Keep, yo solo pretendo compartir el conocimiento para aquellos que no saben inglés).
Encode Este campo le dice al juego, cada vez que una stat se va a codificar cuando se guarda para ahorrar espacio. Se usa para stats complejas con más de un parámetro, como por ejemplo: "Posibilidad de lanzar al golpear", que tiene que guardar la probabilidad de lanzar el evento, el nivel de la habilidad, el tipo de evento, etc.
Add Este campo sirve para modificar el precio del objeto, sumandole al coste base esta cantidad. Algunos tipos de armaduras tiene estos valores fijados en el código a fuego.
Multiply Este campo sirve para modificar el precio del objeto, multiplicando el coste base por esta cantidad. Algunos tipos de armaduras tiene estos valores fijados en el código a fuego.
Divide Este campo ya no se usa en el código.
ValShift Este campo le dice al juego como el stat se va a leer y escribir en los objetos. Sirve para optimizar el espacio del fichero .d2s.
1.09-Save Bits
1.09-Save Add
Estos campos solo aplican para objetos importados de versiones entre la 1.07 y la 1.09, y reemplazan a los campos Save Bits y Save Add para poder converir los objetos del viejo formato al nuevo. No se usan en personajes a partir de la 1.10.
Save Bits
Save Add

Este campos controlan cuantos bits de datos se usan en el fichero .d2s para guardar los objetos, aunque no tienen casi aplicación en tiempo real. La única aplicación que tienen es cuando un objeto se comprime o descomprime, lo que sucede cada vez que coges un objeto o haces algo con el.

Save Bits controla cuantos bits se usan para guardar el valor de una stat, el valor maximo real de cualquier stat por tanto es 2^Save Bits - 1.

Save Add controla el valor mínimo que puede tener mediante la siguiente fórmula:

2^SaveBits + 1 - SaveAdd

Save Param Bits Este campo controla cuantos bits de datos se usan para guardar los parametro de esta stat cuando se guardan los objetos lo mismo se aplica aquí, en la columna anterior y en CSVParam. Save Add no afecta al valor máximo o mínimo del parametro de la stat, no obstante, lo mejor ese establecer este campo a 17 para todas las stats que usen cualquier forma de Identificados para sus parámetros, porque la mayor parte de los rangos estan capados a 65535 y esos parametros siempre son signed, a menos que se guarden en 32 bits lo que te permitirá usar todos los Ids sin miedo a glitches o bugs.
KeepZero

Este booleano supuestamente controla que una stat no sea negativa, probablemente se usa de alguna manera en la implementación de fMin y tiene pinta de que sus efectos son solo del lado cliente.

Como todos sabemos, el mana y la resistencia (stamina) pueden volver a cero cuando superan su máximo.

Op
Op Param
Op Base
Op Stat1
Op Stat2
Op Stat3

Estos campos controlan formas especiales de asignar stats.

Por ejemplo, stats que dependen del cLvl. Hay un total de 13 fórmulas para el campo Op pero no todas se usan en el juego. Dejando este campo vacio o estableciendolo a 0 se usará el op por defecto, que aplica la stat en unidades directamente. Más abajo hay una tabla donde se explica que es lo que hace cada Op.

Opstat se refiere al conjunto de stats que se encuentran en las columnas Op Stat1 a Op Stat3, statvalue se refiere al valor de la propia stat, basevalue se refere al conjunto de stats definido en la columna Op Base y param se refiere al conjunto de valores definidos en la columna Op Param.

op notas
1 opstat + (opstat.base * statvalue / 100)
2

opstat + [(statvalue * basevalue) / (2 ^ param)]

este no funciona adecuadamente con cualquier stat que no sea de nivel por como se actualiza, ya que se refresca solo cuando te reequipas el objeto, cuando se guarda el personaje o cuando subes de nivel, algo similar a como lo hacen las habilidades pasivas. Solo porque parezca que funciona como dice en la descripción del objeto no quiere decir que lo haga. El juego solo recalcula la información de la descripción en cada frame, y los valores restantes que no cambian en el lado servidor.

3 Esto es un porcentaje basado en op 2, es decir, se aplica la misma fórmula pero se obtiene un porcentaje en lugar de un entero.
4 Este funciona como op 2, sin embargo el bonus de la stat se agrega al objeto en lugar de al personaje. Por ejemplo, el bonus de defensa por nivel se agrega a la defensa del objeto y no al personaje directamente.
5 Este funciona como el op 4 pero está basado en porcentaje.
6 Como el op 7 pero no en porcentaje. Tampoco funciona.
7 Se usa para incrementar la stat basada en el momento del dia actual en el juego en porcentaje. No funciona en el lado servidor, solo se actualiza en el lado cliente, por lo que este op es inútil.
8 Está programado a fuego para que se use solo con el maná máximo. Se aplicará la cantidad apropiada de mana para tu personaje, basado en CharStats.txt para la cantidad de energía que agrega el stat, no funciona para personajes que no sean jugables.
9 Es igual que op 8 pero con la vida máxima y la resistencia máxima (stamina).
10 No hace nada, poner esto es como poner un 0, el valor por defecto
11

opstat.base * statvalue / 100

Parecido a como funciona op 1 y op 13, solo que el código comprueba un par de cosas más.

12 No hace nada, poner esto es como poner un 0, el valor por defecto
13

opstat + (opstat.base * statvalue / 100)

Este es usable solo en objetos, no se aplicará el bonus a otros tipos de unidades, es por esto que se usa, por ejemplo en +% durabilidad, +% daño, etc.

Direct Este boolean controla si se ha llegado a un máximo que no se puede superar para esta stat. Cuando se haya llegado al máximo dejará de incrementarse.
MaxStat El número máximo asociado a esta stat. Este campo solo tiene efecto si Direct es verdadero. Los incrementos basados en porcentaje normalmente alteran esta stat también pero algunos aspectos se definen en el código.
ItemSpecific

Este booleano controla cada vez que es especifica para un objeto, esto significa, si engarzas una joya que agrega durabulidad a algo, la durabulidad de ambos objetos no se suman cuando se devuelve una llamada general a GetStat. Debería prevenir que la Stat se agregue continuamente al total.

DamageRelated

Este Booleano controla que no se cuente dos veces las stats de un arma, una vez cuando se equipa y otra vez cuando se ataca. El juego copia las stats de un arma en una lista temporal cada vez que se ataca. Esto afecta a los barbaros que van con dos armas por ejemplo.

ItemEvent1
ItemEvent2
El evento correspondiente a la función del campo correspondiente. Ten en cuenta que no todos los eventos funcionan con todas las funciones, y que algunas funciones no se pueden usar como evento de un objeto.
ItemEventFunc1
ItemEventFunc2

La función asociada al evento correspondiente al evento definido en la columna ItemEventX. Aquí una referencia de los eventos y que hacen

código descripción
1shoots a missile at the owner of a missile that has just hit you (Chilling Armor uses this)
2freezes the attacker for a set duration the attacker (Frozen Armor uses this)
3does cold damage to and chills the attacker (Shiver Armor uses this)
4% of damage taken is done to the attacker (Iron Maiden, thorns uses a hardcoded stat)
5% of damage done added to life, bypassing the targets resistance (used by Life Tap)
6attacker takes physical damage of #
7knocks the target back
8induces fear in the target making it run away
9applies Dim Vision to the target (it casts the actual curse on the monster)
10attacker takes lightning damage of #
11attacker takes fire damage of #
12attacker takes cold damage of #
13% damage taken is added to mana
14freezes the target
15causes the target to bleed and lose life (negative life regen)
16crushing blow against the target
17mana after killing a monster
18life after killing a demon
19slows the target
20casts a skill against the defender
21casts a skill against the attacker
22absorbs physical damage taken (used by Bone Armor)
23transfers damage done from the summon to the owner (used by Blood Golem)
24used by Energy Shield to absorb damage and shift it from life to mana
25absorbs elemental damage taken (used by Cyclone Armor)
26transfers damage taken from the summon to the owner (used by Blood Golem)
27used to slow the attacker if he hits a unit that has the slow target stat (used by Clay Golem)
28life after killing a monster
29destroys the corpse of a killed monster (rest in peace effect)
30cast a skill when the event occurs, without a target
31reanimate the target as the specified monster
DescPriority

Cuanto mas alto sea este valor más abajo se encontrará esta stat en la lista de modificadores de un objeto. Si mas de una stat comparte la misma prioridad, se listaran en el orden en el que esté definido en este fichero. El rango de valores valido es de 0 a 255.

DescFunc

Esta funcion se usa para generar la descripción de la stat, esto funciona similar a como lo hacen las descfuncs de SkillDesc.txt. En la siguiente tabla se puede ver como sería si DescVal fuera igual a 1.

código valor
1+[value] [string1]
2[value]% [string1]
3[value] [string1]
4+[value]% [string1]
5[value*100/128]% [string1]
6+[value] [string1] [string2]
7[value]% [string1] [string2]
8+[value]% [string1] [string2]
9[value] [string1] [string2]
10[value*100/128]% [string1] [string2]
11Repairs 1 Durability In [100 / value] Seconds
12+[value] [string1]
13+[value] to [class] Skill Levels
14+[value] to [skilltab] Skill Levels ([class] Only)
15[chance]% to case [slvl] [skill] on [event]
16Level [sLvl] [skill] Aura When Equipped
17[value] [string1] (Increases near [time])
18[value]% [string1] (Increases near [time])
19this is used by stats that use Blizzard's sprintf implementation (if you don't know what that is, it won't be of interest to you eitherway I guess), look at how prismatic is setup, the string is the format that gets passed to their sprintf spinoff.
20[value * -1]% [string1]
21[value * -1] [string1]
22[value]% [string1] [montype] (warning: this is bugged in vanilla and doesn't work properly, see CE forum)
23[value]% [string1] [monster]
24used for charges, we all know how that desc looks
25not used by vanilla, present in the code but I didn't test it yet
26not used by vanilla, present in the code but I didn't test it yet
27+[value] to [skill] ([class] Only)
28+[value] to [skill]
DescVal

Controla como se muestra el valor del stat.

  • 0 = No muestra el valor del stat
  • 1 = Muestra el valor del stat antes de la descripción
  • 2 = Muestra el valor del stat después de la descripción
DescStrPos

El string que se usa en la descripción cuando el stat es positivo.

DescStrNeg

El string que se usa en la descripción cuando el stat es negativo.

DescStr2

Un string adicional se usa para algunas DescFuncs, normalmente usadas como un sufijo o para dar información adicional (por ejemplo: "por nivel del personaje")

dGrp

Cuando todas las stats del grupo están presentes en el mismo objeto y tienen todas el mismo valor, se reemplaza su descripción por la asociada a la descripción del grupo.

dGrpFunc Igual que DescFunc pero para los grupos de stats.
dGrpVal Igual que DescVal pero para los grupos de stats.
dGrpStrPos Igual que DescStrPos pero para los grupos de stats.
dGrpStrNeg Igual que DescStrNeg pero para los grupos de stats.
dGrpStr2 Igual que DescStr2 pero para los grupos de stats.
Stuff

Mantente lejos de esta columna a menos que sepas muy bien lo que haces y/o trabajes para Blizzard. Esta columna se usa durante la creación del fichero binario para generar una cache, regulando el op-stat y otras cosas, cambiar esto puede ser inútil, funciona como la columna constants de MonUMod.txt y no tiene otra relación con ItemStatCost.txt. El primer stat de este fichro simplemente debe tener esto asignado o sino se rompe todo lo relacionado con op.

Explicaciones extra

La fórmula aplicada para calcular el coste de un objeto es como sigue:
cost * (1 + value * multiply / 1024)) + add (...)