Язык в рогаликах

Материал из Клуб любителей рогаликов
Версия от 12:18, 28 августа 2009; Sanja (обсуждение | вклад) (Первая версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Когда я начал играть в Омегу, мне было всего двенадцать лет, я не мог понять в ней многих вещей поскольку я финн и школьный английский не совсем соответствовал языку использующемуся в Омеге. В нём было слишком много слэнга и использовались выражения, которые не вполне подходили для школьного курса ;), так что я собрал все материалы по английскому и мои оценки по английскому взлетели как ракета. Или может, дело было в безотрывном просмотре телевизора?

Теперь я чувствую себя в Омеге как дома, поскольку я знаю язык. Это даже кажется немного слишком легко ;) Но сегодня в играх наиболее раздражает то, что одни и те же фразы возникают снова и снова. Вы попали в него! Вы поразили его! Кобольд мёртв! Вы фатально ранили мясника-орка! Мясник-орк мертв! Нечто, вроде этого. Большинство из этих предложений действительно просты и втиснуты в один и тот же формат. Подлежащее воздействует глаголом на объект.

Так не должно быть. Такому ленивому человеку как я, никто не мешал почитать слишком много исходников для roguelike-игр. Но то, что я видел, выглядело наподобие print("You hit");print(mons_article); print(mons_name_short); Не слишком трудно, достаточно просто, чтобы не мешать. Вот и всё, что всё время игрок получает. Мило разумеется, что опытные игроки сразу получают информацию, изучив структуру предложений или что-то такое же простое, требуется всего лишь немного игры ;)

С соответствующим интерфейсом игра может стать более красочной. Здесь на C++ показан (интерфейс, который я считаю наилучшим).

if(this!=player) msgbar << subjadj << this-&gtdamage_report();
msgbar << subj << this-&gtsimpleflags() | 0x20*map-&gtisseen(this-&gtx,this-&gty);
msgbar << verbadj << "critically" << 
verb << "hits";
msgbar << objadj << mons-&gtdamage_report();
msgbar << obj << mons-&gtsimpleflags() | 0x20*map-&gtisseen(mons-&gtx,mons-&gty);
...

когда повреждения получает монстр.

if(msgbar.isstop) return;
msgbar << cont << obj2subj;
msgbar << passive << but;
msgbar << verb << "protected";
msgbar << obj << "armor";
msgbar << stop;

И всё, что игрок увидит будет:

You critically hit badly wounded orc but he was protected by 
his armor. (Вы нанесли фатальное ранение тяжело раненому орку,
но он был защищён своей бронёй.)
или You hit orc. (Вы ранили орка.)
или You simply blast orc but he was protected by his armor.
(Вы просто взрываете орка, но он защищён своей бронёй.)
или You strike it. (blind) (Вы ударили его. (вслепую))

Другие варианты

Это можно сделать, сохраняя слова в структурах данных с информацией о том, что они означают. Когда это предложение запрашивается, оно должно создаваться другой функцией. Эта функция также может выбросить слова в зависимости от уровня избыточности, она может поискать синонимы и даже довольно легко перевести простые предложения.

Почему каждый не идёт таким трудным путём? Вы могли бы просто сделать список предложений и использовать их по индексу (если сделано с умом, это - хороший путь). Или также слова. Поскольку этот вариант более модульный, это поможет его поддерживать и программисту не нужно думать о языке. Оставим это переводчикам и людям с лучшими языковыми способностями. И поскольку это совершенно верно - будет дурацкой шуткой, писать такой мудреный интерфейс.

Конечно, это можно использовать в дюжине других игр, особенно спортивных играх, но в roguelike-играх и имеющихся у нас играх это очень необходимо. Нужен, естественно режим:

msgbar << sentence << "You hear a voice: Thank 
you for helping me."; (Вы слышите голос: Спасибо, что помогли мне.)
msgbar << "Killing The Big Bad Monster was beyond my abilities
but"; (Убить Огромного Плохого Монстра было выше моих возможностей, но)
msgbar << "I can die in peace, come to me for reward." 
<< stop; (я смогу умереть с миром, приходи ко мне за наградой.)

Такие предложения можно проиндексировать и перевести позже. Но они достаточно простые для распознаванияи перевода с помощью функции, если это необходимо.

Другой вещью могут быть языки, использующиеся в игре. Как, например, речь гнома или эльфа.

       
msgbar << says_in_language << "Village elder 
says" (Старейшина деревни говорит)
msgbar << "You are welcome to our village" << 
stop; (Добро пожаловать в нашу деревню)

можно отобразить так

75% lang skill Village elder says (Старейшина деревни говорит)
:"You ar velkom to our villch" ()
50% lang skill Village elder says :"yu ar vlekm vil" (Дабро пажалават нашу древню)
25% lang skill Village elder mumbles :"yu r vlkm vil" (Дбро пжалават нашу древню)

и так далее. На большинстве языках, IMO, это легко должно определять вещи, которые дают ошибки. Подобно тем буквам 'e', они действительно могут быть трудными для определеления, как и слово 'to' ('в'). Это в английском, в финском можно легко получать противоположные по смыслу слова как, например "pankkiin" и "pankista" - вход и выход (в банке)). Эти слова стремятся быть длиннее и они много раз добавляются друг к другу. Последнее слово может быть достаточно трудным для определения, я должен догадываться (как я полагаю).



Автор: Esa Ilari Vuokko, Copyright © 01.03.2000.
Источник: неизвестен.
Перевел: Дмитрий О. Бужинский, 06.03.2006.