• Nikitos's avatar
    Порт генерации рейда из audm-neko: $.raid
    · 8bd7f20e
    Nikitos создал
    Седьмой блок порта (docs/TASKS.md §12.11, §6.5). В audm-neko мир рейда был ОДНОЙ
    большой связной картой: районы слева направо (деревня → ПГТ → город → промзона →
    пойма), рельеф шумом, постройки по районам, точки интереса, выходы, а содержимое
    появлялось СТРИМИНГОМ по чанкам вокруг бойца.
    
    * план мира: районы с долями ширины, рельеф (гладкий шум, усиленный районом),
      постройки по видам застройки (изба, хрущёвка, гаражи, халупа), точки интереса,
      выходы по одному на район плюс «дальний», план тайников и NPC с капами;
    * всё — ЧИСЛА: генератор не создаёт ни спрайтов, ни тел; $.raid.fill() отдаёт
      содержимое чанков игре (onBuilding/onLoot/onNpc/onChunk);
    * стриминг: окно radius чанков вокруг игрока, load/unload, takePending() отдаёт
      чанки к наполнению РОВНО ОДИН РАЗ (лут и NPC не двоятся), chunkContent() —
      срез рельефа и содержимое чанка;
    * детерминированность от сида: create({ seed }) воспроизводим, reseed(),
      save/load (план воспроизводится из сида, в сейве только он и загруженные чанки);
    * погода: clear/overcast/rain/storm/fog с влиянием (fog, rain, wind, loud — в
      грозу шаги слышно хуже, light), одна на рейд.
    
    Тесты нашли три настоящих ошибки:
    1) сид в объекте рейда был СНИМКОМ, а не геттером — reseed() и load() меняли
       переменную, но игра видела старое значение;
    2) голый xorshift32 без размешивания сида давал первые значения ≈0 для соседних
       сидов: границы районов, первый дом и погода повторялись. Добавлен финализатор
       MurmurHash3 — соседние сиды расходятся сразу;
    3) districtAt(-10) отдавал ПОСЛЕДНИЙ район вместо первого.
    
    Проверка: tests/js/raid_test.mjs (19 проверок: детерминированность, районы без
    дыр, дома внутри районов, выходы, капы, стриминг, чанки, сейв, погода), полный
    набор qjs и агентских тестов зелёный.
    8bd7f20e