목차

이전 항목

제작자 정의 디스플레이어블

다음 항목

맞춤 텍스트 태그

링크


원문 보러 가기
오역 신고하기
Created using Sphinx.

제작자 정의 명령문

제작자 정의 명령문으로는 렌파이에 자신이 만든 명령문을 추가할 수 있습니다. 이 기능으로 현재 렌파이 문법에서 지원하지 않는 것들을 추가할 수 있습니다.

제작자 정의 명령문은 python early 블럭에서 정의해야 합니다. 더불어 제작자 정의 명령문이 포함된 파일은 해당 명령문을 사용하는 파일보다 먼저 불려와야 합니다. 렌파이는 파일을 유니코드 순서대로 불러오기 때문에, 제작자 정의 명령문을 정의한 파일 이름 앞에 01 또는 작은 숫자 문자를 접두사로 사용하는 것이 타당할 것입니다.

제작자 정의 명령문은 해당 명령문을 정의한 파일 내에서 사용할 수 없습니다.

제작자 정의 명령문은 renpy.register_statement 함수를 사용해 등록할 수 있습니다.

renpy.register_statement(name, parse=None, lint=None, execute=None, predict=None, next=None, scry=None, block=False, init=False, translatable=False)

제작자 정의 명령문을 등록합니다.

name
명령문 키워드로 시작하는 공백으로 구분된 이름 목록이거나 새로운 기본 명령문을 정의하는 빈 명령문이어야 한다(이 기본 명령문은 say문을 대체할 것이다).
parse
Lexer 객체를 받는 함수. 이 함수는 명령문을 분석하고 객체를 반환한다. 이 객체는 다른 모든 함수들에 인수로써 전달된다. lexer 인수는 다음 메소드를 받는다:
lint
명령문을 확인하기 위해 호출된다. parse가 반환한 인수인 객체 하나를 전달 받는다. 오류를 보고하기 위해 renpy.error 를 호출해야 한다.
execute
명령문을 실행했을 때 호출되는 함수. parse가 반환한 인수인 객체 하나를 전달 받는다.
predict
명령문에서 사용하는 이미지를 예측하기 위해 호출되는 함수. parse가 반환한 인수인 객체 하나를 전달 받는다. 명령문에서 사용된 디스플레이어블의 리스트를 하나 반환해야 한다.
next
다음 명령문을 결정하기 위해 호출된다. parse가 반환한 인수인 객체 하나를 전달 받는다. 레이블을 반환하거나, 다음 명령문을 실행하도록 하려면 None을 반환해야 한다.
scry
Ren'Py 내부에서 사용한다.
block
블럭을 받으면 True, 그 외에는 False이다.
init
이 명령문이 초기화 과정에서 실행되어야 하는 명령문이라면 참이어야 한다. (명령문이 init 블럭에 없다면, 이 명령문은 자동으로 init 0 블럭에 배치된다.)

parse 메소드는 Lexer 객체를 받습니다.:

class Lexer
eol()

lexer가 행의 끝에 다다랐다면 True이다.

match(re)

임의의 정규표현식 문자열과 대조한다.

대상을 대조하는 렉서 내에 있는 모든 명령문은 이 함수에 따라 구현된다. 우선 공백은 무시하고, 행과 대조해본다. 대조에 성공했다면, 대조된 텍스트를 반환한다. 그 외에는 None을 반환한다.

keyword(s)

s 를 키워드로 대조한다.

name()

이름을 대조한다. 내장 키워드와는 대조하지 않는다.

word()

키워드를 포함한 모든 단어를 대조한다. 일치한 단어는 텍스트로 반환한다.

string()

렌파이 문자열을 대조한다.

integer()

정수를 대조하고 해당 정수가 포함된 문자열을 반환한다.

float()

부동소수점 숫자를 대조하고 해당 숫자가 포함된 문자열을 반환한다.

simple_expression()

단순 파이썬 표현식을 대조하고 그 표현식을 문자열로 반환한다.

rest()

공백은 무시하고 행의 나머지 부분은 반환한다.

checkpoint()

렉셔의 현재 상태를 대표하는 불투명 객체를 반환한다.

revert(o)

`o`가 checkpoint()에서 반환된 객체라면, lexer는 checkpoint()가 호출되었을 때의 상태로 되돌아간다. (이는 역추적을 위해 사용되는 기능이다.)

subblock_lexer()

현재 행과 관련 있는 블럭 대신에 Lexer를 반환한다.

advance()

서브블록 렉서에서 다음 행으로 진행한다. 이 메소드는 반드시 첫 번째 행을 분석할 수 있도록 첫 번째 행 앞에서 호출되어야 한다.

Lint Utility Functions

스크립트 오류 검사 기능을 작성할 때 유용한 함수입니다.

renpy.check_text_tags(s)

s에 있는 텍스트 태그를 확인한다. 오류가 있으면 에러 문자열을 반환하며, 없으면 None을 반환한다.

예제

아래 예제는 따옴표 없는 문자가 기본 대사로 사용되는 "line"이라는 명령문을 생성합니다.

python early:

    def parse_smartline(lex):
        who = lex.simple_expression()
        what = lex.rest()
        return (who, what)

    def execute_smartline(o):
        who, what = o
        renpy.say(eval(who), what)

    def lint_smartline(o):
        who, what = o
        try:
            eval(who)
        except:
            renpy.error("Character not defined: %s" % who)

        tte = renpy.check_text_tags(what)
        if tte:
            renpy.error(tte)

    renpy.register_statement("line", parse=parse_smartline, execute=execute_smartline, lint=lint_smartline)

이 명령문은 다음처럼 작성해 사용할 수 있습니다.:

line e "이 인용문은 제대로 나타날 거야," 아이린이 말했다, "게다가 역슬래시를 같이 적을 필요도 없지."