CCD48 seems to be the place where the routine starts.
CCDC0’s loop is something to loop through all the player characters until it finds the one you’re promoting. (Possibly to find what their current class is.)
You can see the game check twice for classes to promote to at CCE56. If you pull that out, the second option becomes a glitchy mess.
CCE72 looks at the case of the trainee classes and adds the third promotion to the list of promotions (which is located at 0202547C). It also hardcodes the three extra promotions the trainees get to their class.
The check for whether you’ve completed the game before, and thus whether that third promotion is actually activated, seems to be somewhere else though :\ .
Haven’t figured out enough about the branching to make any significant changes, but loading an old save file, got this:
Related: CD7FC and a few more ensuing blocks of ASM load the text that happens before the trainee promotions.
The problem is that I can’t figure out where the “check to see if game has been beaten” part is being done… but just removing/restructuring the trainees should be that hard…
EDIT: The third promotion existing and being locked to the trainees seems to be hardcoded somewhere else, with this section of code only serving to say what the promotions will be. When I got rid of the trainee-specific conditionals and tried to promote Ross, I got this…
Solved - ccca4 does the check to see if the trainees get their third promotion option open (this seems to be a check for Eirika/Ephraim mode beaten).
cdd70 determines if the promotion display will show the third promotion option.
If there is no third class, the game will glitch when you cursor to that option…
That doesn’t work because it saves the class somewhere else dynamically before the promotion routine starts.
The routine that does that is located at CDB34, though… oh, ew, CDB80 has another hard-coded check for trainee classes. But changing that should make it work.