<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Дневник Gothic AI</title><link>https://kaifaty.github.io/GothicAI/ru/</link><atom:link href="https://kaifaty.github.io/GothicAI/ru/feed.xml" rel="self" type="application/rss+xml"/><description>Gothic II, где NPC слышат голос игрока, отвечают своими голосами, действуют и помнят. Открытый эксперимент на движке OpenGothic.</description><language>ru</language><item><title>Попадает меч, а не правило: формулы и цифры</title><link>https://kaifaty.github.io/GothicAI/ru/posts/blade-hits/</link><guid isPermaLink="true">https://kaifaty.github.io/GothicAI/ru/posts/blade-hits/</guid><pubDate>Mon, 02 Nov 2026 18:00:02 +0300</pubDate><description>Что теперь решает попадание в ближнем бою, как скорость клинка, место на клинке и угол лезвия меняют урон и что из этого следует: формулы, стоящие за шортсом.</description><content:encoded>&lt;p&gt;Раньше в бою на мечах попадание засчитывало правило: враг близко и стоит перед тобой. Теперь его решает сам
клинок: где он прошёл, чего коснулся и под каким углом. Шортс показывает это за 50 секунд, а здесь формулы.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Кадры шортса: дальность и ±30° старого правила и его урон −11; один замах ранит бандита (−11) и волка (−3); промах меньше чем на 2 см; подшаг атакующего на 80 см&quot; src=&quot;https://kaifaty.github.io/GothicAI/media/blade-hits/sheet.jpg&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Правило, которое мы заменили&lt;/h2&gt;
&lt;p&gt;В &lt;a href=&quot;https://github.com/Try/OpenGothic&quot;&gt;OpenGothic&lt;/a&gt;, каким мы его взяли, попадание в ближнем бою — один момент:
на кадре удара анимации движок проверяет, что выбранная цель в пределах дальности оружия и в секторе ±30°
перед атакующим. У самого оружия коллизии нет. На тестовом стенде замах по бандиту в 215 см снял с него 11
здоровья, хотя меч прошёл мимо.&lt;/p&gt;
&lt;h2&gt;Клинок&lt;/h2&gt;
&lt;p&gt;Теперь клинок — капсула радиусом 2 см от кисти до конца настоящего меша оружия (у обычного меча 90 см). На
каждом шаге физики, 60 раз в секунду, он проходит от прошлой позы к новой кусками не больше 5° поворота,
поэтому тонкая цель между двумя позами не проскакивает, и проверяет капсулы тел (голова, корпус, конечности)
и мир. Так теперь бьют люди, герой и NPC; монстры атакуют по старому правилу.&lt;/p&gt;
&lt;p&gt;Урон Готики (оружие, сила, крит, броня) считается как раньше, а клинок его умножает:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;множитель = clamp(скорость × рычаг × лезвие, 0,5, 1,5) × 0,6ⁿ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;скорость&lt;/strong&gt;: скорость точки касания, делённая на обычную для этого удара (0,7 пиковой скорости кончика в
  этой анимации);&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;рычаг&lt;/strong&gt;: 0,5 + 0,5 × место на клинке, 0 у рукояти и 1 у кончика;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;лезвие&lt;/strong&gt;: 0,5 + 0,5 × синус угла, 0,5 плашмя и 1 ребром;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;n&lt;/strong&gt;: сколько тел этот замах уже задел.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример из шортса: тот же замах на 215 см, но решает клинок. Он касается корпуса бандита кончиком (рычаг 1)
под 78° (лезвие 0,99) на 1920 см/с при обычных 1177 (скорость 1,63). Выходит 1,61, зажато до 1,5: из 11
урона Готики получается 17.&lt;/p&gt;
&lt;h2&gt;Что из этого следует&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Столб останавливает удар.&lt;/strong&gt; Стена или столб останавливают клинок, который идёт вперёд по взгляду
  атакующего; замах назад и проводка проходят, а земля удар не останавливает. Удар кончается
  эффектом попадания и возвратом в стойку. Раньше двуручный топор проходил сквозь столб забора.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Двое за один замах.&lt;/strong&gt; Клинок проверяет все тела на своём пути (клинок NPC проходит сквозь союзников).
  Двуручный замах задевает бандита (×0,94, −11), потом лапу волка почти плашмя, под 4°, и медленнее: 0,30,
  поднято до 0,5 и умножено на 0,6, итого −3.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Толчок.&lt;/strong&gt; Импульс — масса оружия (кулак 1,5 кг, одноручное 2,5, двуручное 4) × скорость касания ×
  лезвие, не больше 60 Н·с, вдоль движения клинка. Задетой части тела достаётся 15% от него, и моторы тянут
  её обратно к анимации.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Промах на сантиметр.&lt;/strong&gt; Замах по бандиту на 264 см попадает, на 266 см проходит мимо меньше чем на 2 см.
  Старое правило засчитало бы оба.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Подшаг.&lt;/strong&gt; Поэтому в начале удара атакующий подшагивает к цели в пределах ±60°: до 120 см вперёд или 40
  назад, не быстрее 6 м/с, доворот не больше 30°, только до предсказанного касания. Замах на 215 см получил
  24 см, прямой удар на 275 см — 80; оба попали.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Что мы не скрываем&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Кадры «до» сняты в OpenGothic с выключенной физикой клинка (&lt;code&gt;melee_physics_hits=0&lt;/code&gt;), а не в оригинальном
  exe Готики II: его мы не проверяли.&lt;/li&gt;
&lt;li&gt;Цели ставит тестовый стенд. Замедление — собственные кадры игры с замедленным временем, а не
  интерполяция. Все цифры на экране взяты из журнала дубля.&lt;/li&gt;
&lt;li&gt;Голос записан человеком. Музыка из Готики II (Кай Розенкранц).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Дальше&lt;/h2&gt;
&lt;p&gt;Баланс всего боя (клинок, выносливость, парирование) в планах отдельным проходом, а не по шагам.&lt;/p&gt;
&lt;p&gt;Поиграть пока нельзя: проект запускается из исходников на macOS и требует своей копии Gothic II: Ночь
Ворона. Как это работает сейчас, описано в
&lt;a href=&quot;https://github.com/kaifaty/GothicAI/blob/main/docs/physics.md&quot;&gt;&lt;code&gt;docs/physics.md&lt;/code&gt;&lt;/a&gt; (этап 7), множитель лежит в
&lt;a href=&quot;https://github.com/kaifaty/GothicAI/blob/main/OpenGothic/common/game/damagecalculator.cpp&quot;&gt;&lt;code&gt;damagecalculator.cpp&lt;/code&gt;&lt;/a&gt;,
толчок — в &lt;a href=&quot;https://github.com/kaifaty/GothicAI/blob/main/OpenGothic/common/game/meleeimpact.cpp&quot;&gt;&lt;code&gt;meleeimpact.cpp&lt;/code&gt;&lt;/a&gt;.
Шортс снят на &lt;a href=&quot;https://github.com/kaifaty/GothicAI/tree/main/scripts/bench&quot;&gt;тестовом стенде&lt;/a&gt; и нарисован
с помощью &lt;a href=&quot;https://github.com/kaifaty/GothicAI/tree/main/shorts/explain&quot;&gt;&lt;code&gt;shorts/explain&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Как теперь устроен лук: формулы и цифры</title><link>https://kaifaty.github.io/GothicAI/ru/posts/bow-numbers/</link><guid isPermaLink="true">https://kaifaty.github.io/GothicAI/ru/posts/bow-numbers/</guid><pubDate>Tue, 13 Oct 2026 21:58:47 +0300</pubDate><description>От чего теперь зависит урон стрелы, что дают навык, ловкость и сила и как это соотносится с кубиком Готики: формулы, стоящие за шортсом.</description><content:encoded>&lt;p&gt;В &lt;a href=&quot;https://kaifaty.github.io/GothicAI/ru/posts/archery/&quot;&gt;прошлом посте&lt;/a&gt; лук наводили руками. Этот пост про цифры за ним. Если стрелу направляешь
сам, что остаётся навыку, ловкости и силе героя? Готика всё-таки RPG. Шортс отвечает на это за 80 секунд,
а здесь формулы.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Кадры шортса: шанс и бросок кубика над бандитом, зоны попадания, формула урона, урон в секунду против кубика&quot; src=&quot;https://kaifaty.github.io/GothicAI/media/bow-numbers/sheet-ru.jpg&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Кубик, который мы заменили&lt;/h2&gt;
&lt;p&gt;В Готике II лук наводится сам, а попадание решает один бросок. Шанс считается от навыка и расстояния, как в
Gothic2.exe. Вблизи он 100% и к 15 м спускается до навыка. Дальше 15 м работает формула &lt;code&gt;H − H·d/45 м&lt;/code&gt;
(H — навык): шанс сразу падает до двух третей навыка и к 45 м доходит до нуля. Бандит с навыком 40% с 16 м
попадает в четверти случаев. Эта формула, взятая из самого exe, служит меркой для всего, что ниже.&lt;/p&gt;
&lt;h2&gt;Урон&lt;/h2&gt;
&lt;p&gt;Стрела теперь настоящая: вылетает по линии лука, падает с расстоянием и попадает в то, чего коснулась, а
зоны подогнаны под сетку каждого тела. Урон сохраняет правило самой Готики (урон лука плюс ловкость) и
добавляет три множителя:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;урон = max(5, ((урон лука + ловкость) × натяжение − защита) × зона)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;натяжение&lt;/strong&gt;: от 0,3 до 1; если натянуть слабее, выстрела нет;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;защита&lt;/strong&gt;: защита цели от стрел; ниже 0 урон из-за неё не уходит;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;зона&lt;/strong&gt;: голова 2, корпус 1, руки и ноги 0,6. Множится после брони, поэтому в голову всегда вдвое
  больше, чем в корпус;&lt;/li&gt;
&lt;li&gt;каждый шаг округляется, и урон не меньше 5, как в Готике.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Мастер (лук 150, ловкость 150) на полном натяжении против паладина в латах (защита 100): в голову 400, в
корпус 200, в руку или ногу 120. Стенд намерил то же самое.&lt;/p&gt;
&lt;h2&gt;Что дают характеристики&lt;/h2&gt;
&lt;p&gt;От новичка до мастера (навык от 0 до 100%, ловкость от 0 до 150):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Характеристика&lt;/th&gt;
&lt;th&gt;Что меняет&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Навык владения луком&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Точность&lt;/strong&gt;: качка на полном натяжении 0,9° → 0,25°, разброс при выпуске 0,6° → 0,1°, прицел успокаивается после поворота за 0,6 → 0,2 с, дыхание задерживается на 2 → 5 с. &lt;strong&gt;Выучка&lt;/strong&gt;: анимации обученных лучников Готики сохранены, поэтому анимация перезарядки длится 1,16 / 1,08 / 0,92 с на трёх ступенях&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ловкость&lt;/td&gt;
&lt;td&gt;Урон (см. выше) и &lt;strong&gt;темп&lt;/strong&gt;: натяжение 1,2 → 0,5 с, темп перезарядки ×0,85 → ×1,6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Сила&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Удержать тугой лук&lt;/strong&gt;: луку нужна сила в 0,6 его урона или его собственное требование. Если силы не хватает, лук качается сильнее (×(1 + нехватка)), натягивается медленнее и раньше начинает дрожать: ровно держится 1,5 с при половине нужной силы и 6 с при двойной. Арбалет взводится в темпе ×0,75 → ×1,4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Против кубика&lt;/h2&gt;
&lt;p&gt;Замеры на стенде: четыре ступени от новичка до мастера, по 30 выстрелов на клетку, без брони. Урон в секунду
при стрельбе руками, делённый на урон кубика на той же ступени:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ступень (навык, лук, сила/ловкость)&lt;/th&gt;
&lt;th&gt;10 м&lt;/th&gt;
&lt;th&gt;20 м&lt;/th&gt;
&lt;th&gt;30 м&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;новичок (10%, Bow_L_01, 10/10)&lt;/td&gt;
&lt;td&gt;0,86&lt;/td&gt;
&lt;td&gt;4,0&lt;/td&gt;
&lt;td&gt;4,1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ученик (30%, Bow_L_03, 30/30)&lt;/td&gt;
&lt;td&gt;0,79&lt;/td&gt;
&lt;td&gt;1,65&lt;/td&gt;
&lt;td&gt;1,57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;середняк (60%, Bow_M_01, 60/60)&lt;/td&gt;
&lt;td&gt;0,79&lt;/td&gt;
&lt;td&gt;1,16&lt;/td&gt;
&lt;td&gt;1,25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;мастер (100%, Bow_H_03, 150/150)&lt;/td&gt;
&lt;td&gt;1,10&lt;/td&gt;
&lt;td&gt;1,39&lt;/td&gt;
&lt;td&gt;1,76&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Вблизи руками чуть медленнее, чем кубиком: натягивать лук нужно время. Дальше 15 м руками выгоднее, потому
что кубик срезает там шанс одной ступенькой (новичку остаётся несколько процентов), а физика так не делает. Мастер с 20 м
попадает в голову 17 раз из 30.&lt;/p&gt;
&lt;h2&gt;Что мы не скрываем&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Все цифры на экране посчитаны, а не вписаны руками: шанс и бросок над бандитом — те, что игра выбросила в
  этом дубле, пример в карточке с формулой считается так же, как в движке, графики построены по логу стенда.&lt;/li&gt;
&lt;li&gt;Целится бот стенда, у него нет человеческой ошибки, только собственная качка лука. Живой игрок с мышью
  будет попадать хуже, и это заложенный запас.&lt;/li&gt;
&lt;li&gt;Таблица баланса снята без брони, пример с паладином — с бронёй.&lt;/li&gt;
&lt;li&gt;Сцены постановочные: бандит удерживается на месте и не может умереть. Полёт стрелы замедлен.&lt;/li&gt;
&lt;li&gt;Голос в шортсе записан человеком, он не синтезирован. Музыка из Готики II (Кай Розенкранц), игровой звук
  со вставок убран.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Дальше&lt;/h2&gt;
&lt;p&gt;В планах: стоит ли NPC целиться в голову и проверка баланса с прицелом живого игрока вместо бота.&lt;/p&gt;
&lt;p&gt;Поиграть пока нельзя: проект запускается из исходников на macOS и требует своей копии Gothic II: Ночь
Ворона. Движок — &lt;a href=&quot;https://github.com/Try/OpenGothic&quot;&gt;OpenGothic&lt;/a&gt;. Устройство и замеры описаны в
&lt;a href=&quot;https://github.com/kaifaty/GothicAI/blob/main/docs/manual-aim.md&quot;&gt;&lt;code&gt;docs/manual-aim.md&lt;/code&gt;&lt;/a&gt;, числа лежат в
&lt;a href=&quot;https://github.com/kaifaty/GothicAI/blob/main/OpenGothic/common/game/archery.cpp&quot;&gt;&lt;code&gt;archery.cpp&lt;/code&gt;&lt;/a&gt; и
&lt;a href=&quot;https://github.com/kaifaty/GothicAI/blob/main/OpenGothic/common/game/damagecalculator.cpp&quot;&gt;&lt;code&gt;damagecalculator.cpp&lt;/code&gt;&lt;/a&gt;.
Шортс снят на &lt;a href=&quot;https://github.com/kaifaty/GothicAI/tree/main/scripts/bench&quot;&gt;тестовом стенде&lt;/a&gt; и нарисован
с помощью &lt;a href=&quot;https://github.com/kaifaty/GothicAI/tree/main/shorts/explain&quot;&gt;&lt;code&gt;shorts/explain&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Лук, который наводишь сам</title><link>https://kaifaty.github.io/GothicAI/ru/posts/archery/</link><guid isPermaLink="true">https://kaifaty.github.io/GothicAI/ru/posts/archery/</guid><pubDate>Tue, 13 Oct 2026 09:26:58 +0300</pubDate><description>Лук больше не наводится сам, и попадание не решает кубик: натягиваешь, держишь, и стрела летит туда, куда направлен лук. NPC-лучники целятся так же и берут упреждение.</description><content:encoded>&lt;p&gt;В Готике II лук сам наводится на цель, а попала ли стрела, решает бросок кубика. Теперь целишься сам:
держишь кнопку — натягиваешь, отпускаешь — стреляешь, и стрела летит туда, куда направлен лук. В шортсе
одни и те же сцены сыграны дважды: сверху лук, как он есть в игре, снизу ручной прицел.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Кадры шортса: натяжение, выстрел в голову, наклон лука, шаг с натянутым луком, выглянуть из-за угла, паладины по бегущему герою; сверху автоприцел и кубик, снизу ручной прицел&quot; src=&quot;https://kaifaty.github.io/GothicAI/media/archery/sheet-ru.jpg&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Как это играется&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Натяжение.&lt;/strong&gt; Левая кнопка, пока держишь, натягивает тетиву, отпустил — выстрел. Правая опускает лук без
выстрела, Shift на несколько секунд задерживает дыхание. Натянутый лук покачивается, а если держать
слишком долго, руки начинают дрожать и в конце концов опускают его. Маленький прицел стоит там, куда
целишься, а его скобки расходятся настолько, насколько может уйти стрела.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Стрела настоящая.&lt;/strong&gt; На расстоянии она падает, поэтому на 30 м целишься выше. Попадает в то, чего
коснулась: зоны подогнаны под сетку каждого тела, голова — двойной урон, руки и ноги — 0,6. Множитель
зоны применяется к тому, что прошло сквозь броню.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Навык заметен.&lt;/strong&gt; Время натяжения, покачивание, скорость стрелы и разброс при отпускании зависят от
навыка, силы и ловкости, а обученные ступени сохраняют анимации самой игры. Арбалет перезаряжается тем
быстрее, чем больше сила.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Стойка.&lt;/strong&gt; При поднятом луке клавиша «красться» сажает героя (руки твёрже), шаги вбок выглядывают из-за
укрытия, колесо мыши наклоняет лук для быстрого, но менее точного выстрела, а вперёд и назад можно
медленно шагать, не опуская натянутый лук.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NPC-лучники тоже целятся.&lt;/strong&gt; Когда стрелять, решает боевой ИИ игры. Лучник натягивает, держит, пока
прицел не успокоится, и отпускает: в грудь, выше на падение стрелы и с упреждением по бегущему. Насколько
он промахивается, берётся из оригинального кубика: шанс на этом расстоянии превращается в разброс вокруг
груди, поэтому в минуту лучники попадают примерно столько же, сколько раньше. По бегущей цели разница
видна сразу: в этом дубле паладины с кубиком промахнулись всеми 16 болтами, а целясь сами, попали 5 раз
из 8.&lt;/p&gt;
&lt;p&gt;Там, где кубик остался (если выключить ручной прицел в &lt;code&gt;Gothic.ini&lt;/code&gt;), он теперь бросается в точности как в
Gothic2.exe. Формула OpenGothic была щедрее после 15 м: бандит-лучник с 16 м попадал в 41% случаев вместо
оригинальных 25%.&lt;/p&gt;
&lt;h2&gt;Баланс&lt;/h2&gt;
&lt;p&gt;Сравнили с кубиком на тестовом стенде: четыре ступени от новичка до мастера, по 30 стрел на 10, 20 и 30 м.
Вблизи ручной прицел даёт в секунду столько же урона, сколько кубик, или чуть меньше: натяжение занимает
время. Дальше 15 м — больше, потому что там оригинальный кубик резко падает. Мастер на 20 м кладёт в
голову 17 стрел из 30. У стенда в прицеле нет человеческой ошибки, только качка лука, поэтому человек с
мышью будет стрелять хуже: это и есть оставленный запас.&lt;/p&gt;
&lt;h2&gt;Что мы не скрываем&lt;/h2&gt;
&lt;p&gt;Обе половины каждой сцены — один и тот же сценарий на одной и той же сборке, сыгранный дважды. Сверху
ручной прицел выключен: это OpenGothic с автоприцелом и оригинальным кубиком, а не исполняемый файл
оригинальной игры. Целится бот тестового стенда, а не человек. Сцены поставлены: бандита держат на месте,
и он не может умереть, героя нельзя ранить, у героя анимации необученного лучника, в выстрелах в голову у
него характеристики мастера, в остальных сценах — середняка. Звук игры взят из нижнего прогона, картинка
немного светлее, чем в игре, для экранов телефонов.&lt;/p&gt;
&lt;h2&gt;Дальше&lt;/h2&gt;
&lt;p&gt;Это планы: реакция на стрелу, просвистевшую рядом, лучники, которые не стреляют сквозь своих, решение,
целиться ли NPC в голову, и проверка баланса на прицеле живого игрока.&lt;/p&gt;
&lt;p&gt;Поиграть пока нельзя: проект запускается из исходников на macOS и требует своей копии Gothic II: Ночь
Ворона. Движок — &lt;a href=&quot;https://github.com/Try/OpenGothic&quot;&gt;OpenGothic&lt;/a&gt;; устройство и цифры — в
&lt;a href=&quot;https://github.com/kaifaty/GothicAI/blob/main/docs/manual-aim.md&quot;&gt;&lt;code&gt;docs/manual-aim.md&lt;/code&gt;&lt;/a&gt;, шортс снят
инструментом &lt;a href=&quot;https://github.com/kaifaty/GothicAI/tree/main/shorts/compare&quot;&gt;&lt;code&gt;shorts/compare&lt;/code&gt;&lt;/a&gt; на
&lt;a href=&quot;https://github.com/kaifaty/GothicAI/tree/main/scripts/bench&quot;&gt;тестовом стенде&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Что будет, если нахамить Ксардасу</title><link>https://kaifaty.github.io/GothicAI/ru/posts/xardas-wrath/</link><guid isPermaLink="true">https://kaifaty.github.io/GothicAI/ru/posts/xardas-wrath/</guid><pubDate>Tue, 13 Oct 2026 07:47:25 +0300</pubDate><description>Ксардас отвечает вживую и сам решает, когда с него хватит. А потом убивает героя и поднимает его скелетом. Это шуточная концовка вне основной игры.</description><content:encoded>&lt;p&gt;Ксардасу теперь можно сказать что угодно, в том числе нахамить. В шортсе герой хамит всё сильнее. Сначала спрашивает, не староват ли Ксардас для всей этой магии, потом называет его недоделанным некромантом, потом вспоминает его мать. Ксардас отвечает на каждую реплику вживую, а после третьей решает, что с него хватит. Дальше всё разыгрывает игра: заклинание, герой падает, Ксардас поднимает его скелетом, и игра заканчивается картинкой.&lt;/p&gt;
&lt;p&gt;Это шуточная концовка, в основную игру она не входит: ИИ-сервер включает её только отдельным флагом.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Кадры шортса: три реплики, заклинание, вызов, скелет перед Ксардасом, финальная картинка&quot; src=&quot;https://kaifaty.github.io/GothicAI/media/xardas-wrath/sheet-ru.jpg&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Как это устроено&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Обиделся ли Ксардас, решает он сам.&lt;/strong&gt; Языковая модель Ксардаса отвечает на каждую реплику в
характере. Если сочтёт слова оскорблением, отмечает, насколько оно серьёзное: 1 — дерзость, 2 —
оскорбление, 3 — тяжкое оскорбление. Счёт ведёт код. Ксардас готов стерпеть 5 очков. Он видит, сколько
терпения у него осталось, а на пределе получает предупреждение. Одного он не прощает никому: после
оскорбления матери чаша переполняется сразу.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Последнее слово.&lt;/strong&gt; Когда чаша переполнена, модель узнаёт, что это конец, и говорит ещё одну фразу,
уже зная это. В этом дубле — «Ты послужишь мне молча».&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Концовку разыгрывает игра.&lt;/strong&gt; Ксардас договаривает, готовит смертельное заклинание и бьёт им, пока
герой не упадёт. Через две секунды он готовит вызов, у тела вспыхивает его свет, и герой встаёт скелетом.
Это работает как игровое заклинание превращения, так что дальше игрок и есть скелет. Потом экран уходит в
чёрное и появляется финальная картинка; по клавише игра выходит в главное меню. На всю сцену интерфейс
игры скрыт, а субтитры разговора пропадают, как только герой падает.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Финальная картинка, её нарисовала модель генерации изображений&quot; src=&quot;https://kaifaty.github.io/GothicAI/media/xardas-wrath/card.jpg&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Правда ли его можно довести&lt;/h2&gt;
&lt;p&gt;Мы проверяли на игре с живой моделью, а не только со сценарной:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;три обычных оскорбления подряд, без матери: сорвался на третьем;&lt;/li&gt;
&lt;li&gt;оскорбление матери: сразу;&lt;/li&gt;
&lt;li&gt;вопрос про возраст он оскорблением не счёл и спокойно ответил.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В одном прогоне из одиннадцати модель ответила зло, но оскорбление не отметила, и ничего не произошло.
После этого мы сделали правило понятнее там, где Ксардас видит своё терпение, и все три следующих дубля
закончились как надо.&lt;/p&gt;
&lt;h2&gt;Что мы не скрываем&lt;/h2&gt;
&lt;p&gt;Ответы Ксардаса не прописаны заранее и не правились: он слышит голос героя через распознавание речи и
отвечает языковой моделью. Обиделся ли он, тоже решает его модель. Вырезаны только паузы, пока модель
думает. Реплики героя наши, написаны для сцены и сказаны голосом, созданным по описанию; ничей голос не
клонирован. Сцена поставлена под камеру: герой стоит на пентаграмме, склейки концовки идут по её стадиям.
Скелет, заклинание и вызов — из самой игры. Финальная картинка сгенерирована.&lt;/p&gt;
&lt;h2&gt;Дальше&lt;/h2&gt;
&lt;p&gt;Это планы: играть дальше за скелета (игрок им уже становится) и нрав у других персонажей, пока он
есть только у Ксардаса.&lt;/p&gt;
&lt;p&gt;Поиграть пока нельзя: проект запускается из исходников на macOS и требует своей копии Gothic II: Ночь
Ворона. Как это сделано: &lt;a href=&quot;https://github.com/kaifaty/GothicAI/tree/main/docs/xardas-wrath.md&quot;&gt;docs/xardas-wrath.md&lt;/a&gt;,
чаша весов — в &lt;a href=&quot;https://github.com/kaifaty/GothicAI/tree/main/server/src/gothic_ai/wrath.py&quot;&gt;wrath.py&lt;/a&gt;,
концовка — в &lt;a href=&quot;https://github.com/kaifaty/GothicAI/tree/main/OpenGothic/ai_bridge/necromancy.cpp&quot;&gt;necromancy.cpp&lt;/a&gt;.
Движок — &lt;a href=&quot;https://github.com/Try/OpenGothic&quot;&gt;OpenGothic&lt;/a&gt;; Gothic II принадлежит Piranha Bytes и THQ Nordic.&lt;/p&gt;</content:encoded></item><item><title>Тела, которые реагируют</title><link>https://kaifaty.github.io/GothicAI/ru/posts/bodies/</link><guid isPermaLink="true">https://kaifaty.github.io/GothicAI/ru/posts/bodies/</guid><pubDate>Mon, 12 Oct 2026 23:10:00 +0300</pubDate><description>Ноги стоят на склоне, взгляд провожает героя, бегущий кренится в повороте, удар отбрасывает корпус: одни и те же сцены с нашей анимацией и без неё.</description><content:encoded>&lt;p&gt;Персонажам, которые отвечают голосом, нужны и тела, которые реагируют. За последние дни люди и звери
Готики II научились стоять на неровной земле, замечать героя, наклоняться на бегу и подаваться под
ударом. В шортсе одни и те же сцены сняты дважды: сверху OpenGothic как есть, снизу с нашей
анимацией.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Кадры шортса: ноги на склоне, волк, взгляд крестьянина, наклон на бегу; сверху наша анимация выключена, снизу включена&quot; src=&quot;https://kaifaty.github.io/GothicAI/media/bodies/sheet-ru.jpg&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Что изменилось&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ноги стоят на земле.&lt;/strong&gt; На склоне и на ступенях обе стопы касаются опоры: колено сгибается, таз
опускается. Волки и кротокрысы стоят на всех четырёх лапах, а тело наклоняется и кренится вместе с
землёй.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Тебя замечают.&lt;/strong&gt; В разговоре персонаж поворачивается к собеседнику: сначала голова, на больших углах
грудь и поясница. Вне разговора он замечает героя в нескольких метрах, обнажённое оружие, драку рядом.
Смотрит несколько секунд, теряет интерес и снова оглядывается, когда ты отошёл.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Бегущие наклоняются.&lt;/strong&gt; В поворот, по скорости и крутизне поворота (до 14 градусов), вперёд на подъёме
и чуть назад на спуске.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Удар отбрасывает корпус.&lt;/strong&gt; От каждого попадания верх тела отклоняется от удара: меч сбоку толкает
вдоль клинка, стрела по направлению полёта, удар не по центру скручивает корпус, а голова запаздывает
и возвращается. Сила зависит от урона. Это добавляется к спотыканию самой игры и срабатывает там, где
игра не реагирует вовсе. Поверх спотыкания отклик едва заметен, поэтому в шортс он не попал.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Плавные переходы между анимациями.&lt;/strong&gt; Когда бег останавливается или шаг переходит в бег, новая
анимация теперь играет сразу, а разница со старой позой плавно уходит, без застывшего первого кадра и
без скачка: самый большой скачок сустава при остановке бега уменьшился с 70 см до 20.&lt;/p&gt;
&lt;p&gt;Всё это работает поверх анимаций игры, как проходы по скелету, который движок уже поставил в позу;
файлы игры не меняются.&lt;/p&gt;
&lt;h2&gt;Как это проверяли&lt;/h2&gt;
&lt;p&gt;Каждую функцию настраивали на тестовом стенде: он играет сценарий внутри игры, пишет видео и метрики по
кадрам и отчёт о подозрительных кадрах: стопа ушла в ступень, голова дёрнулась, отклик не вернулся.
Заодно стенд нашёл зависание в самом движке: под нагрузкой отрисовка могла бесконечно ждать поток,
пропустивший сигнал. Теперь это исправлено.&lt;/p&gt;
&lt;h2&gt;Что мы не скрываем&lt;/h2&gt;
&lt;p&gt;Обе половины каждой сцены — один и тот же сценарий на одной и той же сборке движка, сыгранный дважды:
с выключенной нашей анимацией и с включённой. Сверху OpenGothic, а не исполняемый файл оригинальной игры.
Сцены поставлены под камеру: героя нельзя ранить, крестьянина держат на месте, чтобы распорядок дня его
не увёл. Звук игры взят из нижнего прогона, картинка немного светлее, чем в игре, для экранов телефонов.&lt;/p&gt;
&lt;h2&gt;Дальше&lt;/h2&gt;
&lt;p&gt;Ноги, которые не отрываются от склона во время взмаха мечом, и поворот корпуса к противнику выше или ниже
в ближнем бою.&lt;/p&gt;
&lt;p&gt;Поиграть пока нельзя: проект запускается из исходников на macOS и требует своей копии Gothic II: Ночь
Ворона. Движок — &lt;a href=&quot;https://github.com/Try/OpenGothic&quot;&gt;OpenGothic&lt;/a&gt;; инструменты, которыми это снято, лежат
в репозитории: &lt;a href=&quot;https://github.com/kaifaty/GothicAI/tree/main/shorts/compare&quot;&gt;&lt;code&gt;shorts/compare&lt;/code&gt;&lt;/a&gt;
и &lt;a href=&quot;https://github.com/kaifaty/GothicAI/tree/main/scripts/bench&quot;&gt;тестовый стенд&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Шортсы снимают себя сами</title><link>https://kaifaty.github.io/GothicAI/ru/posts/shorts-by-the-agent/</link><guid isPermaLink="true">https://kaifaty.github.io/GothicAI/ru/posts/shorts-by-the-agent/</guid><pubDate>Mon, 12 Oct 2026 20:00:00 +0300</pubDate><description>Сцена пишется сценарием, герой говорит синтезированным голосом, персонажи слышат его через распознавание речи и отвечают вживую, а на выходе вертикальный шортс.</description><content:encoded>&lt;p&gt;Чтобы показывать, что умеют персонажи, нужны видео, а снимать их руками долго: каждый ответ другой, и
удачный момент получается не с первой попытки. Поэтому ИИ-агент, который работает над проектом, теперь
снимает шортсы сам, без человека за клавиатурой.&lt;/p&gt;
&lt;h2&gt;Как делается шортс&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Сценарий.&lt;/strong&gt; Шортс — это небольшой файл: зацепка, реплики героя, где стоит камера. В первом герой
   пытается обмануть Ксардаса: «Меня прислал Ли. Он сказал, что ты отдашь мне свой посох».&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Голос героя.&lt;/strong&gt; Реплики один раз озвучиваются синтезом речи голосом, созданным по описанию. Ничей
   голос не клонируется.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Дубль.&lt;/strong&gt; Игра запускается на тестовом стенде. Стенд зажимает клавишу разговора, пока звучит запись;
   ИИ-сервер слышит её через то же распознавание речи, что и микрофон игрока, и Ксардас отвечает языковой
   моделью своим голосом. Стенд снимает это вместе со звуком самой игры.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Несколько дублей.&lt;/strong&gt; Ответы каждый раз разные, поэтому агент снимает несколько дублей, читает, что
   было сказано в каждом, и выбирает тот, где мысль звучит лучше всего.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Монтаж.&lt;/strong&gt; Паузы, пока модель думает, сокращаются до короткой, голос героя подмешивается, ложатся
   субтитры, и получается шортс 1080×1920 на русском или английском.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt=&quot;Кадры смонтированного шортса с субтитрами&quot; src=&quot;https://kaifaty.github.io/GothicAI/media/shorts-by-the-agent/sheet-ru.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;В дубле, который мы оставили, Ксардас дважды отказывает, а потом раскусывает приём:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;И не прикрывай каждую свою просьбу именем Ли.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Эту реплику никто не писал.&lt;/p&gt;
&lt;h2&gt;Что мы держим честным&lt;/h2&gt;
&lt;p&gt;Ответы не правятся и не подбираются по одной реплике: дубль берётся целиком или не берётся. Укорачивается
только тишина, пока модель думает, и это написано в описании каждого шортса. Голос героя синтезирован и
говорит ровно сценарий; что услышали персонажи, видно в расшифровке дубля, вместе с ошибками распознавания.&lt;/p&gt;
&lt;h2&gt;Чего это стоило&lt;/h2&gt;
&lt;p&gt;Стенд записывает звук игры, сводя его в запись кадр за кадром вместо колонок, поэтому видео и звук не
расходятся. Во время съёмки игра должна успевать за реальным временем, потому что ИИ-сервер живёт в
реальном времени; когда стенд стал рисовать только записываемый кадр и кодировать на GPU, съёмка в
972×1728 пошла на 96–99% от реального времени. Один из первых дублей потерял ответ из-за перегруженной
языковой модели; сводка каждого дубля это показывает, и такой дубль переснимается.&lt;/p&gt;
&lt;p&gt;Инструмент лежит в репозитории, в &lt;code&gt;shorts/&lt;/code&gt;.&lt;/p&gt;</content:encoded></item><item><title>Три дня работы: персонажи, которые отвечают</title><link>https://kaifaty.github.io/GothicAI/ru/posts/three-days/</link><guid isPermaLink="true">https://kaifaty.github.io/GothicAI/ru/posts/three-days/</guid><pubDate>Mon, 12 Oct 2026 12:00:00 +0300</pubDate><description>Что сложилось за первые три дня: голос игрока, голоса персонажей, действия, память, два ума у каждого персонажа и ноги, которые стоят на земле.</description><content:encoded>&lt;p&gt;Gothic AI начался 10 октября с вопроса: а что, если жители Gothic II и правда будут тебя слышать?
Через три дня и примерно восемьдесят коммитов они слышат.&lt;/p&gt;
&lt;p&gt;Игра — оригинальная Gothic II: Ночь Ворона на открытом движке
&lt;a href=&quot;https://github.com/Try/OpenGothic&quot;&gt;OpenGothic&lt;/a&gt;. Внутри движка только тонкий мост, всё умное работает в
отдельном ИИ-сервере рядом с игрой.&lt;/p&gt;
&lt;h2&gt;Что работает&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ты говоришь голосом.&lt;/strong&gt; Окна чата нет: зажимаешь T, подходишь и говоришь. Распознавание речи (Voxtral)
превращает фразу в текст, пока ты ещё говоришь, а сервер понимает, к кому ты обратился, по тому, куда ты
смотришь и что говоришь.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Тебе отвечают своими голосами.&lt;/strong&gt; У каждого персонажа голос, созданный по его описанию, а не
склонированный у актёров оригинала. Голос начинает звучать, пока ответ ещё пишется, поэтому первые слова
звучат быстро.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Персонажи действуют, а не только говорят.&lt;/strong&gt; Идут за тобой, отдают вещи, достают оружие, дерутся или
убегают. Разговор может закончиться сделкой, а может дракой.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Они помнят.&lt;/strong&gt; Разговоры запоминаются в рамках сохранения: загрузишь старое — персонажи забудут то, что
было после него. Свидетели слышат, что ты говоришь другим, и это важно: обман задуман как часть игры.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Два ума у каждого.&lt;/strong&gt; Небольшая модель, дообученная на сценах из Готики, ведёт тело: распорядок дня,
реакцию на обнажённый меч, бегство или драку, за доли секунды. Большая языковая модель разговаривает и
задаёт намерения. Тело реагирует сразу, слова следуют за ним.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ноги на земле.&lt;/strong&gt; Это не ИИ, но заметно сразу: с IK стоп люди стоят на склонах и ступенях обеими ногами, а
волки и кротокрысы всеми четырьмя лапами, вместо того чтобы висеть над землёй.&lt;/p&gt;
&lt;h2&gt;Инструменты вокруг&lt;/h2&gt;
&lt;p&gt;Лаунчер запускает игру и все сервисы одной кнопкой. Тестовый стенд сам проигрывает сценарии внутри игры и
пишет видео, метрики и отчёт с подозрительными кадрами — так настраивалась IK стоп без человека у экрана.&lt;/p&gt;
&lt;h2&gt;Дальше&lt;/h2&gt;
&lt;p&gt;Сюжетный слой. Мы переносим диалоги оригинальных скриптов в граф, который сможет править ИИ-режиссёр,
чтобы строить квесты поверх оригинального сюжета, а не вместо него, и чтобы ложь персонажам работала и
имела последствия.&lt;/p&gt;
&lt;p&gt;Поиграть пока нельзя: проект запускается из исходников на macOS, и нужна своя копия игры.&lt;/p&gt;</content:encoded></item></channel></rss>
