I like to use tables a lot. One of the big things is that they are so well organized visually. I also like to put tables in a separate header file, which doesn’t save memory, but it has helped me organizationally.
I know for one of my games I had a list of random text because that seemed like the way to go, but I changed it to a one-column table that was easier to sort (automatically or with a script) and weed out duplicates. This has meant much less of a headache for me. Another bonus was, if an item threw an error, I could see which one instead of seeing “Oops, there’s an error in one of these 100 entries! Now which did I add recently?”
If tables get very big, you may have to change compiler constants to accomodate them, but that’s a minor nuisance.
ETA @MattW: I’ve had bigger games that did not trip the memory limit. Was the problem that some of the strings were very long, or there were a lot of table entries? I know I didn’t have a problem adding a lot of tables to my 2017 IFComp entry, but it mostly used variables instead of long strings.
I have to admit I don’t know what adds a lot to the memory. I’ve done some testing with a switch Zarf showed me …
For those who don’t know, adding this tells you when you hit z-machine limits, and you can add/subtract code as needed to see what takes up a ton of space.
Include (- Switches z; -) after "ICL Commands" in "Output.i6t".