Sometimes it is better not to take shortcuts with design. I want this game to have 100 stages. At first I was just generating random permutations of enemies. Instead I am going to author each stage manually, and provide a name. Most of these 100 stages will unlock something, as a reward and to gradually increase complexity.
Example 1
"Green Pasture" will consist only of goblin archers, that do less damage but have a reduced turn counter (so they attack more quickly). The stage will permit the maximum number of simultaneous enemies, which is 5.
Example 2
An ice stage that only has one completely overpowered golem. Like a mini-boss fight, where different heroes and skills need to be chosen. Specifically, increasing the turn-counter of the golem to delay its turn. What if the stage can only be played with one hero instead of 3 or 4?
Example 3
Enemies completely immune to certain elements. Some creepy dungeon of ghosts, that can only be killed with fire? Things like this, to keep the game interesting, but hopefully not annoying.
More thoughts
Some stages will have many enemies, and others fewer. It will be necessary to choose suitable skills for each hero, like ones that target all or just one. Replaying the same stage repeatedly for experience and coins will be expected. I do not expect any player to just plow through all these stages in one sitting.
I can defer this kind of creative work to moments when I am in transit, like on a bus or train for many hours. Programming is a bit more involved, so I need a desk and decent chair without distractions of my surroundings.
Here is the long map I have arranged, to place the 100 stages. I will paint and adjust the seams later. For now, they are just rectangles naively copy-and-pasted without continuity.
The vertical dimension of this map is insanely high. After I author the stages, and then adjust the seams, I will split up this image into pieces. I think some phones will force a texture like this to be square, so that would waste a lot of memory by extending the horizontal to match the vertical by adding unused space.