Показать сообщение отдельно
Старый 28.01.2018, 22:44
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 102  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Друзья! Вновь прошу помочь и опять скорее с принципиальным решением, нежели чем с конкретной реализацией. Я добрался до самого важного - до подготовки и вывода игроку контекстных текстов. Вместе с артами это главное, что должно быть сделано, и сделано хорошо. Под хорошо я подразумеваю гибкий подбор нужных фраз в зависимости от значений различных игровых свойств. Так например, если наш персонаж наносит врагу удар, то в зависимости от его силы и скилла для выбранного оружия, игрок должен увидеть:

1. высокая сила, высокий скилл: "Идеально рассчитав момент, Вы нанесли удар сокрушительной силы"
2. высокая сила, низкий скилл: "Вы рубанули со всей дури, впрочем, не особо контролируя, куда прилетает острие вашего оружия"
3. низкая сила, высокий скилл: "Вы отлично рассчитали траекторию, однако вам не хватило силы как следует вложиться в удар."
...и так далее.

Решать данную задачу чисто математически, совершая какие-либо действия над численными значениями интересующих свойств и анализируя результат, я даже не стал пытаться. Если определяющих свойств два, то ещё можно придумать что-то типа метода наименьших квадратов, но если их 3 или 5, то такая модель становится нерешаемой.

При этом, разумеется, решение должно обеспечивать приличный уровень абстракции, чтобы не переписывать весь механизм под каждую конкретную ситуацию. Мне пока придумался (и уже реализован) такой вариант. Я определяю набор свойств, влияющих на текст (сила и скилл из примера выше), и проверяю их значения, используя уже существующий способ проверки условий доступности игровых действий. Каждая проверка возвращает результат true или false. Таким образом, для описанного в примере случая я по очереди проверяю:
  • сила больше N?
  • сила меньше M?
  • скилл больше N?
  • скилл меньше M?
и кодирую результат с помощью 1 или 0. Таким образом, на выходе получается последовательность типа String вида 0110 для низкой силы и высокого скилла или 0001 для средней силы и низкого скилла, а если все значения средние, то будет 0000 и т.д.

Полученный код отправляется в парсер, который загружает из ActionData заранее заготовленные варианты интерпретации таких последовательностей. Они построены по следующему принципу: 0 или 1 требуют строгого соответствия, а Х означает, что данный показатель не важен и подойдёт любой. Каждой комбинации соответствует свой вариант текста, портрет для вывода и т.п. Варианты сравниваются сверху вниз, чуть только соответствие найдено, алгоритм прекращает свою работу и возвращает найденные ID. А поставив в конец XXXX, мы гарантированно получаем вариант по умолчанию, мимо которого уже точно не проскочишь.

Выглядит примерно так:
Код AS3:
private const reactionProfile: Array =
			[
				{code: "1010", profileID: "mightySkilledPunch"},
				{code: "1001", profileID: "mightyUnskilledPunch"},
				{code: "10XX", profileID: "mightyPunch"},
				{code: "XXXX", profileID: "default"}
			];
Беда в том, что мне пока совсем не нравится то, что получилось. Главная проблема - читабельность и наглядность. Сказать, что они плохие - ничего не сказать! Буквально отошёл сварить кофейку, ответил на телефон, и вернувшись, смотрю как баран на эти единицы и нули. А учитывая, что для разных действий и разных ситуаций, под этими 1, 0, Х могут быть совершенно разные свойства, то совсем никуда не годится.

Надеюсь, понятно объяснил. Если у кого есть идеи как улучшить, буду признателен.
__________________
Не сломано - не чини!