Alternate Forms and Stat Stacking?
Ok, this is for a Non-WoD game.
I have characters that will under go a transformation. They have base stats in 'normal' form that carry over to 'transformed' form. The problem I can't seem to wrap my head around is how to deal with duplicate stats that should stack when in the transformed state.
Any ideas would be welcomed. I know the idea of doing a separate sheet for each form is a possibility but that would require adjusting every sheet when XP is spent on the base form. (Yes they can have multiple transformations.)
A status on the pc to indicate transformed, then +sheet adds normal and transformed stats. If tansformed is static (based on what they transform into) only need the transformed data on one object. Otherwise a duplicate storage for individual transformation stats (however you're storing them).
But either way, I'd stick to a status that tracks if they are normal or transformed, then have +sheet do the math depending on that status.
@Lotherio That's the plan they have a FORM attribute. The problem lies in...
Form A - Base Form has the attribute: Appearance:3
Form B - Transformed form has the attribute: Appearance:2
The sheet for Form B should now reflect a total attribute of Appearance:5 (No this isn't like the WoD attribute it's a secondary attribute.)
I can make it merge attribute lists if they have no duplicates, but the hiccup is duplicate attributes..
The number after the RP` indicates which form the stat is associated with. However, all forms other than 0, take into account that form's stats + Form 0's stats.
I tried to avoid suggestions on how/where to store the data, as we all have different preferences.
I usually designate in the attributes name what it is (wherever it is stored). I'd have a norm_app in one place, and a trans_app in another. Anyone looking at it one view code side (exam *object) knows which is normal appearance and which is transformed appearance, in the off chance something is messed up (page from player: hey staff, I messed up my XP spend, I put a point in my wolf form appearance but meant to add it to my human appearance).
Then you have two none duplicated names, when they +sheet as normal, it pull norm_app, but if the form is changed, you can generate a list of the appearances by getting all the attributes *_app and summing them up.
I've done it two ways:
I have stored a copy of all the stats for each form, and then copy them to the 'active' stat whenever a form changes. This works well for static stats.
If they need to be more dynamic, I'd store them as an attribute and then whatever code grabs them, checks to see if they have a form active. If so, it grabs the form`stat and adds it to the main stat in calculation. This should work for your need to not adjust the sheets each time, since it's dynamically pulling the info separately for each call. It just requires a couple of if() statements and clear ways to store the extra data.
I know you said you were avoiding suggestions on how/where to store data, but I can't really think of how to suggest without it, soooo...
We use an attribute for each stat. When we need to offset, you add that to the same attribute, after a period.
_ATTRIBUTE.COMPOSURE : 5.-1
When the stat gets called, either for the sheet or the roller, it runs through a function, to get either the real, or the adjusted, and displays accordingly.
When you shift, then, it pulls from a list of offsets to apply and does that. When you shift back, it clears those.
&form: 0 1
Appearance: [ladd( iter( get( player/form ), get( player/appearance_%i0 ))]
This is not a suggestion on where to store, but pseudo code based on I'm on my iPad and this gives you the idea. It should be easy for @Seamus to extrapolate to the form he's using.
- &RP`0`attr`001 db=Appearance
- &rp`0`attr`001`rank db=3
- &rp`1`attr`002 db=Appearance
- &rp`1`attr`002`rank db=2
Let me make the suggestion again based on this.
&form: 001 002
To display a specific attribute:
&display.attribute.one-line: \\ %0: sheet dbref \\ %1: attribute number cat( get( %0/rp`%1`attr`001 ):, ladd( iter( get( %0/form ), get( %0/rp`%1`attr`%i0`rank ))) )
That should do it. Pardon typos as I'm doing this in the board editing window.
Hope that helps.