본문 바로가기
Programming/Renpy

렌파이 대화 - renpy 한국어 번역

by Devsaurus 2024. 1. 24.
728x90

대화와 서술

텍스트는 비주얼 노벨에 기본적이며, 일반적으로 스토리 기반 게임에서 매우 중요합니다. 이 텍스트는 캐릭터가 하는 대화로 레이블이 지정된 대화와 발화자가 없는 서술로 구성될 수 있습니다. (편의상 대화와 서술을 중요한 차이가 있는 경우를 제외하고 대화로 통합할 것입니다.) 또한 사용자가 대화의 모양을 게임에 맞게 사용자 정의할 수 있어야 합니다.

Ren'Py에서 대부분의 대화는 say 문을 사용하여 작성됩니다. 대화의 모양은 Character 객체를 사용하여 캐릭터별로 사용자 정의할 수 있습니다.

Say 문

Say 문은 대화와 서술에 사용됩니다. 거의 항상 Ren'Py 스크립트에서 가장 자주 사용되는 문이기 때문에 say 문은 작성 오버헤드를 최소화하는 구문을 가지고 있습니다. 몇 가지 예시 say 문은 다음과 같습니다:

"This is narration."

"Eileen" "This is dialogue, with an explicit character name."

e "This is dialogue, using a character object instead."

"Bam!!" with vpunch
  • 첫 번째 형태의 say 문은 문자열 자체로 구성됩니다. 이 형태는 서술에 사용되며, 서술은 문자열의 내용입니다.
  • 두 번째 형태는 두 개의 문자열로 구성됩니다. 첫 번째 문자열은 말하는 캐릭터의 이름이고, 두 번째는 말하는 대화입니다.
  • 세 번째 형태는 간단한 표현식 다음에 문자열이 옵니다. 간단한 표현식은 캐릭터 이름을 나타내는 문자열이나 Character 객체로 평가되어야 합니다. 후자의 경우 캐릭터 객체가 대화가 표시되는 방법을 제어하는 데 사용됩니다.
  • 마지막 형태는 문자열과 전환을 가진 with 절로 구성됩니다. 이 경우 문자열이 표시되고 화면이 동시에 흔들립니다.

say 문이 정확히 무엇을 하는지의 세부 사항은 사용된 캐릭터 객체에 따라 제어되지만, 일반적인 say 문의 효과는 화면에 대화를 표시하고 사용자가 클릭하여 해당 대화를 없애는 것입니다.

특정 캐릭터는 Ren'Py에게 특별한 의미를 가지며 대화 문자열에 사용할 수 없습니다. { 문자는 텍스트 태그를 시작하고 [ 문자는 치환을 시작합니다. 이를 대화에서 사용하려면 이중으로 입력하세요. 대화에 따옴표를 사용하려면 백슬래시를 앞에 붙일 수도 있습니다. 예를 들면:

"I walked past a sign saying, \"Let's give it 100%!\""

대화 문자열 대신 캐릭터 객체 대신 프록시 함수를 사용할 수도 있습니다. 이에 대한 자세한 내용은 :ref:이 섹션 <say-proxy>에서 확인할 수 있습니다.

캐릭터 객체 정의

Character 객체를 만들고 say 문에서 사용함으로써 대화의 모양(및 어느 정도는 행동)을 사용자 정의할 수 있습니다. 캐릭터는 define 문을 사용하여 캐릭터를 변수에 할당함으로써 만들어집니다. 예를 들면:

define e = Character("Eileen", who_color="#c8ffc8")

이렇게 하면 대화에서 해당 캐릭터를 사용할 수 있습니다:

e "Hello, world."

Character는 많은 키워드 인수를 받는 Python 함수입니다. 이러한 키워드 인수는 캐릭터의 동작을 제어합니다.

이미지 속성이 있는 Say

캐릭터가 연관된 이미지 태그로 정의되면 해당 캐릭터를 사용하는 say 문은 캐릭터 이름과 두 번째 문자열 사이에 이미지 속성을 놓을 수 있습니다.

이 형태에서는 주어진 태그의 이미지가 표시되면 Ren'Py는 캐릭터 태그와 속성을 사용하여 show 명령을 발행합니다. 이미지가 표시되지 않으면 Ren'Py는 속성을 사이드 이미지에서 사용하기 위해 저장하지만 이미지는 표시하지 않습니다.

예를 들면:

define e = Character("Eileen", image="eileen")

label start:

    show eileen mad
    e "I'm a little upset at you."

    e happy "But it's just a passing thing."

는 다음과 동일합니다:

define e = Character("Eileen")

label start:

    show eileen mad
    e "I'm a little upset at you."

    show eileen happy
    e "But it's just a passing thing."

위의 예에서 mad와 happy는 서로 대체됩니다. 그러나 mad 속성을 지정하지 않고도 happy가 없는 eileen으로 돌아갈 수 있습니다. 속성 앞에 마이너스 기호 ( - )가 있는 속성 이름은 :ref:show 문 <show-statement>에서와 마찬가지로 해당 효과가 있습니다.

예를 들면:

define e = Character("Eileen")

label start:

    show eileen
    e mad "I'm a little upset at you."

    e happy "That's funny."

    e -happy "I'm not

 sure what to think now."

@이 속성 목록에 포함되면 그 뒤에 배치된 모든 요소는 대화 줄의 끝에서 임시 효과만 가지며 되돌려집니다.

예를 들어 다음 코드는 이전 예제와 동일합니다:

define e = Character("Eileen", image="eileen")

label start:

    show eileen mad
    e "I'm a little upset at you."

    e @ happy "That's funny."

    e "I'm not sure what to think now."

단일 행은 @ 앞에 온 것이 영구적인 변경과, 이후에 온 것이 임시적인 변경을 결합할 수 있습니다.

e happy @ vhappy "정말! 모든 것이 달라졌어요."

@ 기호 뒤에 마이너스 기호도 사용할 수 있습니다:

e @ right -mad "내 분노는 일시적으로 중단됐어요..."
e "그러나 !"

이와 같은 방식으로 이미지가 변경될 때 전환을 일으키려면 :var:config.say_attribute_transition를 전환으로 설정하십시오. 더 많은 제어가 필요한 경우 :var:config.say_attribute_transition_callback을 사용하십시오.

예시 캐릭터

여기 몇 가지 예시 캐릭터가 있습니다:

# 대화가 괄호로 둘러싸인 캐릭터
define e = Character("Eileen", what_prefix='(', what_suffix=')')

# 변수에서 이름을 가져오는 캐릭터
define p = Character("player_name", dynamic=True)

특수 캐릭터

일부 캐릭터 이름은 기본적으로 정의되어 있으며 특정 상황에서 자동으로 사용됩니다. 의도적으로 이러한 캐릭터를 재정의하면 Ren'Py의 동작이 변경될 수 있지만 실수로 사용하면 문제가 발생할 수 있습니다.

  • adv: Character가 사용하는 기본 캐릭터 종류입니다. 화면에 한 줄이 표시되도록 캐릭터를 설정합니다.
  • nvl: 대화가 :doc:nvl_mode에서 표시되는 Character의 종류로, 한 번에 여러 줄의 텍스트가 화면에 표시됩니다.
  • narrator: 캐릭터 이름이없는 say 문을 통해 서술을 표시하는 데 사용되는 캐릭터입니다.
  • name_only: 캐릭터 이름이 문자열로 주어진 대화에 사용되는 캐릭터입니다. 이 캐릭터는 주어진 이름으로 새 캐릭터로 복사되고, 그런 다음 해당 새 캐릭터가 대화를 표시하는 데 사용됩니다.
  • centered: 이 캐릭터는 말한 내용을 화면 중앙에, 어떤 창에도 속하지 않게 표시합니다.
  • vcentered: 이 캐릭터는 세로 방향 텍스트에서 화면 중앙에 말한 내용을 표시합니다.
  • extend: 이 캐릭터는 마지막으로 대화한 캐릭터에게 마지막 대화 줄, "{fast}", 및 확장할 대화를 포함하는 대화 줄을 말하게 만듭니다. 이를 사용하여 대화가 진행되는 동안 화면이 변경될 수 있습니다.

Extend는 NVL 모드를 인식하고 올바르게 처리합니다. 첫 번째 say와 extend 사이에 언어 설정이 변경되면 Extend가 제대로 작동하지 않습니다.

예를 들면:

# 첫 번째 대화 줄 표시, 클릭 대기, 표정 변경 및 나머지 표시.
show eileen concerned
e "가끔, 나는 슬픔을 느껴."
show eileen happy
extend " 하지만 보통 금방 극복해!"

# 유사하지만 첫 번째 줄이 끝날 때 자동으로 표정 변경
# 텍스트 속도가 완전히 높게 설정되어 있지 않은 경우에만 의미가 있습니다.
show eileen concerned
e "가끔, 나는 슬픔을 느껴.{nw}"
show eileen happy
extend " 하지만 보통 금방 극복해!"

대화 창 관리

Ren'Py에는 대화 창을 관리하기 위한 여러 문이 포함되어 있습니다. 대화 창은 항상 대화 중에 표시되므로 이러한 문은 대화가 아닌 상호 작용 중 창의 존재 또는 부재를 제어합니다.

  • window show: 창을 표시하는 문으로, 선택적 전환을 인수로 사용할 수 있습니다. 전환을 생략하면 :var:config.window_show_transition이 사용됩니다.
  • window hide: 창을 숨기는 문으로, 선택적 전환을 인수로 사용할 수 있습니다. 전환을 생략하면 :var:config.window_hide_transition이 사용됩니다.
  • window auto: 창을 자동으로 관리하는 문으로, 창은 :var:config.window_auto_show에 나열된 문 전에 표시되며, :var:config.window_auto_hide에 나열된 문 전에 숨겨집니다.
  • window auto hide, window auto show: 이 문은 window show 또는 window hide와 같이 창을 표시하거나 숨길 수 있습니다. 그러나 이 문은 자동 관리를 계속 유지합니다.
window show # 기본 전환으로 창 표시
pause       # 이 일시 정지 동안 창이 표시됩니다.
window hide # 창을 숨깁니다.
pause       # 이 일시 정지 동안 창이 숨겨집니다.

window show dissolve # 디졸브로 창을 표시합니다.
pause                # 이 일시 정지 동안 창이 표시됩니다.
window hide dissolve # 디졸브로 창을 숨깁니다.
pause                # 이 일시 정지 동안 창이 숨겨집니다.

window auto

"이 대화 줄 앞에 창이 자동으로 표시됩니다."
pause                # 이 일시 정지 동안 창이 표시됩니다.

scene bg washington  # 장면 변경 전에 창이 숨겨집니다.
with dissolve

window auto show     # 정상적으로 표시되기 전에 창을 표시합니다.

show eileen
with dissolve

"window auto show가 없으면 창은 여기서 표시되었을 것입니다."

대화 창 관리는 "빈 창 표시" :func:Preference에 영향을 받습니다. 이 기본 설정이 비활성화된 경우 위의 문은 효과가 없습니다.

say 문에 인수 전달

say 문에는 괄호 안에 인수를 포함하여 추가적인 인수를 전달할 수 있습니다. 예를 들어 다음과 같이 작성할 수 있습니다:

e "안녕, 세계." (what_color="#8c8")

say 문에 대한 인수는 먼저 :var:config.say_arguments_callback에 의해 처리됩니다(만약 None이 아닌 경우). 남아있는 경우 이들은 그런 다음 캐릭터에 전달되어 캐릭터가 정의될 때 존재했던 것처럼 취급됩니다. 따라서 위의 예제는 대화를 초록색으로 표시합니다. 특수 키워드 _mode 및 _with_node는 이 상호 작용을 위해 캐릭터에서 설정된 것을 무시합니다.

interact 매개 변수는 특수한 경우로, Character를 정의할 때 False로 전달되면 interact=True가 전달되어도 덮어쓰이지 않습니다. 이 경우 상호 작용이 발생하지 않습니다.

:var:config.say_arguments_callback은 매번 say 문이 실행될 때마다 호출되며 인수가 전달된 경우에만 호출되지 않습니다. 캐릭터의 사용자 정의를 조건적으로 덮어쓰기 위해 유용할 수 있습니다.

init python:
    def say_arguments_callback(char, *args, **kwargs):
        if colorblind_mode:
            kwargs["what_color"] = "#000"
        return args, kwargs

define config.say_arguments_callback = say_arguments_callback

독백 모드

일부 비주얼 노벨은 확장된 서술이나 동일한 캐릭터의 다중 대화 블록을 가지고 있습니다. 이러한 경우 캐릭터 이름과 따옴표를 여러 번 입력하는 것은 다소 중복됩니다.

이러한 경우를 다루기 위해 Ren'Py는 독백 모드를 지원합니다. 대화가 삼중 따옴표 문자열 내에 있으면 Ren'Py는 대화를 비어있는 줄에서 블록으로 분할합니다. 각 블록은 자체 say 문을 생성합니다. 여기 예제가 있습니다. 세 블록의 서술 다음에 세 줄의 대화가 있는 경우입니다:

"""
This is the first line of narration. It's longer than the other two
lines, so it has to wrap.

This is the second line of narration.

This is the third line of narration.
"""

e """
This is the first line of dialogue. It's longer than the other two
lines, so it has to wrap.

This is the second line of dialogue.

This is the third line of dialogue.
"""

추가 인수 또는 속성과 같은 추가 절이 허용되지만 이들은 독백 내의 각 줄에 전달되어 유용하지 않을 수 있습니다.

만약 블록 간의 공백을 생략하고 싶다면, 파일의 최상위 수준에서 rpy monologue single을 작성하세요.

이를 비활성화하고 대신 삼중 따옴표 사이에 작성한 모든 줄을 하나의 메시지로 표시하려면 rpy monologue none을 사용할 수 있습니다.

캐릭터 저장소

주요 문서: :ref:named-stores

say 문은 기본 저장소 전에 캐릭터 명명 저장소를 검색합니다. 기본 저장소에 변수와 동일한 이름을 가진 캐릭터를 갖고 싶다면 다음과 같이 정의할 수 있습니다:

define character.e = Character("Eileen")

그런 다음 이 캐릭터를 기본 저장소의 변수와 함께 사용할 수 있습니다:

default e = 0

label start:

    # 여전히 좋지 않은 변수 이름입니다.
    $ e = 100

    e "현재 에너지는 [e] 유닛입니다."

say 문에서 캐릭터에 대한 변수 정보를 관리하려면 기본 저장소와 충돌하지 않도록 적절한 네임스페이스에 대한 캐릭터를 정의하는 것이 특히 유용합니다.

define character.naomi = Character("Naomi Nagata", who_color="#8c8")
default naomi = PersonClass(engineering=5, max_g_force=.7) # 객체가 될 수 있습니다...
define character.fred = Character("Fred Johnson", who_color="#72f")
default fred.money = 1000 # ...또는 전용 명명 저장소
default fred.rank = "Colonel"

label traded:
    fred "여기 있어."
    $ fred.money -= 50
    $ naomi.money += 50
    naomi "고마워요 ! 내 클래스-[naomi.engineering] 공학 기술을 평가해 주셨군요."

대체 프레젠테이션

  • :doc:nvl_mode : 화면 전체에서 대화를 표시하는 모드.
  • :doc:bubble : 말풍선에서 대화를 표시하는 모드로 상호적으로 위치를 조절할 수 있습니다.

관련 정보

  • :doc:statement_equivalents : 여기에서 설명된 기능을 파이썬 컨텍스트에서 사용하는 방법에 대한 정보이며 일부 단점과 제한 사항이 있습니다.
  • :func:renpy.last_say : 마지막 say 문에 대한 정보를 제공합니다.
728x90