|
Руководство по скриптам в Приключениях
Оглавление:
Вступление
Основные понятия
- Приключение
Приключения состоят из локаций. Игрок перемещается между локациями с помощью действий.
- Переменные
Переменные - это ячейки, в которых хранятся числа и строки.
Новинка! Строковые переменные.
- Триггеры
Триггеры - это ячейки, в которых хранится "да" или "нет".
- Формулы
С помощью формул выполняются вычисления.
- Инструкции
Инструкции изменяют текст локации.
- Код
Код изменяет переменные и триггеры.
- Скрипты в приключении
Инструкции расплагаются в тексте, а код - в специальных полях.
Дополнительные возможности
Вступление
Итак, вы решили сделать приключение.
У приключения есть локации и действия. Игрок начинает со стартовой локации, читает её текст, выбирает одно из действий, попадает на другую, читает, выбирает, попадает на следующую… И так до конца.
Без скриптов приключения были бы просто фанфиками с выбором поворотов сюжета. Но со скриптами они могут превратиться в настоящий квест или ролевую игру – с интерактивным окружением, инвентарём, ростом параметров…
Скрипт – это программа, инструкция.
Благодаря скриптам вы можете научить приключение запоминать и реагировать на действия игроков. Например, можно сделать такие вещи:
- Когда игрок первый раз приходит на опушку леса, он видит сияющего Сайкуна, который быстро исчезает в чаще. Когда игрок снова приходит на опушку леса, сайкуна там нет.
- У игрока есть некоторое количество денег, которое он может потратить по своему усмотрению в магазинах города.
- Меняется погода – то жарит солнце, то пасмурно, то начинается гроза. Призрак, которого игрок должен найти и обезвредить, появляется только в грозу.
- За успешные действия игрок получает очки. В конце очки запоминаются, и игроки могут состязаться, кто наберёт больше – кто прошёл приключение успешнее.
- …и многие другие. Пример вы могли видеть в тестовом приключении "Неравный Бой".
Однако не переборщите со скритами: там, где можно легко справиться без них, справляйтесь без них, иначе ваше приключение будет подтормаживать.
Основные понятия
Приключение
Думаю, вы уже заметили, как устроен основной механизм приключения, но не лишним будет повторить.
Приключение состоит из локаций, отображающихся в виде текста. У локаций есть описание и название. "Тёмный лес: Вы входите под густую сень деревьев. Сразу становится сумрачно и страшно."
Игроку предлагается выбрать одно из нескольких (как правило) действий: "Углубиться в лес", "Остановиться и прислушаться", "Пошёл-ка я отсюда"… Когда игрок выбирает действие, он перемещается на следующую локацию. Или к послесловию, если приключение закончено.
На экране послесловия игрок читает концовку и может запомнить или стереть игру. Если в этом приключении предусмотрено ведение счёта, то при запоминании счёт добавляется в таблицу рекордов – можно состязаться с другими игроками %) Если счёта нет, то просто запоминается, в какую версию и сколько раз играл пользователь.
Иногда в приключении можно сохраняться (где именно – устанавливает автор). Если игрок сохранялся, то в таблицу рекордов записывается и число загрузок. Победить без загрузок куда престижнее, чем победить после множества загрузок.
Переменные
Главная движущая сила скриптов – это информация. Если бы приключение не могло запоминать последствия действий игроков, ситуация в игре бы не менялась.
Для хранения информации есть 100 числовых ячеек, каждая из которых может запоминать целое число от минус двух миллиардов до плюс двух миллиардов – в общем, всем хватит. Числовые ячейки называются "переменные" и обозначаются в скриптах как n# (например, n1, n23, n100). "n" означает numeric – номер, число.
Вы можете использовать переменные для чего угодно, например:
- Количество денег.
- Показатель защиты покемона.
- Число яблок в инвентаре.
- Выбранный стартовый покемон (1 = бульбазавр, 2 = чармандер, 3 = сквиртл).
- Время.
Вам не обязательно запоминать номер той или иной переменной, вы можете дать им названия – "количество яблок", "защита" и так далее. Однако это только для вашего удобства: обращаться к переменной по её названию нельзя. Зато у вас будет удобное окошко с табличкой, где будут указаны имена всех переменных.
Вы ещё не забыли, что в приключении можно вести счёт? Счёт хранится в переменной n101. В общем-то, обычная переменная, только её результат можно сохранить в таблице рекордов.
Ещё переменным можно задавать начальные значения. Например, чтобы у игрока сразу было 309 денег, а не 0.
Строковые переменные
Помимо 100 числовых ячеек, есть 100 строковых, которые могут содержать текст - например, имена, которые тренер дар своим покемонам. Они обозначаются как i# (например, i1, i25, i99). "i" здесь означает input - ввод, поскольку чаще всего эти переменные применяются для хранения ввода пользователя.
Триггеры
Иногда нужно просто запомнить, что игрок что-то уже совершил: уже прочёл газету, уже побывал на опушке леса, уже участвовал в состязании… Тогда в дело вступают триггеры – переключатели.
Триггерами удобно отмечать прогресс игрока в приключении. Каждый триггер - это "да" или "нет", 1 или 0.
Как и переменных, триггеров 100 штук, и обозначаются они как t# (t2, t34, t99…). Им тоже можно давать понятные названия. Все триггеры в начале приключения выключены (равны нулю), но в процессе вы можете их включать, обозначая, что игрок что-то совершил. Если нужно, вы можете и выключать триггеры, возвращая им нулевое значение. Например:
- В примере с Сайкуном: когда игрок увидел Сайкуна, включился триггер "видел Сайкуна". Поэтому сайкун больше не появляется.
- Игроку предлагают выбрать, какую окаменелость взять – округлую или когтистую. Когда игрок делает свой выбор, срабатывает триггер "взял окаменелость". Больше халявных окаменелостей не будет.
- Если игрок пьёт воду из волшебного источника, он получает благословение (включается триггер), и покемоны в лесу начинают ему доверять. Однако если он пытается поймать какого-либо покемона, благословение исчезает (триггер выключается).
И снова про счёт. Очень удобно вести его с помощью триггеров: каждому триггеру можно назначить награду, которая прибавляется к счёту, если триггер включается (например, увидев Сайкуна, игрок получает за это достижение 10 очков). Когда вы сделали приключение, вам достаточно раскидать награды на триггеры – и готов простор для достижений.
Формулы
Там, где есть числа, есть и вычисления.
Допустим, игрок хочет купить n1 яблок. У него есть n2 денег. Сначала надо проверить, достаточно ли у него денег – их должно быть не меньше n1*n2. Вот вам и формула.
В процессе выполнения скрипта формула вычисляется и заменяется на число.
Все мы сталкиваемся с формулами (выражениями), когда проходим математику и алгебру в средней школе. Сложение, умножение, скобки, возведение в степень, остаток, приоритет операций – всё это есть и здесь.
Допустим, n1=4, а n2=10. Примеры формул:
- n1 (результат, как ни странно, 4.)
- n1+3 (результат равен 7.)
- n2-n1 (результат равен 6.)
- n2*n1 (результат 40.)
- (n1+1)*n2 (результат 50.)
Триггеры тоже могут участвовать в формулах: как известно, они равны или 0, или 1.
Возможно, вы ещё не сталкивались с операциями сравнения. Эти операции сравнивают два числа – в итоге получается 1 ("да") или 0 ("нет"). Примеры таких формул:
- n1>n2 (результат "нет", 4 вовсе не больше 10.)
- n1=n2 (результат "нет", 4 не равно 10.)
- (n1=4)&(n2=10) (результат "да": n1 действительно равно 4 и n2 действительно равно 10.)
Если вы когда-либо программировали хотя бы на Бейсике, все эти операции должны показаться вам знакомыми. Итак, в формуле можно использовать следующие операции (перечислены в порядке приоритета – те, что идут первее, выполняются раньше):
Приоритет | Операция | Объяснение |
I | ! | Отрицание: результат равен 1, если число больше нуля, или 0, если число меньше либо равно нулю. Пример: !n1 |
II | ^ | Возведение в степень. Пример: n2^2 (n2 в квадрате). |
III | * | Умножение |
/ | Деление |
div | Деление нацело |
% | Остаток от деления |
Примеры: 5 div 2 (получается 2), 5 % 2 (получается 1), 2*2 (получается 4) Деление на ноль не производится. |
IV | + | Сложение |
- | Вычитание |
V | & | Логическая операция "и": если оба числа больше нуля, результат 1, "да". если хотя бы одно равно нулю или меньше – результат 0, "нет". |
Пример: t1&t2 (если включены оба триггера, результат "да". Если хотя бы один выключен, результат "нет".) |
VI | | | Логическое "или": если хотя бы одно из чисел больше нуля, результат 1, "да". Если оба равны нулю или меньше, результат 0, "нет". |
x | Исключающее "или": либо одно, либо другое. Если одно из чисел больше нуля, результат 1, "да". Если оба больше нуля или оба меньше либо равны нулю, результат "нет". |
Пример: t1|t2 (если хотя бы один из триггеров включён, результат "да"). |
VII | > | Больше |
< | Меньше |
>= | Больше либо равно |
<= | Меньше либо равно |
= | Равно |
!= | Не равно |
eql | Эквивалентно: если оба числа больше нуля или оба числа меньше либо равны нулю, результат "да". |
Примеры: n1>=n2 (если n1 больше n2, результат "да"), n1!=3 (если n1 не равно трём, результат "да"), t1 eql t2 (если оба триггера включены или оба триггера выключены, результат "да"). |
В формулах могут быть дробные числа (например, если разделить 1 на 2 или записать число с точкой – 0.5), однако помните, что в переменных могут храниться только целые.
Ещё в формулах можно использовать случайные числа. Согласитесь, многие игры без них никуда. Случайное число записывается так:
- d# -- генерирует случайное (целое) число от 1 до #. "d" означает "dice" – бросок игральной кости.
- Например, d20 (от 1 до 20), d6 (от 1 до 6), d67 (от 1 до 67)…
Строки в формулах
В формулах можно использовать как строковые переменные (от i1 до i100), так и просто строки. Строки должны заключаться в апострофы. На стандартной клавиатуре в английской раскладке апостроф находится там же, где кавычка на русской.
Пример:
- 'поке' + 'мон' -- результатом этой формулы будет строка 'покемон'.
Для строк существуют такие операции:
Операция | Объяснение |
!'строка1' | Переворачивает строку. Например, !'абв' даёт 'вба'. |
'строка1' + 'строка2' | Добавляет вторую строку в конец первой. |
'строка1' - 'строка2' | Из строки1 убираются части, совпадающие со строкой2. Например, 'абва'-'а' даёт 'бв'. |
'строка1' = 'строка2' | Результат равен 1, если строки одинаковые, или 0, если они разные. |
'строка1' != 'строка2' | Результат равен 0, если строки одинаковые, или 1, если они разные. |
'строка1' > 'строка2' | Результат равен 1, если строка1 длиннее строки2, или 0, если нет. |
'строка1' < 'строка2' | Результат равен 1, если строка1 короче строки2, или 0, если нет. |
'строка1' >= 'строка2' | Результат равен 1, если строка1 длиннее или такой же длины, как строка2, или 0, если нет. |
'строка1' <= 'строка2' | Результат равен 1, если строка1 короче или такой же длины, как строка2, или 0, если нет. |
'строка1' * число | Строка1 повторяется число раз. Например, 'а' * 3 даёт 'ааа'. |
'строка1' / число | Строка1 сокращается в число раз. Например, 'абв'/3 даёт 'а'. |
Инструкции
Естественно, переменные были бы пустым звуком, если бы игрок не мог их так или иначе увидеть. Если у персонажа есть 5 яблок, это должно быть написано в инвентаре. Если сейчас 18 часов вечера, то небо должно быть хмурым. Если игрок выбрал стартового чармандера, то атаковать его покемон будет огнём, а не водой.
Для этого есть инструкции, заключённые в тексте локации. Например:
- Ваши деньги: ##(n1)р.
Это простая инструкция, которая вычисляет формулу в скобках и показывает её результат. Допустим, n1 равно 302. Тогда игрок увидит такой текст:
- Ваши деньги: 302р.
А если бы в n1 хранилось число копеек, можно было бы вывести так:
- Ваши деньги: ##(n1 div 100)р. ##(n1 % 100) к.
- Игрок видит: Ваши деньги: 3р. 2к.
Итак, две решётки и открывающаяся скобка ##( обозначают вывод переменной. Не используйте их в обычном тексте.
Иногда нужно вывести не значение переменной, а кусок текста в зависимости от значения переменной или триггера. Например, если триггер "видел Сайкуна" отключён, то надо показать описание убегающего Сайкуна.
Это более сложные инструкции. Они заключаются в {фигурные скобки}. Поэтому тоже не используйте фигурные скобки в обычном тексте локации.
В фигурных скобках вы можете использовать такие команды:
- echo (текст) – показывает текст, заключённый в скобках.
- show (формула) – показывает значение формулы, заключённой в скобках.
- if (формула) команда – если результат формулы больше 0, то выполняется команда. Например, команда echo – так мы и делаем появление Сайкуна %) пример ниже.
- case (формула) команда – действует как if. Но: если в инструкции уже сработала команда case, то последующие игнорируются. Это называется "ветвление".
- endcase – заставляет скрипт "забыть" обо всех предыдущих командах case.
Все отдельные команды должны разделяться двумя знаками доллара $$ (опять же, не используйте это сочетание в тексте внутри инструкций).
Примеры:
- t1 – триггер "видел Сайкуна". Чтобы при первом посещении локации описать появление легендарного покемона, в текст надо вставить такой фрагмент:
- {$$if (!t1) echo (Впервые бросив взгляд на опушку леса, вы замечаете свечение… и так далее.)}
- ! – это отрицание. Если t1=0 (выключен), то результат !t1 будет равен 1 ("да"). В общем, как мы говорим "если не видел Сайкуна", так и записываем команду. Поскольку условие больше нуля, выполняется команда echo, добавляющая на локацию текст.
- После выхода с локации триггер t1 включается. Когда t1=1, его отрицание равно 0, "нет". Раз условие не выполняется, то и команда тоже.
- n1 – количество денег у персонажа. На локации ему предлагают купить магикарпа за 25пм. Персонаж мысленно подсчитывает свой капитал. В текст локации добавляется следующее:
- {$$case (n1>=25) echo (Да, у меня как раз достаточно денег.)$$case(1) echo (Увы, я не располагаю должной суммой.)}
- Если n1 больше либо равно 25, то условие первого case соблюдается. Поэтому выполняется команда echo, говорящая, что "денег достаточно".
- Если выполнилась первая команда case, то вторая пропускается.
- Если первая команда case не выполнилась, то вторая выполняется обязательно – ведь в скобках единица, она больше нуля. И игрок видит в тексте локации фразу "Увы, я не располагаю должной суммой".
- Реальный пример из "Неравного боя". В переменной n99 хранится концовка: 1 = отказался от боя, 2 = пропустил бой, 3 = проиграл бой… и так далее. Когда приключение завершается, то выводится один из пяти завершающих текстов. Выглядит это вот так:
- {$$case(n99=1)echo(Отделу учёта участников турнира тренера Ф.И.О Заявление…) $$case(n99=2)echo(В 15:00 на Центральном Стадионе собрались зрители…) $$case(n99=3)echo(В 15:00 на Центральном Стадионе сошлись в бою чаризард и раттата…) $$case(n99=4)echo(Победа!! Тренировки и усилия прошли не даром…) $$case(n99=5)echo(Ничья! На поле боя сошлись чаризард и раттата…)}
- Думаю, вам уже должно быть понятно, как действует эта инструкция %)
Код
Итак, есть переменные, и они могут влиять на текст в приключении. Но в тексте нельзя менять значения переменных. Тогда где?
На локациях и в действиях есть специальные поля для кода (о них позже). Это не инструкции – они не могут выводить текст. Но они могут делать всё остальное.
Переменную можно изменить вот так:
- n# = формула (присваивает переменной результат формулы).
- n# +формула (прибавляет к переменной результат формулы).
- n# -формула (отнимает у переменной результат формулы).
- n# *формула (умножает переменную на результат формулы).
- n# /формула (делит переменную на результат формулы. Деление на ноль не производится.).
Можно пользоваться только первой из этих команд, но остальные могут быть удобнее и быстрее.
А триггер изменяется вот так:
- trig(#) – включает триггер (и выдаёт награду, если есть).
- trigoff(#) – выключает триггер (и отнимает награду %)
Здесь точно так же есть команды if, case и endcase, но записываются немного иначе:
- if(условие)(команда) – выполняет команду, если условие больше нуля.
- case(условие)(команда) – как if, но игнорируется, если уже был выполнен другой case.
- endcase – заставляет скрипт "забыть", была бы выполнена команда case.
Команды в коде разделяются точкой с запятой;
Примеры:
- Итак, игроку предлагают купить магикарпа за 25пм (деньги хранятся в n1). Он выбирает действие "Купить магикарпа", которое выполняет код:
- n1-25; trig(1);
- И вуаля! Переменная n1 стала на 25 меньше, а триггер №1 включился (допустим, именно он отвечает за наличие магикарпа).
- У покемона показатель ловкости 5. Он уворачивается от удара противника. Как это бывает во многих ролевых играх, автор приключения устанавливает сложность удара (число), игрок бросает кубик и прибавляет показатель ловкости – если получилось больше сложности, увернуться удалось. Допустим, показатель ловкости хранится в n4, а сложность равна 7.
- n100=n4+d6; if (n100>7)(trig(13));
- Теперь в n100 хранится результат уклонения. Если n100 получился больше 7 – то выключается триггер №13 (допустим, он и обозначает успешность уклонения).
- Игрок участвует в лотерее (участие стоит 5пм). Он запускает руку в шляпу и вытаскивает одну из 100 бумажек. На двух из них написано "1000пм", на десяти написано "сыграй ещё" (и тебе возвращают деньги), а на остальных написано "проиграл". Допустим, деньги хранятся в переменной n1.
- n1-5; n99=d100; case(n99>=99)(n1+1000); case(n99>=89)(n1+5);
- Сначала из денег вычитается 5 единиц – плата за лотерею. Потом в переменную n99 записывается случайное число от 1 до 100 (ну надо же его куда-то записать).
- Если выпало 99 или 100 (это как раз те две победные бумажки), то к деньгам прибавляется 1000.
- Если выпала бумажка с 89 по 98 (это как раз десять бумажек с "попробуй ещё"), то возвращаются деньги – те самые 5пм.
- Если выпало что-то другое, то не делается ничего – игрок зря потратил деньги.
Скрипты в приключении
Вам известно, как работают скрипты. Но где должны располагаться скрипты, чтобы правильно работать?
Инструкции могут располагаться в любом тексте в игре: названия и описания локаций, названия действий, послесловие, интерлюдия. Они не могут быть в названии приключения, кратком описании и вступлении, потому что этот текст люди видят, ещё не начав игру.
Для кода есть специальные поля – ведь игроки не должны его видеть. А именно:
- Код, выполняющийся при старте приключения.
- Код, выполняющийся после завершения приключения, перед послесловием.
- Код, выполняющийся при каждой смене локации.
- Код на входе в локацию.
- Код на выходе из локации.
- Код при выборе действия.
Первые три пункта заполняются в общих параметрах приключения, код локации – на странице локации, а код действия – на странице действия.
При старте происходит следующее:
- Выполняется стартовый код приключения.
- Выполняется входной код первой локации.
При переходе между локациями код выполняется в таком порядке:
- Выходной код локации, на которой только что был игрок.
- Код действия, которое выбрал игрок.
- Код, который приключение выполняет при каждом переходе.
- Действие вычисляет номер целевой локации.
- Входной код новой локации.
А при завершении приключения:
- Выходной код локации, на которой только что был игрок.
- Код действия, которое выбрал игрок.
- Код, который приключение выполняет при каждом переходе.
- Действие вычисляет номер целевой локации (0, как известно, ведёт на послесловие).
- Финальный код приключения.
Есть ещё одно поле у приключений, не упомянуть которое просто нельзя.
У действий есть условия появления. В условии должна стоять формула. Каждый раз, когда показывается локация, идёт проверка, какие действия следует показывать, какие нет. С каждой локацией связан набор действий (вы и сами это видите), но показываются только те, чьи _условия_ соблюдаются – чья формула показала больше нуля. Если условие не заполнено, то действие будет показываться всегда на надлежащих ей локациях.
Помните игрока, которому предлагают купить магикарпа за 25пм? Действие "Купить магикарпа" появляется только при соблюдении условия n1>=25 (в n1 хранятся деньги).
Важно! Менять переменные можно только при переходе между локациями, когда и выполняется весь код. Если вы будете менять переменные в тексте локации, то изменения будут происходить каждый раз, когда человек загружает страницу. А ещё может поменяться выполнение условий действий, и тогда человек выберет одно действие - а выполнится другое.
Дополнительные возможности
Всё самое главное вы уже узнали. Однако есть ещё несколько приёмов, которые могут показаться вам полезными. Если хотите их освоить, приготовьтесь пораскинуть мозгами.
Индексы
Переменные, триггеры, броски случайных чисел – они все вызываются ключевыми буквами: n1, d6, t39 и так далее. Число обозначает, к какой ячейке нужно обращаться. Однако оно не обязательно должно быть числом – это может быть и формула.
Например:
- n(n2) или nn2 – обращается к ячейке, номер которой записан в переменную 2. Если n2=3, то эта конструкция вернёт значения ячейки n3. Если n2=99, то получится значение ячейки n99.
- n(d6+4) – обращается к случайной ячейке с номером от 5 до 10.
- n(n21)=5 – если это в коде, то команда присваивает ячейке с номером n21 значение 5. Если это в формуле, то получается 1 ("да"), если в ячейке с номером n21 записано число 5.
Помните, что переменных и триггеров только по 100 (плюс n101 для хранения счёта).
Ещё одно поле, где вы можете использовать формулу вместо числа – это номер локации, куда ведёт действие. На самом деле там может располагаться любая формула. Хотите, чтобы действие вело на одну из трёх случайных локаций? Поставьте вместо номера локации, допустим, "d3" – тогда действие перекинет игрока на локацию номер 1, 2 или 3 (случайный выбор).
Дополнительные ключевые слова
Каждой переменной можно назначить стартовое значение. Например, в Неравном Бою у переменной, хранящей hp чаризарда, стартовое значение 12. Стартовое значение можно считать и использовать в формулах:
- c# – константа. Возвращает стартовое значение переменной номер #.
- Изменять их нельзя, но с помощью них удобно писать меняющиеся величины, например:
- hp врага: ##(n20)/##(c20)
- Получается что-то вроде: "hp врага: 10/12"
У каждой локации есть номер – думаю, это вы уже заметили. Он не показывается игроку, но автор его видит. Именно номером задаётся, на какую локацию ведут те или иные действия.
- loc – возвращает номер текущей локации. Это может быть полезно, если понадобится на неё вернуться.
В приключении могут понадобиться слова, а не только числа. Например, у инвентаре на самом деле лежат не "предмет №2" или "предмет №92" – там лежит "покебол" и "камень грома". Чтобы показать это, существуют строковые константы, которые используются только в конструкции ##.
- s# – строковая константа. Используется только в блоке ##(). Пишет заранее заготовленную фразу номер #. Этому номеру не обязательно быть от 1 до 100 – это может быть число от 0 до 65 тысяч.
- Например, так реализован инвентарь в Неравном Бое:
- Аксессуар: ##(sn25)
- Инструкция выводит заготовленную фразу номер n25. Например, если n25=5, а s5="Шипастый ошейник", то мы получим текст: "Аксессуар: Шипастый ошейник".
Функции
Если вы занимались программированием, то неизбежно сталкивались с функциями и знаете, что это такое.
Здесь функции – это куски кода, которые можно вызывать по номеру: f# (в формуле) или func(#) (в коде).
Чем это полезно?
- Бывает так, что одну и ту же последовательность команд нужно выполнять несколько раз за приключение. И тогда надо в кучу мест скопировать один и тот же код. А представьте, что вы решили что-то в нём поменять – тогда придётся снова отыскать каждый кусок и в каждом поменять что-то вручную. Гораздо лучше, если этот повторяющийся кусок кода будет забит в функцию: это не только изящно, но и удобно, если нужно будет что-то поменять.
- Функция может возвращать значение. Иногда вычисления нельзя или сложно облачить в формулу. Но функция – это код, а формула – это формула. В формуле нельзя использовать команды if и case, а в функции – можно, поэтому функция более гибкая.
- if и case выполняют только одну команду, если соблюдается условие. А если нужно выполнить несколько? Вызовите функцию. В функции находится код, а он может состоять из любого числа команд.
- Наконец, функции бывают перехватными (override) – они могут запускаться автоматически при соблюдении условий. Именно так в Неравном Бое реализована победа: когда hp врага равны 0, одна из функций перехватывает управление и переводит игрока на локацию победы.
Примеры функций:
- Действие приключения происходит в трёх городах. Когда игрок перемещается между ними, затрачивается время (n10) и уменьшается его энергия (n5), он устаёт. Эти две операции выполняет функция №8:
- Функция №8: n10+2; n5-1;
- Всякий раз, когда игрок путешествует между городами, просто вызывается функция №8: func(8);
- Если автор вдруг решает, что на переход из города в город должно затрачиваться в два раза больше времени (а затраты энергии остаться такими же), он просто меняет функцию:
- n10+4; n5-1;
- В приключении идёт время (n10) и сменяется время суток. Ночью в лесу появляются одни покемоны, утром другие, днём третьи, вечером четвёртые… Время суток проверяется четырьмя функциями: одна возвращает 1 ("да"), когда стоит ночь, другая – когда утро, третья – когда день… и так далее. Выглядят они так:
- Ночь, функция №1: n100=(n10>=21)&(n10<=5)
- Утро, функция №2: n100=(n10>=6)&(n10<=10)
- День, функция №3: n100=(n10>=11)&(n10<=17)
- Вечер, функция №4: n100=(n10>=18)&(n10<=20)
- У всех функций результат считывается с n100 (см.ниже). Получается, что ночь длится с 21 по 5 часов (включительно), утро с 6 по 10, день с 11 по 17 и так далее.
- Эти функции удобно использовать в условиях – например, Мудрый Ноктаул ночью охотится, днём спит, а вот утром и вечером его можно навестить. У действия "Пойти к Ноктаулу" будет условие (f2|f4).
- Если вдруг понадобится продлить ночь до 6 утра, нужно будет только поменять функции "ночь" и "утро" – и бинго, Ноктаул в 6 часов утра ещё не спит.
Итак, у функции есть:
- Номер.
- Название (для удобства).
- Код. Каждый раз, когда вызывается функция, выполняется этот код.
- Номер переменной, откуда считывается результат. Если функция вызывается в формуле (типа "n2=f10*4"), то функция заменяется на значение этой переменной (после выполнения кода функции).
- Перехват (вкл/выкл).
- Условие перехвата (если функция перехватная, условие должно быть обязательно).
- Порядок перехвата (срабатывание перехватных функций проверяется по очереди – это может быть важно, если произошло сразу два события, вызывающих перехват: скажем, и у покемона игрока, и у врага закончились hp).
- Перехватная целевая локация (если поле пустое или возвращает –1, то игрок направляется на ту локацию, на которую и должен был. Если же нет – то номер локации задаёт эта формула).
Если в приключении есть перехватные функции, то при переходе с локацию на локацию происходит следующее:
- Выходной код локации, на которой только что был игрок.
- Код действия, которое выбрал игрок.
- Код, который приключение выполняет при каждом переходе.
- Проверяются условия перехватных функций, в порядке перехвата. Если условие сработало (формула вернула положительное число), то выполняется код функции и вычисляется (если есть) перехватная локация.
- Если одна из перехватных функций вернуло перехватную локацию, то игрок направляется на эту локацию. Если несколько перехватных функций предлагают перехватные локации – то берётся та, которая была предложена последней.
- Если перехватной локации не было, действие вычисляет номер целевой локации.
- Входной код новой локации (или финальный код приключения, если игрока отправили на послесловие).
Важно! Не злоупотребляйте функциями, особенно перехватными. Оптимизируйте ваши скрипты. Например, если в случае с функциями времени суток нужно убедиться, что сейчас утро или день и вы вызываете для этого две функции - (f2|f3) - то выполняется много ненужных операций. Лучше создать отдельную функцию "утро или день", которая будет проверять, что время находится в пределах от 5 до 17 часов. Перехватных функций же должно быть как можно меньше, и условия их следует делать простыми.
Ввод
Одна из новых функций приключений - ввод. Можно попросить пользователя ввести число или текст и сохранить его в переменную. Для этого поставьте галочку "Пользовательский ввод" у действий, которыми вы хотите попросить ввод. Например, вы можете сделать действие "Введите имя покемона" и отметить его галочкой "Пользовательский ввод", чтобы позволить игроку назвать покемона.
У ввода есть параметры: число это или строка? в какую переменную сохранить? минимум и максимум числа (или минимальная и максимальная длина)? Так вы можете проконтролировать, что ввод будет такой, какой вам нужен.
Для особо хитрого ввода вы можете использовать проверочную функцию. Это должна быть функция с выводом в числовую переменную. Если в этой переменную окажется 0 - то ввод считается неподходящим, у игрока попросят повторить его. Предлагаемый пользователем ввод функция может считать из переменной n200 или i200, в зависимости от того, где число это или строка.
|
| |