Skip to content
yuer edited this page Jul 30, 2022 · 46 revisions

汉化过程中需注意的

遇得多的函数

an()

位置:objnam.c

调用了just_an(),处理后,一般会给字符串前面加上"a "或者"an "

所以在处理中文字符串时,要去掉an(),an(str)改为str


ansimpleoname(obj)

位置:objnam.c

判断物品obj的数量是否是单数,是就会调用an(simpleoname),我作了修改

simpleoname = an(simpleoname);改为simpleoname = simpleoname;

汉化时无需额外处理


otense(otmp, verb)

位置objnam.c

先判断物品otmp的数量是否是复数,不是复数,就调用vtense(),否则直接返回动词

汉化时无需处理


vtense(subj, verb)

位置objnam.c

判断物品subj本身为单数还是复数,最后决定动词verb是否要加"s"或者"es",结果返回动词

中文下,verb都会处理为加"s",我作了修改

Strcasecpy(bspot + 1, "s");改为Strcasecpy(bspot + 1, "");

汉化时无需额外处理


strncmp(str1, str2, n)

通用函数,把 str1 和 str2 进行比较,最多比较前 n 个字节

在处理中文时,中文在不同编码下的字节不一样,不能使用这个函数

我在config.h中定义了3种标识符

#define cnstrcmpi(bp, str, l) strncmpi(bp, str, l = strlen(str))

#define cnstrcmp(bp, str) strncmp(bp, str, strlen(str))

#define cnbstrcmp(bp, p, str) BSTRCMPI(bp, p - strlen(str), str)

所以把strncmp(str1, str2, n)替换为cnstrcmp(str1, str2)


strncmpi(str1, str2, l = n)

把strncmpi(str1, str2, l = n)替换为cnstrcmpi(str1, str2, l)


BSTRCMPI(str1, p - n, str2)

把BSTRCMPI(str1, p - n, str2)替换为cnbstrcmp(str1, p, str2)


strsubst(str1, str2, str3)

例,str1="123456789456",str2="456",str3="a"

结果str1="123a789456"


the()

位置objnam.c

判断是否在字符串前面加"the ",我作了修改

Strcpy(buf, "the ");改为Strcpy(buf, "");

汉化时无需额外处理


The()

位置objnam.c

调用了the(),并将t大写为T

汉化时无需额外处理


Tobjnam(otmp, verb)

位置objnam.c

会调用The(),最后加上动词verb,我作了修改

Strcat(bp, " ");改为Strcat(bp, "");

汉化时无需额外处理


修改添加代码的函数

formatkiller()

位置topten.c

游戏理解

游戏开始的地方

allmain.c/moveloop(),游戏启动!

职业神器

在NetHack/dat文件夹下的一些des文件中,每个职业都有各自的des文件

从des文件的的判断过程代码为sp_lev.c/spo_object() -> sp_lev.c/create_object() -> do_name.c/oname() -> artifact.c/exist_artifact()

Clone this wiki locally