Механизм в бета-тестировании, ногами не пинать ))

Код AS3:
package main {
import flash.display.*;
import flash.text.*;
import flash.events.*;
import main.*;
public class AppQuester extends Sprite {
private var questStep;
private var questContent:XMLList;
private var questName:String;
private var questWaitingAction:String;
private var questWaitingParameter:String;
private var questStepNumber:int;
private var containers:Object;
public function AppQuester(_containers,questInfo) {
// Для последующей передачи ссылки на враппер при необходимости
containers = _containers;
// Получаем данные по квесту
var questArr:Array = questInfo.split("|");
questName = questArr[0];
questStepNumber = int(questArr[1]);
questContent = GlobalQuestData.elements(questName);
// Если квест есть и шаг требует вывода на экран - выводим
if (questContent!=null) {
var action:String = questContent.step[questStepNumber].attribute("action");
switch(action) {
case "viewImmediately": showQuestStep(); break;
}
}
}
public function checkEvent(eventData) {
if (eventData.action.toString()==questWaitingAction && eventData.parameter.toString()==questWaitingParameter) { // получили ожидаемое действие пользователя
// Если было открыто - убираем с экрана (позже поставим нормальное удаление)
if (questStep) questStep.y = -2000;
// Переходим к следующему шагу
// и выполняем действие, заложенное на этом шаге
questStepNumber++;
showQuestStep();
}
}
private function showQuestStep() {
// Запоминаем действие и параметр, который ждем
questWaitingAction = questContent.step[questStepNumber].attribute("waitingAction");
questWaitingParameter = questContent.step[questStepNumber].attribute("waitingParameter");
// Если требуется закрыть все окна - закрываем
if (questContent.step[questStepNumber].attribute("closeBefore").toString()=="closeAllComplexInterfaces") {
var appEvent = new AppEvent("closeAllComplexInterfaces","",true)
dispatchEvent(appEvent);
}
// Если требуется записать статус - записываем
if (questContent.step[questStepNumber].attribute("saveStatus").toString()!="") {
var requestData = { questStatus : questContent.step[questStepNumber].attribute("saveStatus") };
var connDB = new DataConnectorDB(containers.wrapper,"saveQuestStatus",requestData);
}
// Открываем лопух правильной формы и ориентации
var windowsVariant:String = questContent.step[questStepNumber].attribute("windowVariant").toString();
switch(windowsVariant) {
case "flipX" : questStep = new QuestStepFlipX();
break;
case "info" : questStep = new QuestInfo();
break;
case "title" : questStep = new QuestTitle();
break;
default: questStep = new QuestStep();
}
// Позиционируем лопух и заполняем контентом
questStep.x = questContent.step[questStepNumber].attribute("mousePositionX");
questStep.y = questContent.step[questStepNumber].attribute("mousePositionY");
questStep.stepTitle.htmlText = "<b>" + questContent.step[questStepNumber].stepTitle + "</b>";
questStep.stepText.htmlText = questContent.step[questStepNumber].stepText;
questStep.btnClose.addEventListener(MouseEvent.CLICK,closeStep);
addChild(questStep);
}
private function closeStep(e:Event) {
removeChild(e.target.parent);
}
}
}
Квест прописан в таблице пользователя в виде тесковой строки questName|questStep. GlobalQuestData - это глобальный объект вида:

Код AS3:
package {
public var GlobalQuestData:XML =
<quests>
<startQuest>
<step stepNumber="0" mousePositionX="165" mousePositionY="215"
action="viewImmediately" condition="noCondition" item="noItem"
waitingAction="openObjectControlInterface"
waitingParameter="Farm" >
<stepTitle>Приветствуем Вас в игре "Поездатый товарняк"!!!</stepTitle>
<stepText>Сейчас Вам нужно произвести первый товар. Нажмите здесь, чтобы запустить производство.</stepText>
</step>
<step stepNumber="1" mousePositionX="655" mousePositionY="220"
windowVariant="flipX"
waitingAction="startManufacture"
waitingParameter="" >
<stepTitle>Всю эту продукцию Вы можете производить</stepTitle>
<stepText>Нажмите здесь, чтобы начать производство риса.</stepText>
</step>
...
</startQuest>
</quests> ;
}
При загрузке приложения, смотрим, нет ли у пользователя активного квеста и на каком шаге. Если есть - порождаем объект класса AppQuester.
В необходимых точках приложения, вызываем метод checkEvent, который проверяет, не ожидает ли квест этого события.