Korean_IME_suport_Linux_v2.tar.gz



http://moordev.tistory.com/242 두근두근 문예부! 리눅스에서 굴리기


해당 글에서 우리는 두근두근 문예부를 굴리는데 성공했습니다.

그런데 다른 것은 하나도 문제가 없는데 이름 입력할 때 한국어가 입력이 안 된다는 문제가 있었습니다.


패치는 글 제일 아래에 있습니다. 아래에서 이야기하는 것은 다 넣어놨으니 그냥 패치만 필요하신 분은 그냥 글 아래로 쭉 내려가세요.


원인이 Ren'Py 엔진이 사용하는 SDL이 리눅스에서 사용하는 XIM프로토콜(한국어, 중국어, 일본어 입력기에서 사용하는 프로토콜)이 지원이 안된다고 합니다. 게다가 해당 프로토콜이 딱히 정형화 되어 있지 않은 것이 워낙 많아서 SDL에서 지원을 하기가 좀 걸끄러운 수준인 듯 합니다.


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

여기 보면 해당 사항에 대해 나와있습니다.


대충 해석하면 리눅스에서는 IME가 필요한 한국어, 일본어, 중국어 입력이 불가능



그래서 다른 방법을 생각했습니다.


그럼 어차피 Python이니 Python의 기능을 활용해서 넣으면 되는거 아닌가?

실제로 Tkinter같은 간단한 GUI 라이브러리를 쓰면 아무런 문제가 없을테니까요.


그래서 게임을 뜯었습니다. 


rpatool https://github.com/Shizmob/rpatool

unrpyc https://github.com/CensoredUsername/unrpyc



이 둘을 쓰면 rpa를 뜯고 스크립트를 들여다보는 것은 어렵지 않습니다. 자세한 것은 직접 확인을 부탁드리고 우선 Tkinter를 렌파이에 삽입하기 전에 간단한 GUI를 만들어보았습니다.

#-*- coding: utf-8 -*-
from Tkinter import *

name = ""
root = Tk()
def okClick():
    name = txt.get()
    root.destroy()
    print name

lbl = Label(root, text="이름")
lbl.pack()

txt = Entry(root)
txt.pack()

btn = Button(root, text="OK", command=okClick)
btn.pack()

root.mainloop()

렌파이는 아직도 Python2.7을 쓰기 때문에 2.7에 맞춰서 제작했습니다. 해당 프로그램은 이름을 입력한 후 OK버튼을 누르면 터미널에 입력한 문장을 띄우는 지극히 간단한 GUI프로그램입니다.


우분투라면 python-tk 패키지를 미리 설치해야 작동합니다.

sudo apt install python-tk


나중에는 python2.7-tk 이런 식으로 이름이 바뀔 수도 있습니다. 그때가면 알게 되겠지요.


이런 것을 넣기로 게임에 해당 코드를 삽입하기로 했습니다.


Scripts.rpa파일은 game 폴더 안에 있다. 사실 여긴 게임하다보면 자주 들락날락 하게 되는 곳이기도 하다.



scripts.rpa파일이 보이는 군요. 이 안에 필요한 파일이 있을 것입니다.


rpatool -x scripts.rpa


rpatool이 설치 된 곳에서 명령을 내리세요.


그러면 수많은 rpyc파일들이 쏟아집니다. 그러면 이걸 rpy로 디컴파일 해야 합니다. 제가 원하는 파일은 screen.rpyc더군요.(노가다해서 알아냈습니다.


python unrpyc.py screen.rpyc (screen.rpyc 파일을 unrpyc와 함께 놓고 명령을 내리세요.)


이렇게 하면 디컴파일된 코드를 얻을 수 있습니다. 이걸 수정해서 (설치폴더)/game

에 rpy 상태로 그냥 넣으면 수정된 코드로 작동하게 됩니다. 이건 LongLiveTheQueen에서 잘 써먹었던 방법이지요. rpa에 있는 스크립트보다 밖에 있는 스크립트가 우선됩니다.


그리고 screem.rpy파일을 잘 뒤져서

init -501 screen name_input(message, ok_action):


코드를 찾습니다.

이 부분이 바로 이름을 입력하는 부분!


 init -501 screen name_input(message, ok_action):
    python:
        #-*- coding: utf-8 -*-
        from Tkinter import *
        global root
        global tk_txt
        global name
        global player
        tk_txt = ""
        name = ""

        root = Tk()
        def okClick():
            global name
            global tk_txt
            global player
            name = tk_txt.get()
            root.destroy()
            player = unicode(name)
            print player
      
        lbl = Label(root, text="이름을 입력해 주세요")
        lbl.pack()
        
        tk_txt = Entry(root)
        tk_txt.pack()
        
        btn = Button(root, text="OK", command=okClick)
        btn.pack()
        if not player:
            root.mainloop()

        else:
            del(root)
            del(tk_txt)
            del(name)

        
    modal True

    zorder 200

    style_prefix "confirm"

    add "gui/overlay/confirm.png"
    key "K_RETURN" action [Play("sound", gui.activate_sound), ok_action]

    frame:

        has vbox:
            xalign .5
            yalign .5
            spacing 30

        #label _(message):
        label _(player+"(으)로 진행합니다."):
            style "confirm_prompt"
            xalign 0.5
        #input default "name" value VariableInputValue("player") length 12


        hbox:
            xalign 0.5
            spacing 100

            textbutton _("예") action ok_action



여기서 붉은 색으로 표시한 부분이 추가한 부분입니다.

그리고 초록색으로 표시한 부분은 앞에 #을 추가하여 삭제한 코드입니다.

아래쪽에 frame: 안을 보시면 label _(message)를 삭제하고 player란 변수에 들어간 이름을 쓴다는 지극히 쓸데없는 메시지를 한번 더 띄웁니다. 사실 본래 이름입력하라고 한 창을 최소한의 수정으로 바꾼 것입니다.


이걸 쓰면 일단 TK로 된 창이 뜨고 이름을 입력하면 기존 player라는 변수에 이름이 입력되게 됩니다.


문제는 Renpy에 Tkinter 라이브러리를 넣어줘야 한다는 것.

어차피 제가 올려놓은 패치에는 필요한 라이브러리는 다 넣었습니다.


(문예부 설치폴더)/game/python-package

여기에 해당 모듈을 쏟아 부어줘야 합니다.

시스템에 python2.7이 설치되어 있다면

/usr/lib/python2.7/lib-tk

여기에 해당 모듈이 다 있습니다. 이걸 (문예부 설치폴더)/game/python-package 여기에 싹 복사해서 넣어주면 됩니다.


그리고 추가로 python2.7.14의 _tkinter.so파일이 필요합니다. 이건 Debian패키지에서 찾아서 넣어주면 됩니다.

https://packages.debian.org/sid/python-tk

여기서 sid버전의 DEB을 다운로드 받은 다음 압축을 풀어서 AMD64패키지의 것은


(문예부 설치폴더)/lib/linux-x86_64/lib

여기에 _tkinder.so 파일을 넣고

i386은 (문예부 설치폴더)/lib/linux-x86/lib

여기에 넣으면 됩니다.


그러면

이렇게 별도의 창을 띄울 수 있게 됩니다. 이러면 한글 입력이 가능해지는 것이지요!


이제 리눅스에서도 한글 이름 입력을 할 수 있게 되었습니다!


 

 

 




수정 전 후비교


왼쪽은 백날 아무리 두드려봐야 한글 입력이 안 되지만 오른쪽은 한글로 입력이 가능해집니다. 추가로 글자수 제한이 풀려서 14자 이상의 글자 입력이 가능합니다.


해당 패치는 리눅스 전용입니다. Windows에서는 정상작동이 절대로 안 되니 Windows 사용자분들은 굳이 설치 하지 마세요.(애초에 Windows는 한글입력이 잘 되니까 이런 짓 안 해도 됩니다.)


===================================


2018. 4. 13


세이브중에 세이브가 안 되는 버그가 발견되어 이를 수정한 패치를 만들었습니다.


Korean_IME_suport_Linux_v2.tar.gz


수정 부분은

         if not player:
            root.mainloop()

        else:
            del(root)
            del(tk_txt)
            del(name)


이 부분으로 이름입력이 끝난후 필요없어진 TK관련 객체를 삭제하는 코드를 넣었습니다. 그랬더니 세이브가 잘 되더군요.


====사용상 주의사항======


1. 한글 이름입력을 위해 Tkinter를 이용한 패치입니다. 따라서 Tcl/Tk 라이브러리가 설치되어야 합니다.


우분투의 경우

sudo apt install python-tk


명령을 통해 Tkinter 설치가 가능합니다.


2. 한국어 입력기에 따라 마지막 글자가 입력이 될 수도 있고 안 될 수도 있습니다. 그럴 때는 화살표 키를 한번 눌러주시면 마지막 글자가 입력 됩니다.


3. 이름을 입력하고 되돌리기는 불가능합니다. 이름을 잘 못 입력했다면 그냥 눈물을 머금고 다시 게임을 시작하시기 바랍니다. game폴더의 firstrun파일을 지우면 완전 처음부터 가능합니다.


4. 이 패치는 오로지 한국어 환경에서 리눅스를 사용하는 사람들을 위한 패치입니다. 절대로 한글 패치가 아닙니다.


5. 게임을 수정한 것이기에 Monika가 갑자기 놀랄 수가 있습니다. 그건 제가 알 바 아닙니다.


6. 게임이 이상해진다거나 하는 것은 이 패치 때문이 아닙니다. 이 쯤 되면 다들 알잖아요?


7. 게임내의 캐릭터가 사라지는 것은 이 패치 때문이 아닙니다.


8. 저는 Team Salvato와 아무런 관계가 없습니다. 한글패치 팀과도 아무런 관계가 없습니다.


9. JUST MONIKA

,

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


,