Skip to content

API Basic Config zh tw

Codex edited this page Sep 15, 2026 · 1 revision

JSON / Config.bas

ClassicUO • Basic

Config.bas 位於 Scripts/Include。將 Include/Config.bas 放在主腳本旁並加入 Include "Config.bas"。模組結合持久 JSON 與獨立預設值。

完整語法

Include "Config.bas"
settings = Config.Load(fileName, defaults)
Config.Save(fileName, settings)
enabled = Config.GetFlag(settings, key, fallback=False)
Config.SetFlag(settings, key, value)
JsonParse(text) / JsonStringify(value[, indented=0])
JsonLoad(fileName[, defaultValue]) / JsonSave(fileName, value[, indented=1])
JsonKind(value) / JsonBoolean(value) / JsonNull() / flag.Value()

參數

  • fileName — 必要的檔案路徑。相對路徑以主腳本資料夾為基準,包括從 Include 呼叫時。也接受絕對路徑。
  • defaults (Config.Load) — Config.Load 必須提供預設值 Dictionary。其深層 JSON 副本與已儲存的頂層鍵合併,不改變原始值。不可省略 defaults。
  • defaultValue (JsonLoad) — 可選的備用值,僅在檔案或資料夾不存在時使用。經 JSON 轉換取得獨立副本;內容、編碼或存取錯誤不會被隱藏。
  • settings / value — 數字、String、陣列、List、Dictionary、JsonBoolean 或 JsonNull。Dictionary 的鍵必須是字串。可共用參照,不可循環參照。
  • indented — Integer 旗標:0 緊湊格式,非0 使用縮排。預設 Stringify=0、Save=1。
  • key / fallback — Config.Load(fileName, defaults) 回傳新 Dictionary:儲存的頂層鍵覆寫 defaults 的深層副本;巢狀物件整個取代,不遞迴合併。Config.Save(fileName, settings) 明確儲存且無回傳值。Config.GetFlag(settings, key, fallback=False) 回傳1/True 或0/False;既存非布林值會出錯。Config.SetFlag(settings, key, value) 只變更記憶體,無回傳值。Load/Save 需要字串鍵的 Dictionary。內部 Private RequireObject 檢查外層類型;JSON 轉換檢查全部內容。

傳回值

Config.Load(fileName, defaults) 回傳新 Dictionary:儲存的頂層鍵覆寫 defaults 的深層副本;巢狀物件整個取代,不遞迴合併。Config.Save(fileName, settings) 明確儲存且無回傳值。Config.GetFlag(settings, key, fallback=False) 回傳1/True 或0/False;既存非布林值會出錯。Config.SetFlag(settings, key, value) 只變更記憶體,無回傳值。Load/Save 需要字串鍵的 Dictionary。內部 Private RequireObject 檢查外層類型;JSON 轉換檢查全部內容。

行為

  • 這些是無 UO. 前綴的本機 Basic 函式,不傳送遊戲封包。JsonParse/JsonStringify 在記憶體內運作。Basic True 儲存為數字1;JSON true 請用 JsonBoolean(True)。JsonNull() 將 null 與0 區分。
  • 只接受有限數字。整數值超出 ±9007199254740991 會被拒絕;大型 ID 請存為字串。其他數字使用 Double 精度。嚴格 UTF-8:輸入接受 BOM,輸出不含 BOM。無效 Unicode 會出錯。
  • 限制:1048576 個 UTF-16 編碼單元、4MiB 位元組、64 層容器、100000 個值節點。超限會出錯。解析/讀取建立新集合;儲存不複製記憶體物件。
  • Save 驗證全部資料、建立父資料夾、在目的檔旁寫入唯一暫存檔、清空緩衝區後移動/取代。取代前失敗或取消會保留舊檔。系統允許時清理暫存檔。已完成的取代不會復原。
  • 每256 個值、4096 位元組/字元區塊之間及取代前檢查暫停/停止。不建立額外執行緒;無法強制中斷個別系統呼叫。同時儲存時以最後成功取代為準,不是資料庫交易。

範例

1. 獨立預設值

# fileName=missing-settings.jsondefaults  delay=350檔案不存在時 Load 複製 defaults將結果改為125 不影響原始350結果為 "125:350"測試前請重新命名或移除舊範例檔Option Explicit On
Include "Config.bas"
Sub Main()
    Dim defaults=Dictionary()
    defaults["delay"]=350
    Dim settings=Config.Load("missing-settings.json", defaults)
    settings["delay"]=125
    Return CStr(settings["delay"]) & ":" & CStr(defaults["delay"])
End Sub

參數與執行說明:

fileName=missing-settings.json,defaults 含 delay=350。檔案不存在時 Load 複製 defaults。將結果改為125 不影響原始350。結果為 "125:350"。測試前請重新命名或移除舊範例檔。

Include/Config.bas

Option Explicit On

' Copy Include/Config.bas beside your main script, then Include "Config.bas".
' Relative JSON paths are based on the main script's folder, not this module.
Module Config
    Private Sub RequireObject(ByVal value)
        If JsonKind(value) <> "object" Then
            Throw "Config requires a Dictionary with string keys."
        End If
    End Sub

    ' Returns a new Dictionary. Saved top-level keys override independent defaults.
    ' Missing files use defaults; invalid files raise an error and remain unchanged.
    Public Function Load(ByVal fileName, ByVal defaults)
        RequireObject(defaults)
        Dim result = JsonParse(JsonStringify(defaults))
        Dim saved = JsonLoad(fileName, Dictionary())
        RequireObject(saved)
        For Each entry In saved
            result.Set(entry.Key(), entry.Value())
        Next
        Return result
    End Function

    ' No return value. Validates and writes UTF-8 using same-directory replacement.
    Public Sub Save(ByVal fileName, ByVal settings)
        RequireObject(settings)
        JsonSave(fileName, settings)
    End Sub

    ' A JSON Boolean is distinct from a Basic numeric flag. Convert explicitly.
    ' Returns 1/True or 0/False; non-Boolean saved values raise an error.
    Public Function GetFlag(ByVal settings, ByVal key, Optional ByVal fallback=False)
        RequireObject(settings)
        Dim flag = settings.Get(key, JsonBoolean(fallback))
        If JsonKind(flag) <> "boolean" Then
            Throw "Config.GetFlag expects a JSON Boolean for key: " & CStr(key)
        End If
        Return flag.Value()
    End Function

    ' Changes the Dictionary in memory; call Save to persist it.
    Public Sub SetFlag(ByVal settings, ByVal key, ByVal value)
        RequireObject(settings)
        settings.Set(key, JsonBoolean(value))
    End Sub
End Module

2. 儲存並重新讀取

# SetFlag 建立 JSON 布林值Save 建立/取代 demo-settings.jsonLoad 重新讀取GetFlag 回傳 Integer1delay=350結果為 "1:350"Option Explicit On
Include "Config.bas"
Sub Main()
    Dim settings=Dictionary()
    settings["delay"]=350
    Config.SetFlag(settings, "enabled", True)
    Config.Save("demo-settings.json", settings)
    Dim loaded=Config.Load("demo-settings.json", Dictionary())
    Return CStr(Config.GetFlag(loaded, "enabled")) & ":" & CStr(loaded["delay"])
End Sub

參數與執行說明:

SetFlag 建立 JSON 布林值。Save 建立/取代 demo-settings.json,Load 重新讀取。GetFlag 回傳 Integer1,delay=350。結果為 "1:350"。

Include/Config.bas

Option Explicit On

' Copy Include/Config.bas beside your main script, then Include "Config.bas".
' Relative JSON paths are based on the main script's folder, not this module.
Module Config
    Private Sub RequireObject(ByVal value)
        If JsonKind(value) <> "object" Then
            Throw "Config requires a Dictionary with string keys."
        End If
    End Sub

    ' Returns a new Dictionary. Saved top-level keys override independent defaults.
    ' Missing files use defaults; invalid files raise an error and remain unchanged.
    Public Function Load(ByVal fileName, ByVal defaults)
        RequireObject(defaults)
        Dim result = JsonParse(JsonStringify(defaults))
        Dim saved = JsonLoad(fileName, Dictionary())
        RequireObject(saved)
        For Each entry In saved
            result.Set(entry.Key(), entry.Value())
        Next
        Return result
    End Function

    ' No return value. Validates and writes UTF-8 using same-directory replacement.
    Public Sub Save(ByVal fileName, ByVal settings)
        RequireObject(settings)
        JsonSave(fileName, settings)
    End Sub

    ' A JSON Boolean is distinct from a Basic numeric flag. Convert explicitly.
    ' Returns 1/True or 0/False; non-Boolean saved values raise an error.
    Public Function GetFlag(ByVal settings, ByVal key, Optional ByVal fallback=False)
        RequireObject(settings)
        Dim flag = settings.Get(key, JsonBoolean(fallback))
        If JsonKind(flag) <> "boolean" Then
            Throw "Config.GetFlag expects a JSON Boolean for key: " & CStr(key)
        End If
        Return flag.Value()
    End Function

    ' Changes the Dictionary in memory; call Save to persist it.
    Public Sub SetFlag(ByVal settings, ByVal key, ByVal value)
        RequireObject(settings)
        settings.Set(key, JsonBoolean(value))
    End Sub
End Module

3. 驗證旗標類型

# enabled=1 是數字不是 JSON trueGetFlag 拒絕它Catch 回傳 "invalid flag"SetFlag(settings,"enabled",True) 可設定正確類型不變更檔案Option Explicit On
Include "Config.bas"
Sub Main()
    Dim settings=Dictionary()
    settings["enabled"]=1
    Try
        Dim enabled=Config.GetFlag(settings, "enabled")
    Catch problem
        Return "invalid flag"
    End Try
    Return "unexpected"
End Sub

參數與執行說明:

enabled=1 是數字,不是 JSON true。GetFlag 拒絕它;Catch 回傳 "invalid flag"。SetFlag(settings,"enabled",True) 可設定正確類型。不變更檔案。

Include/Config.bas

Option Explicit On

' Copy Include/Config.bas beside your main script, then Include "Config.bas".
' Relative JSON paths are based on the main script's folder, not this module.
Module Config
    Private Sub RequireObject(ByVal value)
        If JsonKind(value) <> "object" Then
            Throw "Config requires a Dictionary with string keys."
        End If
    End Sub

    ' Returns a new Dictionary. Saved top-level keys override independent defaults.
    ' Missing files use defaults; invalid files raise an error and remain unchanged.
    Public Function Load(ByVal fileName, ByVal defaults)
        RequireObject(defaults)
        Dim result = JsonParse(JsonStringify(defaults))
        Dim saved = JsonLoad(fileName, Dictionary())
        RequireObject(saved)
        For Each entry In saved
            result.Set(entry.Key(), entry.Value())
        Next
        Return result
    End Function

    ' No return value. Validates and writes UTF-8 using same-directory replacement.
    Public Sub Save(ByVal fileName, ByVal settings)
        RequireObject(settings)
        JsonSave(fileName, settings)
    End Sub

    ' A JSON Boolean is distinct from a Basic numeric flag. Convert explicitly.
    ' Returns 1/True or 0/False; non-Boolean saved values raise an error.
    Public Function GetFlag(ByVal settings, ByVal key, Optional ByVal fallback=False)
        RequireObject(settings)
        Dim flag = settings.Get(key, JsonBoolean(fallback))
        If JsonKind(flag) <> "boolean" Then
            Throw "Config.GetFlag expects a JSON Boolean for key: " & CStr(key)
        End If
        Return flag.Value()
    End Function

    ' Changes the Dictionary in memory; call Save to persist it.
    Public Sub SetFlag(ByVal settings, ByVal key, ByVal value)
        RequireObject(settings)
        settings.Set(key, JsonBoolean(value))
    End Sub
End Module

en · ru · uk · fr · de · it · es · zh-tw · ja · ko

Basic

Clone this wiki locally