北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
楼主: jarlyyn

求助,关于mudlet的使用

[复制链接]
 楼主| 发表于 2024-4-20 07:27:08 | 显示全部楼层
感谢各位的回复,我的思路要变一下了
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2024-4-20 07:34:57 | 显示全部楼层
holygb 发表于 2024-4-20 01:01 AM
我也有类似需求,写了个函数获取一行或几行间字符的属性,代码如下:
function get_color_string(from_line ...

这个代码就牵涉到另一个问题了

lua的string本质应该就是ansi的string,一个字符一位

但utf8是变长的,而gettextformat应该是根据utf8字符来的,所以每次获取的数据长度不一致对吧?

纯做mudlet的库的话这倒问题不大,如果想和ansi的跑gbk的mush共享代码,就要好好整整了
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2024-4-20 08:42:25 | 显示全部楼层
jarlyyn 发表于 2024-4-20 07:34 AM
这个代码就牵涉到另一个问题了

lua的string本质应该就是ansi的string,一个字符一位

不管mud是什么编码的,mudlet内部变量都是unicode,所有用utf8的接口都可以兼容。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2024-4-29 21:39:20 | 显示全部楼层
holygb 发表于 2024-4-20 01:01 AM
我也有类似需求,写了个函数获取一行或几行间字符的属性,代码如下:
function get_color_string(from_line ...

爬了下mudlet的代码,这个基本是个bug,具体的bug点在

https://github.com/Mudlet/Mudlet ... /TConsole.cpp#L1312

里的

  1.     if (y < 0 || x < 0 || y >= static_cast(buffer.buffer.size()) || x >= (static_cast(buffer.buffer.at(y).size()) - 1)) {
复制代码


越界检测里,Y轴不减1,X轴减1了

也就是说当x等于Y轴对应缓冲的值-1也报错

北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2024-4-29 21:50:43 | 显示全部楼层
21年就有人提了这个bug

https://github.com/Mudlet/Mudlet/issues/5744
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2024-4-29 22:34:41 | 显示全部楼层
直接insert太脏了

我查了下Mudlet的Wiki

创建了一个不显示的buffer,把要处理的Line copy&paste进去再append一个空格,直接在buffer里跑一样逻辑的代码,绕过去了。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2024-4-29 22:38:44 | 显示全部楼层
本帖最后由 jarlyyn 于 2024-4-29 10:54 PM 编辑

大概处理的代码,给需要的人,我是响应所有的行,自己按自己格式存一份了。
  1. createBuffer('hclua_line')
  2. local function online()
  3.     local all = getCurrentLine()
  4.     selectCurrentLine()
  5.     copy()
  6.     clearWindow('hclua_line')
  7.     paste('hclua_line')
  8.     moveCursor('hclua_line',utf8.len(all), 0)
  9.     insertText('hclua_line',' ')
  10.    
  11.     local newline = line.Line:new()
  12.     if all == '' then
  13.         return
  14.     end
  15.     local last = ''
  16.     local text = ''
  17.     local lastresult
  18.     for i = 0, utf8.len(all)-1, 1 do
  19.         moveCursor('hclua_line',i, 0)
  20.         selectSection('hclua_line',i, 1)
  21.         local result = getTextFormat('hclua_line')
  22.         local format = hashformat(result)
  23.         if format ~= last then
  24.             if text ~= '' then
  25.                 local word = newword(lastresult)
  26.                 word.Text = text
  27.                 newline:appendWord(word)
  28.             end
  29.             text=''
  30.             last = format
  31.             lastresult=result
  32.         end
  33.         text = text .. getSelection('hclua_line')
  34.     end
  35.     if text ~= '' then
  36.         local word = newword(lastresult)
  37.         word.Text = text
  38.         newline:appendWord(word)
  39.     end
  40.     print(newline:toShort())
  41. end
复制代码


北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2024-4-29 22:56:33 | 显示全部楼层
本帖最后由 jarlyyn 于 2024-4-29 10:58 PM 编辑

摘要输出大概是这样的
北大侠客行已经执行了一天十二小时二十二分四十六秒。
#0AA0北大侠客行已经执行了#0AA0一天十二小时二十二分四十六秒#0AA0。   
目前共有 698 位玩家在线上。
#0AA0目前共有 698 位玩家在线上。   
Input 1 for GBK, 2 for UTF8, 3 for BIG5
#0MA0Input 1 for GBK, 2 for UTF8, 3 for BIG5   
由于MushClient对Unicode输出支持有限,使用MushClient时请连接8080端口,并且不要选择编码!
#0KA4由于MushClient对Unicode输出支持有限,使用MushClient时请连接8080端口,并且不要选择编码!   

如已登录,并且再次登录8080端口时出现档案问题,请联系巫师处理。
#0KA4如已登录,并且再次登录8080端口时出现档案问题,请联系巫师处理。   
您的英文名字(要注册新人物请输入new。):
#0AA0您的英文名字(要注册新人物请输入new。):   

北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2024-5-2 23:08:20 | 显示全部楼层
本帖最后由 jarlyyn 于 2024-5-3 01:50 AM 编辑

更新下,不行,isFgColor和isBgColor强制使用main窗口。

还是要用insert,最多再replace掉。

无力吐槽
  1. local function online()
  2.     local all = getCurrentLine()
  3.     local lineno=getLastLineNumber()
  4.     local length=utf8.len(all)
  5.     selectCurrentLine()
  6.     moveCursor(length, lineno)
  7.     insertText(' ')
  8.     local newline = line.Line:new()
  9.     local last = ''
  10.     local lastword
  11.     for i = 0, length-1, 1 do
  12.         moveCursor(i, lineno)
  13.         selectSection(i, 1)
  14.         local result = getTextFormat()
  15.         local format = hashformat(result)
  16.         if format ~= last then
  17.             word=newword(result)
  18.             if lastword ~= nil then
  19.                 newline:appendWord(lastword)
  20.             end
  21.             lastword=word
  22.             last = format
  23.         end
  24.         lastword.Text = lastword.Text .. getSelection()
  25.     end
  26.     if lastword~=nil and lastword.Text ~= '' then
  27.         newline:appendWord(lastword)
  28.     end
  29.     selectSection(length,1)
  30.     replace('')

  31.     Hclua.world:onLine(newline)
  32.     local callbacks=Hclua.world.params['_lineReady']
  33.     Hclua.world.params['_lineReady']={}
  34.     for index, value in ipairs(callbacks) do
  35.         value()
  36.     end
复制代码


北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2024-5-3 19:15:55 | 显示全部楼层
目前用的mudlet 4.17.2,还发现一个bug

中文的粗体无效,不管显示还是GetTextFormat。

只有登陆页的字符的粗体有效。

mush,hellclient和北侠的网页版都没这个问题。

除非北侠会给mudlet返回不一样的格式,不然估计这又是一个bug

猫猫叹气.jpg
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-24 06:06 AM , Processed in 0.010161 second(s), 12 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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