_ren.py 파일: Python으로 작성하는 Ren'Py

복잡한 게임에서는 대부분이 Python 코드이고, 이를 Ren'Py에 전달하기 위한 init python: 같은 Ren'Py 문이 조금만 포함된 파일을 사용할 수 있습니다. Ren'Py는 이렇게 Python 비중이 높은 파일을 작성하는 다른 방법을 제공합니다. 이름이 _ren.py로 끝나는 파일은 Python 문법으로 작성할 수 있으며, 이후 Ren'Py 스크립트로 변환되어 처리됩니다.

이 방식을 사용하는 주된 이유는 두 가지입니다.

  • _ren.py 문법을 사용하면 모든 Python 줄 앞에 필요한 한 단계의 추가 들여쓰기를 없앨 수 있습니다.

  • 편집기에서 Python 전용 도구로 _ren.py 파일을 열 수 있으므로, Ren'Py 안에 포함된 Python 코드에서는 지원하지 않는 코드 분석과 리팩터링을 수행할 수 있습니다.

Python 안의 Ren'Py 파일은 actions_ren.py처럼 이름이 _ren.py로 끝납니다. 이 파일은 .rpy 파일과 같은 유니코드 순서로 처리되므로 actions_ren.py는 actions.rpy가 처리될 위치에서 처리됩니다. 기본 이름이 같은 _ren.py 파일과 .rpy 파일이 함께 있으면 오류입니다. 예를 들어 actions.rpy와 actions_ren.py는 충돌하므로 같은 디렉터리에 둘 다 있으면 오류가 발생합니다.

문법과 변환

Python 안의 Ren'Py 파일에는 세 종류의 구간이 있습니다.

  • 파일의 처음에는 무시되는 구간이 하나 있습니다. 여기에 편집기와 다른 도구에 도움이 되는 Python 가져오기나 구문을 넣을 수 있지만, 게임의 일부가 아니며 Ren'Py에서 실행하지 않습니다.

  • Ren'Py 스크립트를 담는 하나 이상의 Ren'Py 구간입니다. Ren'Py 스크립트는 일반적으로 Python 구간을 도입하고 해당 Python 코드의 들여쓰기도 설정합니다.

    Ren'Py 구간은 단독 줄의 """renpy로 시작하고 단독 줄의 """로 끝납니다. 시작과 끝 모두 들여쓰기 없이 줄 맨 앞에 놓아야 합니다. 어느 쪽이든 들여쓰기가 있으면 파일이 올바르게 처리되지 않습니다.

  • 하나 이상의 Python 구간입니다. Python 구간은 Ren'Py 구간 뒤에 오며, 그 구간에서 공백만 있거나 주석인 줄을 제외한 마지막 줄과 같은 수준으로 들여씁니다. 그 줄이 콜론(:)으로 끝나면 Python 코드를 공백 4개만큼 더 들여씁니다.

이 변환으로 메모리에 .rpy 파일과 동등한 내용이 만들어지고 일반적인 방식으로 컴파일됩니다. 특히 Python 안의 Ren'Py는 독립된 모듈이 아니라 Ren'Py 스토어에서 실행되며, Python 코드에는 롤백과 저장/불러오기를 가능하게 하는 변환이 적용됩니다. Python 문과 롤백을 참고하세요.

예제

다음은 _ren.py 파일의 예입니다.

# This is not included in the game. It's here so that an editor knows
# the type of strength.
strength = 100

"""renpy
init python:
"""

class BoostStrength(Action):
    """
    Boosts the strength of the player by 10.
    """

    def __call__(self):
        global strength
        strength += 10
        renpy.restart_interaction()

이 파일은 다음과 같이 변환됩니다. 빈 줄 일부는 생략했습니다.

init python:

    class BoostStrength(Action):
        """
        Boosts the strength of the player by 10.
        """

        def __call__(self):
            global strength
            strength += 10
            renpy.restart_interaction()