Great ideas. Let's see if we can solve them in order of easiest to more obscure.
Blue mage: Probably a script function since it is a very specific thing; whenever a battle ability is used or a combatant is targeted it sends a notify event to that script class (this is always a good idea anyway):
No probrem!Code:void BlueMage.SomeNotifyEvent( object performer, battle_action action ) { if(performer.faction == ENEMY && action.type == SPELL && action.subtype == BLUE) //or something... { if( !spellbook[BLUE].contains( action.id ) { //learn the spell spellbook[BLUE].add(id); //maybe needs a learn queue or similar... } } }
Case 2: Anything bought or acquired or learned at LV UP doesn't need to be learned in the sense of having to grind out exp, AP, or have a current learning rate data attached to it, you just get whatever it is.
Case 3: Commands, Spells, Skills, (whatever else?) have a mini subset of a simple experience point system that can be tracked and modified. ...Still not entirely sure about this except that it should be able to work in some sort of tandem with these:
* Skills - Each character can have multiple skillsets.
* Spells - Each character can have multiple spellbooks.
* Abilities - can be learned by various means.
* Classes(Jobs) - need to be able to track lv, exp, other(?) by each character.
* All of the above can be 'learned' at some given rate by exp or AP.
I suppose everything above could be handled by a super simple learning container that stores a dynamic list of data that holds an id, type, rate, exp, and lv which is saved in the save file... This would be the generic solution which, strangely enough, would still work with every conceivable data type. Even items, monsters, chests, or maps could be learned! lol. Though the downside of this is an extra step of looking in here every time something is equipped or removed etc. and having to be managed by scripts, though it's likely that most people will not go crazy with this and just use it for one or two things at most, if that.
Other Ideas?
[edit] Also not touchings events yet. (I'm not ignoring you, just that this requires a lot of dedication and time to implement - which I'm putting off until we have some level of a playable game)