Hmm, well that does appear to be what is happening. Though Cecil's level-ups were changed to Tellah's, Tellah's entire Level up Data was erased, despite Tellah 1 still having the normal Tellah Level-up Data (because I switched his data to Dark Knight Cecil's beforehand) which is nothing. By changing this, Tellah 2 and 3 still have Dark Knight Cecil's Level-up Data,. So I think that might be what is going on regardless of the case and Cecil's data reads it as Cecil's Level Up Data.
So if I understand correctly... you changed Cecil's levelups to Tellah's, right? So now the situation is the actors DK Cecil, Tellah 1, Tellah 2, and Tellah 3 all have Tellah's levelups. Next, you changed Tellah 1's levelups to Cecil's. So now the situation is Tellah 1 has Cecil's (old) levelups and now actors DK Cecil, Tellah 2, and Tellah 3 all have what were Tellah's levelups, correct? Now you save rom and exit, then when you load up the editor you should see this:
| Actor | Levelups |
| DK Cecil | DK Cecil |
| Tellah 1 | Tellah |
| Tellah 2 | DK Cecil |
| Tellah 3 | DK Cecil |
But when you look in the character editor you'll find that the levelups that are being called "DK Cecil" are actually what Tellah's were originally, and the levelups that are being called "Tellah" are what DK Cecil's were originally. This behaviour is "correct" and I'll explain why:
Levelup data is stored by character, but the
pointers to the levelup data are stored by actor (thanks, FF4 programmers). What this means is I can't just read levelup data along with the rest of the character data. I have to read it with the
actor data and assign it to the corresponding character as I go. So let's just do a quick trace of this process with the data changes made above:
- Read first actor: DK Cecil
- Pointer to levelup data: (points to what used to be Tellah's levelups)
- Is this pointing to data I've already read so far: No (I haven't read any so far, this is the first one)
- What character corresponds to this actor: DK Cecil
- Assign DK Cecil (character) this levelup pointer (hence making what used to be Tellah's levelups to now be labelled as Cecil's)
- ... read some more actors ...
- Read actor: Tellah 1
- Pointer to levelup data: (points to what used to be DK Cecil's levelups)
- Is this pointing to data I've already read so far: No (Cecil's had been changed to something else, so this is the first one pointing to his old levelups)
- What character corresponds to this actor: Tellah
- Assign Tellah (character) this levelup pointer
- ... read some more actors ...
- Read actor: Tellah 2 (Tellah 3 will operate the same way as this)
- Pointer to levelup data: (points to what used to be Tellah's levelups)
- Is this pointing to data I've already read so far: Yes
- Therefore we look at which character is the first one with this data: DK Cecil (thus it will be labelled DK Cecil's levelups)
- What character corresponds to this actor: Tellah
- This character already has levelup data so no assignment needed
Now let's suppose instead that you hadn't assigned Cecil's levelups to anyone. You left all Tellah's actors alone and just changed Cecil to have Tellah's levelups. Now when you save and re-load, the following happens:
- Read first actor: DK Cecil
- Read levelup pointer: (points to what used to be Tellah's levelup data)
- Assign it to DK Cecil (character)
- ... read some more actors ...
- Read actor: Tellah 1 (the other Tellahs will all work like this)
- Read levelup pointer: (also points to what used to be Tellah's levelup data, but would now be lablelled DK Cecil)
- Assign it to Tellah (character)
- ... read the rest of the actors, none of which point to what used to be DK Cecil's levelups ...
Notice that now there is nothing pointing to DK Cecil's former levelups. What this means is that the data is still there, it's hasn't been deleted or overwritten or anything, there's just no way to access it from within the editor. If you were to manually go in with a hex editor and update the pointer for one of the characters to point to DK Cecil's old levelups, they'd all be there and completely accessible.
Actually now that I think about it they might get overwritten in the saving process since nothing is pointing to it; the levelups that are actually being used might all just get written sequentially and the pointers computed based on that, in which case what I said above wouldn't hold true for DK Cecil but depending on what else you changed you might be able to salvage, say, FuSoYa's had you done that with his levelups rather than Cecil's.
Ideally, I'd like to be able to read all the levelup data regardless of whether anything points to it or not; that way you can assign pointers to whatever levelup sets you like without having to worry about it since the entire data set would always be read and written. But it's tricky to do that because of the way those particular pointers work. They care about the character's starting level. If you start at level 10, it will result in a different pointer from if you start at 15, even if the data begins at the same memory address. This means that in order to read the levelup data correctly I need to know the corresponding character's starting level, meaning it has to
have a corresponding character.
Also I have an observation about the level up editor. On the later levels (50+ or so) the MP increased byte is also used by the experience needed for level up. It starts with $20 and moves on to $40--what this means if you put in a value that exceeds $BF for example the exp needed for level up increases as well. As an example put $FA on Rydia or Rosa's level 40 MP level up data and you'll see the required exp for level up goes into well above 300,000.
My recommendation is to have the max MP increased per level up not exceed 191 ($BF) or make it an even 190 ($BE). Or you can be safe and cap it at 160 (A0)--I haven't tested it any further. :)
Let me know if you need a further explanation.
When you do this in FF4kster the result is that the MP ends up getting capped to 31 and the TNL goes bonkers. So I'm just going to do the lazy thing for now and cap it at 31.
