NB大神这个最终做出来的是个画地图的插件或者调用程序么
devilkate 发表于 2025-12-13 10:42 AM
NB大神这个最终做出来的是个画地图的插件或者调用程序么
这个不画地图 ,画地图的事情肯定是脚本来做。
这个相当于定制版的excel,方便人工查看和修订脚本生成的地图,可以对比两个时间的地图查看差异,甚至可以部分回退。
然后提供一个全功能的http接口,方便没有js/lua的客户端,或者js/lua性能不高的客户端使用。
我同步做了一套配套的js/lua,可以脱离这个直接使用。
甚至可以不使用我的地图格式,直接用脚本解析现有的地图格式直接计算路径。
devilkate 发表于 2025-12-13 10:42 AM
NB大神这个最终做出来的是个画地图的插件或者调用程序么
举个例子,这两天有人想让我把我现成的机器移植到其他mud去。
我做了基本框架的迁移后,就要整理新mud的地图信息了。
对方提供了mush(jscript)/hc(js)/ls(lua)的机器给我做参考,其实都是同一份地图转来转去的。
我找了最全的一份,lua的地图,格式大概是
M.rooms = {
= { roomNo = 0, roomName = "玄冥峰山脚", exits = { ["ed"] = 5, ["nw"] = 1 } },
= { roomNo = 1, roomName = "山路", exits = { ["nw"] = 6 } },
= { roomNo = 2, roomName = "山路", exits = { ["nu"] = 3, ["se"] = 11 } },
= { roomNo = 3, roomName = "山路", exits = { ["nd"] = 10, ["sd"] = 2 } },
}这样的,我写了一个脚本转成了我的格式
local hmm = require("./hmm")
local map=require("./map")
local MapDatabase = hmm.MapDatabase:New();
MapDatabase:NewMap()
MapDatabase.Current.Map.Encoding=hmm.MapEncoding.GB18030
local all={}
function splitAnd(data)
local result={}
for item in data:gmatch("[^&]+") do
table.insert(result,item)
end
return result
end
for key, value in pairs(map.rooms) do
local room=hmm.Room:New()
room.Key=tostring(value.roomNo)
room.Name=value.roomName
for k2,v2 in pairs(value.exits) do
local exit=hmm.Exit:New()
local data={}
for item in k2:gmatch("[^>]+") do
table.insert(data,item)
end
local tag=""
local cmd=""
if #data==1 then
cmd=data
else
tag=data
cmd=data
end
exit.Command=cmd
if (tag ~= "") then
print(tag)
local cond=hmm.ValueCondition:New(tag,1,false)
table.insert(exit.Conditions,cond)
end
exit.Cost=#splitAnd(cmd)
if cmd:sub(1, #"goto ")=="goto " then
exit.Cost=20
end
exit.To=tostring(v2)
table.insert(room.Exits,exit)
end
table.insert(all,room)
end
MapDatabase:APIInsertRooms(all)
print(#MapDatabase.Current.Records.Rooms)
local file = io.open("./map.hmm", "w")
file:write(MapDatabase:Export(""))
然后,能在我的程序里编辑,维护了
可以使用我前面提到过的关系地图,差异对比等各种维护功能
然后在维护的时候,可以手动或者用脚本给地图的房间打标签,出口加条件等等
直接实现不同的路径不同的耗时计算,以及各种动态规划功能,比如
https://www.pkuxkx.net/forum/thread-50473-1-1.html
里说的各种。
更重要的是,这样一份地图是脱离客户端存在的。
不管你是gbk的mush跑的js/lua,utf8的mudlet跑的lua,还是你自己用python糊的客户端。
都可以用使用同一份地图,有相同的功能,
至少我拿到的这3个机器,真的有需要的话,我都可以通过写个补丁文件,重写路径计算部分的功能直接无感无缝使用。
更新了js版的文档,在github上顺手让AI理解了下,发现AI能理解,说明我文档写的没问题,恩恩。
yct69
文档终于干的差不多了
开始继续折腾程序
改了下锁的机制,把互斥锁改成了读写锁。
这样就能并发寻路了,直接把寻路的rps干到4位数
go-wrk -c 10 -body @query.json -M POST http://abc:@127.0.0.1:8466/api/db/querypathany
Running 10s test @ http://abc:@127.0.0.1:8466/api/db/querypathany
10 goroutine(s) running concurrently
11774 requests in 9.996072455s, 15.96MB read
Requests/sec: 1177.86
Transfer/sec: 1.60MB
Avg Req Time: 8.489954ms
Fastest Request: 2.880918ms
Slowest Request: 25.324171ms
Number of Errors: 0
新编译一版,开始跑稳定性测试。
进入功能冻结期。