北大侠客行MUD论坛

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

杰哥瞎扯蛋之我的地图数据结构

[复制链接]
 楼主| 发表于 2025-5-20 15:53:10 | 显示全部楼层
Landmark 定位

  1. public partial class Landmark
  2. {
  3.     public string Key { get; set; } = "";
  4.     public string Type { get; set; } = "";
  5.     public string Value { get; set; } = "";
  6.     public string Group { get; set; } = "";
  7.     public string Desc { get; set; } = "";
  8. }
复制代码


给你放用来定位的数据的。

根据key 和Type 唯一,供你的脚本读取

以我非北侠机器为例
  1. let matcherssl = /^象一蓬蓬巨伞般伸向天空,把阳光遮得丝毫也无。尺把厚的松针/
  2.     let matchergc = "错节,据传已有千年的树龄,是这座城市的历史见证。树干底部有一个很大"
  3.     let matcheryp = "抽屉里散发出来的。神医平一指坐在茶几旁,独自喝着茶,看也不看你一眼。"
  4.     let matcherdzm = "    前面就是明教的“地字门”了,这里是明教中女弟子"
复制代码
这是4个定位用的正则,那完全可以创建 key=房间key,type=regex的定位信息,机器启动时批量加载


当然,北侠也不可能这么简单就能实现一个可用的定位系统

甚至由于北侠这类MUD的特点,我必须实现同一个Key的多种Type的定位信息共存,这样才能通过多种依据定位,避免一不小心被一锅端。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2025-5-20 15:57:20 | 显示全部楼层
Shortcut 捷径

  1. public class RoomConditionExit : Exit
  2. {
  3.     public List RoomConditions { get; set; } = [];

  4. }

  5. public partial class Shortcut : RoomConditionExit
  6. {
  7.     public string Key { get; set; } = "";
  8.     public string Group { get; set; } = "";
  9.     public string Desc { get; set; } = "";
  10. }
复制代码
就是一个带Key和房间条件的非固定出口。

这个在北侠可能对大部分人没用。

在有miss或者rideto的mud比较实用点。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2025-5-20 15:58:22 | 显示全部楼层
Variable 变量

  1. public class Variable
  2. {
  3.     public string Key { get; set; } = "";
  4.     public string Value { get; set; } = "";
  5.     public string Group { get; set; } = "";
  6.     public string Desc { get; set; } = "";
  7. }
复制代码
和客户端的变量一样,给脚本用的,爱存啥我不管。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2025-5-20 16:04:49 | 显示全部楼层
Snapshot 快照

  1. public partial class Snapshot
  2. {
  3.     public static Snapshot Create(string key, string type, string value, string group)
  4.     {
  5.         return new Snapshot()
  6.         {
  7.             Key = key,

  8.             Type = type,
  9.             Value = value,
  10.             Timestamp = (int)(new DateTimeOffset(DateTime.UtcNow)).ToUnixTimeSeconds(),
  11.             Group = group,
  12.         };
  13.     }
  14.     public string Key { get; set; } = "";
  15.     public int Timestamp = 0;
  16.     public string Group { get; set; } = "";
  17.     public string Type { get; set; } = "";
  18.     public int Count { get; set; } = 1;
  19.     public string Value { get; set; } = "";
  20. }
复制代码


在北侠很实用的结构吧。

这个理论上就是把扫街的结果,进行存储的原始数据结构。

同Key,Type,Value唯一。

处于扫街结果的常态和节约空间,如果取得了同样的Key,Type,Value,会只更新更新时间,以及Count+1

并提供简单的查找接口。

用途么,就是扫加,把NPC。房间名/房间描述 保存起来。

遇到Task之类的任务,进行查找过滤,或者脚本分析生成合适的定位数据。

理论上不该归我编辑器管,但实际我又用到的一个结构。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2025-5-20 16:16:12 | 显示全部楼层
好了,基本数据结构到这里了,再来个彩蛋。
对于地图计算来说,基础数据重要,但只依赖基础数据是不够的。

比如我大量引入了标签和条件,这个在哪里设置呢?

所以,在脚本里,肯定要维护个当前环境的数据

  1. public class Environment
  2. {
  3.     public List Tags = [];
  4.     public List RoomConditions = [];
  5.     public List Rooms = [];
  6.     public List Paths = [];
  7.     public List Shortcuts = [];
  8.     public List Whitelist = [];
  9.     public List Blacklist = [];
  10.     public List BlockedLinks = [];
  11.     public List CommandCosts = [];

  12. }
复制代码


  • Tags,标签列表,用于判断某些出口是否可用
  • RoomConditions,房间条件列表,用于在规划路线时排除某类房间,比如不走安全房间……
  • Rooms,额外房间。有些动态的房间信息,比如个人住房,每次重启后更新的迷宫。这些明显不适合放在地图信息里。
  • Paths,临时出口。配合额外房间使用的。
  • Shortcuts,额外的捷径,适合能自定义飞行的MUD
  • Whitelist,白名单模式,只能在指定的房间里规划路径
  • Blacklist,黑名单模式,不经过指定的房间
  • BlockedLinks,临时屏蔽房间的出口,排除房间A去房间B的所有路径。适合在杀不过NPC时放弃部分路径/房间。当然,北侠喜欢Guard玩家,这也是很好的解决方式。被Guard一次,我直接把这个出口加进黑名单半小时,您慢慢晾着。
  • CommandCost 指令耗时的动态修改。说实话,这个只是理论上该有,我没用过。


光光静态的地图是没法应对复杂的MUD设定的。有了完善的环境信息才能尽可能的无视某些蛋疼的设定。

对了,对于实际行走,我还有一个选项结构

  1. public class MapperOptions
  2. {
  3.     public int MaxExitCost = 0;
  4.     public int MaxTotalCost = 0;
  5.     public bool DisableShortcuts = false;
  6. }
复制代码
能设定每个规划的
  • 最大单步耗时,太耗时的出口不走
  • 最大总耗时,超过这个耗时停止规划
  • 禁用捷径,字面意思


总体来说,我追求在静态的地图数据外,还能尽可能的动态的进行调整,不能抱着死地图不放。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2025-5-20 16:23:29 | 显示全部楼层
API参考

我具体实现的API

List/Insert/Remove系列
维护原始数据

  1.     public QueryReuslt? APIQueryPathAny(List from, List target, Context context, MapperOptions options)
复制代码
多个起点和多个终点之间的路径规划,实际用的最多的是1对多

  1.     public QueryReuslt? APIQueryPathAll(string start, List target, Context context, MapperOptions options)
复制代码
无顺序房间的动态规划,核心,动态查询房间后,通过多次单步模拟行走的方式,计算出遍历路径

  1.     public QueryReuslt? APIQueryPathOrdered(string start, List target, Context context, MapperOptions options)
复制代码
有顺序的动态规划,通过多次单步模拟行走计算

  1.     public List APIQueryRegionRooms(string key)
复制代码
查询区域房间,配合APIQueryPathAll使用

  1. public List APIDilate(List src, int iterations, Context context, MapperOptions options)
复制代码
膨胀房间,具体用途,比如获取扬州的所有房间,然后npc不是会跑么,膨胀3格遍历

  1.     public string APITrackExit(string start, string command, Context context, MapperOptions options)
复制代码
跟踪出口,看会去哪里

  1.     public List APISearchRooms(RoomFilter filter)
复制代码
根据过滤器,搜索房间

  1.     public List APIFilterRooms(List src, RoomFilter filter)
复制代码
在限定的房间里过滤房间,比如只找扬州的非安全房间

  1.     public void APITakeSnapshot(string key, string type, string value, string group)
复制代码
拍摄快照,扫街用

  1.     public void APITraceLocation(string key, string location)
复制代码
记录足迹,扫街用

  1.     public void APITagRoom(string key, string tag, int value)
复制代码
给房间打标记,扫街用

  1.     public void APISetRoomData(string roomkey, string datakey, string datavalue)
复制代码
设置房间数据,扫街用

  1.     public void APIGroupRoom(string key, string group)
复制代码
设置房间分组,扫街用
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2025-5-20 16:24:02 | 显示全部楼层
打完收工,准备写lua/js实现
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2025-5-22 17:19:59 | 显示全部楼层
厉害,看不懂。。。。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2025-5-22 17:26:40 | 显示全部楼层
能不能弄个python呀
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2025-5-22 17:53:07 | 显示全部楼层
jarlyyn 发表于 2025-5-20 04:24 PM
打完收工,准备写lua/js实现

你要说这个我可就不困了
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-31 03:13 PM , Processed in 0.009946 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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