@Pieter Boelen should be able to give you more of a steer but even if you just search how and where the variables are used it should give you a good idea of their importance in the scheme of things. If you do experiment let us know the result because your taste of level of skill gain/experience may just be someone else's too.
Seconded.
I seem to remember rewriting that 'AddXP' function myself a bit and I think
@Grey Roger worked on it too.
But if I look at it, there doesn't seem to be a lot of balancing applied just yet.
Multipliers are either 0.5 or 1.0 and there are a whole bunch of checks for 'if smaller than 0.5', which doesn't seem to really be possible so it's "just in case" code.
Note that 'GetOfficerSkillFactor' can be 0, 1 OR 2!
This is defined in PROGRAM\Characters\officertypes\init_officertypes.c .
That results in 200% skill gain for officers in their areas of expertise.
As comparison, the player only ever gets 50%, which is the same as everybody else gets when Shared Experience is active.
Only skills the player gets 100% for are Leadership and Sailing (because player is a captain).
But even then, officers specialised in that could get 200% for those.
So definitely the system is stacked in favour of the officers.
In part on purpose, because as soon as the player is better than an officer, the officer becomes superfluous.
And we don't want that to happen too soon.
Sounds like this may get a bit excessive though once the officer's main skills are maxed out.
Maybe some check should be added for 'if skill is the one the officer is specialised in AND that skill is maxed out', reduce the number.
Otherwise I believe the 200% still applies, but it ends up distributed over whatever other skills are left.
Compare that to 50% for the player, and we've got the makings of those super-officers @Kara Korson describes...
Maybe it could be as simple as finding:
Code:
if (skillmult < 0.5 && SharedXP) skillmult = 0.5; // Sharing XP, so everybody gets at least 50%
if(DEBUG_EXPERIENCE>1) Trace("XP LOG: skillmult = "+skillmult);
And adding a line inbetween:
Code:
if (skillmult < 0.5 && SharedXP) skillmult = 0.5; // Sharing XP, so everybody gets at least 50%
if (GetCharacterBaseSkill(chr, expName) == 10) skillmult = 0.5; // Once this skill is maxed out, slow down progression (as this spreads to other skills)
if(DEBUG_EXPERIENCE>1) Trace("XP LOG: skillmult = "+skillmult);
I haven't tested that, but it might be worth a try.
EDIT AH I see
@Pieter Boelen has already steered you a bit whilst I was typing this ENDEDIT
Ninja'd.
Your post is far better though than my two lines.