The huge mess of syntax below is a Generator which will produce a character for the ExaltedRPG, statted as a starting character before bonus points are spent. It uses MoonShadow/GeneratorGenerator syntax.
Remarkably, it seems to work so far. Should currently return a random Exalt Type from Solar, Abyssal, (Dynastic) Dragon-Blooded, Sidereal, of random Caste/Aspect?. Attribute points should be within respective constraints, number of favoured abilities should be correct, and initial ability points should be put into random skills legally, taking account of the at-least-1-in-Favoured rule, the requirements of Dynasts and Sidereals of all flavours, and the number of points that are forced to be in Favoured abils. 5 Virtue points should be assigned, respecting the "No virtue above 3" rule.
Currently, only Solar abilities will be output in a pretty table. Anyone bored and wanting to save me work can do the other ones - it should be fairly straightforward to adapt from the Solar model. Just note that the "digit##foo" strings need a space on each side.
The generator on this page is what might be described as the Product version. I may continue tinkering with it (name, initial Charm selection, bonus point spending etc.) on /BetaExaltedStatsGenerator. Any significant, working advances made there will be copied over to here. In an attempt at consistency, to aid readability etc, I shall try to have all non-terminals of the form ntCapitalisdWords?, and variables of the form varNameWords?. Short-form non-terminals to be used as subscripts won't follow this convention, as it would make them longer, thus defeating the object... option ::= include = MoonShadow/Calculator
Assign favored abilities. Clear all off, and if we get >=1 ability, process ability 1 ntFavdAbil1? ::= <vari::=u> <varFavdAbil1?::=abNull> <varFavdAbil2?::=abNull> <varFavdAbil3?::=abNull> <varFavdAbil4?::=abNull> <varFavdAbil5?::=abNull> <varFavdAbil6?::=abNull> <ntFavdAbil1?##vari##varNoFavd?::=_ntFavdAbil1?> <ntFavdAbil1?##varNoFavd?##varNoFavd?::=nothing> ntFavdAbil1?##vari##varNoFavd? cst##varFavdAbil1?
Choose a random ability. If it is not already Caste or Favored, make it Favoured 1 _ntFavdAbil1? ::= <varFavdAbil1?::=ntAbility> <ntFavdAbilChk?##varFavdAbil1?::=ntFavdAbil2?> <ntFavdAbilChk?##varCasteAbil1?::=_ntFavdAbil1?> <ntFavdAbilChk?##varCasteAbil2?::=_ntFavdAbil1?> <ntFavdAbilChk?##varCasteAbil3?::=_ntFavdAbil1?> <ntFavdAbilChk?##varCasteAbil4?::=_ntFavdAbil1?> <ntFavdAbilChk?##varCasteAbil5?::=_ntFavdAbil1?> ntFavdAbilChk?##varFavdAbil1?
Clear Favd 2. If we get >=2 abilities, process ability 2 ntFavdAbil2? ::= <vari::=1##vari> <varFavdAbil2?::=abNull> <ntFavdAbil2?##vari##varNoFavd?::=_ntFavdAbil2?> <ntFavdAbil2?##varNoFavd?##varNoFavd?::=nothing> ntFavdAbil2?##vari##varNoFavd? cst##varFavdAbil2?
Choose a random ability. If it is not already Caste or Favored, make it Favoured 2 _ntFavdAbil2? ::= <varFavdAbil2?::=ntAbility> <ntFavdAbilChk?##varFavdAbil2?::=ntFavdAbil3?> <ntFavdAbilChk?##varCasteAbil1?::=_ntFavdAbil2?> <ntFavdAbilChk?##varCasteAbil2?::=_ntFavdAbil2?> <ntFavdAbilChk?##varCasteAbil3?::=_ntFavdAbil2?> <ntFavdAbilChk?##varCasteAbil4?::=_ntFavdAbil2?> <ntFavdAbilChk?##varCasteAbil5?::=_ntFavdAbil2?> <ntFavdAbilChk?##varFavdAbil1?::=_ntFavdAbil2?> ntFavdAbilChk?##varFavdAbil2?
Clear Favd 3. If we get >=3 abilities, process ability 3 ntFavdAbil3? ::= <vari::=1##vari> <varFavdAbil3?::=abNull> <ntFavdAbil3?##vari##varNoFavd?::=_ntFavdAbil3?> <ntFavdAbil3?##varNoFavd?##varNoFavd?::=nothing> ntFavdAbil3?##vari##varNoFavd? cst##varFavdAbil3?