Создание сценариев - продвинутое

Материал из Wesnoth Life Wiki
Перейти к: навигация, поиск

Быстрое перемещение

Создание сценариев

Building scenarios: Advanced

TODO:

Тут содержится повторение того, что уже есть в Создание сценариев - средний уровень А должно быть:

  • (больше) информации про создание и использование препроцессоров (PreprocessorRef)
  • информация об основном слое файла сценария
  • продвинутая фильтрация
  • ...

Каждый кто чувствует в себе силы приглашается на дописывание!

Продвинутые события

Внутренние действия

Смотрите InternalActionsWML в поисках полного писка всех возможных тегов и значений. Далее будет объяснены основы создания и использования переменных.

Переменные

(Этот раздел можно пропустить, если Вы уже знакомы с переменными)

(Смотрите VariablesWML)

Что такое переменные? Переменные - это по сути имена. А с этими именами мы связываем некоторые значения. Вы можете сравнить их со словами, так как слова так же ассоциированны с некоторыми объектами, чувствами, людьми, хоть самими ими и не являются. Так что переменные - лишь способ общения Вас и компьютера (то есть с движком Wesnoth).

Наиболее важное свойство переменных - это то, что они могут меняться со временем (иначе мы назвали бы их константами). А поскольку они меняются, мы можем использовать их для реакции на события или для отслеживания изменений. Вы уже делали это в Создание сценариев - средний уровень при помощи тега [event]. Тогда мы хотели обработать событие перемещения Конрада в 4,8,для чего использовали переменные х и у.

Большинство переменных, предоставляемых движком, ассоциированы с конкретными тегами и могут использоваться только внутри них.

Работа с переменными

Есть три действия, которые можно выполнить при помощи одного тега '[set_variable]'. Предположим, что мы хотим сохранить 'Hello World' в переменной с именем message_to_the_world. Это делается так:

[event]
.
.
.
  [set_variable]
    #Имя нашей переменной:
    name=message_to_the_world
    #Значение для переменной, обратите внимание на нижнее подчёркивание!
    value= _ "Hello World!"
  [/set_variable]
 .
 .
 .
[/event]

Теперь, если мы захотим изменить её значение на что-то другое, например 'Goodbye World', мы можем использовать тот же самый код, что и выше. Если мы захотим что-то добавить к нашему сообщению, мы сделаем это так:

[event]
.
.
.
  [set_variable]
    name=message_to_the_world
    value= _ "$message_to_the_world Have a nice day!"
  [/set_variable]
 .
 .
 .
[/event]

До сих пор мы использовали текстовые переменные (они же строки). Но мы так же можем хранить числа и использовать основные математические операции. Вот пример:

[event]
.
.
.
  [set_variable]
    name=number_x
    value=10
  [/set_variable]
  [set_variable]
    name=number_x
    add=-9
  [/set_variable]
  [set_variable]
    name=number_x
    multiply=200
  [/set_variable]
  [set_variable]
    name=number_x
    multiply=0.5
  [/set_variable]
 .
 .
 .
[/event]

В этом примере мы сохранили в переменной с именем number_x значение 10. Потом мы уменьшили его на 9 (=1), и умножили на 200 (=200) а затем разделили на два (или умножили на 0.5) получив в результате 100.

Использование переменных

Теперь, после того, как Вы научились работать с переменными, мы начнём их использовать. Для начала, Вы должны знать, какие переменные есть в вашем распоряжении. Для тега event это:

  • side_number: количество сторон, участвующих в игре (может быть пустым в начале игры или для предстартовых событий)
  • turn_number: номер текущего хода (может быть пустым в начале игры или для предстартовых событий)
  • x1: x-координата локации, где произошло последнее событие
  • y1: y-координата локации, где произошло последнее событие
  • x2: x-координата вспомогательной локации, где произошло последнее событие
  • y2: y-координата вспомогательной локации, где произошло последнее событие
  • unit: в пределах события - юнит, расположенный в локации с координатами $x1,$y1
  • second_unit: в пределах события - юнит, расположенный в локации с координатами $x2,$y2
  • this_unit: в пределах стандартного фильтра юнитов - юнит, подходящий под этот фильтр.

Некоторые из этих переменных являются всего лишь контейнерами для других переменных, например, переменная unit. Для того, чтобы получить доступ к 'под'переменным, используйте точки:

unit.hitpoints
unit.side
...

Для примера мы будем использовать unit, чтобы посмотреть, как всё это работает:

[scenario]
.
.
.
  [event]
    #Юнит перемещается на тайл:
    name=moveto
    [filter]
      x,y=25,26
    [/filter]
    
    
    [set_variable]
      name=unit.hitpoints
      add=-5
    [/set_variable]
    [set_variable]
      name=unit.status.poisoned
      value=yes
    [/set_variable]

    #После того, как мы изменили значения, мы должны их активировать (применить)
    #Для этого мы будем использовать тег unstore_unit:
    [unstore_unit]
      variable=unit
      find_vacant=no
    [/unstore_unit]
  [/event]
  #Всё!
.
.
.
[/scenario]

Тут есть только один неизвестный нам тег - [unstore_unit]. Для его объяснения я расскажу Вам про его противоположность - [store_unit]. [store_unit] сохраняет юнита или нескольких юнитов в выбранной Вами переменной. После чего Вы можете работать с ними уже известным образом. А для сохранения изменений в юнитах используется [unstore_unit]. Более подробно об этом смотрите в InternalActions.

В версии 1.9, всё это можно сделать ещё проще:

  [event]
    #юнит перемещается в тайл:
    name=moveto
    [filter]
      x,y=25,26
    [/filter]
    #модифицируем юнит   
    [modify_unit]
        [filter]
            x,y=25,26  
        [/filter]
        hitpoints=$($unit.hitpoints - 5)
        status.poisoned=yes
    [/modify_unit]
  [/event]
  #Всё!
[/scenario]

Вы, возможно, заметили знак доллара ($) перед некоторыми именами переменных. Это означает, что движок заменит '$your_variable_name' текущим значением этой переменной. Например:

[set_variable]
  name=my_variable   # тут Вы обращаетесь к самой переменной
  value=5
[/set_variable]
[message]
  speaker=narrator
  message= _ "Your variable's value: $my_variable"  # а тут будет показано "Your variable value: 5"
[/message]


GetText & Переводы

Как заметил Viliam (цитата не дословная):

Локализация программ состоит из двух шагов. Во-первых, создать сценарий, который возможно локализовать; причём желательно легко
локализовать. [...] Второй шаг - перевести тексты... но это могут сделать и переводчики.

Итак, как создатель кампании / сценария, Вы должны обеспечить возможность легко его локализовать. И это легко сделать - для этого достаточно просто поместить нижнее подчёркивание перед всеми текстами, которые будут показаны на экране; _ обозначает локализуемую строку. GetText тогда сможет найти перевод, основанный на ваших локальных настройках. Вот пример для большей ясности:

.
.
.
[message]
  speaker=Konrad
  message= _ "I am mighty Konrad! I fought many dummies and now I will fight you!"
[/message]
.
.
.

Ключ message содержит слова, которые должны быть показаны, когда Конрад говорит. Так что это локализуемая строка, поскольку перед ней стоит знак _.

Вильям так же сказал:

Самое главное правило - не делите предложения.
В неоторых языках добавление ещё одного слова требует большего, чем просто склейка строк.
Некоторые языки используют склонения.

Краткий список тегов

ScenarioWML теги верхнего уровня: [scenario], [multiplayer], [test], и [tutorial]

Дополнительно