Some training + development conventional wisdom I'm confident I can clear up at this stage:
- game-time contributes towards development. Yes - you have to play at least 60 minutes. No. Every minute counts. - match rating matters. No - the result matters. No - the competition's reputation matters. Yes. [s]It looks to be a direct relationship between the reputation of the player and of the competition (i.e. U21 players will get bigger impacts from EPL games than first-team players).[/s] It's to do with the "established level" of the player relative to what he's playing at. - players under 18 don't need to play competitive matches. No Maximising match experience for an U18 player amounts to ~1.6 CA extra a month
EDIT: how I learned this. I've found the function that computes monthly player growth (0x144F70400 if you want to open it up in Ghidra) and I've been calling it willy-nilly. One thing I found is the presence of what I'm calling Match Points, but you can think of it like match experience. And this exists per player, in RAM; you can view it in Cheat Engine right now. (Either find a Person object and look at -0xCA before it or find their Player object and look for +0x1AE after it; in the next 15 bytes are also the number of matches a player has played since their last monthly development and last month's values, but we only need to care about Match Points).
These points are added whenever a player takes part in any number of any matches. Everything counts, but the amount you get scales with a) the importance of the competition relative to your own player reputation and b) the number of minutes played. The person I've been testing, 17 year old Omari Kellyman got 2.5x as many points for playing in an EPL game vs his U21 side.
Here are some players I monitored for a Premier League match:
Match Points max out at 150. Going above this makes no difference, so it would take our Kellyman 3 90-minute senior appearances every month to cap out his match experience benefits (or 6 U21 matches, these are equivalent).
Some takeaways - Kellyman grows very quickly even without match-time (we knew this, it gets repeated a lot) and this growth doesn't change until he gets over 100 Match Points. Once he goes over 125 he adds another 1.5 CA a month). (That said, if you don't want to max out a player's CA as fast as possible, not playing him will still let him develop reasonably well.) - As you can see, senior (21+, but I've not tested 19 or 20) players get basically all of their development from playing time. I think this was known but here it is laid-out. Again, this only takes about 270 minutes play-time a month to accomplish.
You could test this by finding the day a player gets his training benefit (remember, UID / 28, take the remainder and add 1 (e.g. Kellyman's UID is 2000147523. Divided by 28 gives a remainder of 3: his growth date is the fourth of each month)) and hardcoding his Match Points to 0, advancing, measuring his CA change, reloading, setting the value to 150 and comparing. (Note: randomness is at play in the development function, so you will see variations when running a tiny sample size, but it should get across the point).
And, because I couldn't help myself, I started changing mental attributes while doing this.
There's a lot more experimentation to be done (all will be possible via scripts when I release this addition to my simulator app) but I've got a feeing I won't be able to nail the exact mechanics down. Attribute change for lots of reasons, not just monthly growth and I don't think I'm going to be able to chase them all down.
EDIT 2: here's the formula for Match Points, by the way:
minutes * match weight * level ratio
- minutes is the (smaller of minutes played and 90) / 5. Played 45+ minutes: +1 if his team is stronger, −1 if weaker, and +1 for player of the match - match weight (average of a per-player value (probably CA, I haven' checked) over everyone who played / 10 + competition level + opponent's reputation / 500) / 40 + 0.5 - level ratio is competition level / the highest level the player has established himself at (visible in Cheat Engine at player +0x1BC). * (1.5 − apps/120) while he has fewer than 60 appearances at that level. Clamped to 1.0 - 2.0
Basically this:
- There's no 60 minute threshold; points for up in 5-minute steps from the first minute. - ratings, goals and assists are not in here; they don't count. (The one exception is the player-of-the-match bonus, worth one extra 5-minute step.) - Why youngsters earn about twice as much per minute. It isn't age or reputation, it's level ratio. Kellyman's established level is 1, so a Premier League game hits the 2.0 cap. Zaniolo (17) and Tielemans (18) are already at Premier League level, so they get about 1.1. - Competition level is competition reputation / 10 FYI. - Team strength is a byte stored in RAM on the team object (+0x338). How it's calculated or how it changes I don't know (forgive me for not following every trail of breadcrumbs at once).
Some training + development conventional wisdom I'm confident I can clear up at this stage:
- game-time contributes towards development. Yes
- you have to play at least 60 minutes. No. Every minute counts.
- match rating matters. No
- the result matters. No
- the competition's reputation matters. Yes. [s]It looks to be a direct relationship between the reputation of the player and of the competition (i.e. U21 players will get bigger impacts from EPL games than first-team players).[/s] It's to do with the "established level" of the player relative to what he's playing at.
- players under 18 don't need to play competitive matches. No Maximising match experience for an U18 player amounts to ~1.6 CA extra a month
EDIT: how I learned this. I've found the function that computes monthly player growth (0x144F70400 if you want to open it up in Ghidra) and I've been calling it willy-nilly. One thing I found is the presence of what I'm calling Match Points, but you can think of it like match experience. And this exists per player, in RAM; you can view it in Cheat Engine right now. (Either find a Person object and look at -0xCA before it or find their Player object and look for +0x1AE after it; in the next 15 bytes are also the number of matches a player has played since their last monthly development and last month's values, but we only need to care about Match Points).
These points are added whenever a player takes part in any number of any matches. Everything counts, but the amount you get scales with a) the importance of the competition relative to your own player reputation and b) the number of minutes played. The person I've been testing, 17 year old Omari Kellyman got 2.5x as many points for playing in an EPL game vs his U21 side.
Here are some players I monitored for a Premier League match:
| Player | Age | Reputation | Minutes | Rating | Points | Per minute |
| --- | --- | --- | --- | --- | --- | --- |
| Kellyman | 17 | 4989 | ~102 | 7.1, goal | 57 | 0.56 |
| Proctor (GK) | 16 | 3090 | 65 | 6.6 | 28 | 0.43 |
| Gauci (GK) | 23 | 5345 | ~37 | 6.7 | 16 | ~0.43 |
| Rogers | 21 | 6302 | ~19 (injured) | 6.6 | 6 | 0.32 |
| Zaniolo | 24 | 7295 | ~102 | 7.1 | 30 | 0.29 |
| Bailey | 26 | 7094 | ~83 | 7.0, goal | 24 | 0.29 |
| Tielemans | 26 | 7335 | 50 | 6.4 | 14 | 0.28 |
Match Points max out at 150. Going above this makes no difference, so it would take our Kellyman 3 90-minute senior appearances every month to cap out his match experience benefits (or 6 U21 matches, these are equivalent).
And how do these points affect monthly CA growth?
| Player | Age | 0 | 20 | 40 | 60 | 80 | 100 | 125 | 150 |
|---|---|---|---|---|---|---|---|---|---|
| Proctor (GK) | 16 | +0.34 | = | = | = | = | +0.96 | +2.02 | +2.08 |
| Kellyman | 17 | +1.26 | = | = | = | = | +1.56 | +2.72 | +2.76 |
| Rogers | 21 | 0 | 0 | 0 | +0.28 | +0.32 | +0.42 | +1.62 | +1.80 |
| Gauci (GK) | 23 | +0.08 | +0.10 | +0.12 | +0.50 | +0.92 | +1.06 | +1.40 | +1.40 |
| Zaniolo | 24 | +0.10 | 0 | 0 | 0 | +0.92 | +0.98 | +1.00 | +1.04 |
| Tielemans | 26 | 0 | 0 | 0 | 0 | +0.68 | +0.72 | +0.78 | +0.84 |
| Bailey | 26 | −0.04 | −0.04 | −0.04 | −0.02 | −0.02 | −0.02 | −0.02 | −0.02 |
| McGinn | 28 | 0 | −0.22 | −0.10 | 0 | 0 | 0 | 0 | 0 |
| Martínez (GK) | 30 | 0 | −0.12 | −0.04 | 0 | +0.04 | +0.06 | +0.06 | +0.06 |
| Digne | 30 | 0 | −0.14 | −0.02 | 0 | +0.04 | +0.04 | +0.04 | +0.04 |
| Olsen (GK) | 33 | −0.28 | −0.82 | −0.52 | −0.30 | −0.24 | −0.18 | −0.06 | −0.04 |
"=" means no difference from the previous cell
Some takeaways
- Kellyman grows very quickly even without match-time (we knew this, it gets repeated a lot) and this growth doesn't change until he gets over 100 Match Points. Once he goes over 125 he adds another 1.5 CA a month). (That said, if you don't want to max out a player's CA as fast as possible, not playing him will still let him develop reasonably well.)
- As you can see, senior (21+, but I've not tested 19 or 20) players get basically all of their development from playing time. I think this was known but here it is laid-out. Again, this only takes about 270 minutes play-time a month to accomplish.
You could test this by finding the day a player gets his training benefit (remember, UID / 28, take the remainder and add 1 (e.g. Kellyman's UID is 2000147523. Divided by 28 gives a remainder of 3: his growth date is the fourth of each month)) and hardcoding his Match Points to 0, advancing, measuring his CA change, reloading, setting the value to 150 and comparing. (Note: randomness is at play in the development function, so you will see variations when running a tiny sample size, but it should get across the point).
And, because I couldn't help myself, I started changing mental attributes while doing this.
Kellyman baseline 0:+1.26 20:+1.26 40:+1.26 60:+1.26 80:+1.26 100:+1.56 125:+2.72 150:+2.76
Kellyman 20 determination 0:+1.28 20:+1.28 40:+1.28 60:+1.28 80:+1.28 100:+1.56 125:+2.74 150:+2.78
Kellyman 20 professionalism 0:+2.10 20:+2.10 40:+2.10 60:+2.10 80:+2.10 100:+2.10 125:+3.38 150:+3.46
Kellyman 20 ambition 0:+1.28 20:+1.28 40:+1.28 60:+1.28 80:+1.28 100:+1.56 125:+2.74 150:+2.80
Kellyman 1 determination 0:+0.50 20:+0.50 40:+0.50 60:+0.50 80:+0.50 100:+0.70 125:+1.80 150:+1.86
Kellyman 1 professionalism 0:+0.60 20:+0.60 40:+0.60 60:+0.60 80:+0.60 100:+0.70 125:+1.86 150:+1.86
Kellyman 1 ambition 0:+0.46 20:+0.46 40:+0.46 60:+0.46 80:+0.46 100:+0.56 125:+1.70 150:+1.78
Kellyman set all to 1 0:+0.06 20:+0.06 40:+0.06 60:+0.06 80:+0.06 100:+0.08 125:+1.08 150:+1.08
Kellyman set all to 20 0:+1.96 20:+1.96 40:+1.96 60:+1.96 80:+1.96 100:+1.96 125:+3.36 150:+3.46
There's a lot more experimentation to be done (all will be possible via scripts when I release this addition to my simulator app) but I've got a feeing I won't be able to nail the exact mechanics down. Attribute change for lots of reasons, not just monthly growth and I don't think I'm going to be able to chase them all down.
EDIT 2: here's the formula for Match Points, by the way:
minutes * match weight * level ratio
- minutes is the (smaller of minutes played and 90) / 5. Played 45+ minutes: +1 if his team is stronger, −1 if weaker, and +1 for player of the match
- match weight (average of a per-player value (probably CA, I haven' checked) over everyone who played / 10 + competition level + opponent's reputation / 500) / 40 + 0.5
- level ratio is competition level / the highest level the player has established himself at (visible in Cheat Engine at player +0x1BC). * (1.5 − apps/120) while he has fewer than 60 appearances at that level. Clamped to 1.0 - 2.0
Basically this:
- There's no 60 minute threshold; points for up in 5-minute steps from the first minute.
- ratings, goals and assists are not in here; they don't count. (The one exception is the player-of-the-match bonus, worth one extra 5-minute step.)
- Why youngsters earn about twice as much per minute. It isn't age or reputation, it's level ratio. Kellyman's established level is 1, so a Premier League game hits the 2.0 cap. Zaniolo (17) and Tielemans (18) are already at Premier League level, so they get about 1.1.
- Competition level is competition reputation / 10 FYI.
- Team strength is a byte stored in RAM on the team object (+0x338). How it's calculated or how it changes I don't know (forgive me for not following every trail of breadcrumbs at once).
@LightningFlik, great findings!
It deserves its own thread for more visibility.