Описания параметров на русском независимо от локали сервера
CI / test (push) Failing after 7s
Release / release (push) Successful in 29s

Панель показывала комментарии из самого конфига, а игра пишет их на языке
сервера: на Windows-клиенте они русские, на Linux-сервере почти всегда
английские — и вся вкладка оказывалась на английском.

Теперь у панели свой словарь: подпись и описание для всех 153 параметров
servertest.ini, встречающихся в Build 41 и 42, плюс подписи для 182
параметров песочницы. Комментарий из файла остаётся запасным вариантом для
ключей, которых словарь не знает, — в новых версиях игры их добавляют.

Песочница заодно научилась отдавать свои комментарии: игра расписывает там
смысл каждого значения, и даже английский текст лучше пустоты.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-05 16:03:09 +03:00
co-authored by Claude Opus 5
parent 5d50b609f6
commit c706665196
2 changed files with 389 additions and 31 deletions
+25 -3
View File
@@ -13,6 +13,9 @@ import (
type SandboxEntry struct {
Path string `json:"path"`
Value string `json:"value"`
// Comment — строки "--" перед параметром: игра расписывает там смысл
// значения и расшифровку вариантов.
Comment string `json:"comment,omitempty"`
}
// Sandbox — разбор <server>_SandboxVars.lua. Файл генерируется игрой и имеет
@@ -24,6 +27,8 @@ type Sandbox struct {
lines []string
// index сопоставляет путь параметра с номером строки.
index map[string]int
// comments хранит описание параметра по его пути.
comments map[string]string
// crlf — файл был с виндовыми переводами строк; сохраняем как было.
crlf bool
}
@@ -35,16 +40,24 @@ var (
// ParseSandbox разбирает содержимое SandboxVars.lua.
func ParseSandbox(data []byte) *Sandbox {
s := &Sandbox{index: make(map[string]int)}
s := &Sandbox{index: make(map[string]int), comments: make(map[string]string)}
raw := string(data)
s.crlf = strings.Contains(raw, "\r\n")
text := strings.ReplaceAll(raw, "\r\n", "\n")
s.lines = strings.Split(text, "\n")
var stack []string
// Комментарии копим до ближайшего параметра, как и в .ini.
var comment []string
for n, line := range s.lines {
trimmed := strings.TrimSpace(line)
if trimmed == "" || strings.HasPrefix(trimmed, "--") {
if strings.HasPrefix(trimmed, "--") {
comment = append(comment, strings.TrimSpace(strings.TrimPrefix(trimmed, "--")))
continue
}
if trimmed == "" {
comment = nil
continue
}
if sandboxCloseRe.MatchString(line) {
@@ -66,6 +79,7 @@ func ParseSandbox(data []byte) *Sandbox {
} else {
stack = stack[:0]
}
comment = nil
continue
}
path := name
@@ -73,6 +87,10 @@ func ParseSandbox(data []byte) *Sandbox {
path = strings.Join(stack, ".") + "." + name
}
s.index[path] = n
if len(comment) > 0 {
s.comments[path] = strings.Join(comment, " ")
}
comment = nil
}
return s
}
@@ -99,7 +117,11 @@ func (s *Sandbox) Entries() []SandboxEntry {
if !ok {
continue
}
out = append(out, SandboxEntry{Path: path, Value: s.valueAt(n)})
out = append(out, SandboxEntry{
Path: path,
Value: s.valueAt(n),
Comment: s.comments[path],
})
}
return out
}