ROGUENAROK 0.14.0 — СИСТЕМА РУН

СТАТУС И ПРОВЕРКА
Реализованы код предметов, установка, серверные боевые обработчики и добыча для 37 утверждённых рун. Это сборка для игрового тестирования. Valheim и кооператив с этой версией фактически НЕ запускались; успешная компиляция и модельные тесты не подтверждают визуал, боевые события и сетевые задержки в игре.
На живой сервер и клиент сборка не устанавливалась. Перед установкой всем игрокам нужна одна версия. Применяется существующее правило проекта: новый релиз один раз обнуляет игроков до 20 монет. При повторном входе и рейдах той же версии прогресс сохраняется. Мир не сбрасывался, резервные копии мира не создавались.

1. ИЗМЕНЁННЫЕ ФАЙЛЫ
Новые файлы Foundation/Runes/:
RuneRegistry.cs — 37 определений, редкости, совместимость, формат пяти слотов v1, таблица вероятностей.
RuneItemManager.cs — три технических шаблона, 37 Jotunn-предметов, копии материалов/иконок, ванильный статус Неистовства. Технические шаблоны не регистрируются как доступные предметы. Потенциально опасные скрипты исходного Eitr отключаются только на клонах; физика подбора и ванильные визуальные компоненты сохраняются.
RuneUIManager.cs — tooltip предмета/оружия/наземной руны, ПКМ → ЛКМ, защита перемещения во время установки.
RuneSocketManager.cs — сохраняемый запрос, серверное подтверждение, повтор после переподключения, удаление ровно одного токена.
RuneLedger.cs — атомарный серверный XML-журнал выдачи и установки, проверка токенов, подтверждённых слотов, дробные монеты.
RuneNumbers.cs — фиксированные утверждённые коэффициенты; RuneTuning.cs — серверный конфиг неопределённых величин и дропа.
RuneStatusManager.cs — временные состояния и счётчики.
RuneEffectManager.cs — первичный урон, подтверждение реальной потери HP, метки, кровь, области, легендарные эффекты.
RuneClientEffects.cs — фазы атаки, скорость, стамина, натяжение, блок/парирование, прочность.
RuneProjectile.cs — три реальные стрелы, пробитие первой цели и однократные рикошеты без дополнительного расхода стрел.
RuneSceneBridge.cs — штатные сетевые прокси участников и целей из ZDO для dedicated-сервера, ограниченное удержание на 10 с и поиск соседей через FindSectorObjects; владение объектами не меняется. Контейнеры проверяются по ZDO без принудительной загрузки их инвентарей. Нагрузку прокси на поздних волнах необходимо измерить.
RuneNetwork.cs — ограниченные по размеру RPC, проверка отправителя, принадлежности персонажа, оружия, токенов и диапазонов; подтверждение попаданий; синхронизация конфига/баффов.
RuneLootManager.cs — сундуки, звёздные противники, боссы, общий физический дроп, серверные debug-команды.

Изменены существующие Foundation-файлы:
Plugin.cs — инициализация/жизненный цикл, команды и обновление модуля.
RpgModifiers.cs — единое применение скорости анимации RPG и рун, без конкурирующих записей animator.speed.
RpgNetwork.cs — бонус XP убийце и обработка подтверждённой смерти после существующей транзакции RewardedDeaths.
RpgRules.cs, RpgStore.cs — версия 0.14.0 и необязательная дробная часть бонуса XP; старые checkpoint-файлы читаются с нулевой дробью. Старый schema 8 остаётся совместим по полям.
CharacterProgress.cs — очистка незавершённого запроса установки при согласованном сбросе нового релиза.
MarketServices.cs — запрет продажи рун и перемещения участвующих в установке предметов через продажу.
Roguenarok.Foundation.csproj — ссылка на встроенный UnityEngine.ParticleSystemModule.
Foundation.Tests/Program.cs, Foundation.Tests.csproj — модельные проверки рун.
Проверка API: Roguenarok/verify_rune_api.ps1. Упаковка: Roguenarok/package_0140.py.

2. СБОРКА И АВТОМАТИЧЕСКИЕ ПРОВЕРКИ
Release/netstandard2.1: успешно, 0 предупреждений, 0 ошибок.
238914 проверок модели прошли, включая прежние проверки рейдов/экономики/прогрессии и новые проверки рун.
Дополнительно проверены реальные 32 точки Harmony/reflection в установленной assembly_valheim.dll: наличие методов, перегрузки tooltip и имена внедряемых полей. Это проверка метаданных, а НЕ запуск Harmony в игре.
Проверки: 37 уникальных ID; 15/16/6; совместимые и запрещённые пары; дубли белых; запрет дублей синих; зависимость легендарных; версия/повреждение слотов; +16% двух Сил; 14 п.п. двух Критичностей; расходы Разгона/Экономии; Раскол/Разрушитель; пропорции Перегрузки; 800000 вероятностных бросков; отсутствие второго результата одного источника; выдача/установка/повтор подтверждения после перезапуска журнала; повторное использование токена; дробные монеты и XP; запрет XML DTD.

3. ПРАВИЛА И ГРАНИЦЫ СИНХРОНИЗАЦИИ
Оружие: KnifeFlint, AxeStone, AxeFlint, Club, Bow. Более поздние модели оружия не включены автоматически.
Пять слотов: 2 белых, 2 синих, 1 легендарный. Белые дубли складываются. Легендарную можно поставить до синей, но усиление останется неактивным до появления необходимой синей.
ItemData.m_customData: rr_runes = формат 1, rr_rune_weapon = ID экземпляра; у руны rr_rune_token. Журнал: <StateDirectory>/<worldUID>/runes.xml, формат 1. Неизвестные/повреждённые данные не очищаются молча.
Установка сначала подтверждается сервером и сохраняется в журнале, затем клиент применяет ответ. Повтор того же запроса возвращает прежний результат. Во время ожидания эти предметы нельзя выбросить/перетащить/продать через штатный UI. Закрытие меню не теряет запрос. После переподключения запрос повторяется. При смерти предметы теряются по прежним правилам, запрос отменяется.
Сервер ведёт эффекты и принимает подтверждение попадания от текущего владельца цели. Удары с нулевой потерей HP не увеличивают счётчики. Урон, взрывы, волны и дополнительные стрелы разделены: вторичный урон не запускает цепочку новых счётчиков/меток/волн.
При нулевой дополнительной стамине Перегрузка не создаёт дополнительную область. Перегрузка считается по успешным атакам; одна атака оплачивается один раз, независимо от числа целей. Урон первичного удара усиливается до расчёта брони. Конец нативного прохода по целям передаётся отдельным событием: добавленная область не повторяет уже нанесённые этой атакой попадания. Мясник также дополняет набор до трёх разных целей.
Дубина нигде не требует специальную атаку. Парирование определяется по нативному успешному блоку, окну 0,25 с и наличию у блокирующего предмета parry-бонуса.
Руны сундука добавляются владельцем контейнера по серверному результату. Один источник хранится в журнале, а контейнер — под ванильным сохранением и маркером. Сундук не перезаполняется. Руны с противников/боссов создаются сервером как один физический ItemDrop на группу; боссовый дроп не зависит от начисления XP. Нулёзвёздные враги не дают рун.
Трофейщик добавляет физические монеты к прежней награде; дробь хранится на сервере. Опытность повышает XP убийце, остальные члены группы получают прежний общий XP. Запись XP и его дроби использует существующий checkpoint и RewardedDeaths. Изменения журнала без немедленной выдачи пачкуются за кадр; выдача токена и установка записываются до подтверждения.
При смене оружия, смерти, новой генерации, конце рейда и переподключении временные состояния сбрасываются. После успешной эвакуации предметы и слоты сохраняются, временные накопления — нет.

Это не отдельный античит. Как и ванильный Valheim, мод использует принадлежащие клиенту инвентарь, исходный HitData, позы/стамину и владение ZDO. Проверки защищают нормальный протокол от повторов, несовместимых слотов и повторного расходования токенов; не заявляется защита от произвольно модифицированного клиента и ручной подмены сейвов.
Для передачи контекста урона расширена сериализация HitData в мирах Roguenarok. Версия клиента/сервера должна совпадать. Совместимость с другими модами боя/HitData отдельно не проверялась.
Повреждённый серверный журнал отключает руны с сообщением и сохранением файла; рейды остаются доступны. После ремонта файла требуется переподключение/перезапуск. Атомарность серверного журнала не превращает нативный сейв мира и клиентский профиль в общую транзакционную БД: аварийное выключение в момент сохранения требует отдельного испытания. Резервного копирования мира эта версия не добавляет.

4. НЕОПРЕДЕЛЁННЫЕ В ЗАДАНИИ ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ
Секция Runes.Effects серверного local.roguenarok.foundation.cfg; значения синхронизируются клиентам:
BleedDuration=6 с; BleedDamage=0.6 от урона попадания; BleedTick=1 с. Кровотечение — отдельный прямой урон, не повторяющий проверку брони; повторный прок обновляет ваше кровотечение, а не создаёт бесконечные стаки.
AccelerationDuration=4 с; ObsessionDuration=7 с.
ShockwaveRadius=3 м; ShockwaveDamage=0.35 урона попадания. Землетрясение: 4,5 м, каждое второе попадание.
OverloadRadius=3 м до усиления; максимум 3,9 м и +45% урона при 30 дополнительной стамины. За 10/20 стамины — 3,3/3,6 м и +15/+30%.
WedgeRadius=2.5 м; WedgeDamage=0.5 урона разрушающего метку попадания.
DefenseRadius=3 м; DefensePush=15; дополнительного урона нет.
ButcherRadius=3 м; максимум три разных врага, дополнительные цели получают 100% урона обычного попадания с нативными сопротивлениями/бронёй.
PlagueRadius=5 м; полный остаток передаётся каждому из двух врагов. Вторичное кровотечение не передаётся дальше.
VolleySpread=7 градусов в каждую сторону. Дополнительные стрелы не требуют боеприпасов.
Фиксированные утверждённые значения находятся в RuneNumbers.cs. Шаг охотника означает скорость натяжения ×1.5 (длительность /1.5).

Секция Runes.Loot, абсолютные взаимоисключающие вероятности:
ChestWhite=0.20, ChestBlue=0.10, ChestLegendary=0.01.
Star1White=0.04, Star1Blue=0.01, Star1Legendary=0.0005.
Star2White=0.08, Star2Blue=0.04, Star2Legendary=0.003. Для 2 и более звёзд используется строка Star2.
BossBlue=0.75, BossLegendary=0.25; сумма обязана быть 1.
Только звёздные противники: текущая волна 6–10 даёт ×1.5, с 11-й ×2. Сундуки/боссы не умножаются. Некорректные суммы вероятностей отклоняются. Охраняемые сундуки не добавлялись.

5. DEBUG-КОМАНДЫ — F5, ТОЛЬКО АДМИНИСТРАТОР СЕРВЕРА
roguerune give RN_White_Strength
roguerune rarity White
roguerune rarity Blue
roguerune rarity Legendary
roguerune inspect
roguerune clear
roguerune reset
roguerune diagnostic on
roguerune diagnostic off
roguerune loot chest
roguerune loot star1
roguerune loot star2
roguerune loot boss
roguerune verify

loot считает 10000 бросков и выводит результат; не засоряет мир тестовыми предметами. verify проверяет регистрацию 37 префабов, свойства предметов и исходные ванильные шаблоны уже в настоящей игре. Эти команды не запускались в этой проверке.
Для выдачи используйте roguerune, а не обычный spawn: предмет без серверного токена не принимается установкой. clear необратимо очищает слоты выбранного тестового оружия, рун не возвращает. Обычные игроки не могут выполнять debug-запросы, даже отправив RPC вручную.

6. СПИСОК ЭФФЕКТОВ И РУЧНАЯ ПРОВЕРКА
Для каждой строки ниже: выдать руну админской командой, проверить название/цвет/tooltip и условие активации на указанном оружии. Результат фактического игрового теста для ВСЕХ строк пока: НЕ ПРОВЕРЕНО.
RN_White_Strength — Сила (White, Any): +8% урона.
RN_White_Haste — Стремительность (White, Any): +6% скорости атаки.
RN_White_Economy — Экономия (White, Any): −10% стамины на атаки.
RN_White_Stagger — Сокрушение (White, Any): +15% накопления оглушения.
RN_White_Piercing — Пробитие (White, Any): Игнорирование 8% брони врага.
RN_White_Cleave — Рассечение (White, Any): +20% урона дополнительным целям одной атаки; без новых атак.
RN_White_Hunter — Охотник (White, Any): +10% урона врагу с полным HP.
RN_White_Berserk — Берсерк (White, Any): +15% урона при HP игрока ниже 35%.
RN_White_Balance — Равновесие (White, Any): −20% штрафа скорости передвижения во время атаки.
RN_White_Tempering — Закалка (White, Any): −15% расхода прочности оружия.
RN_White_Trophies — Трофейщик (White, Any): +15% монет за убийства этим оружием; дробная часть сохраняется.
RN_White_Experience — Опытность (White, Any): +10% кастомного XP за убийства этим оружием.
RN_White_Critical — Критичность (White, Any): +7 процентных пунктов шанса критического удара ×2.
RN_White_Windup — Быстрый замах (White, Any): −12% длительности подготовки атаки; остальная анимация не ускоряется.
RN_White_Unarmored — Без доспехов (White, Any): +15% урона без нагрудной брони.
RN_Blue_Acceleration — Разгон (Blue, Knife): Попадание даёт +5% скорости атаки и +8% расхода стамины. До 5 накоплений.
RN_Blue_Bloodletting — Кровопускание (Blue, Knife): Каждое четвёртое попадание по одной цели накладывает кровотечение.
RN_Blue_PreyMark — Метка жертвы (Blue, Knife): Специальная атака ставит метку на 6 с. Следующие 3 попадания возвращают по 4 стамины.
RN_Blue_Evisceration — Потрошение (Blue, Knife): Специальная атака мгновенно наносит весь оставшийся урон вашего кровотечения и снимает его.
RN_Blue_Split — Раскол (Blue, Axe): Каждый третий удар по одной цели игнорирует 25% брони.
RN_Blue_Butcher — Мясник (Blue, Axe): После убийства следующая обычная атака поражает до 3 врагов.
RN_Blue_Wedge — Вбитый клин (Blue, Axe): Специальная атака ставит метку на 6 с. Следующий обычный удар разрушает её уроном по площади.
RN_Blue_Crusher — Крушитель (Blue, Club): После парирования следующий обычный удар даёт +80% накопления оглушения.
RN_Blue_Shockwave — Ударная волна (Blue, Club): Каждое третье успешное обычное попадание создаёт ударную волну.
RN_Blue_Defense — Круговая оборона (Blue, Club): После успешного блока следующий обычный удар отбрасывает окружающих врагов.
RN_Blue_Overload — Перегрузка (Blue, Club): Каждое третье успешное обычное попадание тратит до 30 дополнительной стамины: за 10 стамины +15% урона и +10% радиуса; пропорционально запасу.
RN_Blue_Sniper — Снайпер (Blue, Bow): Ещё 0,8 с удержания полностью натянутого лука дают +30% урона.
RN_Blue_HuntingStep — Охотничий шаг (Blue, Bow): После уклонения следующая стрела натягивается на 50% быстрее.
RN_Blue_Explosive — Разрывная стрела (Blue, Bow): После уклонения следующая стрела взрывается при попадании: 40% урона, радиус 2,5 м, перезарядка 8 с.
RN_Blue_Volley — Залп (Blue, Bow): После 3 последовательных попаданий следующая стрела разделяется на 3 снаряда по 45% урона. Промах сбрасывает серию.
RN_Blue_Ricochet — Рикошет (Blue, Bow): Попадание в твёрдую поверхность: один отскок к ближайшему врагу в радиусе 4 м, 50% урона.
RN_Legendary_Obsession — Одержимость (Legendary, Knife): Усиливает «Разгон»: до 8 накоплений, увеличенная продолжительность.
RN_Legendary_Destroyer — Разрушитель (Legendary, Axe): Усиливает «Раскол»: пробитие каждым вторым ударом вместо третьего.
RN_Legendary_Earthquake — Землетрясение (Legendary, Club): Усиливает «Ударную волну»: каждый второй удар, радиус +50%.
RN_Legendary_PerfectShot — Идеальный выстрел (Legendary, Bow): Усиливает «Снайпер»: бонус сразу после полного натяжения; стрела пробивает первую цель.
RN_Legendary_Plague — Чума (Legendary, Knife): Усиливает «Кровопускание»: после смерти кровоточащей цели остаток вашего кровотечения передаётся двум ближайшим противникам.
RN_Legendary_Frenzy — Неистовство (Legendary, Any): После 4 попаданий: на 6 с +30% скорости атаки, +25% урона и +20% скорости движения. Без накопления ярости.

ОБЯЗАТЕЛЬНЫЙ ИГРОВОЙ ЧЕКЛИСТ
[ ] Новый профиль/тестовый сервер с одинаковой 0.14.0 у 1–4 игроков; запуск без ошибок регистрации/Harmony.
[ ] roguerune verify: 37 предметов, неизменны оригинальные Eitr/Crystal/SurtlingCore. Иконки белые/синие/золотые; оригиналы сохранены. Руны не излучают урон Eitr.
[ ] Пять слотов: два одинаковых белых, запрет третьего; две разные синие, запрет одинаковых/неподходящего оружия; одна легендарная, зависимость от синей. Ошибка ничего не удаляет.
[ ] Отключиться в момент установки, войти повторно: одна руна удалена один раз, слоты применены один раз. Попробовать перетащить/выбросить/продать участвующие предметы. Умереть при ожидании — новый запрос впоследствии не заблокирован.
[ ] Выбросить/передать оружие другому игроку, перезапустить сервер, эвакуироваться: сохранены именно его слоты. Умереть: прежние правила потери инвентаря.
[ ] Все 15 белых по одному и попарно; сравнить урон/крит/стамину/прочность/анимацию с контрольным экземпляром. Быстрый замах ускоряет подготовку, не хвост анимации.
[ ] Нож: 4 попадания по одной цели, смена цели, кровотечение и его полный остаток при спецатаке; метка 6 с и три возврата по 4; Разгон 5 и Одержимость 8, таймеры 4/7 с; Чума на двух соседей, без дальнейшей цепочки.
[ ] Топор: Раскол на третьем, Разрушитель на втором; Мясник не более трёх разных целей и не повторяет нативные попадания; метка Клина разрушается обычным ударом.
[ ] Дубина: все эффекты только обычными ударами/блоком/парированием. Проверить Крушитель и Круговую оборону. Ударная волна 3/2 попадания, радиусы 3/4.5 м. Перегрузка с 0/5/10/20/30 стамины, один расход на толпу и отсутствие двойной области.
[ ] Лук: удержание после полного натяжения 0.8 с и мгновенное усиление с легендарной; ускорение после уклонения; взрыв по врагу и по поверхности, радиус и cooldown; три настоящие стрелы по 45%, один боеприпас; один рикошет и пробитие первой цели. Проверить сочетания Залп+Снайпер+Идеальный выстрел и Залп+Рикошет.
[ ] Неистовство: четыре попадания, заметный нативный эффект и иконка на 6 с; скорость/урон/движение без бесконечного продления. Смерть/смена оружия/конец рейда убирают бонусы.
[ ] Общий дроп: один сундук открыть несколькими игроками, повторный вход/перезапуск не дают ещё одну руну. Одна физическая руна с босса, в том числе при смерти убийцы и убийстве товарищем. Проверить ★/★★ на волнах 5/6/10/11; нормальные враги без звёзд не дают рун.
[ ] Повторить бой при разном владении AI: цель рядом с хостом, рядом с другим клиентом, переключение владельца во время боя; dedicated-сервер, хаб далеко от нулевой точки, край острова и разошедшиеся в разные стороны игроки. Один урон/расход/XP/дроп, правильный убийца. Кровоточащую цель убивает товарищ — Чума принадлежит автору кровотечения, чужая Опытность убийце не передаётся.
[ ] Рейд целиком: голосование, подготовка, настроенные волны, торговцы/продажа, XP/RPG, трофей босса, порталы, лодка и эвакуация. Все прежние правила остаются работоспособны.
[ ] Проверить latency и нагрузку на поздней волне, в частности подтверждения попаданий, дробные награды и групповые области. Повреждённый тестовый runes.xml должен отключать руны, сохраняя файл и доступность рейдов.

ИТОГ
Код всех 37 рун и инфраструктура готовы в сборке-кандидате 0.14.0. Компиляция, модели и метаданные API проверены. Полную игровую/сетевую готовность можно подтвердить только после указанного ручного прогона; такой проверки ещё не было.
