JMir Java版热血传奇2资源文件结构解析:地图MAP与WIL贴图加载机制

来源: 作者: 点击:
JMir 作为用 Java 重写 Legend of Mir 2 客户端的开源/教学型实现,资源文件沿用原版传奇2的二进制布局,但在读取层用 InputStream、ByteBuffer、ImageIO 替代了 Delphi/C++ 的原生 API。核心资源目录依旧是客户端根下的 Data、Map、Graphics、Wav、Sound,以及服务端 Envirl/MapInfo.txt 等文本配置 。

Map 目录与 .map 文件结构是场景底座。每个地图一个二进制文件,文件头 52 字节,原版头部含 “Legend of Mir” 标识(部分衍生版为 “Shanda Woool”),随后是按坐标排列的记录块,每条记录 12 字节,描述该格子的地形标志、物件索引、光照、阻挡位、门/传送点引用等。地图宽高在文件头中给出,JMir 解析时先读头→拿到宽高→计算格子总数→循环读取 width*height 个 12 字节单元装入二维数组 MapCell[][]。服务端 Mir200\Map 与客户端 Map 必须同名同结构,否则 Java 端解码后坐标错位、黑屏、卡墙 。

MapInfo.txt 是地图逻辑层绑定文件,格式为 [地图代号|源Map编号 显示名] 属性,例如 [0 比奇省] RUNHUMAN FIGHT、[0330,329->5100,100 ;Houses。JMir 启动时常驻解析该文本,建立 MapNo→MapFile→DisplayName→FlagSet 的映射表;传送、回城、行会召唤、随机卷限制都查这张表。新增地图时既要丢 .map 进 Map 目录,也要在 MapInfo.txt 追加一行,否则 @move 命令找不到目标 。

Data 目录承载贴图库,主体是 .wil / .wzl 文件(Wemade Image Library)。原版 .wil 文件头含 “WEMADE Entertainment inc.” 字样,结构为:标题区→图片数量 int→偏移表 int[]→调色板(256 色老版)或 RGBA 像素块(真彩版)→逐帧图片头(宽、高、偏移、压缩标识)。配套 .wix 为索引文件,记录每张图在 .wil 中的绝对偏移,避免全量扫描。JMir 里通常写 WilArchive 类:构造时读文件头、建偏移数组、懒加载指定 index 的解压像素,转成 BufferedImage 交给绘制层。Objects1~ObjectsN.wil 存地砖与建筑碎片,Tiles.wil 存地面拼贴,Mon1~MonN.wil 存怪物帧,Hum/Weapon/Items/DnItems 存角色、武器、物品栏与掉落物,mmap.wil 存小地图 。

地图渲染时 JMir 的 TileRenderer 按摄像机视口算出可见格子范围,对每个 MapCell:先取地形编号→从 Tiles.wil 取对应帧画地面;再取物件编号→从 ObjectsX.wil 取建筑/树/门帧叠加;若有怪物/NPC/角色占用,再叠加 Mon/Npc/Hum 序列帧;最后合小地图 mmap.wil。Z 序按格子 y 坐标排序,保证上下遮挡正确。缺少对应 .wil 或 index 越界就画粉色/黑色占位块,表现为“白模地图” 。

Graphics 目录放扩展外观:Graphics\Human\ 放衣服外观(文件名对应物品库 Shape 值,如 100.wil),Graphics\Weapon\ 放武器外观,规则同上;部分 JMir 分支把 StateItem.wil、Prguse2.wil 也归到这里做 UI 皮肤 。

声音资源在 Wav / Sound 目录,格式为 .wav,地图触发音(脚步、门响、技能)由 MapCell 音效索引 + 资源表定位;部分引擎扩展用 .wem(Wwise 封装)但 JMir 原生多走 Java Sound API 直接读 PCM,不解析 Wwise 容器 。

Envir 目录(服务端侧)与客户端资源形成双向约束:MonGen.txt 决定某 .map 刷哪类怪,Merchant.txt / Npcs.txt 决定 NPC 站在哪张地图哪坐标、引用哪个 npc.wil 形象,MapQuest.txt 绑定地图事件脚本。JMir 若做联机端,必须同时加载服务端 Envir 文本与客户端二进制资源,单边有缺失就会出现“进图空场”或“怪看不见但能挨打” 。

读取顺序小结:启动→载 MapInfo.txt 建地图表→按需读 Map\xxx.map 解码格子→进图时 WilArchive 缓存 Data\ObjectsX.wil / Tiles.wil / MonX.wil→逐帧 BufferedImage 合成→摄像机裁剪绘制。路径建议纯英文,DBC/编码用 GBK 读 MapInfo,UTF-8 读脚本,混淆会导致地图名乱码或加载空图 。