format has gone somewhat out of hand, so let's give up a bit on that for
the good of mankind ...
All note elements that are allowed to be note colored *always* have a note
type in the filename; if XIsNoteColor is off, "4th" is used. This way, we
don't have different sets of filename rules, fixing clashes between skins
and the fallback, and a number of things become simpler (many of which
I'm still discovering, so I won't try to enumerate them here just now).
Note skin updates coming ...
Design goals are: minimal overhead (one table); minimal extra code to use
it (two lines in the header, to have a space to store a reference to the
table), same API for classes with and without a table; allow switching to
a table-bound class without derived classes having to know about it; keep
zero per-object overhead for classes that don't need it.
Prepare backgrounds, too.
Disallow calling SetNewScreen from a screen ctor/Init; it complicates things.
When loading a new screen (through LoadDelayedScreen), load the
screen with PrepareScreen, to reduce code paths.
handle "set a new screen while we're still loading the old one". (Note that
this isn't preferred, anyway; it's much better to decide in advance which
screen you want via Lua. ScreenBranch is deprecated.)
re-set in the new screen's ctor." Don't do that--don't assume that the old
LoseFocus will be called before the ctor or Init. If you're doing something that
interacts with state changed by focus, do it in the first update, when you're
guaranteed to have focus. Make no guarantees about who has focus when
a new screen is constructed; only that LoseFocus will be sent before GainFocus,
and GainFocus before the first update.