Skip to content

fix(sim): latin class aliases are UTF-8 now, not KOI8-R - #4195

Merged
bylins merged 1 commit into
masterfrom
fix/sim-class-aliases-utf8
Nov 14, 2026
Merged

bylins merged 1 commit into
masterfrom
fix/sim-class-aliases-utf8

Conversation

@bylins

@bylins bylins commented Nov 14, 2026 •

Copy link
Copy Markdown
Owner

Нашёл, когда поднимал mud-sim под разбор жалобы с доски ошибок: сценарий с class: koldun не запускался.

Зачем вообще эта таблица

Сценарий симулятора — это YAML, в котором участник описан так:

attacker:
  type: player
  class: koldun
  level: 30

Движок знает классы по русским именам из lib/cfg/classes/pc_*.xml — «колдун», «волшебник», «тать». Чтобы сценарии можно было писать латиницей и не тащить кириллицу в файлы, которые гоняются скриптами, в scenario_runner.cpp завели таблицу алиасов: koldun → «колдун», wizard → «волшебник» и так далее, 31 запись. Дальше русское имя уходит в FindAvailableCharClassId().

Что было задумано

Таблица хранила русские имена не текстом, а escape-последовательностями, и это было сделано намеренно — чтобы сам .cpp остался в ASCII. В комментарии так и написано:

// Map values are KOI8-R byte sequences hardcoded
// as escape sequences to keep this file ASCII-clean.
{"koldun",        "\xCB\xCF\xCC\xC4\xD5\xCE"},   // «колдун» в KOI8-R

Пока мир и конфиги были в KOI8-R, байты совпадали, и всё работало.

Что сломалось

После перехода проекта на UTF-8 (#3709) имена классов в pc_*.xml стали UTF-8. Сравнение идёт через CompareParam (utils/utils_parse.cpp:513), а он после #3681 ходит по строкам посимвольно, шагая на длину UTF-8-символа:

// Посимвольно, а не побайтово: под UTF-8 регистр русской буквы по одному байту не берётся
// (issue #3681). Шаг обеих строк -- на длину символа, они здесь всегда в одной кодировке.

Последняя оговорка — «они здесь всегда в одной кодировке» — ровно то условие, которое таблица алиасов и нарушала. С одной стороны приходили шесть байт KOI8-R, с другой двенадцать байт UTF-8; совпасть они не могли ни при каких данных.

Итог: ни один из 31 алиаса не работал, сценарий падал на старте:

mud-sim: scenario run failed: unknown player class: 'koldun'

Почему этого никто не заметил

Русское имя (class: колдун) работало и работает: в YAML оно UTF-8, в конфиге UTF-8, кодировки сходятся — мимо таблицы. А латиница, ради которой таблицу и заводили, молча не находилась. Сценарии руками пишут редко, в CI их никто не гоняет, так что поломка просто лежала.

Что сделано

Escape-последовательности заменены обычным текстом, примечание над таблицей переписано:

-{"koldun",        "\xCB\xCF\xCC\xC4\xD5\xCE"},
+{"koldun",        "колдун"},

Все 31 значение, 14 классов. Хранить их в ASCII больше незачем: весь проект в UTF-8, и .cpp в том числе.

Проверка

  • до правки сценарий с class: koldun падал с unknown player class;
  • после — отрабатывает (прогнал на мире build/live);
  • сборка с тестами: 875 тестов, 872 прошли, 3 отключены.

🤖 Generated with Claude Code

Таблица алиасов в ResolveClassAlias хранила русские имена классов
koi8-последовательностями: так было задумано, чтобы файл оставался
ASCII. После перехода проекта на UTF-8 (#3709) имена в pc_*.xml стали
UTF-8, FindAvailableCharClassId сравнивает с ними, и ни один латинский
алиас больше не совпадал:

  mud-sim: scenario run failed: unknown player class: 'koldun'

Падали все 31 алиас, то есть вся ASCII-запись сценариев. Русское имя
("class: колдун") работало и работает.

Проверено: сценарий с "class: koldun" отрабатывает. Сборка с тестами:
875 тестов, 872 прошли, 3 отключены.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@bylins
bylins merged commit b54bc6c into master Nov 14, 2026
20 checks passed
@bylins
bylins deleted the fix/sim-class-aliases-utf8 branch November 14, 2026 10:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant