게임 내 선택지 메뉴
많은 비주얼 노벨에서는 플레이어의 선택에 따라 이야기의 결말이 달라집니다. Ren'Py의 menu 문을 사용하면 손쉽게 선택지를 제시할 수 있습니다.
다음은 menu 문의 예제입니다.
menu:
"무엇을 할까?"
"커피를 마신다.":
"커피를 마신다. 마지막 한 방울까지 맛있다."
"차를 마신다.":
$ drank_tea = True
"차를 마신다. 이 행동에 정치적인 의미가 담기지 않도록 조심하면서."
"무릎을 꿇는다.":
jump genuflect_ending
label after_menu:
"음료를 다 마시고 아침 일과를 이어 갔다."
menu 문은 menu 키워드로 시작합니다. 뒤에 레이블 이름을 붙일 수도 있으며, 이는 메뉴 바로 앞에 해당 레이블을 정의하는 것과 같습니다. 예를 들면 다음과 같습니다.
menu drink_menu:
...
menu 문 아래에는 들여쓴 블록을 둡니다. 이 블록에는 say 문을 넣을 수 있으며, 선택지가 최소 하나 있어야 합니다. say 문을 넣으면 메뉴와 함께 화면에 표시됩니다.
선택지. 선택지는 플레이어가 게임 내 메뉴에서 고를 수 있는 항목입니다. 문자열로 시작하며, 뒤에 if 절을 붙여 조건부로 표시할 수 있습니다. 선택지 줄은 콜론으로 끝내고, 그 아래에 Ren'Py 문으로 된 블록을 둬야 합니다.
플레이어가 선택지를 고르면 해당 블록을 실행합니다. 블록 끝에 도달하면 menu 문 전체의 다음 문으로 넘어갑니다.
if 절은 if 키워드와 Python 표현식으로 이루어집니다. 표현식이 참일 때만 선택지가 표시됩니다. 다음 메뉴에서는:
menu:
"왼쪽으로 간다.":
...
"오른쪽으로 간다.":
...
"위로 날아간다." if drank_tea:
...
drank_tea 변수가 참일 때만 세 번째 선택지가 나타납니다. 다만 config.menu_include_disabled가 True이면 조건이 거짓이어도 비활성화된 버튼으로 표시됩니다.
모든 선택지의 if 조건이 충족되지 않으면 메뉴를 건너뛰고 다음 문으로 진행합니다.
선택지 집합
메뉴 안에 별도의 줄로 set 절을 쓸 수 있습니다. set 절이 있으면 지정한 집합에 문구가 들어 있지 않은 선택지만 표시됩니다. 선택지를 고르면 그 문구가 집합에 추가될 수 있습니다.
if 절을 사용할 때와 마찬가지로, 선택할 수 있는 항목이 없으면 메뉴 다음 문으로 넘어갑니다.
이전 버전과의 호환성을 위해 set 객체와 리스트를 모두 사용할 수 있습니다.
default menuset = set()
menu chapter_1_places:
set menuset
"어디로 갈까?"
"수업을 들으러 간다.":
jump go_to_class
"술집에 간다.":
jump go_to_bar
"감옥에 간다.":
jump go_to_jail
label chapter_1_after_places:
"와, 정말 엄청난 화요일이었다."
메뉴 인수
메뉴 자체와 개별 선택지에 인수를 전달할 수 있습니다. 메뉴 인수는 menu 줄에서 선택적인 레이블 이름 뒤, 콜론 바로 앞에 씁니다. 선택지 인수는 선택지 문자열 뒤, if 키워드나 콜론 앞에 씁니다.
menu ("jfk", screen="airport"):
"일리노이주 시카고" (200):
jump chicago_trip
"텍사스주 댈러스" (150, sale=True):
jump dallas_trip
"아칸소주 핫스프링스" (300) if secret_unlocked:
jump hot_springs_trip
메뉴에 전달한 인수는 스크린 인수가 됩니다. 단, screen은 사용할 스크린을 선택하고, nvl은 NVL 모드 메뉴를 선택하는 데 사용됩니다.
choice 스크린과 config.menu_arguments_callback 문서를 참고하세요.