Apparently if you create a dict with pre-populated data, pyright infers
the dict's types for type checking purposes, and this can be wrong here
where my data dicts are massive sprawling affairs of dynamic info.
The right thing to do is probably turn this into a class, but for now
I'll just split the dicts pyright complains about up differently.
For now this just brings us to parity so a BCCE spoiler log will produce
the same JSON output as a BCEX log. More testing needed on how else BCCE
differs.
Due to inconsistent structure of spoiler logs, r- spells with "Equal
chance of any of the following" could end a line with a ':;". This just
find-and-replaces ':;' with ':' because that should never happen in
reality.
Rather than COMMANDS and its join to CHRACTERS['commands'] be a messy
cluster of \n, do some string parsing to make it look much cleaner and
more readable.