wiki:PvalHandling

Version 2 (modified by magnate, 8 years ago) (diff)

Update post-#120 and #1404

Ok, #1404 has thrown up an interesting dilemma:

Do we persist with the concept of a pval representing the total effect on the object of its related flags?

-- yes, we did.

If we do, we need a function to rearrange pval flags and pvals during ego and randart creation, like

add_pval(object_type *o_ptr, int pval, int flag)

which needs to:

  • check if flag is already on the object
    • if so, check if other flags are associated with the same pval
      • if not, increment it and return
  • check MAX_PVALS to see if we can create a new one
    • if so, put flag on a new pval and increment it, and remove it from other pvals
    • if not, work out what its new value should be and add/move it to the closest pval

-- this is now object_add_pval in pval.c, and is called from ego_apply_magic. It will also be called from randart.c. It isn't necessary for standarts, because artifact pval details are copied wholesale, as artifact definitions are assumed to overwrite anything on the base item. N.B. #120 was completed first. This is currently impossible due to the way object_flags and object_pval_flags work, and can only be done once o_ptr->flags is canonical. But that's on the radar (see http://angband-dev.blogspot.com/2011/03/so-i-finally-managed-to-refactor.html), so this is possible. There are two other possibilities though (and maybe more):

  1. Eddie suggested that pvals should always be +1, +2, +4 and flags assigned to them to create any value from +1 to +7. With a fourth pval this would cater for up to +15. This would make the add_pval function simpler, but it still can't be done until object_flags is fixed. Theoretically this gets us 15 possible pvals for the space of four, but lots of object display code would need rewriting.
  1. FA does away with pval_flags altogether and uses an array for all granular flags. Going down this route means either making o_ptr->flags an array of bytes, or making a total separation between pval flags and binary flags. I would definitely favour the first, if only I understood the ramifications for all the bitflag manipulations (of which there are hundreds).

Grateful for any comments.