Решение череез 5-ую точку...
Все дела делаем в первом кадре (его лучше сделать пустым, а на последнем кадре написать this.gotoAndPlay(2))
- заводим переменную, которая будет отвечать за надобность "обнуления" анимации.

Код AS3:
var needReset:Boolean = false;
- Заводим массив, каждый елемент которого будет списком мувиков текущего кадра, что здесь начинают свою анимацию (впервые появляются на временной шкале, все другие присутствующие мувики уже стартанули на предыдущих кадрах)

Код AS3:
var frames:Array = new Array();
- вешаем обработчик события Event.ENTER_FRAME, который будет сканировать кадр (если нужно), перезапускать анимацию (если нужно) и отменять необходимость перезапуска анимации, если текущий кадр - последний.

Код AS3:
this.addEventListener(Event.ENTER_FRAME, handleEnterFrame);
function handleEnterFrame(event:Event):void {
if (frames[this.currentFrame] == null) {
frames[this.currentFrame] = scanFrame();
}
if (needReset) {
resetFrame();
}
if (this.currentFrame == this.totalFrames) {
needReset = false;
}
}
- Вешаем обработчик события MouseEvent.CLICK на нужную кнопку, который будет устанавливать необходимость перезапуска анимации и переходить на первый (пустой) кадр главной сцены.

Код AS3:
myButton.addEventListener(MouseEvent.CLICK, handleButtonClick);
function handleButtonClick(event:MouseEvent):void {
needReset = true;
this.gotoAndPlay(1);
}
- Функция проверки наличия мувика в таблице обновлений

Код AS3:
function notScanned(child:MovieClip):void {
var len:uint = frames.length;
for (var i:uint = 0; i < len; ++i) {
if (frames[i] is Array) {
var arr:Array = frames[i];
if (arr.indexOf(child) != -1) return false;
}
}
return true;
}
- Функция сканирования кадра

Код AS3:
function scanFrame():Array {
var res:Array = new Array();
var len:uint = this.numChildren;
for (var i:uint = 0; i < len; ++i) {
var child:MovieClip = this.getChildAt(i) as MovieClip;
if (chid != null) {
if (notScanned(child)) {
res.push(child);
}
}
}
return res;
}
- Функция обновления кадра

Код AS3:
function resetFrame():void {
var arr:Array = frames[this.currentFrame];
if (arr != null) {
var len:uint = arr.length;
for (var i:uint = 0; i < len; ++i) {
var mc:MovieClip = arr[i] as MovieClip;
mc.gotoAndPlay(1);
}
}
}
-----------
Все вместе

Код AS3:
var needReset:Boolean = false;
var frames:Array = new Array();
this.addEventListener(Event.ENTER_FRAME, handleEnterFrame);
myButton.addEventListener(MouseEvent.CLICK, handleButtonClick);
function notScanned(child:MovieClip):void {
var len:uint = frames.length;
for (var i:uint = 0; i < len; ++i) {
if (frames[i] is Array) {
var arr:Array = frames[i];
if (arr.indexOf(child) != -1) return false;
}
}
return true;
}
function scanFrame():Array {
var res:Array = new Array();
var len:uint = this.numChildren;
for (var i:uint = 0; i < len; ++i) {
var child:MovieClip = this.getChildAt(i) as MovieClip;
if (chid != null) {
if (notScanned(child)) {
res.push(child);
}
}
}
return res;
}
function resetFrame():void {
var arr:Array = frames[this.currentFrame];
if (arr != null) {
var len:uint = arr.length;
for (var i:uint = 0; i < len; ++i) {
var mc:MovieClip = arr[i] as MovieClip;
mc.gotoAndPlay(1);
}
}
}
function handleEnterFrame(event:Event):void {
if (frames[this.currentFrame] == null) {
frames[this.currentFrame] = scanFrame();
}
if (needReset) {
resetFrame();
}
if (this.currentFrame == this.totalFrames) {
needReset = false;
}
}
function handleButtonClick(event:MouseEvent):void {
needReset = true;
this.gotoAndPlay(1);
}
З.Ы.: Кнопку обновления лучше всего сначала сделать невидимой и показать ее только после последнем кадра. Тогда будет увереность, что все кадры просканированы!
З.З.Ы.: Код написан "с фонаря", а проверять поленился... Но, думаю, идея понятна.
З.З.З.Ы.: Если мувики главногй сцены содержат в себе другие анимированые мувики, тогда прийдется алгоритм переделать под рекурсию, но раз мне лень было тестить свой код, то на рекурсию сами понимаете...