Undertale Engine/Kristal類游戲漢化思路

(本文基于MarkDown格式撰寫,使用的符號不做刪改,不影響閱讀)
# Undertale Engine游戲漢化思路
> Undertale Engine (UTE)一般指的是糖萌蘆于 2018 年 8 月開發(fā)的 Undertale 游戲制作模板。使用者需要使用 GameMaker 加載模板工程進(jìn)行開發(fā)。
>
> 該模板包含了主世界和戰(zhàn)斗功能,同時包含了多個方便開發(fā)的工具,例如 Anim 緩動系統(tǒng)、Console 調(diào)試控制臺等。
>
> 目前 Undertale Engine 只進(jìn)行功能性維護(hù),將不再得到更新。?
——摘自[UT社區(qū)維基(UTCWIKI)](https://utcwiki.com/Undertale_Engine)
關(guān)于UTE游戲的漢化,之前已經(jīng)有人提供方法了,在這個視頻中,@憨憨羊の宇航鴿鴿 講到了ute游戲漢化字體內(nèi)嵌的方法
這里我以內(nèi)嵌和外置字體的方法進(jìn)去字體的替換
一樣的,我們需要utmt來打開data,別搞丟了喲
## 內(nèi)嵌字體
這里以fdy的困難杉為例子(抱歉屯的ute游戲很少)
典型的UTE游戲一般都有bin,locale文件夾(其中l(wèi)ocale文件夾是放語言文件的地方。制作者通常不會全把文本寫在那里,只是部分會需要。所以文本方面記得多看看data里面的strings欄喲)
我們用utmt打開data.win,進(jìn)行字體內(nèi)嵌
我們搜索text,找到`gml_Object_text_typer_Other_15`,如圖所示

你會發(fā)現(xiàn)右邊有好多橙色和黃色
我們先看黃色的是什么
如果你在`"locale\english\string"`這個文件夾,打開**font.txt**,發(fā)現(xiàn)左邊**雙引號的字符串跟上面圖中黃色的一模一樣**(這里是得到該txt的字符串,相關(guān)變量會進(jìn)行識別,這里不多講)

這里我們是內(nèi)嵌字體,那就內(nèi)嵌咯。使出你的ImportFontData.csx,導(dǎo)入字體
導(dǎo)入完了,那我們怎么讓游戲用到我們導(dǎo)入的字體呢?
沒錯,這也就是我要你打開那個代碼的目的:把原來使用的字體換了
這里我導(dǎo)入的字體為:`fnt_comicsans`,`fnt_maintext`,`fnt_plain`,分別對應(yīng) sans、主世界、怪物說話字體

這里我們把第一個字體為sans字體,對應(yīng)文本中的{font 3}

然后我們改為下面的

以此類推,我們把其他的[4,0],[4,1],[5,0],[5,1]分別改為主世界,怪物說話字體(其實這里作者已經(jīng)內(nèi)置相關(guān)的英文字體,不過這里只是舉例)

點擊代碼外部保存,你會發(fā)現(xiàn)那些字體名都變成了數(shù)值(utmt特性罷了,不用擔(dān)心)

至此完成了字體的使用
翻譯文本時切換字體應(yīng)為: {font +**_group_font[]數(shù)組的第一個數(shù)**},比如我這里sans的為`{font 3}`,主世界的為`{font 4}`
要不我們試試看?
這是開頭殺前的一段話:

稍微修一下:

我們保存看一下效果:

這里再把它換成主世界字體看看({font 3}改為{font 4}):

之后就自己去翻譯啦,你已經(jīng)學(xué)會內(nèi)嵌字體了!ヾ(≧▽≦*)o
##外置字體(消除抗鋸齒)
其實外置字體也沒什么可講的,只要把對應(yīng)Lang的字體文件換一換,ini文件里參數(shù)換一換,就基本上ok的了
不巧的是,當(dāng)你把字體換上,并且把字體大小改了之后,進(jìn)入游戲看,字體居然是糊的!
啊啊啊啊啊啊啊啊啊啊啊要死了要死了!?。。。?!
別急,下面就是消除抗鋸齒的方法
還是utmt打開data.win,搜索text找到`gml_Object_text_typer_Other_15`
你可能會好奇:_group_font[]的右值 Lang_GetFont()是什么?
問到點上了。這是一個函數(shù),用來獲取外部字體資產(chǎn)的值(簡單點說就是這個函數(shù)來讀外部的字體的,當(dāng)然僅限ute,因為這是作者(指tml)自己寫的 而非gm內(nèi)置)
那么我們找找唄~
既然這是獲取,那么就得找找讀取這個函數(shù)的腳本(即load)
我們在搜索框搜索lang,相應(yīng)的code欄找到 `gml_Script_Lang_LoadFont` 這段代碼

我們重點關(guān)注30行之后的。我們來看到37行,發(fā)現(xiàn)有個`font_add()`函數(shù)哎
什么?你不知道這是什么?那我稍微引用下吧
> 此函數(shù)可用于從**包含的文件**中存在的字體文件向游戲添加字體??梢远x字體的大小 (以點數(shù)表示),以及字體應(yīng)該是粗體還是斜體, 也可以定義要包含的字符范圍。該函數(shù)返回一個index值,該值應(yīng)存儲在變量中,因為在引用此字體的所有其他代碼中都需要此值,或者如果該函數(shù)由于任何原因而失敗,它將返回- 1。
>
> 請注意,字體文件必須是 `*.ttf` 或 `*.otf` 文件,對于添加亞洲或阿拉伯字體等非標(biāo)準(zhǔn)字體也很有用。
> ?——[Gamemaker 開發(fā)者之家 翻譯的 GameMaker 用戶手冊](https://github.com/GamemakerChina)
我們在那行下面插入 `font_add_enable_aa(0)` ,并且要給該條件括上花括號,如圖:

自行比較,看看區(qū)別在哪
你:???這又是什么函數(shù)?
> 該函數(shù)可用于對使用`font_add()`添加的字體啟用或禁用抗鋸齒 (AA)。這個函數(shù)需要在添加任何字體之前調(diào)用并將其設(shè)置為true會啟用AA,將其設(shè)置為**false**會禁用它。默認(rèn)情況下,已啟用AA。請注意,這對在調(diào)用函數(shù)之前已經(jīng)添加的字體沒有影響,并且該函數(shù)只需要在添加字體時調(diào)用一次,而不是在使用該字體的每個繪制/步驟。
> ——[Gamemaker 開發(fā)者之家 翻譯的 GameMaker 用戶手冊](https://github.com/GamemakerChina)
簡單點說就是這個函數(shù)來開關(guān)抗鋸齒,0是關(guān),1是開
把它們括一起的原因是要在讀的同時也要關(guān)掉抗鋸齒(如果不是同時那加了也沒用)
保存后看看效果(這里使用主世界字體)

這里可以換種寫法(如果你想讓抗鋸齒可開可關(guān)而不是寫死了關(guān)的話)
28行插入:
```gml
var aa = ini_read_real("font", "aa", 0)
```
相應(yīng)的,`font_add_enable_aa(0)` 改為 `font_add_enable_aa(aa)`

相應(yīng)的,對應(yīng)字體的ini文件加上 `aa = 0`

這里換成1看看字體是否會糊


# Kristal游戲漢化思路
你:?這什么東西
> Kristal is a powerful [Deltarune](https://deltarune.com/) fangame and battle engine, made with [L?VE](https://love2d.org/). Easily play and create custom Deltarune stories, using the [Lua](https://www.lua.org/) scripting language with an accurate battle and overworld engine!
>
> Kristal是基于[L?VE](https://love2d.org/)制作的一個強(qiáng)大的[Deltarune](https://deltarune.com/) fangame和戰(zhàn)斗引擎。使用[Lua](https://www.lua.org/)腳本語言制作精確的戰(zhàn)斗和主世界,輕松游玩和創(chuàng)建自制的Deltarune故事線!
> ——[Kristal官方WIKI](https://github.com/KristalTeam/Kristal/wiki)
>
> L?VE是一個使用 Lua 作為編程語言的 2D 游戲框架。L?VE 完全免費,能用在任何開源項目,或閉源、商業(yè)項目。
> ——[L?VE官方WIKI](https://love2d.org/wiki/Main_Page_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87))
<br>
關(guān)于這類游戲的拆包,我只能說很簡單。因為很多的都是**普通打包**(普通打包:簡單的對資源和源代碼進(jìn)行打包,打包成相應(yīng)平臺的安裝文件),即使是編譯打包,游戲作者也是會提供源代碼的,所以拆的事這點不用擔(dān)心
懶得下源碼就直接把那exe解壓出來就行了
(游戲通??杀嬲J(rèn)為 一個紅藍(lán)背景中間白愛心的程序 帶著一些dll文件。)

字體資源在該文件夾的 **assets\font** 文件夾
你可以把一些字體替換了而且能加入新的字體
我們先把一些原字體換了,比如 `main.ttf` 和 `main_mono.ttf`,并在相應(yīng)的json調(diào)字體大小
一般情況下你就在 `defaultSize` 這個鍵調(diào)字體大小就行了
`fallbacks`就是缺字的時候補(bǔ)上的字體(ps:用圖像驅(qū)動的,fallbacks不管用)
這里我用的字體最佳比例為24,那我就調(diào)24(如果需要小一點的同個字體,需要在對應(yīng)代碼調(diào)參數(shù))

不過這樣還是看不出變化的,我們需要修改一下才能看到效果

我們根據(jù)這界面的文字來找找好了。發(fā)現(xiàn)在 `src\engine\ment\menu.lua` ,然后稍微翻一翻

再把文件導(dǎo)進(jìn)去exe里(你就用解壓軟件打開exe 找到lua文件相應(yīng)位置 拖進(jìn)去就行了)(對了那些字體文件,json也要拖到相應(yīng)位置)


怪物說話的字體(plain)怎么辦?它可是圖片哎
我能想到的是:創(chuàng)建新字體,因為中文需要ttf(
比如我新字體為plain_cn,把ttf文件和json文件放進(jìn) `assets\fonts` 文件夾,然后我們來到`src\engine\game\battle\ui\speechbubble.lua`
`Assets.getFont()`,`Assets.getFontData()` 里面的 **plain** 改成 **plain_cn** ,也就是那個新字體,然后拖進(jìn)去看看
如有必要,`DialogueText()` 里面的 `font= "plain"` 改為`font = "plain_cn"`
效果如圖

下面講下修改非 `defaultSize` 控制的字體大小
如圖,這個字體大小很大,肯定不是給出的24

這里我們搜一下,找到大寫的fps,發(fā)現(xiàn)在 `"src\engine\overlay.lua"`,看到這行:

看到?jīng)]?32!
改,都可以改(這里改成12,順便調(diào)了下位置,體現(xiàn)差距)。改完之后拖進(jìn)exe,如圖:

目前遇到的情況目前就這么多
當(dāng)然也會有拖進(jìn) `assets\fonts` 還會有問題的情況
那就把字體拖進(jìn) `mods\[游戲名]\assets\fonts` 文件夾里,總之這個不是沒就是有了
至此,我能夠說的思路目前就這么多,希望對你能有所幫助
如有疑問或錯漏的地方,請指出來,畢竟我不是專業(yè)的
如有問題,可以在該q群里問:238552588