北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 14269|回复: 14

有用tintin++的前辈吗?小弟发现有些字不能被触发。

[复制链接]
发表于 2015-8-8 11:02:39 | 显示全部楼层 |阅读模式
本帖最后由 acdd 于 2015-8-8 11:08 AM 编辑

把{charset}设成{big5}的时候,匹配内容里只要有编码以5C(十进制是92)结尾的汉字就不能被触发,比如GBK编码的“乗”、“俓”、“蒤”,big5编码的“苒”等等。如果把{charset}改回{ascii},虽然可以正常触发,但是会显示成乱码,比如执行“#showme 测乗试”,显示的是“测伿”。
版本是最新的2.01.1,求大神指点迷津,小弟感激不尽

北大侠客行MUD,中国最好的MUD
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-8-8 16:51:57 | 显示全部楼层
linux 还是 cygwin 下?
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2015-8-8 18:33:24 | 显示全部楼层
终于有人理我了 激动ing。。。
小弟用的linux,cygwin没试过,不过wintin++也有这些问题。试的时候用的这几个命令:
#config charset big5
#action {测乗试} {#showme 么么哒}
#showme 测乗试
本来应该显示“么么哒”,然而神马也木有发生。。。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-8-8 19:11:59 | 显示全部楼层
我试了下确实是有问题的....我以为 lz 的问题是显示乱码呢...我也不知道了~
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2015-8-8 19:25:03 | 显示全部楼层
谢谢帮忙测试!看来很可能是tintin++在处理中文上有bug了。。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-8-10 00:11:14 | 显示全部楼层
我论坛下过一个wintin++,打开看很原始,就没兴趣了。
tintin++和zmud基本语法接近,还是很推荐zmud玩家使用的,不过wintin++客户端就算了。

我推荐下面的客户端。
Jaba Mud Client 3.6
http://nerevar.github.io/jmc/
缺点:英文界面,如果觉得不方便,用eXeScope自己汉化一下吧。
优点:支持基本全Tintin++ 的命令。vbs,js的脚本

Wintin 95
老的wintin软件基本和zmud 462差不多,不过计算能力强。

wintin.net
新的wintin 客户端,支持C,vbs,Lua。应该很强大,鄙人没研究过,主要书剑mud每次登陆在提示Y/N的时候报错,pkuxkx没事。。。

tortilla mud client
JMC的升级版本,强大,强大。可惜界面俄文。要手动汉化一下
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-8-10 00:11:23 | 显示全部楼层
我论坛下过一个wintin++,打开看很原始,就没兴趣了。
tintin++和zmud基本语法接近,还是很推荐zmud玩家使用的,不过wintin++客户端就算了。

我推荐下面的客户端。
Jaba Mud Client 3.6
http://nerevar.github.io/jmc/
缺点:英文界面,如果觉得不方便,用eXeScope自己汉化一下吧。
优点:支持基本全Tintin++ 的命令。vbs,js的脚本

Wintin 95
老的wintin软件基本和zmud 462差不多,不过计算能力强。

wintin.net
新的wintin 客户端,支持C,vbs,Lua。应该很强大,鄙人没研究过,主要书剑mud每次登陆在提示Y/N的时候报错,pkuxkx没事。。。

tortilla mud client
JMC的升级版本,强大,强大。可惜界面俄文。要手动汉化一下
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2015-8-11 13:00:36 | 显示全部楼层
本帖最后由 acdd 于 2015-8-11 01:04 PM 编辑

挨个试了楼上大侠推荐的客户端,发现它们对中文支持也不理想,而且扩展能力都没有tintin++强,小弟再三思索,还是决定接着用tintin++。。但是一想起来那个bug,就浑身不舒服斯基,于是乎,小弟从tintin++官网下载了源代码,因为小弟只懂一丢丢点儿的C语言,完全不懂神马telnet之类滴,所以只是抱着试一试滴心态,想把bug揪出来,结果瞎猫碰上死耗子,真就被偶找出来了。。。
下边两个小bug都是在把charset设置成big5的时候(#config charset big5)才会出现,把charset设置成ascii的时候好像会出现另外一些bug,不过小弟不用ascii,所以ascii下的bug对小弟来说不算bug。。。

==============================================================================
第一个就是一楼说的编码以5C(十进制是92)结尾的汉字不能被触发
十进制编码为92的字符是反斜杠“\”,在正则表达式里反斜杠是特殊字符,要对特殊字符本身做匹配必须对其转义。把charset设成ascii的时候,tintin++会测试每个字节是否为特殊字符,然后对特殊字符进行转义,而把charset设成big5时,tintin++遇到不在0~127范围里的字节(gbk、big5编码的第一个字节)时会直接跳过下一个字节,比如“乗”的两个字节是129 92,tintin++遇到129就会跳过92,本来应该转义的92却原封不动就交给正则表达式引擎编译,会导致编译出错,就算不出错编译结果也绝不会是偶们想要的。
*解决办法*是在tinexp.c中找到:
pcre *tintin_regexp_compile(struct session *ses, struct listnode *node, char *exp, int option)
在它下边大括号里再找到:
if (HAS_BIT(ses->flags, SES_FLAG_BIG5) && *pti & 128 && pti[1] != 0)
往下看可以看到有两行“*pto++ = *pti++;”,把第二个,也就是“continue”上边的,改成:
switch (pti[0])
{
        case '[':
        case ']':
        case '(':
        case ')';
        case '|':
        case '.':
        case '?':
        case '+':
        case '*':
        case '^':
        case '\\':
                *pto++ = '\\';
        default:
                *pto++ = *pti++;
}
==============================================================================

==============================================================================
第二个是关于换行的。首先执行“#config charset big5”,然后在扬州中央广场“n;s”,如果紧接着地点描述的消息(一定要紧接着)是“XXX手持YYYY……”或者“XXX身穿YYYY……”,其中YYYY带颜色,这时候的正常显示应该是:
        这里明显的出口是 north、south、east、down、west 和 up。
        大榕树(Rong shu)
        >
        XXX手持YYYY……
然而实际显示的是
        这里明显的出口是 north、south、east、down、west 和 up。
        大榕树(Rong shu)
        >XXX手持
        YYYY……
这个好像是telnet之类滴东东,小弟也不知道具体是什么原因,只能接着求大神解释了,不过大神们好像都很忙。。。
*解决办法*还是有滴,在telopt.c中找到:
int translate_telopts(struct session *ses, unsigned char *src, int cplen)
下边大括号里再找
else if (HAS_BIT(ses->flags, SES_FLAG_BIG5) && *cpsrc & 0x80)
然后把

……
else if (HAS_BIT(ses->flags, SES_FLAG_BIG5) && *cpsrc & 0x80)
{
        *cpdst++ = *cpsrc++;
……

换成

……
else if (HAS_BIT(ses->flags, SES_FLAG_BIG5) && *cpsrc & 0x80)
{
        if (HAS_BIT(ses->telopts, TELOPT_FLAG_PROMPT))
        {
                DEL_BIT(ses->telopts, TELOPT_FLAG_PROMPT);

                if (HAS_BIT(ses->flags, SES_FLAG_SPLIT) || !IS_SPLIT(ses))
                {
                        *cpdst++ = '\n';
                        gtd->mud_output_len++;
                }
        }
        *cpdst++ = *cpsrc++;
……

==============================================================================

还有一个是关于#show的,这个其实不理它也无所谓,不过小弟。。额。。是个强迫症。。。
#show会把所有最后一个字符是反斜杠的行当做是提示行(是这么叫吧-_-!),举个栗子,输入“#show 可恶的反斜杠\”,光标就会停在“杠”字后面,输入“#show 反斜杠去见鬼”,光标就停在了下一行的行首。这木有问题,不过让偶们把“乗”大仙请出来,输入“#show 乗”,末尾并没有“\”,可光标却停在了“乗”字后面。。。偶们要做的就是判断前一个字节是否大于127,如果是就忽略掉后面的反斜杠。
*解决办法*是在utils.c中找到“int str_suffix(char *str1, char *str2)”,把它下边大括号里的:
if (!strcasecmp(str1 + len1 - len2, str2))
改成
if (!(strcasecmp(str1 + len1 - len2, str2) || str[len1-2] & 128))

建议楼上大侠试试在linux上用tintin++,linux上的tintin++有#run命令,配合#action命令,任何语言都可以用来写脚本啦。wintin++没有#run,只能用它自带的命令写脚本,虽然也够用,不过偶发现它的数组下标是从1开始的,顿时心中千万只羊驼奔腾而过,再也不想用了。。。。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-8-11 14:49:29 | 显示全部楼层
赞一个。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2015-8-11 19:29:08 | 显示全部楼层
擦,大牛啊
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-24 07:09 PM , Processed in 0.010015 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表