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

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

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

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

Пошаговое обучение

Сейчас мы покажем простейший файл сценария и объясним в нём каждую строчку. Данный сценарий не отражает все доступные возможности, но он покажет те основы, которые помогут Вам в дальнейшем обучении.

Перед чтением этого раздела было бы неплохо почитать что-нибудь про ситаксис Wesnoth Markup Language: WML

Первая часть


#textdomain wesnoth-Simple_Campaign
[scenario]

  id=01_test-1
  next_scenario=02_test-more
 
  name= _ "A Simple Test Scenario"
  map_data="{~add-ons/Test_Campaign/maps/testmap.map}"
  turns=20
 
  {DAWN}
  {MORNING}
  {AFTERNOON}
  {DUSK}
  {FIRST_WATCH}
  {SECOND_WATCH}
 
  music=battle.ogg
 
  [event]
    name=prestart
    [objectives]
      side=1
      [objective]
        description= _ "Defeat Enemy Leader"
        condition=win
      [/objective]
      [objective]
        description= _ "Death of Konrad"
        condition=lose
      [/objective]
      [objective]
        description= _ "Turns run out"
        condition=lose
      [/objective]
    [/objectives]
  [/event]

продолжение ниже
    ↓ ↓ ↓

  • #textdomain должен находиться в начале вашего файла сценария, если Вы хотите предоставить возможность его локализации. Формат - #textdomain wesnoth-Имя_вашей_кампании, как определено в вашем файле your _main.cfg.


Каждый сценарий должен быть заключён в теги; тег [scenario] используется для сценариев кампаний. Первый набор атрибутов в теге сценария описывает его основные параметры:

  • id (сокращение от identifier(идентификатор)) имя вашего сценария для и он не отображается в течение игры. Это значение используется для отображения игровой статистики (она будет отображаться на http://stats.wesnoth.org по числовому порядку, так то неплохо бы установить в качестве id число). Это значение так же используется в других тегах и файлах, например, в теге [campaign] для атрибута first_scenario (см BuildingCampaignsTheCampaignFile), или внутри тега [scenario] для атрибута

next_scenario (см ниже).

  • Значением атрибута next_scenario является id (см выше) того сценария, который предстоит сыграть после победы в данном сценарии. Юниты из текущего сценария будут доступны для призыва (если только Вы не замените список призыва, но об этом позже). Если ваш сценарий не часть кампании или это последний сценарий - вы должны разместить в файле строку next_scenario=null или просто не указывать этот атрибут. В таком случае игра просто отобразит экран End после победы в сценарии.
  • Значение атрибута name показывается на вступительном экране перед началом каждого сценария (он может содержать изображение карты или любую другую штуку. См BuildingScenariosIntermediate для объяснения как это сделать). Оно так же используется для создания имён сохранений. Нижнее подчёркивание перед именем сделает его локализуемым.
  • Следующий атрибут, map_data, немного хитрый. Обычно map data (текст, который используется для создания карты) указывается напрямую в кавычках. Однако, часто бывает полезно хранить данные карты в отдельном файле и просто указать его в сценарии (всё ещё в кавычках) используя команды препроцессора. Код {~add-ons/Test_Campaign/maps/testmap.map} сообщает движку, что карту надо искать в файле, который находится в папке userdata (см EditingWesnoth иPreprocessorRef). Вы можете создавать и редактировать карты используя встроенный редактор карт (см BuildingMaps).
  • Наконец, последний атрибут в верхней части - turns. Это количество ходов, за которое игрок должен пройти сценарий (оно может быть изменено в процессе игры, но, опять же, об этом позже). Если игрок не успел за это время выиграть - он проигрывает (т.е. вызывается событие defeat. См EventWML)

Следующий раздел - это набор макросов, которые будут выполнены препроцессором Wesnoth'a. Макросы, фактически, являются WML сокращениями. Они позволяют Вам определить куски кода, которые могут быть использованы снова по необходимости. Wesnoth предоставляет Вам целый набор стандартных, уже написанных макросов, чтобы сделать Вашу жизнь проще, но Вы и сами можете их написать (об этом позже!). Давайте вернёмся к примеру. Макрос, показанный вверху описывает то, какие этапы содержат день в сценарии. Список макросов в этом сценарии описывает стандартное течение дня в Wesnoth. Если Вы хотите, чтобы действие в вашем сценарии происходило ночью - уберите всё, кроме {SECOND_WATCH}. Это может быть полезным, например, если вы планируете драку Халдрика с нежитью и хотите дать нежити преимущество. Помните, что если в вашем сценарии есть только одно время суток, то весь сценарий уложится в один день, тогда как обычно сценарии длятся несколько дней.

Атрибут music содержит в качестве значения имя файла с музыкой (см MusicListWML). Этот файл должен быть в папке music/ и должен быть в формате Ogg.

Тег, с которым Вы должны быть хорошо знакомы при создании сценариев - это [event]...[/event]. Тег event используется для описания того, что необходимо сделать, когда происходит некоторое событие. Тип события указывается в атрибуте name тега event. В нашем случае мы описываем так называемое событие prestart. Оно возникает сразу после всех вступительных заставок, которые относятся к этому сценарию, и непосредственно перед тем, как будет показана сама карта. Это событие используется для установки целей сценария, то есть того, что показывается в окне задач сценария при его начале. Цель этого окна - сообщить игроку, что нужно сделать для того, чтобы выиграть в этом сценарии, и что именно будет расцениваться как поражение. Эти условия победы и поражения определяются в теге [objective] (Обратите внимание, что objectives - мн.ч.). Далее каждое условие определяется в своём собственном теге [objective] (тут уже единственное число), где для условий победы атрибуту condition устанавливается значение win, а условиям поражения - lose. В нашем примере, для победы установлено условие "Defeat Enemy Leader", а для поражения есть два варианта - либо "Death of Konrad" либо "Turns run out" (может быть любое количество условий победы или поражения). Соответственно, окно целей сценария будет выглядеть так:

A Simple Test Scenario
Victory:
Defeat Enemy Leader
Defeat:
Death of Konrad
Turns run out

                        [ OK ]

Обратите внимание, что тег [objectives] не определяет условия победы или поражения для движка игры. Он лишь определяет то, что будет сказано игроку. Условия победы или поражения будут заданы в коде с использованием различных событий.

Атрибут side в [objectives] означает, что условия, определяемые в [objective] касаются только фракции или альянса side 1 (см. ниже). В однопользовательской игре, сторона 1 обычно означает игрока. Нижнее подчёркивание ("_") необходимо для перевода с использованием Gettext.

Вторая часть

Мы уже далеко продвинулись! Последняя обязательная часть описывает то, с чем начинают игру игроки (и игроки и компьютер), что они могут делать и что не могут. Каждый игрок описывается в теге [side] со словом side, относящимся к фракции, банде или орде игрока.

    ↑ ↑ ↑
continued from above


  [side]
    side=1
    controller=human
    team_name=2
    user_team_name= _ "Konrad's forces"

    type=Commander
    id=Konrad
    name= _ "Konrad"
    canrecruit=yes

    recruit=Elvish Fighter,Elvish Archer,Horseman,Mage,Elvish Shaman

    {GOLD 100 50 0}
    {INCOME 10 5 0}
  [/side] 
[/scenario]

Выше Вы можете видеть простой пример тега [side], описывающего игрока. Первая группа атрибутов в этом теге относится к стороне в общем:

  • side: лидер этой стороны помещается на место, помеченное этой цифрой (см BuildingMaps). Это может быть число от 1 до 9.
  • controller принимает одно из двух возможных значений: human or ai (т.е., искусственный интеллект, ваш компьютер). По умолчанию значением этого атрибута является ai.
  • team_name описывает, к какой команде принадлежит эта сторона. По умолчанию - к команде с тем же номером, что и side, но, например, если Вы присвоите этому атрибуту значение 2, то эта сторона будет в союзе со стороной 2 (если только Вы не изменили team_name стороны 2).
  • user_team_name это то имя, которое отображается в статистике стороны (при нажатии alt+s во время игры). Нижнее подчёркивание ("_") способствует переводу с использованием Gettext.

Следующая группа атрибутов описывает лидера стороны:

  • canrecruit: этот атрибут может иметь значения либо yes либо no (эквивалентные 1 и 0 или true и false тоже можно использовать). Если значение установлено в no, лидер не сможет нанимать юнитов (хотя, какой он после этого лидер?). Любая сторона без выражения canrecruit=yes автоматически проигрывает, так что убедитесь, что этот атрибут установлен.
  • type описывает тип юнита лидера. Допустимые значения перечислены в таблица юнитов в Весноте.
  • id идентификатор лидера, используется движком и не показывается игроку.
  • name имя лидера, видимо игроку. Нижнее подчёркивание необходимо для локализации.

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

Последний атрибут, recruit, это список с разделителями-запятыми типов юнитов. Эти типы и будут доступны для найма лидеру. Он необходим только для первого сценария, так как этот список наследуется всеми последующими сценариями.

И, наконец, вызываются два макроса. Первый, GOLD, принимает три положительных числа. Они определяют количество денег, с которым игрок начнёт игру на лёгком, среднем, и тяжёлом уровне сложности соответственно. Для игрока (controller=human) это определяет только минимальное количество золота. Реальное же число золота, с которым будет начата игра определяется тем, как игрок закончит предыдущий сценарий. Второй макрос, INCOME, аналогичен GOLD, но он определяет доход. Значения по умолчанию для GOLD и INCOME - 100 и 2 соответственно.

Заставляем всё это работать

Для того, чтобы теперь в этот сценарий можно было поиграть нам надо создать для него кампанию (см BuildingCampaignsTheCampaignFile). Она должна быть сохранена не в основном каталоге data/campaigns а в userdata/data/campaigns. Это позволит не испортить основные кампании или, что ещё хуже, текущие игры. Пожалуйста, обратите внимание, что все файлы (т.е., файлы кампаний и сценариев для каждого уровня) должны быть сохранены с расширением .cfg (например, _main.cfg). Вот короткий пример файла кампании:

[campaign]
  name= _ "Test Campaign"
  first_scenario=test-1
  define=CAMPAIGN_TEST_CAMPAIGN
  difficulties=EASY,NORMAL,HARD
  difficulty_descriptions={MENU_IMG_TXT2 "units/elves-wood/fighter.png" _"Fighter" _"(Beginner)"} +
   ";*" + {MENU_IMG_TXT2 "units/elves-wood/hero.png" _"Hero" _"(Normal)"} +
   ";" + {MENU_IMG_TXT2 "units/elves-wood/champion.png" _"Champion" _"(Hard)"}
  icon="units/elves-wood/hero.png" 
[/campaign]
#ifdef CAMPAIGN_TEST_CAMPAIGN
{~add-ons/test_campaign/scenarios}
#endif

Тег [campaign] описывает кампанию. Первый атрибут, name, определяет то, что будет показано в меню выбора кампаний. Второй, first_scenario, определяет ID первого сценария кампании. Последовательность сценариев определяется атрибутами next_scenario в самих сценариях (см в первой части этого раздела). Так как первый сценарий, очевидно, не имеет предшествующего сценария, то сноска на него даётся здесь. Для того, чтобы Wesnoth мог найти этот сценарий, мы должны включить папку сценариев в нашу кампанию. Последнее выражение в файле кампании и делает это. Это влючение ограничено (best guarded) символом (PreprocessorRef)препроцессора, которое уникально для этой кампании, так что сценарии будут подключены только если выбрана именно эта кампания. Символ препроцессора для кампнаии определяется ключом define.

Атрибут difficulties=EASY,NORMAL,HARD говорит Wesnoth использовать значение EASY если будет выбран первый уровень сложности и NORMAL или HARD если выбраны второй или третий уровни соответственно. Выражение #ifdef может быть использовано позже для проверки значения этого атрибута (см PreprocessorRef). Рекомендуется, чтобы Вы не использовали другие имена, кроме EASY, NORMAL, или HARD для ваших макросов, так как из-за этого могут не работать стандартные макросы, такие как {GOLD} и {INCOME}.

Два необязательных атрибута - difficulty_descriptions и icon. icon в качестве своего значения использует имя картинки, которая будет символизировать кампанию в меню выбора кампаний. difficulty_descriptions использует стандартный рекомендуемый синтаксис. Вы указываете картинку, название уровня сложности и сам уровень сложности. Очевидно, что в нашем случае elvish-fighter.png будет ассоциирован с уровнем сложности easy, elvish-hero.png - с normal, а elvish-champion.png - с hard. Вы можете использовать любые слова, которые хотите и не обязаны ограничиваться только easy, normal и hard. А вот в секции difficulties у Вас такой свободы нет, так как многие макросы завязаны именно на эти имена.

Каждый из элементов списка в difficulty_description начинается с амперсанда ("&"). За ним следует имя файла с изображением, знак равенства и текст для отображения, то есть, "Easy". Обратите внимание, что текст для отображения с указанием уровня сложности (обратите внимание, что это не тот же текст, что и в difficulties).

Дополнительно Вы можете поместить звёздочку ("*") перед одинм из элементов списка difficulty_desciptions для того, чтобы указать выбор по умолчанию. В нашем примере по умолчанию установлен нормальный уровень сложности.

Дополнительная информация