No, not always afaik. But most do.
Some start at 1, not at 0.
0 values often have a constant ending on _NONE too, e.g. ITEM_LAUNDER_RESULT_NONE
Some use -1 and an _INVALID constant like ITEM_TRAIT_TYPE_CATEGORY_INVALID
And there often exist matching *_ITERATION_START and *_ITERATION_END variables then,
e.g. ITEM_FUNCTIONAL_QUALITY_ITERATION_START and _END
|