Симптом
При пересохранении мира в YAML через C++-эмиттер (circle -S, а также OLC-сохранение мобов) теряются умения моба (Skill: строки легаси). Это видно в tools/run_load_tests.sh:
Full_YAML_checksums vs Full_YAML_RoundTrip: DIFFER
Small_YAML_checksums vs Small_YAML_RoundTrip: DIFFER (MOB 100-108)
Репро (small-мир)
- Сконвертировать
lib.template в YAML, забутить с -W → запомнить чексумму MOB 100.
circle -d . -S world_v2, подменить world ← world_v2, забутить с -W.
- Чексумма MOB 100 меняется.
Поле, которое расходится, — умения. Mob 100 в legacy имеет Skill: 136 15:
- исходный (Python-конвертер) YAML: блок
skills: [{skill_id: 136, value: 15}] присутствует;
- пересохранённый (
-S, C++-эмиттер) YAML: блок skills отсутствует → при загрузке умение 136 пропадает.
Где
src/engine/db/yaml_world_data_source.cpp, YamlWorldDataSource::SaveMobs — эмиссия умений (has_skills / цикл по ESkill::kFirst..kLast с mob.GetSkill(...) > 0). На mob 100 блок не пишется, хотя Skill: 136 загружен. Нужно сверить диапазон/условие и формат вывода (ручной out << поверх BeginSequence()), затем закрепить round-trip-тестом.
Контекст
Не связано с #3384/#3386 и PR #3390 (там правки только на стороне загрузчика; кросс-формат Legacy↔YAML совпадает полностью). Это отдельный баг сохраняющего YAML-эмиттера, затрагивает OLC-сохранение мобов и -S.
Симптом
При пересохранении мира в YAML через C++-эмиттер (
circle -S, а также OLC-сохранение мобов) теряются умения моба (Skill:строки легаси). Это видно вtools/run_load_tests.sh:Репро (small-мир)
lib.templateв YAML, забутить с-W→ запомнить чексумму MOB 100.circle -d . -S world_v2, подменитьworld←world_v2, забутить с-W.Поле, которое расходится, — умения. Mob 100 в legacy имеет
Skill: 136 15:skills: [{skill_id: 136, value: 15}]присутствует;-S, C++-эмиттер) YAML: блокskillsотсутствует → при загрузке умение 136 пропадает.Где
src/engine/db/yaml_world_data_source.cpp,YamlWorldDataSource::SaveMobs— эмиссия умений (has_skills/ цикл поESkill::kFirst..kLastсmob.GetSkill(...) > 0). На mob 100 блок не пишется, хотяSkill: 136загружен. Нужно сверить диапазон/условие и формат вывода (ручнойout <<поверхBeginSequence()), затем закрепить round-trip-тестом.Контекст
Не связано с #3384/#3386 и PR #3390 (там правки только на стороне загрузчика; кросс-формат Legacy↔YAML совпадает полностью). Это отдельный баг сохраняющего YAML-эмиттера, затрагивает OLC-сохранение мобов и
-S.