RenPy게임은 사실 허점이 많습니다. 이런 저런 잠금장치를 해봐도 결국 Python이라는 특성상 Py파일을 열 수 있고 엔진의 Py파일을 손대면 이러니저러니 해도 데이터 마이닝을 쉽게 할 수 있습니다.


사실 대다수 게임엔진은 개발자모드 혹은 콘솔진입을 허용합니다. 대표적인 게임이 퀘이크 엔진과 그의 영향을 받은 소스엔진 같은 게임 엔진입니다.


멀리 갈 것도 없이 소스엔진 게임인 half-life를 실행한 상태에서 `키(혹은~키)를 누르면 갑자기 게임 내에서 명령어 창이 뜹니다. 이게 바로 게임 엔진의 콘솔인 것이지요. 일반인들은 이 콘솔을 치트키를 치는 창 정도로 생각하지만 (sv_cheats 1 이런 것)사실은 이 명령창은 개발자의 개발 편의성을 위해 만들어진 것 입니다.


RenPy도 게임엔진이기에 개발자의 편의를 위한 기능을 내장하고 있습니다. 보통 options.rpy파일로 이를 제어하고 있습니다.


우선 매뉴얼을 볼까요?


https://www.renpy.org/doc/html/developer_tools.html

Shift+O키를 누르면 콘솔이 활성화 되고 Shift+R을 누르면 스크립트를 다시 읽어들인다고 합니다. 실시간 스크립트 수정이 필요할 때 아주 좋지요.


하지만 이것을 실제 게이머가 실수로 누르기라도 하면 난감해지겠지요? 어떻게 하는지도 잘 모를 것이고요. 이를 제어하는 일반적인 방법은 다음과 같습니다.


Renpy로 만들던 중에 Options.rpy 파일을 열면

init -1 python hide:
    config.developer = False
    config.console = False

이러한 구문이 있거나 이것과 흡사한 구문이 있습니다.


바로 개발자모드를 활성화 하는 코드입니다. 물론 실제 상용 게임에는 True를 False로 바꿔서 개발자모드 진입을 막습니다. 그리고 파일을 쉽게 읽기 어렵게 하기 위해 rpyc형태로 배포합니다. 한번 컴파일한 형태이지요. 물론 rpyc는 쉽게 디컴파일이 되지만 Python 직접 접근 구문에서 간혹 파일이 깨지기도 합니다. 그러므로 rpyc파일을 디컴파일해서 rpy로 만든 다음 수정해도 되지만 이는 별로 추천하지 않습니다.


무엇보다 Renpy는 Python이기에 위험한 작업 없이도 쉽게 됩니다.


Python은 인터프리터 언어이고 이미 있는 객체의 이름을 다른 객체로 선언하면 이전의 객체는 무시됩니다. 그리고 Renpy는 스크립트를 읽어들일때 이름 순으로 읽습니다. 즉, A로 시작되는 파일을 읽기 시작해서 z로 시작하는 파일로 끝내는 것입니다.


그렇다는 것은 Options.rpy를 읽어들여서 개발자모드가 비활성화 되었다고 한들 z로 시작되는 파일을 읽어서 활성화 되면 개발자모드가 다시 활성화 되는 것입니다.


두근두근 문예부의 경우 이를 비활성화 해 놓았습니다. 막말로 이런 플레이어를 가지고 노는 게임이 개발자모드로 진입하면 이게 게임의 일부분인지 아니면 실수인지 알 길이 없지요.(오류메시지나 블루스크린마저 게임의 일부분으로 써먹는 게임이니까요. 진짜 오류메시지와 구분이 안 갑니다.)


하지만 zzzzz.rpy라는 파일을 game폴더에 만들어 놓고 다음과 같이 적어봅시다.

init -1 python hide:
    config.developer = True
    config.console = True


이렇게 하고 게임을 실행하면...


평상시와 다를 것이 없습니다. 하지만 Shift+O키를 누르면 상황이 달라집니다.

>

어디서 많이 보지 않았나요?

닮았죠?

네 바로 Python 커맨드 창입니다. 직접 여기서 명령을 내려서 제어를 할 수 있습니다.

물론 Python구문뿐 아니라 RenPy모듈도 이미 import 되어 있기에 RenPy명령어도 먹힙니다.


그러므로 개발자 콘솔에서 탈출을 하려면 Python과 똑같이

exit

이 명령을 하면 됩니다.


그럼 한번 치트를 시도해봅시다.


jump credits


이러면 바로 credits라고 정의된 부분으로 바로 점프합니다. (타이틀에서는 먹히지 않습니다. 일단 새 게임을 눌러서 게임이 시작되야 먹힙니다. credits 레이블이 나중에 만들어지기 때문입니다.)


그럼 바로 엔딩 보는 겁니다. 물론 CG는 회수 된 부분 까지만 나오게 됩니다. Monika가 놀라서 뒤집어질 일이 일어난 것이지요. (이래서 데이터 마이닝을 하는 사람은 미스테리 게임을 못합니다. - 언더테일 제작자 왈)


이런 jump기능은 특정 label로 바로 넘어가기 위한 구문으로 실제로 스크립트에 써먹는 구문입니다. 이걸 명령을 때우는 겁니다. Python개발 할 때랑 비슷하지요.


그리고 넘기기가 안 먹히는 구간에서 콘솔을 열고 config.fast_skipping=True를 다시 때려버리면 마구 넘어갑니다. 이 외에도 많은 부분을 뜯어 볼 수 있습니다.


물론 이걸 남용하면 Monika가 그랬던 것처럼 게임이 망가집니다. 주의하세요!

,