Цитата:
|
Пока сам надумал немного. Есть мысль №1 о том что поскольку условий может быть много, и точное их количество неизвестно для различных случаев, это должен быть некий массив, который будет передаваться на входе в метод-определитель доступности, чтобы он - метод - пробегал по всем и давал итоговое заключение на выходе: либо всё соблюдено, либо № элемента, который "не проходит". Мысль №2, что если у нас все характеристики персонажей (и не только персонажей) заданы через строковые идентификаторы типа "character.intelligence", то их можно и запихивать в массив с условиями, чтобы быстро обратиться за соответствующим значением. А вот всё остальное (запись и хранение целевых значений, операторов сравнения и т.п.) пока не находит ответов.
|
Тут сам диалог получается как отдельная мини игра.
Не приходилось такого делать, но представляю это себе примерно так:
Диалог представляет из себя объект, приблизительно такого вида

Код AS3:
{
dialog1: [{skillLevel: 1, textID: "walkInThePark"}, {skillLevel: 2, textID: "killDragon"}, { skillLevel: 100500, textID: "changeTheWorld" }]
}
Дальше игрок, допустим, подходит к какому-то NPC, которому прописан ID диалога. В данном случае dialog1 и этот NPC выбирает что сказать в зависимости от текущих возможностей игрока. В базовом классе NPC должен быть механизм определения

Код AS3:
public function showDialog(dialogID:):void {
var playerSkillLevel:int = _gameModel.selectedCharacter.skillLevel;
var dialogVersions:Array = DialogManager.getDialogVersionsByID(dialogID); // какое-то централизированное хранилище диалогов
for each (var dialog:Object in dialogVersions) {
if (dialog.skillLevel == playerSkillLevel) {
showDialog(dialog.textID);
return; // дальше выполнять метод нельзя, так как диалог найден
}
}
showDialog(null); // если в цикле ничего не нашлось, показываем диалог-пустышку
}
private function showDialog(textID:String):void {
if (textID) {
trace(i18n.getTextByID(textID)); // "Иди, завали дракона, о игрок второго уровня!"
} else {
trace(i18n.getTextByID(DialogManager.NOTHING_TO_SAY)); // "Братуха, извини, но ты слишком крут для меня. Мне нечего тебе сказать"
}
}
Эту систему можно дальше рекурсивно усложнять, в зависимости от потребностей. Но для первой игры, я бы не советовал этого делать. Возникнет большая путаница, и есть вероятность, что система вообще не будет работать