Показать сообщение отдельно
Старый 16.10.2017, 06:32
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 69  
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Пока сам надумал немного. Есть мысль №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)); // "Братуха, извини, но ты слишком крут для меня. Мне нечего тебе сказать"
       }
}
Эту систему можно дальше рекурсивно усложнять, в зависимости от потребностей. Но для первой игры, я бы не советовал этого делать. Возникнет большая путаница, и есть вероятность, что система вообще не будет работать
__________________
Ко мне можно и нужно обращаться на ты)