Repository navigation
fix(sim): latin class aliases are UTF-8 now, not KOI8-R - #4195
Merged
Merged
Conversation
Таблица алиасов в 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Нашёл, когда поднимал
mud-simпод разбор жалобы с доски ошибок: сценарий сclass: koldunне запускался.Зачем вообще эта таблица
Сценарий симулятора — это YAML, в котором участник описан так:
Движок знает классы по русским именам из
lib/cfg/classes/pc_*.xml— «колдун», «волшебник», «тать». Чтобы сценарии можно было писать латиницей и не тащить кириллицу в файлы, которые гоняются скриптами, вscenario_runner.cppзавели таблицу алиасов:koldun→ «колдун»,wizard→ «волшебник» и так далее, 31 запись. Дальше русское имя уходит вFindAvailableCharClassId().Что было задумано
Таблица хранила русские имена не текстом, а escape-последовательностями, и это было сделано намеренно — чтобы сам
.cppостался в ASCII. В комментарии так и написано:Пока мир и конфиги были в KOI8-R, байты совпадали, и всё работало.
Что сломалось
После перехода проекта на UTF-8 (#3709) имена классов в
pc_*.xmlстали UTF-8. Сравнение идёт черезCompareParam(utils/utils_parse.cpp:513), а он после #3681 ходит по строкам посимвольно, шагая на длину UTF-8-символа:Последняя оговорка — «они здесь всегда в одной кодировке» — ровно то условие, которое таблица алиасов и нарушала. С одной стороны приходили шесть байт KOI8-R, с другой двенадцать байт UTF-8; совпасть они не могли ни при каких данных.
Итог: ни один из 31 алиаса не работал, сценарий падал на старте:
Почему этого никто не заметил
Русское имя (
class: колдун) работало и работает: в YAML оно UTF-8, в конфиге UTF-8, кодировки сходятся — мимо таблицы. А латиница, ради которой таблицу и заводили, молча не находилась. Сценарии руками пишут редко, в CI их никто не гоняет, так что поломка просто лежала.Что сделано
Escape-последовательности заменены обычным текстом, примечание над таблицей переписано:
Все 31 значение, 14 классов. Хранить их в ASCII больше незачем: весь проект в UTF-8, и
.cppв том числе.Проверка
class: koldunпадал сunknown player class;build/live);🤖 Generated with Claude Code