Внутриигровые меню
Во многих визуальных новеллах игроку предлагается делать выбор,
который влияет на исход истории. Язык Ren'Py содержит инструкцию menu,
которая позволяет легко представлять выбор пользователю.
Вот пример инструкции menu:
menu:
"What should I do?"
"Drink coffee.":
"I drink the coffee, and it's good to the last drop."
"Drink tea.":
$ drank_tea = True
"I drink the tea, trying not to make a political statement as I do."
"Genuflect.":
jump genuflect_ending
label after_menu:
"After having my drink, I got on with my morning."
Инструкция menu начинается с ключевого слова menu. За ним может следовать
имя метки, что в данном случае эквивалентно предварению меню
этой меткой. Например:
menu drink_menu:
...
За инструкцией menu следует блок с отступом. Этот блок может содержать инструкцию say и должен содержать как минимум один пункт меню. Если инструкция say присутствует, она отображается на экране одновременно с меню.
Пункты меню. Пункт меню — это опция, которую пользователь может выбрать из внутриигрового меню. Пункт меню начинается со строки. За строкой может следовать условие if, которое делает выбор условным. Пункт меню заканчивается двоеточием и за ним должен следовать блок инструкций Ren'Py.
Когда выбор сделан, выполняется блок инструкций. Если выполнение достигает конца блока, оно продолжается с инструкции, следующей за концом инструкции menu.
Условие if состоит из ключевого слова if, за которым следует выражение
Python. Пункт меню отображается только в том случае, если выражение
истинно. В следующем меню:
menu:
"Go left.":
...
"Go right.":
...
"Fly above." if drank_tea:
...
Третий вариант будет предложен только в том случае, если переменная drank_tea
истинна. (Однако, если переменная config.menu_include_disabled
установлена в True, он будет показан как неактивная кнопка.)
Если условия if не выполняются ни для одного из пунктов меню, меню будет пропущено, и управление перейдет к следующей за ним инструкции.
Набор меню
Меню может принимать выражение set на отдельной строке. Если оно присутствует, в меню отображаются только те пункты, подписи которых не содержатся в наборе. Когда выбор сделан, его подпись может быть добавлена в набор.
Как и в случае с if, если ни один вариант выбора недоступен, управление переходит к инструкции после меню.
По историческим причинам, набор может быть как объектом set, так и списком.
default menuset = set()
menu chapter_1_places:
set menuset
"Where should I go?"
"Go to class.":
jump go_to_class
"Go to the bar.":
jump go_to_bar
"Go to jail.":
jump go_to_jail
label chapter_1_after_places:
"Wow, that was one heck of a Tuesday."
Аргументы меню
Можно передавать аргументы как самому меню, так и отдельным его
пунктам. Чтобы передать аргументы меню, добавьте их в
строку menu, после необязательного имени и непосредственно перед двоеточием. Чтобы
передать аргументы пункту меню, укажите их после строки меню и перед
ключевым словом if или двоеточием.
menu ("jfk", screen="airport"):
"Chicago, IL" (200):
jump chicago_trip
"Dallas, TX" (150, sale=True):
jump dallas_trip
"Hot Springs, AR" (300) if secret_unlocked:
jump hot_springs_trip
Аргументы, переданные самому меню, становятся аргументами для экрана, за исключением аргумента screen, который выбирает экран, и аргумента nvl, который выбирает меню NVL-режима.
Смотрите документацию для экрана choice и
config.menu_arguments_callback.