Mudlet 客戶端與自動地圖

Mudlet 是免費的專業 MUD 客戶端,Windows、macOS、Linux 都能用。 搭配我們的自動地圖套件,走過的房間會自己畫進地圖,之後點兩下就能自動走過去。

一、我需要 Mudlet 嗎?

不一定。直接用瀏覽器玩完全沒問題,新手建議先從網頁版開始,什麼都不用裝。

會想換 Mudlet,通常是因為玩到後面想要這些:

  • 自動地圖——目前世界有 39 個區域、1452 間房間,靠記的會很辛苦
  • 自動走路——在地圖上點兩下,角色自己走過去
  • 別名(alias)——把一長串常用指令縮成一個短詞
  • 觸發(trigger)——看到特定文字時自動做某件事

先用網頁版玩玩看 水墨版介面 →

二、安裝 Mudlet 並連上遊戲

mudlet.org 下載安裝(免費、開放原始碼)。

打開後按左上角的「連接 / Connect」,選「新建 / New」,填入:

設定名稱Fantatopia(隨你取)
主機位址mud.kangatnewyork.com
埠號4000
資料編碼UTF-8

編碼一定要選 UTF-8,選錯會整片亂碼。若已經連上才發現亂碼,在遊戲裡輸入 encoding 也可以改。

三、把字型換成有中文的(很重要)

Mudlet 預設的字型是 Bitstream Vera Sans Mono,這個字型一個中文字都沒有。 中文還是顯示得出來,但那是系統臨時拿別的字型湊的,所以看起來會比英數字細、粗細不一致、久看很累。

到「設定 / Settings → 顯示設定 / Display」把字型換成有中文的等寬字型,中文會立刻變清楚:

  • Windows:微軟正黑體(Microsoft JhengHei)或 新細明體
  • macOS:蘋方(PingFang TC)
  • 三個系統通用、效果最好:Sarasa Mono TC 更紗黑體(免費)

同一頁的「設置『模糊』寬度字符的寬度」請保持勾選,這是讓中文與數字在表格裡對齊用的。

四、安裝自動地圖

下載自動地圖套件 FantatopiaMapper.mpackage(v1.1,約 22 KB)

  1. 下載上面的檔案
  2. Mudlet 上方工具列 → PackagesInstall from file
  3. 選剛剛下載的 FantatopiaMapper.mpackage
  4. 進遊戲走個幾步,地圖就會開始自己長出來
⚠ 如果你裝過 Mudlet 內建的 generic_mapper,請先移除它。
(Packages → 選 generic_mapper → Remove)
兩套地圖會互相搶著畫,同一間房會被畫成兩格。移除之後在遊戲裡輸入 fmap reset 重建即可。裝好後套件也會自己偵測並提醒你。
五、怎麼用
動作結果
在地圖上點兩下某間房角色自動走過去
fgo 當鋪走到名字符合的房間
fmap看目前認識了幾間房
fmap stop中斷自動走路
fmap reset清空地圖重新畫

看不到地圖面板的話,工具列上的「地圖 / Map」按鈕可以叫出來。

六、幾件事先講清楚
  • 自動走路只能走你已經走過的房間。沒去過的地方要先自己走一次—— 地圖是你自己的足跡,不是攻略。
  • 沒走過的方向會顯示成一小截短線,提醒你「這邊還有路沒探」。
  • 房間的位置是預先算好的,所以不會像一般自動地圖那樣互相疊在一起、 需要你手動拖開。
  • 這個套件只讀取伺服器本來就會送給客戶端的房間資料, 不會替你跑任何指令,也不會碰你的帳號。
  • 網頁版玩家不需要安裝——網頁版本來就有房間圖與方位面板。
七、GMCP 封包速查表(進階:自己寫腳本)

伺服器除了看得見的文字,還會另外送一份結構化資料給客戶端,走的是 GMCP 這個標準協定。上面那個自動地圖套件讀的就是其中的 Room.Info。 你也可以自己讀這些資料,做出血條、目標視窗、背包面板之類的東西—— 比用觸發器去解析文字穩定得多,我們改文案不會把你的腳本弄壞。

Mudlet 預設就會協商 GMCP,通常什麼都不用設定。 (設定 → 一般設定裡有「啟用 GMCP」的選項,預設是開的。)

目前送出的封包
封包內容什麼時候送
Room.Info 房間編號、名稱、所屬區域、出口方向與各出口通往的房間(含鄰房名稱);另有一個跨重建不變的房間索引,適合當自己資料表的鍵。副本房間另附 instance / instance_name / depth / depth_total(見下方說明) 每次進入新房間、登入時
Room.Exits 目前房間的出口方向陣列 同上,另外房內有人進出時也會重送
Room.Entities 房裡的 NPC、玩家、物品,各附名稱與可執行的動作 進房、look、房內有人/物進出時
Char.Vitals 氣血、內力、法力、精神、體力(各含上限) 任何一項有變動就送(伺服器每秒偵測一次)
Char.Stats 十項基礎屬性、武學心得、身家、十一個裝備欄位,以及門派/地位/正邪/名聲/年紀/體況 登入、換裝備時
Char.Skills 已學的基礎技能與武學,各含等級、境界、是否已運起 登入、學藝/升級/運起武學時
Char.Inventory 身上的物品(同款會堆疊計數),含稀有度、裝備欄位、消耗品效果 登入、物品進出行囊、換裝備時
Char.Missions 目前進行中的任務與其進度文字 登入、移動、查任務時
Char.Combat 是否在戰鬥中、打的是誰、誰在打你、目標血量、出手間隔(詳見下一段) 開打與收兵當下立刻送;其餘變動每秒偵測一次
Npc.Dialogue NPC 對你說的話(說話者、內容) NPC 跟你講話時
Emote.List 全部表情動作的清單 登入時送一次(內容固定不變)
Core.Chat 全服頻道的發言與表情 有人在頻道說話時

這些封包只送你自己的資料,看不到別人的私密資訊。 裡頭的 ref(形如 #12345)指的是「這一隻/這一件」的當下編號, NPC 重生後會換一個;要做長期對照表請用 keyproto_key

副本房間(Room.Info 的四個額外欄位)

副本(冰雪祭壇、裂地龍穴這類)的房間是每一趟隨機生成、走完就刪的, 所以沒有「跨場次不變」的房間索引——room_id 一律是空字串。 能穩定辨識的是這幾項:

area / zone副本種類代號(如 frost_altar),跨場次固定——用這個判斷「我在哪一種副本」
subarea本房性質:entrance 前廳/combat 戰鬥房/trap 機關房/boss 關底
instance本趟副本的實例編號。非空字串就代表這是臨時房間
instance_name副本中文名(如「冰雪祭壇」)
depth / depth_total本趟第幾間 / 共幾間,例如 6 / 10
⚠ 寫自動地圖的話,看到 instance 非空請直接略過這間房。
副本房走完就刪除,畫進地圖只會讓你每跑一趟就永久多出十幾間再也回不去的鬼房間。 官方地圖套件 v1.1 起已自動略過(進出副本時會提示一行), 舊版請重新下載安裝。

一般地圖房間的這四欄固定是 "" / "" / 0 / 0, 所以你可以無條件讀取、不必判斷欄位存不存在。

Char.Combat 的欄位
active是否處於戰鬥中。你有鎖定目標、或有人正在打你,都算
attacking你自己有沒有鎖定目標。active 為真而這項為假,代表你正在單方面挨打
mode"fight" 點到為止/"kill" 生死相搏/"duel" 切磋;非戰鬥時為空字串
busy施展招式之後的僵直,這一回合不會揮擊
queued已排入下一回合的動作 {kind, windup};沒有則為 null
interval你目前的出手間隔(秒),會吃輕功與凍緩等修正
target鎖定的目標,沒有則為 null
attackers正在攻擊你的對象陣列,被圍毆時會超過一個

targetattackers 裡每一個對象長這樣:

{
  "name":       "冰甲妖兵(Iceguard)",   完整顯示名(含稱號/門派前綴)
  "name_zh":    "冰甲妖兵",             乾淨中文名
  "key":        "iceguard",
  "proto_key":  "iceguard",             跨重生恆定,做對照表用這個
  "ref":        "#606262",              精確指向這一隻
  "is_player":  false,
  "hp":         120,
  "hp_max":     300,
  "hp_percent": 40
}

血量不是額外開放的情報——戰鬥訊息每一擊本來就會印「(某某 剩 120/300)」, 這裡只是把同一份數字整理成好讀的格式。戰鬥外不會有 target, 所以沒辦法拿來偷看路人的血量。

Mudlet 這樣接
-- 新增一個 Script,把下面貼進去
function onCombatUpdate()
    local c = gmcp.Char.Combat
    if not c.active then return end

    if c.target then
        local t = c.target
        cecho(string.format("<yellow>[戰鬥] %s  %d/%d (%d%%)\n",
              t.name_zh, t.hp, t.hp_max, t.hp_percent))
    end
    if not c.attacking then
        cecho("<red>[警告] 你正在挨打,卻沒有還手目標!\n")
    end
end

registerAnonymousEventHandler("gmcp.Char.Combat", "onCombatUpdate")

其他封包同理,事件名稱就是 gmcp. 加上封包名,例如 gmcp.Char.Vitalsgmcp.Room.Info。 想要新的欄位、或覺得哪裡不好用,歡迎到留言/回報開一單。

八、遇到問題
走了半天地圖還是空的
輸入 fmap 看「本次連線收到 Room.Info」是不是 0。 是 0 的話代表套件沒收到房間資料,請到留言/回報告訴我們。
同一間房被畫成兩格
幾乎都是 generic_mapper 還裝著。移除它,再 fmap reset
點兩下沒反應
先確認那間房你真的走過。沒走過的房間之間沒有路徑可算,自然走不過去。
中文變成方框或問號
編碼不是 UTF-8,或字型沒有中文。回頭看第二、三節。

← 新手指南 立即進入遊戲