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

,