The Pawns and Berolinas promote from the Zones (first to unpromoted pieces, second to first-promotions); Guards only by capture; other unpromoted pieces by either capture or the first zone; and first-promotion only by capturing other promoted pieces. That's a lot for any generic system to try to be able to handle.
Well, I see a lot in there that can be handled generically. E.g. that the promotion choice is not always the same, but could depend on the type of the piece that promotes. One way to implement this would be to alter the meaning of the promoChoice parameter when it is used after a piece definition, to apply only to that piece type, and have each piece type then use its own set of choices when the zone rules or an asterisk in the morph or captureMatrix orders a promotion choice.
Or even better, allow the definition of a number of choice sets that are not directly associated with a piece type, e.g. separated by slashes in the promoChoice parameter. Promotion as per maxPromote and promoZone would then use the first of those sets. But promotions ordered by the morph or captureMatrix could explicitly refer to one of the other sets by putting a digit in the element referring to that square or (attacker, victim) combination. So that the choice for a given type can depend on where it promotes in a location-triggered promotion, or on what it captures.
Another way to enhance the capabilities is a better coexistence of chess-like and shogi-like promotions. E.g. your promotion rules for non-Pawns could conveniently be configured by a promoOffset parameter, and proper ordering of the piece definitions. Then we could set maxPromote=0 to suppress any automatic invocation of the promotion procedure, and only rely on promotions to be requested by the morph or captureMatrix. There would be separate symbols in those matrices for indicating promotion per promoOffset and promotion per choice set, and in the first case there could be different symbols for a normal promote/defer choice, or an automatic deferral when the promotion piece is not available in the holdings. (For a choice set this distinction would have been indicated as part of the set, as is already possible in promoChoice. An automatic promotion can already be indicated by putting the piece ID of the promoted type in the matrices.)
Well, I see a lot in there that can be handled generically. E.g. that the promotion choice is not always the same, but could depend on the type of the piece that promotes. One way to implement this would be to alter the meaning of the promoChoice parameter when it is used after a piece definition, to apply only to that piece type, and have each piece type then use its own set of choices when the zone rules or an asterisk in the morph or captureMatrix orders a promotion choice.
Or even better, allow the definition of a number of choice sets that are not directly associated with a piece type, e.g. separated by slashes in the promoChoice parameter. Promotion as per maxPromote and promoZone would then use the first of those sets. But promotions ordered by the morph or captureMatrix could explicitly refer to one of the other sets by putting a digit in the element referring to that square or (attacker, victim) combination. So that the choice for a given type can depend on where it promotes in a location-triggered promotion, or on what it captures.
Another way to enhance the capabilities is a better coexistence of chess-like and shogi-like promotions. E.g. your promotion rules for non-Pawns could conveniently be configured by a promoOffset parameter, and proper ordering of the piece definitions. Then we could set maxPromote=0 to suppress any automatic invocation of the promotion procedure, and only rely on promotions to be requested by the morph or captureMatrix. There would be separate symbols in those matrices for indicating promotion per promoOffset and promotion per choice set, and in the first case there could be different symbols for a normal promote/defer choice, or an automatic deferral when the promotion piece is not available in the holdings. (For a choice set this distinction would have been indicated as part of the set, as is already possible in promoChoice. An automatic promotion can already be indicated by putting the piece ID of the promoted type in the matrices.)