이제 혼자서 박치기를 할 수밖에 없어진 상황...


일단 같은 lucasystem을 사용하던 리틀버스터즈 EE를 번역하셨던 분과 연락이 닿아 

그래도 한글 출력을 위한 방법을 알게 되었는데.


결론부터 말하자면 저의 상상력이 부족한 거였습니다...



저는 계속 일본어와 한자만 구성 되어있는 엔진의 폰트 비트맵에 어떻게 한글을 추가할지만 연구를 하고 실험을 하고 있었는데.


해결 방법은 비트맵의 한자 부분을 한글 폰트 이미지로 바꾸고 스크립트의 번역된 대사들을 같은 위치의 한자로 1대1 대응을 해 넣는 것이였습니다. ㄷㄷ


방법을 알았으니 이제 실행에 옮겨야 하는데 


일단 두가지로 나누자면


1. Luca System 엔진의 폰트 비트맵을 추출 후 한자 이미지를 한글로 변경.


여기서 바로 문제가 발생합니다.

Lucksystem 툴의 비트맵 제작 기능을 한글 폰트에 사용할 경우;



정상적인 좌표에 넣지 못하고 이렇게 받침이 없는 문자의 위치가 뜨게 되어 정상적인 출력이 되지 않습니다.



그렇기에 폰트 비트맵 제작 프로그램을 직접 만들수밖에 없게 되었습니다. 



그리고 몇시간에 걸친 머리굴림과 연구 끝에 허접하지만 성공적으로 원하는 폰트와 좌표로 비트맵을 생성하는 

프로그램 제작에 성공했습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageDraw, ImageFont
 
    # 원본 비트맵에서 추출한 문자열을 읽는다
def create_bitmap_font(chars_file, font_path, letter_size, bitmap_size, output_file, letter_spacing, line_spacing):
    with open(chars_file, 'r', encoding='utf-8') as f:
        chars = f.read().strip()
        
    # 투명한 빈 이미지를 생성
    image = Image.new('RGBA', bitmap_size, (255, 255, 255, 0))
    draw = ImageDraw.Draw(image)
    # 폰트를 읽는다
    font = ImageFont.truetype(font_path, letter_size[1])
    
    # 좌표 값 지정ㅇ
    x_offset = 0
    y_offset = 0
    max_char_width = letter_size[0] + letter_spacing # 글자 간격 & 줄 간격 설정
 
    for char in chars:
        if x_offset + max_char_width > bitmap_size[0]:
            x_offset = 0
            y_offset += letter_size[1] + line_spacing
            if y_offset + letter_size[1] > bitmap_size[1]:
                break
        # 하얀색으로 폰트 그리기
        draw.text((x_offset, y_offset), char, font=font, fill=(255, 255, 255, 255))
        x_offset += max_char_width
        
    # 이미지 저장
    image.save(output_file)
 
def open_file_dialog(entry_widget):
    filename = filedialog.askopenfilename()
    entry_widget.delete(0, tk.END)
    entry_widget.insert(0, filename)
 
def submit():
    chars_file = chars_file_entry.get()
    font_path = font_path_entry.get()
    letter_size = (int(letter_width_entry.get()), int(letter_height_entry.get()))
    bitmap_size = (int(bitmap_width_entry.get()), int(bitmap_height_entry.get()))
    output_file = output_file_entry.get()
    letter_spacing = int(letter_spacing_entry.get())
    line_spacing = int(line_spacing_entry.get())
    
    create_bitmap_font(chars_file, font_path, letter_size, bitmap_size, output_file, letter_spacing, line_spacing)
 
root = tk.Tk()
root.title("Luca System 비트맵 생성기")
 
tk.Label(root, text="문자열 파일").grid(row=0)
tk.Label(root, text="사용할 폰트").grid(row=1)
tk.Label(root, text="글씨 넓이").grid(row=2)
tk.Label(root, text="글씨 높이").grid(row=3)
tk.Label(root, text="비트맵 넓이").grid(row=4)
tk.Label(root, text="비트맵 높이").grid(row=5)
tk.Label(root, text="출력파일 이름").grid(row=6)
tk.Label(root, text="글자 간격").grid(row=7)
tk.Label(root, text="줄 간격").grid(row=8)
 
chars_file_entry = tk.Entry(root)
font_path_entry = tk.Entry(root)
letter_width_entry = tk.Entry(root)
letter_height_entry = tk.Entry(root)
bitmap_width_entry = tk.Entry(root)
bitmap_height_entry = tk.Entry(root)
output_file_entry = tk.Entry(root)
letter_spacing_entry = tk.Entry(root)
line_spacing_entry = tk.Entry(root)
 
chars_file_entry.grid(row=0, column=1)
tk.Button(root, text="Browse", command=lambda: open_file_dialog(chars_file_entry)).grid(row=0, column=2)
font_path_entry.grid(row=1, column=1)
tk.Button(root, text="Browse", command=lambda: open_file_dialog(font_path_entry)).grid(row=1, column=2)
 
letter_width_entry.insert(0, "41")
letter_height_entry.insert(0, "41")
bitmap_width_entry.insert(0, "4200")
bitmap_height_entry.insert(0, "3024")
output_file_entry.insert(0, "bitmap_font_41.png")
letter_spacing_entry.insert(0, "1")
line_spacing_entry.insert(0, "1")
 
letter_width_entry.grid(row=2, column=1)
letter_height_entry.grid(row=3, column=1)
bitmap_width_entry.grid(row=4, column=1)
bitmap_height_entry.grid(row=5, column=1)
output_file_entry.grid(row=6, column=1)
letter_spacing_entry.grid(row=7, column=1)
line_spacing_entry.grid(row=8, column=1)
 
submit_btn = tk.Button(root, text="비트맵 생성", command=submit)
submit_btn.grid(row=9, columnspan=3)
 
root.mainloop()
 
cs







결과물! 

원본 비트맵에서 추출한 문자열을 읽어온 뒤에 투명한 배경에 맞는 해상도와 좌표값(줄 간격&글자 간격)에

원하는 지정한 폰트를 하얀색으로 그려주는 프로그램입니다..



이제 다음 문제로 넘어가자면


2. 번역된 스크립트의 한글 글자를 좌표 순서에 맞는 한자와 1대1 변경하는 프로그램을 만드는 것.



이것 또한 다음날 퇴근 후에 새벽까지

시행착오를 한 결과 마찬가지로 허접하지만 일단 원하는 결과가 나오는 프로그램을 만들었습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import os
import tkinter as tk
from tkinter import filedialog
 
def read_mapping_dict(mapping_file):
    # 직접 만든 매핑 사전 읽기
    mapping_dict = {}
    with open(mapping_file, 'r', encoding='utf-8') as file:
        for line in file:
            korean, chinese = line.strip().split()
            mapping_dict[korean] = chinese
    return mapping_dict
 
def replace_korean_with_chinese(text, korean_to_chinese):
    replaced_text = ''
    for char in text:
        # 한국어 인식시 한자로 바꾸기
        replaced_text += korean_to_chinese.get(char, char)
    return replaced_text
 
def convert_files():
    input_folder = 'import'
    output_folder = 'export'
 
    os.makedirs(output_folder, exist_ok=True)
 
    # 사전 읽기
    korean_to_chinese_file = 'korean_to_chinese_mapping.txt'
    korean_to_chinese = read_mapping_dict(korean_to_chinese_file)
 
    # import 폴더안 파일들 인식
    for filename in os.listdir(input_folder):
        if filename.endswith('.txt'):
            input_file = os.path.join(input_folder, filename)
 
            with open(input_file, 'r', encoding='utf-8') as file:
                text = file.read()
 
            # 글자 변경
            modified_text = replace_korean_with_chinese(text, korean_to_chinese)
            output_file = os.path.join(output_folder, filename)
 
            # UTF-8 & 유닉스 lf
            with open(output_file, 'w', encoding='utf-8', newline='') as file:
                file.write(modified_text)
 
    result_label.config(text=f"파일 변환 완료")
 
if __name__=="__main__":
    # GUI
    window = tk.Tk()
    window.title("import폴더안스크립트들의한글글자들을한자로1대1변환뒤에export폴더에저장하는프로그램 1.0")
    window.geometry("800x100")
 
    # 버튼
    convert_button = tk.Button(window, text="파일 변환", command=convert_files)
    convert_button.pack(pady=10)
 
    # 레이블
    result_label = tk.Label(window, text="")
    result_label.pack(pady=5)
 
    window.mainloop()
 
cs




import 폴더에 한글로 번역한 스크립트 파일을 넣어두고 파일 변환 버튼을 누르면 



export 폴더에 파일이 변환됩니다.



성공적으로 변환이 된 모습입니다.



그러면 이제 변환된 스크립트를 SCRIPT.PAK으로 리팩하고

만든 폰트 비트맵을 FONT.PAK 안의 파일들과 교체를 해주면...?




(며칠 만에 본 드디어 작동하는 감동적인 장면)


성공적으로 한글 출력이 되는 모습입니다.




다만 여기서 끝나게 되었다면 단순한 일지가 아니라 간이 한글 패치를 배포했겠죠....

마지막 문제가 남아있습니다.


바로 script.pak 의 대사에서 


예) MESSAGE (124, "@焼軒獣原@「益掘辞……益 陥製拭虞壱澗 源馬走 省走幻, 謝戚 厳備壱 赤澗 蟹税 企重拭, 馬蟹 採店閤焼 爽走 省澗亜?」" 가

MESSAGE (124, "@焼軒獣原@「1益掘辞……益 陥製拭虞壱澗 源馬走 省走幻, 謝戚 厳備壱 赤澗 蟹税 企重拭, 馬蟹 採店閤焼 爽走 省澗亜?」") 처럼 


한 글자라도 글자 수가 달라질 경우 선택지가 작동하지 않게되는 것.

(이것은 한글 출력 성공 전에도 있던 문제입니다.)


대표적으로 1챕터의 스크립트 파일을 (0206-01-00.txt)를 열어서, 첫 번째 선택지 부분을 보면



선택지를 누를 경우 ONGOTO 를 이용해서 어떤 장면으로 이동할지 정해지는데 뒤에 오는 숫자들

" (65530, 12835, 12344, 12592, 0, 37376, 14, 0, 43008, 31, 0x0) " 이 무엇을 의미하는지 도저히 모르겠습니다...


유일하게 알아낸 사실이 있다면 대사에 아무 글자나 단 한 개라도 추가 하거나 뺄 경우에 선택지가

작동하지 않게 되는 것을 보니 전체 대사의 글자 수 변동 시 뭔가가 달라져서 생기는 문제인 것 같습니다.


+ 새로 알게 된 점은 바뀐 글자 수 만큼 첫 번째 숫자 65530에 더하거나 뺄 경우 오류 선택 창은 안 나오지만, 

어느쪽을 누르든지 같은 결과가 나오게 됩니다.



정말 어려운 것은 다한 것 같은데…. 또 벽에 막힌 기분이어서 정말 슬프네요, 혹시 누구라도 뒤에 숫자들이

무엇을 의미하는지 알아내신다면 제가 원하시는 프렌차이즈 기프티콘이라도 보상하겠습니다.


제가 제작한 프로그램들 각종 파일들, 원본 게임, 추출한 스크립트 파일 첨부해서 업로드 합니다.

+파이썬 설치 없이 프로그램 실행할 수 있게 .exe 로 변환도 해뒀어요

+비트맵 한글화가 되어 있는 FONT.PAK을 적용하고 게임속 설정에서 明朝 폰트로 변경해야 합니다.

aHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2ZpbGUvZC8xR1JHT1RkR1JHQ2RPTXJtcmg5Q0VmajV4MEpza2xjMmcvdmlldz91c3A9c2hhcmluZw==


부디 제발 도와주세요...