В AEIIRM версии 2.3 присутствует, хотя и не полная, поддержка скриптов для миссий кампании. Это как минимум позволяет свободно изменять карты кампании без необходимости их подгонять под "вшитые" в игру сценарии, например, теперь можно менять положения юнитов, которые раньше должны были оставаться там, куда их поместили разработчики игры. При определенном творческом подходе, однако, можно будет даже создавать свои собственные сценарии для кампании.
Скрипт устроен довольно просто. Это обычный текстовый файл, в котором описаны возможные состояния скрипта и набор команд, выполняемых в каждом состоянии. По мере продвижения игрока по сценарию миссии скрипт переходит из одного состояния в следующее.
Пример простейшего скрипта:
@Case 0
NextState
@Case 1
CompleteMission
В этом случае игрок просто выигрывает сражение еще до того, как оно успело бы начаться. Рассмотрим этот простой пример пошагово.
Выполнение скрипта начинается с нулевого состояния, при этом будут выполняться инструкции, находящиеся после метки @Case 0. В данном скрипте инструкция там всего одна - NextState, она переводит скрипт в следующее состояние, то есть первое. Соответственно, при следующем запуске скрипта будут выполняться инструкции после метки @Case 1, то есть CompleteMission. Последняя инструкция завершает миссию - игрок победил.
Данный скрипт будет запущен всего два раза: первый раз в нулевом состоянии и второй раз в первом состоянии, после чего миссия завершится. Более сложные скрипты могут запускаться большое число раз, например, если в каком-то состоянии присутствует условие, выполнение которого необходимо для перехода к следующему состоянию (или завершения миссии), скрипт будет запускаться в этом состоянии до тех пор, пока не будет выполнено условие.
Другой, более полезный с точки зрения практического применения скрипт:
@Case 0
ShowMapName ; показываем название карты
Wait 10 ; ждем немного, чтобы это название не пропало сразу же, едва появившись
NextState ; переходим к следующему состоянию
; задержка, вызванная инструкцией Wait 10, произойдет только при следующем запуске скрипта,
; причем из-за инструкции NextState уже в следующем состоянии.
; инструкции внутри одного состояния выполняются без задержек.
@Case 1
SetFadeValue 16 ; убираем занавес (иначе будет видно только черный экран)
SetCursorVisible true ; показываем курсор
StartPlay ; запускаем игру в обычном режиме
NextState ; переходим к следующему состоянию
@Case 2
Test CountUnits -1 -1 1 = 0 ; проверяем, остались ли еще противники
; если предыдущая проверка выполнится успешно, то есть противников будет 0,
; мы окажемся на следующей строчке скрипта.
; если же проверка провалится (число противников не равно 0),
; выполнение скрипта просто завершится.
; при следующем запуске скрипта эта проверка будет выполнена снова, и т.д.
Test GameState = 0 ; проверяем, что игра работает в обычном режиме
; здесь то же самое, что и в случае с проверкой выше.
Wait 10 ; ждем еще немного, пока отыграются запущенные анимации (например, облако дыма над последним поверженным противником)
NextState ; переходим к следующему состоянию
@Case 3
CompleteMission ; завершаем миссию
Этот скрипт можно использовать в качестве своеобразной заглушки для всех карт кампании, если они будут меняться, а подгонять расположение юнитов под встроенный сценарий или писать свой нет желания.
Ниже приведен список всех реализованных на данный момент инструкций.
- Jump <N> - пропустить <N> строк в скрипте.
- Alt <N> - аналогично Jump; задает число строк, которые будут пропущены следующей (и только следующей) инструкцией Test, если проверка не выполнится. По умолчанию принимается Alt -1, то есть в случае невыполнения проверки Test скрипт завершится.
- Test <выражение> <оператор> <значение> - проверить, что <выражение> равно (не равно, больше, меньше, и т.д.) <значение>. Если проверка выполнится, перейти к следующей строке, если не выполнится - пропустить столько строк, сколько задано предшествующей командой Alt (или завершить выполнение скрипта, если команды Alt не было). Варианты операторов: =, !=, >, >=, <, <=. Варианты выражений:
- CurrentPlayer - текущий игрок. В кампании 0 - человек, 1 - AI. В схватке соответствует номеру игрока в списке игроков, который появляется при создании новой схватки.
- CurrentTurn - текущий ход.
- GameState - состояние игры. 1 - обычное состояние.
- AlphaWindow - больше 0, если на карте что-то подсвечивается розовым или желтым, например, показаны доступные ходы.
- StatusBarOffset - больше 0, если информационная строка съехала вниз и еще не вернулась на место.
- UnitFinishedMove - 1, если юнит закончил ход, иначе 0.
- CountUnits <тип> <состояние> <номер игрока> - подсчет юнитов определенного типа, находящихся в определенном состоянии, принадлежащих определенному игроку. Типы юнитов:
- -1 - все юниты
- 0 - солдат
- 1 - лучник
- 2 - элементаль
- 3 - ведьма
- 4 - висп
- 5 - волк
- 6 - голем
- 7 - катапульта
- 8 - дракон
- 9 - король
- 10 - скелет
- 11 - кристалл
- Состояния: -1 - все состояния
- Номера игроков: см. выражение CurrentPlayer, -1 - все игроки
- Wait <N> - отложить выполнение следующей итерации скрипта на <N> кадров.
- NextState - переход к следующему состоянию скрипта.
- ShowMapName - показать название карты.
- StartPlay - запустить игру в обычном режиме.
- CompleteMission - завершить миссию победой игрока.
- SetFadeEnabled <true|false> - разрешить или запретить обновление значения затемнения экрана. См. SetFadeValue.
- SetCursorVisible <true|false> - показать или скрыть курсор.
- SetGameActive <true|false> - включить или отключить управление в игре, например, в cut-сценах и т.д.
- SetFadeValue <N> - задать значение затемнения экрана. <N> - число от 0 до 16 включительно: 0 - нет затемнения, 16 - черный экран, но иногда все наоборот.
- SetMapStepMax <N> - задать максимальную скорость перемещения карты в <N> пикселей за кадр.
- SetUnitSpeed <slow|fast|N> - задать скорость перемещения юнитов: медленно, быстро, или <N> пикселей за кадр.
- ShowDialog <строка> <персонаж> <резерв> - показать диалог. Персонаж с указанным номером произностит строку с указанным номером. Параметр <резерв> не используется.
- ShowHelp <строка> - показать экран помощи со строкой с указанным номером.
- Vibrate <N> - запустить вибрацию на <N> кадров.
- MoveMapAndCursor <king N | X Y> - передвинуть курсор (и, если потребуется, карту) или на короля игрока <N>, или к элементу с координатами <X> и <Y>. Эта команда автоматически переводит скрипт в следующее состояние.
- GetUnitPlotRoute <UX> <UY> <состояние> <PX> <PY> <режим> - проложить маршрут для юнита, стоящего на элементе с координатами <UX> и <UY>, к элементу с координатами <PX> и <PY>. Если <режим> равен true, маршрут будет прокладываться с учетом проходимостей элементов, иначе напрямую.
- CreateUnitPlotRoute <тип> <игрок> <UX> <UY> <PX> <PY> <режим> <обход> - создать юнит указанного типа для указанного игрока на элементе с координатами <UX> и <UY> и проложить для него маршрут к элементу с координатами <PX> и <PY>. Если <режим> равен true, маршрут будет прокладываться с учетом проходимостей элементов, иначе напрямую. Если <обход> равен true, то при наличии в конечной точке другого юнита конечная точка переместится в одну из соседних.
- GetUnit <UX> <UY> <состояние> - выбрать юнита, стоящего на элементе с координатами <UX> и <UY>. К выбранному юниту затем могут быть применены команды RemoveUnit, CreateSpriteAtUnit и т.д.
- RemoveUnit - убрать с карты юнит, выбранный командой GetUnit
- ScheduleUnitAnimationStop <N> - остановить анимацию юнита через <N> кадров. Имеется в виду анимация активных юнитов, стоящих на карте.
- CreateSpriteAtUnit <Smoke|Spark|RedSpark> <SX> <SY> <режим анимации> <задержка> - создать анимированный спрайт на элементе, на котором стоит выбранный юнит, со смещением <SX> и <SY>. <режим анимации> и <задержка> в данном случае как-то связаны со сменой кадров...
Используются технологии
uCoz