This also makes loading consistent between ActorFrame, ActorScroller and DActorScroller.
Previously, we ran ActorFrame::LoadFromNode before adding children, which caused InitCommand
to be run before adding children.
in note skins.
- skins with only one ghost flash can simply override "Common Tap Explosion Bright"
and "Dim"
- don't need to have tons of files to redirect each type of ghost flash
- still supports overriding ghost commands in NoteSkin metrics.ini
- fixes obscure bug: the first bright ghost flash wouldn't hide the last dim ghost flash
without implementing operator= and a copy ctor; the ActorFrame child list
won't be updated. (This used to work because, with a fixed-length array,
this loading was done in the ctor, though it should have been done in Init.) Also
fixes loads happening during Player::Load, which shouldn't happen.
This won't work with theme reloading, but that hasn't worked in a long time anyway
(recreating the Lua environment while it's actually in use is hard).
XML features, where there's not necessarily any corrolation between elements
of different graphics. This didn't work well, anyway: it'd apply the old tweening
queue to the new graphics, but they might have completely different animations.
This will cause transitions between NoteSkins to be more abrupt, but we don't
use that feature anyway.
muted sounds when GetPlayOnlyCriticalSounds changes. Fixes background music
playing for a split second in some sound drivers when start is pressed during attract.
with Subdivisions > 1, m_exprTransformFunction uses too much memory, and
very few scrollers use this. Usually, per-item effects can be done better by
using DynamicActorScroller and doing the effects on item load (but this can
do some things that can't).
backup directory immediately after a successful load. This ensures that
the data we're copying is valid, so after a successful copy, the backup
is valid, too. This has a couple problems:
- Copying takes a while. It's much faster to move data.
- Data shouldn't be written during a profile read. Players should be able
to assume that it's safe to remove the memory card at any time except
when the game is explicitly saving.
- Copying good data from one place to another is just as prone to error as
initially writing it. It's at least as easy for the backup copy to fail
and result in a bad backup as it is for a save to fail in the first place.
Instead, when we successfully load profile data (and not from a backup),
set a flag. Later, when we save over that data, we'll clear the flag and
move the data we're about to overwrite to the backup.
PAGE_TYPE_ALL_STEPS, PAGE_TYPE_*_COURSES) and ScreenRankingLines
(PAGE_TYPE_CATEGORY, PAGE_TYPE_TRAIL).
Use DynamicActorScroller for ScreenRankingScroller; reduces overhead
significantly.
ScreenCredits and ScreenRanking without constructing dozens or hundreds
of actors, which saves a lot of memory and is easier to manipulate. This could
also be used to support CourseContentsLists for long courses cheaply, etc.
of 1x1, and are sized by zooming. That's unintuitive, commonly causes
problems when used in conjunction with other stretch effects, and all we have
to do is SetHeight/SetWidth to set the actual size, which will make it behave
exactly like any other sprite. This one didn't work because m_exprTransformFunction
overrides the zoom, usually resetting it to 1x1.