OpenRCT2는 롤러코스터 타이쿤2를 리버스 엔지니어링해서 만들어진 프로젝트입니다.
리버스엔지니어링은 거의 완벽한 수준이고 플레이에도 전혀지장이 없습니다. 그리고 으레 그렇듯 소스가 공개되어있기에 이런저런 능력자들이 힘을 쓰고 있습니다.
대표적으로 한국어 지원문제가 있었는데 한국인 기여자분께서 TTF폰트 지원을 기여해 나눔고딕같은 폰트를 쓸 수 있었습니다. (대신 좀 config설정이 필요했습니다.)
그런데 안드로이드에선 한글이 나오지 않더군요. config의 위치를 파악하고(/sdcard/openrct2-user) 고쳤음에도 폰트를 읽지 못하는듯 싶었습니다.
https://github.com/OpenRCT2/OpenRCT2/issues/21634
Enable TTF in Android builds · Issue #21634 · OpenRCT2/OpenRCT2
#21631 introduced freetype to Android builds, but in order to use it, we need a mechanism to locate fonts. On Android it should be fairly easy, as there are only 3 system-wide fonts available and t...
github.com
이미 이슈가 되어있었는데 자세히보니 Android빌드에서 GetFontPath를 사실상 안 하더군요. 아니 애초에 불가능한듯 했습니다.
이슈 아래를 읽어보니 assets에 직접 ttf를 넣고 이걸 강제로 읽는건(그러니까 그냥 절대경로 리턴) 어떠냐는건데 나눔고딕이나 Noto sans cjk같은걸 넣으면 딱이긴 합니다.
그런데 그 뒤에 아무소식이 없는걸보면 아무래도 잘 안 됐나 봅니다. 그도 그럴게 freetype이 일단 적용되어야하고 또 그게 잘 된다는 보장도 없거든요.
차라리 g2.dat에 있는 폰트 스프라이트를 개조해서 한글 2000자 남짓을 넣는게 더 빠를지도 모르겠습니다.
그나저나 골때리는걸 보면 기여자는 기여자대로 적고 소스도 이해가 잘 안되니 이거야 원...
일단 안드로이드 버전빌드 환경부터 갖추고 직접 해보죠 뭐.
-----------------------소스코드 확인결과------
기본적으로 안드로이드 버전은 NoTTF 옵션으로 빌드되게 되어있습니다.
즉, TTF가 적용이 안 되는 겁니다.
해당옵션을 제거하고 빌드해보니 FreeType관련 오류가 쏟아지는군요. 안드로이드 NDK용 Freetype과 PC에서의 Freetype은 조금 다른가봅니다.
선택지는 두가지입니다.
1. 안드로이드 freetype을 따로 빌드해서 TTF가 적용되게 한다.
2. 그냥 무식하게 한글 2038자 정도를 스프라이트 파일에 쑤셔넣는다. (참고 https://github.com/OpenRCT2/OpenRCT2/issues/13318)
위 방식을 쓰면 어쨌건 외부TTF를 이용해서 폰트를 쓸 수있게 되는거고 아래방식을 쓰면 무식하긴하지만 앞으로 한글 렌더링 걱정을 안 해도 되는 겁니다.
일단은 위 방식으로 해볼건데 안되면 일이 커지겠지만 아래방식으로 시도할겁니다.
========================2025.03.12========================
한글 성공했습니다.
Freetype이 전혀 적용이 안 만들어져 있는줄 알았는데 사실 안드로이드 빌드용 라이브러리에 freetype이 이미 있었더군요.
대체 왜 컴파일할때 안 만들어 넣었는지는 전혀 모르겠지만...
다만, 소스코드의 일부를 수정해야 했습니다. 현재 안정버전인 0.4.20 기준으로
/src/openrct2/platform/PlatformAndroid.cpp
위 파일에서 165번째 줄
std::string GetFontPath(const TTFFontDescriptor& font)
std::string GetFontPath(const TTFFontDescriptor& font)
{
//STUB();
//return {};
return "/sdcard/openrct2/rct2.ttf";
}
이 함수를 이렇게 고쳐서 ttf파일의 경로를 강제로 지정합니다. 어차피 g2.dat를 넣기 위해서 /sdcard/openrct2 폴더는 만들어야 하니 그냥 여기에 넣으면 될겁니다.
저는 역사와 전통의 나눔고딕을 넣었습니다. 물론 rct2.ttf라고 파일명을 바꿔서요.
그리고
/src/openrct2-android/app/src/main/CMakeLists.txt
여기를 많이 고쳐야 합니다. 의외로 버그도 좀 있습니다.
193번때 줄
include_directories(SYSTEM "${CMAKE_BINARY_DIR}/libs/include/freetype2")
이렇게 된걸
include_directories(SYSTEM "${CMAKE_BINARY_DIR}/libs/include/freetype")
뒤에 2를 지우셔야 합니다. 빌드 될때 제일 오류가 많이 난 이유인데 빌드 폴더에 들어가보니 freetype2가 아니라 freetype 이더군요. 그래서 이 부분을 고쳤습니다.
그리고 197번째 줄 저는 주석 처리한 뒤에 아래에 새로 적었는데
add_definitions(-DDISABLE_DISCORD_RPC -DDISABLE_OPENGL -DGL_GLEXT_PROTOTYPES -D__STDC_LIMIT_MACROS -DNO_TTF -DSDL_MAIN_HANDLED)
add_definitions(-DDISABLE_DISCORD_RPC -DDISABLE_OPENGL -DGL_GLEXT_PROTOTYPES -D__STDC_LIMIT_MACROS -DSDL_MAIN_HANDLED)
-DNO_TTF를 지워줍니다. 이 부분은 NoTTF 빌드 옵션을 건다는 의미이므로 해당 옵션을 지워야 정상적으로 돌아갈겁니다.
그리고 제일 많이 괴롭힌건데 254번째 줄에
target_link_libraries(openrct2 android stdc++ log dl SDL2 png z icu icuuc icudata crypto ssl freetype)
ssl뒤에 freetype을 적어 줍니다. 이것때문에 또 왕창 오류가 났는데 알고보니 openrct2 메인라이브러리에도 freetype함수를 불러오게끔 되어 있더군요.
그리고 빌드 시 오류중 하나를 잡기 위해서
sudo apt install nlohmann-json
위 명령어로 nlohmann-json 패키지를 설치후에
/usr/include/niohmann 폴더를
src/thirdparty/niohmann으로 복사합니다. 이러니까 안드로이드 스튜디오에서 알아서 잘 인식하더군요.
그리고 안드로이드에 설치하는 법대로 알아서 OpenRCT2를 설치하고 실행하면..
폰트가 깨져 있을 겁니다.
이번에는 PC에서 했던 대로 config.ini를 수정해야 합니다.
스마트폰에서 openrct2-user 폴더에 들어가면 config.ini파일이 있습니다. 이걸 열고
[font]부분을 찾으면 죄다 비어있을 텐데 나눔고딕 파일을 openrct2/rct2.ttf 파일명으로 넣어놓고 다음과 같이 수정합니다.
[font] file_name = "/sdcard/openrct2/rct2.ttf" font_name = "NanumGothic" x_offset = 1 y_offset = -2 size_tiny = 11 size_small = 12 size_medium = 12 size_big = 13 height_tiny = 12 height_small = 14 height_medium = 14 height_big = 16 |
출처 : https://telk.kr/tb/free/1599?category=53
OpenRCT2에서 사용하는 폰트 바꾸기!
먼저 이 방법은 2f36dbf (2016년 5월 12일...
telk.kr
다른 폰트를 쓴다면 저 수치는 또 변할겁니다. 하지만 PC에서와 같기에 인터넷 잘 뒤지면 수치를 찾을 수 있을 겁니다.
이제 안드로이드에서 OpenRCT2를 실행하면...
PC에서 보던 그 모습 그대로 뜨는 군요.
이제 안드로이드에서도 OpenRCT2를 한글로 즐기는 방법을 찾았습니다.
남은건... 수정소스를 PR 하는 것 뿐.
'헛소리와 잡담' 카테고리의 다른 글
Firefox 그리고 UserAgent의 like Gecko (0) | 2024.04.22 |
---|---|
비개발자들이 생각하는 개발자들 (1) | 2024.04.07 |
webkit은 제2의 트라이던트를 꿈꾸는가 (1) | 2024.02.26 |
광고차단과의 전쟁 과연 승자는 (0) | 2024.01.06 |
구글의 ANGLE이란 무엇일까 (1) | 2023.12.17 |