Slight break from attributes to talk about MP:
These are the easiest number sets by far. First off several characters just have zeroes for their entire lives (Dk.C, Kain, Edward, Yang, & Cid) and the rest have very little variance:
MP Initial Lv Range MP Gain # of Gains Total (Low - High) at Lv
Rydia 10 1-9 5-5 8 ( 50 - 50) at Lv 9
10-30 8-9 21 (218 - 239) at Lv 30
31-99 10-11 68 (908 - 998) at Lv 99
Rosa 150 10-99 8-9 89 (862 - 951) at Lv 99
Twins 50 10-99 8-9 89 (762 - 851) at Lv 99
Cecil 10 1-69 4-4 68 (282 - 282) at Lv 69
70-99 8-9 30 (522 - 552) at Lv 99
Edge 60 25-99 4-4 74 (356 - 356) at Lv 99
FuSoYa 190 51-69 0-0 18 (190 - 190) at Lv 69
70-99 8-9 29 (430 - 460) at Lv 99
Source:
http://rb.thundaga.com/chars/ff4chrlvup.txtLooking at that I think it's just easiest to just straight reference it - except, of course, much more efficiently then have Rosa sport 89 entries corresponding to MP+(8-9). To condense the data I would think the best scheme would be to specify as few parameters as required for each character: so what I mean by that would be to code Cecil as:
If Lv < 70
MP = MP + 4
Else
MP = MP + 8 + Rnd(0...1)
EndIfSo for Cecil we would need to store 70 as the 1st jump point, and then 4 & (8-9) for the gains in those regions. In my "coding" I just wrote it as 8 and then randomizing the range - but it may be more efficient to write it as Rnd(8...9) - or they could work out to be equivalent in ASM - I don't know; but I'm hoping someone will tell me

The reason I'm thinking about that aspect specifically is that HP follows much the same pattern - only with many more stops along the way (often in sets of 8-12 levels). But the ranges there are formulaic as well:
Level HP(+)
10 - 19 20 - 22
20 - 29 30 - 33
30 - 39 40 - 45
40 - 49 50 - 56
50 - 59 60 - 67
60 - 99 70 - 78- This corresponds to Dk.C and it can all be represented by*:
HP(+) = 10 * (1 + INT(Lv/10)) + 1 + Rnd(0...X) With X := Lv - INT(Lv/10) <--- There are probably easier ways to represent this...**
* The allowance here being that I'm fudging to make the earlier ranges 20-23, and 30-34 - to better fit with the later ranges
** ...But I don't know how best to implement random values and modulo so I instead went for what I'd do in Excel off the top of my head - please feel welcomed to share any number of better programming solutions.
The moral of the story is that I can definitely tackle HP as I suggest handling MP; but I'll probably go for a linear formula. Given the complexity of TNL the HP code should be no problem; it definitely shouldn't* be recursive just the old Y = mX + b - whatever they turn out to be for each character.
Now that I have Yang's corrected data (thank again!) I can tackle that issue. After that it will be an overall clean/write-up for everything regarding levels which I will release in Excel as well as a csv for easy data reference.

*It shouldn't have to be recursive but it might end up so - it all depends: just how strong is the OCD-side of The Force?

Slight delay...to quote Butter's Stotch: "Oh...I hate my stupid psychotic brain..." - But still it's coming along