My ACKS scripts are at https://github.com/jedavis-rpg/ackstools . The ones of interest to you are henchstats.py, which depends on libhenches.py, libspellbook.py, tables.py, and (minimally for this purpose) the classes file. It’s all command-line, python 2.7, and tested on linux, but it should work on windows or mac as well.
As for class selection, I do something like this:
- Generate stats
- For each class (as described in the classes file), generate a number of ‘shares’ based on how high your prime reqs are for that class.
- Sum all shares of classes for which you are qualified (prime reqs and minstats all >= 9), and choose in a weighted random fashion.
So a character with Str 18, Int 9, and all other stats 8 might receive 10 shares towards Fighter for his +10% req, 1 share towards Mage for his 9, and 1 share towards Spellsword (currently it uses the minimum of your stats to determine share values for multi-req classes, IIRC, so min of 10 and 1 is 1). He’d have a 5/6 chance of being a fighter and a 1/12 chance of being either a mage of a spellsword. In practice the function to assign share weights is somewhat more complicated (which is to say, I’ve forgotten exactly how it works since I wrote it), but that’s sort of the general gist of it and the share amounts it generates usually strike a balance between “everyone always does what they’re best suited for” and “oh man that was a terrible class choice”.
For example, I just generated 5 9th-level thieves (with the command ./henchstats.py -n 5 -c ./classes -f Thief -l 9) and here’s what I got (where the bracketed values are Str Int Wis Dex Con Cha):
[13, 11, 14, 13, 8, 10], L9 Thief, HP: 13
[10, 8, 6, 10, 3, 14], L9 Thief, HP: 12
[11, 8, 9, 15, 14, 12], L9 Thief, HP: 30
[10, 11, 11, 12, 9, 5], L9 Thief, HP: 21
[14, 11, 12, 15, 8, 12], L9 Thief, HP: 14
And those are all reasonablish thief statblocks (3 Con though, man).