Skip to content

C++ YAML-эмиттер (SaveMobs) теряет умения моба при -S/OLC-сохранении #3391

@kvirund

Description

@kvirund

Симптом

При пересохранении мира в 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-мир)

  1. Сконвертировать lib.template в YAML, забутить с -W → запомнить чексумму MOB 100.
  2. circle -d . -S world_v2, подменить worldworld_v2, забутить с -W.
  3. Чексумма 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions