I think you're vastly overestimating the sort of text manipulation that I intend here. Generally speaking we need to insert a planet name or a player name or something, or a ship name, and it's related to a specific condition. The number of condition types are actually shockingly few in order to allow for a huge number of things the game can do.
Given there's no scripting in this, just sets of conditions and triggers to pre-fabricated actions as needed in a few rare cases (spawn a wave is one of the few ones, or spawn new ships on a certain planet), the actual framework is a lot more concise than you might think. So very many things fall under just a few categories that can be reused again and again that you can make really complex scenarios with lots of complex goals without having more than a dozen or two condition types.
And most of the text is hardcoded, because it's flavor and explanation text, aside from some things that are pulling the name of a ship or planet or whatever. There's no need for whitespace management, because if you have something returning an empty string that means your tutorial is at least a little bit busted and needs to be fixed.
It's not really reinventing the wheel, it's using a different wheel someone else created that just does something more basic. I only need to be able to call properties on one level of object, not on sub-objects, and I don't have any interest in arbitrary code execution abilities.
I basically needed a gas powered lawnmower, not a supercar turbo...thing. I'm not a car guy.