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가 그랬던 것처럼 게임이 망가집니다. 주의하세요!

,

RenPy로 만들어진 게임은 기본 언어가 Python이라서 성능이 생각보다 많이 좋지 못합니다.


심지어 아직도 Python2.7을 사용하기 때문에 3.x에서 해결된 GIL이슈가 아직도 현재 진행형입니다. 고작 2D게임 주제에 무슨 성능 이슈냐! 라고 하시는 분도 있을 것입니다. 그런데 나름 2D게임에서도 3D 효과를 쓰거나 투명도를 잔뜩 쓰는 경우 성능 이슈를 겪을 수 있습니다. 그리고 빠른 프레임을 원한다면 더 하지요.


이러한 RenPy로 만들어진 게임은 대략 다음과 같습니다.


Long Live The Queen

두근두근 문예부

아날로그


등등


일단 RenPy게임에서 성능 이슈라긴 뭐하지만 묘한 성능 이슈를 여기서 겪었습니다.


..JUST MONICA

뒷 배경을 보면 알파값을 심하게 써서 살짝 버벅거림이 눈에 띄더군요. 이유를 잘 몰랐는데 아래의 페이지에서 원인을 알 수 있었습니다.


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


아마도 OpenGL설정이 제대로 되지 않아서 성능 이슈가 생긴 듯 합니다. 그럴 때는 여기에 나온 대로 Shift+G를 누른 다음


여기서 Force OpenGL Renderer를 선택하시면 됩니다. 강제로 OpenGL로 돌아가면서 성능 이슈가 조금이나마 나을 겁니다. 전 어찌된 영문인지 Software로 잠시 들어갔었던 듯 합니다.


만약 LLVM Pipe 등의 Software OpenGL 렌더러를 쓰신다면 반대로 Force Software Renderer를 쓰시면 조금이나마 나아집니다. 그런데 이런 경우는 요즘 많이 없을 듯 하네요.


참고로 Windows에서는 DirectX 렌더링이 뜨기도 하는데 이걸 쓰면 성능이 더 나아지기도 합니다. 그런데 Windows에서는 어눌한 해킹드라이버를 쓴다거나 하지 않는다면 OpenGL 2.0로 굴러가지 못하는 경우가 없습니다. 그냥 일반적으로 기본 설정으로 하다가 이상하다 싶으면 강제 설정을 하시면 됩니다.

,

음... 이건 뭐라고 해야하나..

아무튼 대단한 게임이 있습니다. 게다가 무료지요.


뭐라고 해야하지...?


뭐... 자세한 것은 그렇다고 치고 일단 한국어화 패치 사이트는 여기입니다.


https://sites.google.com/view/dokidokikor


여기에 게임의 모든 것을 설명한...것은 아니고 아무튼 잘 번역이 되어있습니다.


이 게임은...일단 미소녀 연예 시뮬레이터의 일종...이라고 하는데 일단 일종이라는 표현을 빌려서... 에휴.. 모르겠다. 아무튼 아는 사람은 다 알테니 게임에 대한 설명은 넘어가겠습니다.


일단 저는 내용 스포일러를 다 당했기 때문에 그렇다 치겠습니다.


이 게임은 지원 OS가 Windows, Mac, Linux입니다.


스팀판이 있다고 하니까 따로 구하기 귀찮아서 스팀에서 설치하려고 하니...


리눅스 지원이 안된다고 나오네요? 리눅스 지원된다고 알고 있었는데 이유가 뭔지 몰라서 공식 홈페이지에 가봤습니다.


https://teamsalvato.itch.io/ddlc



여깁니다. 어차피 무료이니 여기서 다운로드 버튼을 눌러보면 리눅스, 맥, 윈도버전을 다운로드 받을 수 있게 해놓았겠지요.


하하... 게임이 마음에 들면 기부해 달라고 하네요. 네 마음에 드신다면 여기서 필요한 만큼 금액을 적어서 Paypal이나 기타 방법으로 기부를 하시면 됩니다. 일단 저는... 무료로 해보기 위해서 "No, Thanks. Just take me Download." 를 위치고 다운로드를 하기로 했습니다. 그런데 10달러정도는 기부할 만한 게임입니다. 여러가지 의미로 말이지요...


펭귄그림이 윈도용과 함께 있군요. 그러니까 윈도용과 리눅스용은 공용판이었나 봅니다. Windows용을 다운로드 받으면 되겠군요.


다운로드 받은 ddlc-win.zip 압축을 풀어주시면...


요렇게 나옵니다. 여기서 DDLC.sh를 실행하면 됩니다.


음.. 실행 잘 되네요. 그럼 한글 패치를 해봅시다.


https://sites.google.com/view/dokidokikor


여기가 한글패치 배포 사이트입니다. 여기서 우린 스팀판이 아닌(스팀판을 굴릴래야 굴릴 수가 없으니...)일반 사용자 버전을 다운로드 받으면 되겠습니다.


스팀판 패치는 안 먹히니 이걸 다운로드 받으시면 됩니다.


그리고 압축파일의 내용을 그대로 설치된 곳에 풀어서 덮으시면 됩니다.

(렌파이 엔진의 일부도 갈아엎은 듯 합니다. 몇 년전에 제가 Long Live The Queen 작업할 때 비슷한 짓을 했었지요. 이후 해당 기능이 이식되면서 패치를 내려버리긴 했습니다.)


이제 다시 실행해 보겠습니다.


... 윈도와 리눅스의 차이를 아십니까?


권한이 날아가 버렸네요!

이런 빌어먹을 작업을 해야한다는 것이 더 슬픕니다. 마이너는 이래서 슬픈 겁니다.


하지만 권한따윈 복구해주면 됩니다.


게임이 설치된 곳에서

sudo chmod +x lib/linux-x86_64/DDLC

sudo chmod +x lib/linux-i686/DDLC


이렇게 해주면 실행 권한이 다시 살아납니다.


터미널에 이런저런 내용이 뜨면서 실행이 됩니다.


굳이 터미널로 실행한 이유는 뭐냐고요?


.... 이 게임을 해보시면 압니다. 한국어로 아래에 뜨는 경고문 보이시죠? 이것하고 묘하게 관련이 깊습니다.

해커는 역시 터미널을 봐야 직성이 풀린다고 해야할까요...?


저기 있는 SyntaxWarning부터 신경쓰이기 시작하면 이 게임을 아주 잘 아시는 겁니다.



그런데 새 게임을 눌러보니 한글 입력이 안 되네요?

그래서 한글입력을 할 수 있게 Tkinter를 이용해서 한글 입력이 되게끔 수정한 패치를 같이 공개합니다.


http://moordev.tistory.com/246

두근두근 문예부! 리눅스용 한글입력 개삽질



마지막으로...


리눅스에서의 너는 어떤지 한번 보자꾸나.

> 터미널을 같이 띄우는 이유는 이런일이 일어나기 때문입니다.(스포일러 약간 함유.게임을 할 것이라면 누르지 마세요. 주의)




,

사실 그동안 무슨짓을 했냐고 하신다면 먹고살려고 발버둥 쳤다고 밖에는 말 못하겠습니다. 하지만 먹고 살려고 하는 짓이라고 해도 그게 결국 먹고 살게 되면 문제가 되지 않지만 결국 발버둥에 그친다면...?


아무튼 그렇고 그런 발버둥이 있었습니다. 아직은 먹고 살만은한데 이러면 언젠가는 굶어 죽을지도 몰라요. 그래도 아직까진 희망은 있으니 그렇다고 해둡시다.


최근 Python가지고 이런저런 장난을 또 치고 있었습니다. 이 장난의 결과에 대해서는 나중에 제대로 올릴 예정인데 Python이란 언어가 재미있으면서도 선택의 기로에 섰다는 기분이 다분히 들고 있습니다.

사실 Python 홈페이지(https://www.python.org)홈페이지에 들어가면 두 가지 버전을 구할 수 있지요. Python 2.7과 Python3.x입니다. 그냥 쉽게 말해서 Python2와 Python3로 나뉘어진 셈인데 Python2는 2.7버전을 끝으로 더이상의 업데이트는 없다고 밝혔습니다. 그것도 2010년이었네요. 하지만 그 이후로도 2.7은 계속 쓰였고 아직까지도 2.7을 사용하는 프로그램들이 꽤나 있습니다. 사실 이해가 안 되는 것도 아닌게 Python3는 초기에 엄청 느렸습니다. 벤치마킹을 하면 Python2가 20%~50%정도 더 빨랐거든요. Python2와 Python3는 사실 겉으로보면 거기서 거기지만(80%정도 코드 재활용이 가능했습니다.)내부는 완전히 달라져서 Python3는 현대의 패러다임에 맞춰서 설계를 다시한 물건입니다.


이후 Python3는 2017년 지금 현재 상당한 성능개선이 이루어졌고 현대 하드웨어에 맞추어서 만들어졌으므로 Python2.7에 비해 효율도 상당히 개선되었습니다. 하지만 Python3초창기에 질렸던 사람들이 2.7을 고수하는 경우가 많은 것이 현실입니다. Python3의 개선점이 알려지며 많이 3.x로 교체가 이루어졌고 유명라이브러리는 3.x가 당연히 지원이 되고 있지만 문제는 개인 혹은 사내에서 사용하는 라이브러리가 아직까지도 2.7로 만들어져있는 경우가 많아서 2.7을 보안업데이트를 제외한 기능업데이트는 없다고 밝힌 지금까지도 이용되고 있습니다.


우리나라에서 Python이 제일 많이 쓰이는 곳은 어딜까요?

당연하게도 각종 서비스용 서버프로그램입니다. DB를 sqlite를 쓰고 Python으로 DB관리를 하면 굉장히 쉽게 사용이 가능합니다. 이외에도 모든 웹과 온라인 서비스를 Python으로 처리하는 경우도 많지요. 그런데 문제는 이런 서비스들이 2.x로 작성된 경우가 많아서 python3로 못 넘어간 경우가 많다는 점입니다. 이에 대한 원인으로 여러가지를 들 수 있지만 제일 큰 문제는 비용문제입니다.


사실 python2에서 python3로 넘어가는 것은 그렇게 큰 문제는 아닙니다. 코드의 80%가 재활용이 가능하고 대다수 라이브러리가 3.x호환이 되게끔 업그레이드가 이루어져서 약간의 노력만 하면 Python3로의 전환도 그렇게 어렵지는 않다고 합니다. 하지만 기존의 Python2기반의 서비스를 Python3로 전환하면서 몰랐던 버그가 발생할 수도 있고 (python2와 달리 python3는 무조건 유니코드기반이라 cp949를 기반으로 짰으면 고생길이 열리게 됩니다.) 충분한 테스트가 이루어지지 않으면 서비스가 중단되는 초유의 사태가 벌어질지도 모르기 때문에 이에 고민을 하는 것입니다. 그럴거면 일단 2020년까진 버티기로 버티고 그 다음 Python3로 넘어가도 늦지 않다는 생각을 가진것으로도 보입니다. 


사실 테스트? 조금 시간들이고 비용을 조금만 들이면 얼마든지 할 수 있습니다. 디버깅제대로 안 하고 서비스하다가 망한 것이 어디 한 두가지입니까? 원래 디버깅은 모든 개발에 필수코스입니다. 그건 서비스를 하는 중에도 이루어져야합니다. 그럼 지원기간까지 버티다가 전환하는 것은요? 우리는 WindowsXP를 떠올려야합니다. WindowsXP는 연장지원 2년을 통해 일종의 유예기간을 가졌지만 전환을 늦게하는 바보짓을 하는 바람에 한동안 혼란을 겪고 말았습니다. 그리고 NPAPI지원도 크롬에서 지원을 끊겠다고 발표를 했음에도 이를 미루고 미루다가 결국 크롬의 NPAPI지원코드가 완전히 삭제되고 나서야 부랴부랴 PPAPI로 전환을 시작했습니다. (그런데 그것마저도 엉망이라는 느낌입니다.)


Python2.7의 지원기간은 3년정도 남았습니다. 생각보다 길다고 느끼실지도 모르지만 시간은 생각보다 빨리 지나갑니다. 그리고 Python3의 성능이 Python2보다 더 좋아졌음이 밝혀진 지금 이젠 성능핑계도 댈 수가 없게되었습니다. 그런데 아직도 2.7을 고수하시겠다면...?


당신은 그저 과거의 향수에 젖어 현재를 보지 못하는 늙다리일 뿐입니다. 개발자가 늙다리같은 생각에 빠져있다면 그 프로젝트는 이미 망한 프로젝트인 것이지요.


아직 늦지 않았습니다. 당신의 프로젝트 이제는 Python3로 시작해주세요.


P.S 우분투도 그동안 라이브러리 문제와 일부 프로그램 때문에 Python2.7을 기본탑재하고 있었습니다. 하지만 16.04이후로는 기본 탑재프로그램들이 Python3.5를 지원하고 있어서 Python2대신 Python3.5를 기본 탑재했습니다. 물론 Python2.7을 설치하지 못하는 것은 아니지만 저장소에서 python2.7이 사라질 준비를 하는 것으로 보입니다. 그때가 되면 python명령은 python2.7이 아닌 python3를 실행하는 명령이 되겠지요.


P.S2 업데이트가 굉장히 빠르기로 유명한 Arch는 python명령을 쓰면 Python3가 실행된다고 합니다. 버전업도 빠르기 때문에 무조건 최신버전이 뜨는 것이지요.

만약 아치를 쓰시는 분이 계신다면 터미널에서 python --version 명령을 쳐보세요.


P.S3 사실 이 글은 제 자신한테 하는 말입니다. Python으로 장난을 치는데 저도모르게 Python2스타일로 코딩을 하고 있더군요. 무의식적으로 Python2가 손에 너무 많이 익어버린 것 같습니다. 나름 의식하고 코딩을 하고 있지만 익숙함에서 나오는 그것은 정말 무서운 것이었습니다.

,

실시간 게임번역기란 물건이 있습니다. Monkey head's OCR Realtime Translator - 이하 Mort (http://www.steambb.com/bbs/board.php?bo_table=gamebb&wr_id=479632) 라는 물건입니다. 기존의 텍스트 후커는 API후킹방식을 주로 이용하여 이루어졌는데요. 이 방법은 그냥 화면에 나오는 문장을 OCR로 읽어서 텍스트를 읽어들입니다. 사실 이는 이전에 VNR(Visual Novel Reader)란 프로그램에서도 지원되는 기능이었지만 이 물건은 워낙 묵직했던데다가 API후킹도 지원되던 탓에 OCR방식은 잘 쓰이지 않았습니다. (모르는 사람도 있습니다.) 그에 비해 Mort는 성능도 괜찮고 그럭저럭 쓸만합니다. 단점이라면 Tesseract의 학습 기능을 어느 정도 쓰지 않았다면 인식률이 개판입니다. Mort는 학습 기능과 함께 이미지 전처리 기능을 넣어서 어느정도 인식률을 올린 듯 합니다. 그럼에도 여전히 엉망이라 Spell Checker 기능까지 우겨넣어서 인식률을 끌어 올려야 하더군요. 


그래도 상당히 좋은 물건인 듯 해서 리눅스에서 돌릴 수 있는지 봤는데...


닷넷 프레임워크를 필요로 합니다. mono로는 실행이 안 됩니다. 그래서 약간의 폭발 이후 비슷한 클론을 하나 만들어 냈습니다.

...물론 대충 만들어서 모양은 별로이며 동일한 Tesseract 엔진이라 인식률은 꽝입니다. 심지어 이미지 전 처리 기능도 없습니다.....(PIL이나 OpenCV를 써서 넣으면 되기는 합니다만...)

적당히 만들어서 Gitjub 정도에 올리면 되지 않을까 생각하고 있습니다. 자신 있게 올리기엔 코드가 더러운게 흠이지만요.(저는 프로그래밍 전공이 아닙니다. 그래서 알고리즘이 최적화 되어있지 않습니다.)


제작 언어는 제작 속도가 더럽게 빠르기로 유명한 Python 2.7입니다.(3.x는 일부 라이브러리 때문에 사용 불가) 그리고 Tkinter와 기타 플랫폼 독립적 라이브러리를 이용했기 때문에 (OSX, Windows, Linux만 되기는 하지만)크로스 플랫폼(!) 입니다. Tesseeract-OCR를 라이브러리 형태가 아니기에 따로 추가 설치 해주셔야 합니다. (하지만 Tesseract-OCR도 각 플랫폼 별 바이너리를 제공하기에 큰 문제는 없습니다.)


Mort에 비하면 UI가 공대 감성입니다. 미리 말씀드리자면 완성된 프로그램도 아니고 그냥 비슷한 기능을 구현한 것입니다. 작동 되면 좋고 아님 마는 겁니다.


구성은 창 2개입니다. 왼쪽 터미널 위에 있는 컨트롤 창과 오른쪽 Scan Area 창 두 개입니다.


우선 캡쳐 하고자 하는 부분을 Scan Area 창으로 가려 버립니다(!) 저 Scan Area 창은 X버튼의 기능을 삭제 했습니다. 때문에 그냥 구역 설정 기능만 갖춘다고 생각하시면 됩니다.


...그리고 Start를 누르면...Scan Area창이 최소화되면서 해당 Area 부분을 캡쳐한 뒤 신나게 OCR로 읽어들입니다. 인식률은????.........아직은 포기하면 편해요. 이미지 전처리 기능을 만들지 않는 이상 인식률을 효과적으로 끌어올리기는 힘들 듯 합니다.


그리고 한국어 번역을 쓰는데 구글 웹 번역기(?)를 씁니다. goslate란 모듈이 이를 지원합니다. (영어 → 한국어) 보다는 (영어 → 일어 →한국어)가 더 번역율이 높다고 들어서 한번 해봤는데 구어체는 별 차이가 없습니다. 그래서 그냥 (영어 → 한국어) 로 처리 중입니다.


그냥 한번 어떻게 되는지 구경이나 해봅시다.



번역을 하고 싶은 부분을 찾아서 Scan Area 창을 신나게 가지고 놀자


일단 게임을 실행하고 작성한 파이썬 스크립트를 실행합니다. 항상 위 옵션으로 걸려있으므로 Scan Area 창은 절대로 게임 창 뒤로 가지 않습니다.


번역을 하고자 하는 구역을 Scan Area 창으로 가려버리자! 추후 여기에 번역문을 띄울까 하는 생각도 해봤지만...그건 별로


번역을 하고자 하는 부분 위에 창을 올려놓고 조절합니다. 그냥 가리면 됩니다. 참 쉽죠?


그리고 Start를 하면??? Scan Area 창이 자동으로 최소화 됩니다. 그리고 터미널에 보면!!!


왼쪽에 터미널을 주목하자 아직 출력 창을 안 만들었기에 터미널에 번역문을 대신 띄우고 있다. 참으로 공대감성이 아닐 수 없다.

....번역기의 성능은 기대 안 하는 것이 좋습니다. 어차피 구글 번역기이니까요. 심지어 잘 못 인식된 글자도 있네요. 저것은 이미지 전 처리 기능과 Spell Checker를 추가로 붙여서 보완해야 합니다. 하지만 이를 리눅스로 구현했다는 데에 의의가 있습니다. (그런데 테스트에 쓴 게임은 Windows용 Wine 구동 게임...)


이걸 조금만 더 다듬으면 훌륭한 크로스 플랫폼 실시간 번역기가 될 수 있을 듯한데 모양도 별로고 조금 공대 감성을 탈피해야 합니다. (범인은 Tkinter) 하지만 3일만에 만든 것 치고는 그럭저럭 괜찮네요. 이제 OCR된 문자열 및 번역문 츨력창을 따로 만들고 이미지 전 처리 기능을 넣고 Hunspell- Spell Checker (http://hunspell.sourceforge.net/)을 적용하면 인식률을 엄청 끌어 올릴 수 있을 것 같은데 뭐....언젠가는 하겠지요 뭐...

,

이 글은 2014년 1월 5일 원래 제 다음 블로그에서 가져온 글입니다.

Long Live The Queen 프린세스메이커의 패러디 게임이라고 하는데 죽을일이 없는(가끔 가출은 하더만...) 프린세스 메이커와는 다르게 잘못된 선택은 곧 죽음인 살얼음판의 프린세스메이커라고 한다고해서 가격도 싸길래 냉큼 질러보았다.(사실 리눅스 지원인것도 한 몫했다. 리눅스 지원 게임이 그리 많지는 않으니..최근 개인프로젝트로 돌릴까 하는 클라우드게이밍도 스팀이 리눅스를 지원하면 그냥 클라우드 데스크탑에 스팀만 띄워주면 되니까 쉬워진다.)

일단 냉큼 지르고 영어의 압박을 간단히 떨친후(사실 영어로 되어있어서 반대로 게임하기 수월했다.) 뭐가뭔지 몰라(...) 공략을 찾던 중 이 게임이 Ren'Py라는 엔진으로 만들어졌다는 것을 알았다.

 Ren'Py... 이름에 왠지 Py가 들어가는데다가 MacOSX, Linux, Windows를 전부 지원한다? 혹시 이거 Python?하고 스팀설치 폴더에 들어가서 뜯어본결과 Python맞더만...그것도 PyGame이라는 엔진을 비주얼노벨용으로 만든게 Ren'Py고 PyGame이 안드로이드도 지원하기 때문에 Ren'Py도 안드로이드 지원이 가능하다고 되어있었다.

그러나. 이 게임은 스팀에서 판매하기에 안드로이드 지원이 될 턱이 없었고 스크립트 언어인 Python이라면 별 저항없이 안드로이드에 이식이 되지 않을까 하던중 RenPy SDK에서 안드로이드 지원이 가능하다는 것을 찾아내었다.

흐음...이걸 일단 안드로이드에 이식해 보기로 하고 결국 휴일에 삽을 들고 말았다...에라이.

 자 안드로이드 포팅(?)을 위한 준비물을 우선 말해보도록 하겠다. 여기서는 우분투같은 리눅스 환경에서 작업하는 것으로 되어있습니다. Mac이나 Windows는 스팀게임의 경로나 안드로이드폰 연결방법등이 다릅니다.

 http://baekansi.hosting.paran.com/doc/html/android.html

여기에 일단 안드로이드용으로 컴파일 하기위해 어떻게 해야할지 자세히 나와있다.

우선 필요한 것은

1. Ren'Py SDK http://www.renpy.org/latest.html

2. Oracle JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html

3. Python 2.7 이건 뭐...알아서 검색하던가 sudo apt-get install python2.7

4. RAPT(렌파이 안드로이드 패키징 툴)http://www.renpy.org/dl/android/

5. 손을 댈 Ren'Py로 만들어진 게임(여기선 Long Live The Queen 되시겠다. 이건 Steam관련 스크립트가 있긴 하지만...스팀없이도 실행되는 것을 확인)

6. rpatool https://github.com/Shizmob/rpatool  rpa나 rpi등으로 이미지나 음악들이 압축 되어있는 경우 어쩔 수 없이 이 파일들을 풀어 해쳐놓아야 안드로이드에서 실행이 된다. 아니면 다른 방법이 있을 수도 있는데 방법을 잘 모르겠다.(...)

7. 삽질을 위한 안드로이드 기반 기기(에뮬레이터는 비추)

8. adb 안드로이드개발 홈페이지에서 다운로드 받던지 아니면 sudo apt-get install android-tools-adb

*. 당신의 삽질력


일단 되었으면 JDK와 Python을 설치하자.

그리고 Ren'Py SDK를 적당한곳에 압축을 풀고 RAPT를 Ren'Py SDK의 압축 푼곳에다가 같이 압축을 풀어넣자.

압축 풀기가 완료되었다면 renpy.sh를 실행해서 Ren'Py런처가 실행이 잘 되는지 우선 보도록 하자. 되었다면 예시로 같이 들어있는 것도 실행해 보고 이것저것 하다가 일단 종료.

 이 제 스팀에서 Ren'Py게임을 구입하자. 아니면 조금 뒤적거리면 무료로 좋은 게임을 배포하기도 하니 잘 찾아보자. 걔중엔 지하철에서 하기에는 조금 엄한물건도 있기는 하지만....여기서는 아까 말했던 Long Live The Queen(이하 LLQ)을 이용하도록 하자. 그리고 꼭 한번 실행시켜주자. 가끔 스팀이 제대로 다운로드 안 하고 다 됐다고 사기치는 경우가 있어서 그런것이니  한번은 꼭 실행시켜보도록 하자.

실행이 확인 되었으면 ~/.local/share/Steam/SteamApps/common 로가면 당신이 그동안 스팀에다가 쏟아부은 결과물들이 들어가 앉아 있다. 여기서 Long Live The Queen이란 이름의 폴더째로 일단 복사하자.

 복사한 폴더는 위의 Ren'Py SDK와 RAPT의 압축을 풀어넣은 곳에다가 붙여넣기 하면 된다. 다시 한번 renpy.sh를 실행해보자. LongLifeTheQueen이 보이는가? 오른쪽에 Android라고 보이는가? 여기에 보면 Emulation으로 실행을 해볼 수 있다!!!! 그.러.나. 여기서 실행하면 당연하다는 듯이 에러난다. 이 에러를 잡는 것이 바로 이 삽질의 핵심이다.

삽질의 처음은 로그를 뜯어보는 것이다. 로그를 한번보자. glpatch.rpy가 에러가 났다고 나온다. 하지만 게임폴더를 아무리 뒤져도 rpy파일은 보이지 않는다. 사실 파이썬을 써보면 알겠지만 속도를 위해 한번 바이트코드로 컴파일하게 되는데 렌파이도 비슷한 원리로 스크립트를 컴파일 해 놓은 것이다. 즉 로그에서 rpy라고 나오는 파일이 사실 rpyc를 말하는 것으로 생각해도 좋다.
 

 암튼 glpatch라는 놈이 문제라고 되어있는데 이미 컴파일되어있는 스크립트를 어떻게 해볼 수는 없고 한번 제거해보도록 하자.즉 삭제! 그리고 빈파일을 하나 만들어서 glpatch.rpy라고 하나 만들어 놓자. 빈 파일이기 때문에 아무런 내용은 없지만 그렇다고 파일이 없으면 그건 그것대로 또 에러가 난다. 말그대로 patch라고 되어있는 걸로 봐서 OpenGL관련 문제를 해결한 패치로 보인다. 그러나 안드로이드에서는 저게 도리어 문제를 일으키니 패치를 없애도록 하자. 그리고 한번 게임을 실행해보면 glpatch.rpyc가 생성되어있는 것을 알 수 있다. rpy가 빈파일이므로 rpyc도 빈내용으로 만들어진 바이트코드가 된다. 이걸로 한 가지 알 수 있는 것은 저 패치는 PC에서만 통하는 것으로 보인다는 것. 아마 Nvidia나 ATI드라이버 호환내용이 아니었을까?

아까처럼 PC에서 renpy.sh를 실행하고 Android - Emulation - Phone 혹은 Tablet 를 실행해보자. 이번에는 타이틀 화면이 뜬다? 참고로 Translation.rpy를 작성한뒤 game폴더에 넣어주고 Translation.rpy에 폰트를 지정한다음 해당 폰트를 Game폴더에 같이 넣어주면 폰트도 맘대로 바꿀 수 있게 된다. 다만 은폰트나 나눔 폰트를 이용하는 것을 권한다. 맑은 고딕도 예쁘지만 이건 MS가 저작권을 지니고 있어서...Translation.rpy작성법은 http://www.renpy.org/wiki/Ren%27Py_%EC%97%90%EC%84%9C_%ED%95%9C%EA%B8%80_%EC%84%A4%EC%A0%95%EC%97%90_%EB%94%B0%EB%A5%B8_%EC%95%88%EB%82%B4

여기를 참조하시길

이제 안드로이드용으로 컴파일을 해보자. 해보기에 앞서서 터미널 사용법을 알고 있으리라 믿는다.

 renpy가 설치된 곳으로 가서 (RAPT의 압축을 푼 곳으로 가서)

./android.py installsdk

라고 치면 이 녀석이 안드로이드 SDK를 다운로드 받으면서 이것저것 물어보게 된다. 그냥 yes 혹은 no라고 대답만 하면 알아서 잘 해주니 그냥 시키는대로 하자.

그다음

./android.py configure LongLiveTheQueen

이라 치면 configure 뒤에 붙은 게임의 안드로이드 설정을 하게 된다. 역시 묻는말에 꼬박꼬박 대답하면 된다. 개인적으로는 2.2기반보다 4.0기반으로 만드는 것을 추천한다. 3.0은 그냥 버리는 거다.

이제 설정이 끝났다면 드디어 APK빌드를 해보게 된다. 이에 앞서 안드로이드 폰을 PC에 연결하고 ADB설정을 하고 디버그모드를 허용까지 해주어야 편하다. ADB설정은 이 블로그 어딘가에 잘 써있으니 참고.

일단 안드로이드기기를 PC에 연결하고

./android.py build LongLiveTheQueen release install

이렇게 하면 안드로이드용으로 빌드도 하고 안드로이드기기에 알아서 설치까지 다 해준다.


이제 실행해보기전에

./android.py logcat

을 실행하고 기기에서 게임을 실행해보자. (Ren'Py기본 아이콘에 기본로딩화면이 뜬다. 이는 RAPT루트/res/drawable을 교체함으로써 바꿀 수 있다. 이건 그냥 참고사항


아마도 혹은 역시나 에러를 내뿜어 주실것이다.

 steam.rpy

결국 스팀이 일을 내주셨다. 아까처럼 steam.rpyc를 삭제하고 빈파일로 steam.rpy파일을 하나 만든 후에 게임을 한번 실행하고 다시 APK를 만들어주자.


그리고 bytecode.rpyb파일은 그때그때마다 삭제해놓길 바란다. 게임실행속도를 올리기위한 방법중 하나지만 APK의 용량증가의 원인중 하나이므로...


이제는 안드로이드기기에서 타이틀화면을 봐야 정상인데....

 안된다. 그럼 아까처럼 logcat을 한번 보자.

  왠 아이콘 이미지를 못 찾는다고 뜬다.(icon-big.png)ignore 버튼을 누르니 이번엔 배경이미지를 못찾는다고 하고 배경음악도 못찾는다고 하고..

이 파일들 아까 Game폴더에 없었는데?


 사실 이것의 경우는 안드로이드용 렌파이의 문제일것으로 보인다. 게임 개발자나 회사에서 감추고픈(?) 이미지나 음악들이 떠돌아다니는 것을 싫어하기에 Ren'Py에서는 rpa라는 파일로 압축+암호화를 하는데 이게 안드로이드 내에서 정상적으로 복호화가 진행이 되지 않은 것이다. 잘 뒤져보면 llq.rpa란 파일이 보인다. 아마 못찾는다고 뜬 파일들은 이 안에 다 있을 것이다. 그럼 이걸 풀어서 game폴더에 흩뜨려 놓으면 정상적으로 실행이 될 것이다.

그럼 무엇으로 복호화를 할까? 아주 간단하게도 rpatool을 이용하면 된다. 이 것도 하나의 파이썬 스크립트로 되어있는데 그냥 game폴더에 넣어주자. 그리고 cd명령으로 game폴더까지 들어간다음

./rpatool.py -x llq.rpa

이러면 암호화되었던 것들이 압축이 싹풀리면서 보이게 된다. 그럼 이제 rpatool하고 llq.rpa파일은 필요없어졌으니 삭제하자. 겸사겸사 bytecode.rpyb파일도 삭제해주고.

이제 다시 빌드하고 폰에 넣으면?

 타이틀화면 입성! 게임까지 입성이다!!!

오오..


힘든 사투였다.오오..근데 이 게임을 지하철에서 하는 건 좀 무리 아니려나...

2014. 7 .26 우선 안드로이드 포팅을 하는 방법을 올린 유튜브 영상이다. 본인이 찍었으며 이 방법을 통해서 만들어진 결과물을 마음대로 배포하지를 않기를 바란다. 만들어진 결과물은 개인적으로만 사용하고 꼭 스팀에서 구입한 것을 이용하자. 공식홈페이지에서 구입한 것은...잘 모르겠다.


,