Silent Throne - краткаий обзор
Проект немного приобретает форму. Сейчас активно работаю над звуковым движком.
Самое сложное — грамотно подобрать звуки, чтобы они гармонично вписывались в атмосферу и сочетались с тем, что происходит во время игрового процесса.
На данный момент озвучены:
боевая система,
способности (скиллы),
передвижение персонажа,
отдельные НПС.
А также добавлено музыкальное сопровождение для режимов покоя и боя, а также звуки некоторых погодных явлений.
Кусок кода из моего проекта!
function scr_monster_database(_monster_id) {
if (!variable_global_exists("monster_db")) {
global.monster_db = {
"imp_twitch": {
// ИДЕНТИФИКАТОР: к какой группе относится моб, какая раса и какой тир (1, 2, 3)
view_mob: { group: "Underworld", race: "Imp", tier: 1 }
// ИМЯ МОБА: считывается интерфейсом и дебаг-выводом над головой
name_mob: "Бес-прислужник",
// БАЗОВЫЕ РОЛЕВЫЕ ХАРДКОРНЫЕ РЕСУРСЫ
hp: 40, // Здоровье моба (его 40 HP)
max_mana: 50, // Максимум маны (хватит ровно на 3 дальних каста по 10 маны)
mana: 50, // Текущая стартовая мана
max_sta: 30, // Максимум стамины для замахов/ударов ближнего боя
sta: 30, // Текущая стартовая стамина
mana_cost_ranged: 8, // Сколько маны сжирает ОДИН дальний выстрел фаерболом
sta_cost_melee: 4, // Сколько стамины сжирает ОДИН физ. удар в упоре
mana_cost_buff: 15, // Сколько маны сжирает активация тактического баффа
// БАЗОВЫЙ ФИЗИЧЕСКИЙ УРОН
dmg: 6, // Обычный урон (при касте фаербола или ударе когтями)
dmg_crit: 12, // Критический урон моба при совпадении шанса
//️ БРОНЯ И РЕЗИСТЫ: 0.20 = режет 20% входящего урона магии
prt: 2, // Плоская защита (вычитается из физ. урона меча ГГ)
resist: { phys: 0, magic: 0.20 },
//ШАНСЫ И ДИНАМИКА ПЕРЕМЕЩЕНИЯ
crit_chance: 15, // Критический шанс моба в процентах
move_spd: 2, // Скорость бега по mp_grid сетке в погоне за ГГ
// ТАКТИКА ДАЛЬНЕГО БОЯ (Каст фаерболов / ледяных стрел / лазеров)
attk_skill: "ranged", // Роль моба со старта: "ranged" — маг, "norm" — чистый ближник
atk_dist: 90, // Дистанция каста магии (моб стопится далеко от игрока)
atk_frame: 4, // Кадр анимации, на котором физически спавнится снаряд в ГГ
projectile: spr_fireball, // Анимированный спрайт
bal_frame: 6,
loop_projectile: true, // Граничный кадр: полет, конец — распад!
// ТАКТИКА БЛИЖНЕГО БОЯ (Кулаки / когти / зубы, если ГГ подошёл в упор или кончилась мана)
melee_dist: 30, // Дистанция ближнего боя (срабатывает, если ГГ влетел в упор к магу)
melee_frame: 5, // Кадр анимации, на котором проходит физ. урон когтями по ГГ
// ПАССИВНЫЕ БАФФЫ И СТАРТОВЫЕ ЭФФЕКТЫ
buff: ["demonic", "unholy_heal"], // Массивы баффов, висящих на мобе со старта
// ДЕБАФФ: вешается на ГГ с определённым шансом при физическом ударе или попадании снаряда
debuff: "burn", // "burn" - поджог, "chill" - обморожение, "poison" - яд и т.д.
// ВИЗУАЛЬНЫЙ ПАКЕТ: Спрайты во все 4 стороны изометрии (0-Вправо, 1-Вверх, 2-Влево, 3-Вниз)
sprites_idle: [spr_imp_twitch_idle_right, spr_imp_twitch_idle_up, spr_imp_twitch_idle_left, spr_imp_twitch_idle_down], // Покой
sprites_walk: [spr_imp_twitch_walk_right, spr_imp_twitch_walk_up, spr_imp_twitch_walk_left, spr_imp_twitch_walk_down], // Патруль
sprites_atk: [spr_imp_twitch_attk_right, spr_imp_twitch_attk_up, spr_imp_twitch_attk_left, spr_imp_twitch_attk_down], // Атака/Каст
sprites_hurt: [spr_imp_twitch_hurt_right, spr_imp_twitch_hurt_up, spr_imp_twitch_hurt_left, spr_imp_twitch_hurt_down], // Боль от крита ГГ
sprites_dead: [spr_imp_twitch_dead_right, spr_imp_twitch_dead_up, spr_imp_twitch_dead_left, spr_imp_twitch_dead_down], // Смерть
// АУДИО-ИМПАКТ: Ссылки на звуковые ассеты
snd_aggro: noone, // Рык при обнаружении ГГ
snd_hurt: noone, // Крик боли при получении крита ГГ
snd_death: noone, // Предсмертный хрип
snd_norm: noone, // Ленивые технические звуки в патруле
// ДИСТАНЦИЯ ОБНАРУЖЕНИЯ ГГ
aggro_dist: 150, // Радиус зрения моба, при котором он срывается в погоню
chase_dist_max: 200,
// НАГРАДА ЛУТА
loot_prok: "trash", // Строковый ярлык тира лута для скрипта ("trash", "warrior", "boss")
xp: 25, // Опыт, честно передаваемый функцию scr_player_add_xp
gold: 15 // Количество золота, которое насыпается в труп obj_corps при гибели
}
};
}
return global.monster_db[$ _monster_id];
}
Может кому понадобится для своих проектов, это шаблон базы данных для мобов в Game Maker! Удобно, не приходится городить десятки объектов достаточно одного родителя, и спавнера.


ПРИМЕР
Боевые дебаффы (Дневник разработки Silent Throne v.0.13.5)
Всем привет, народ! Делюсь свежими новостями с полей разработки моего хардкорного пиксельного слэшера Silent Throne.
На этой неделе я плотно засел за переработку боевого баланса и эффектов. Задумка брутальная: в игре есть 6 стихийных категорий магии и ресурсов (Токсины, Преисподняя, Склеп, Высшая магия, Скалы и Сталь). В каждой из них — по 3 жестких проклятия для игрока и по 3 усиления для монстров. Итого 36 уникальных механик, которые должны работать одновременно и без сбоев.
Но на этапе тестов логика эффектов сломалась. Прихожу я в проект, запускаю билд, и меня встречает картина маслом: Главный Герой при получении обычного отравления начинает уродливо и ядовито мерцать зелёным цветом, как неоновый огурчик на дискотеке! Как оказалось, старый алгоритм наглухо перекрашивал сам спрайт персонажа, а из-за кривой настройки условий все остальные эффекты (вроде поджога или кровотечения) просто отключались графически, пока яд полностью не выйдет из крови. Вдобавок урон отравления просчитывался дважды, мгновенно сжигая полоску здоровья.
Что было сделано:
Мы устроили глобальную чистку боевого движка и ввели железное правило: спрайт героя всегда остаётся чистым, сохраняя свои оригинальные цвета, детали и пиксель-арт, а весь хардкор передаётся параллельно и строго через сочные шлейфы частиц у ног или над головой!
Все визуальные баги исправлены, а тактические ограничения теперь работают на полную мощность:
Подрезали сухожилия? Пробел намертво отключается на входе. Тактический кувырок заблокирован.
Поймал «Сало» от магов? Горячие клавиши заклинаний на панели быстрого доступа полностью блокируются, запрещая любые касты.
Наложили «Проклятие Бессилия»? Исходящий физический урон героя режется ровно на 40% во всех боевых формулах.
Попал под кислоту? Входящий урон по Танку увеличивается на 20% прямо перед тем, как удар примут на себя каменные щиты.
Поймал корни? Ноги намертво привязываются к точке спавна ловушки, полностью блокируя ходьбу.
А «Рваная рана» теперь наказывает за панику: если ты стоишь на месте, кровотечение наносит стандартный урон, но стоит побежать — урон мгновенно удваивается!
Кроме того, мы докрутили архитектуру главного меню. Теперь на заднем плане без просадок производительности крутится кинематографичный зацикленный синематик с костром и туманом в стиле Ведьмака, который автоматически сжимается под разрешение экрана и использует наш русский пиксельный шрифт.
Боевая матрица наконец-то собрана в один стальной кулак. Как вам такие механики ограничений? Получили бы леща от местных Скелетов-воинов с такими штрафами? Пишите в комментариях!
Очередной кусочек разработки Silent Throne
Потихоньку двигаю проект дальше: допиливаю механику, настраиваю эффекты, собираю систему навыков и стараюсь привести всё к более цельному виду. На видео как раз видно, как игра постепенно обрастает деталями и начинает выглядеть уже не как набор отдельных фич, а как что-то цельное.
Это, по сути, мой дневник разработки — без лишнего пафоса, просто честный показ того, как идёт работа над игрой.
Понимаю, что со стороны это может выглядеть как “ну да, снова ковыряние в коде”, но для меня это важный этап: здесь как раз и рождается основа всей игры.
Буду рад, если вам интересно следить за прогрессом.
Если есть мысли, советы или просто хочется что-то подсказать — пишите, всегда интересно почитать мнение со стороны.
В этом видео показываю, как двигается проект: доделываю механику, навешиваю эффекты, собираю систему навыков и постепенно привожу всё к более цельному виду.
Это не просто демонстрация, а именно дневник разработчика — без лишнего пафоса, просто честный прогресс по игре.
Буду рад, если это вам интересно.
Дневник разработки Silent Throne (v0.13.4)
Привет, Пикабу! На связи соло-разработчик хардкорного 2D-слэшера Silent Throne. Последние недели моя жизнь напоминала симулятор бешеного кодера, но сегодня я наконец-то могу сказать: «Ура, оно работает сполна!»
Я полностью закончил Книгу Навыков главного героя и, кажется, изобрёл идеальный велосипед для обработки боевых состояний.
🟥 Что было сделано (или как не сойти с ума от switch-case):
Изначально в игре была только базовая ветка Силы (привет любителям помахать двуручником). Но в планах стоял монолит из 4 веток прокачки: Сила, Интеллект, Выносливость и Живучесть. По 12 навыков в каждой!
Главная боль инди-разработчика на этом этапе — превратить кодовую базу в кашу. Чтобы этого не произошло, я применил жесткую изоляцию:
Кастеры на бегу: Магия Интеллекта («Огненные шары», прыгающие молнии) работает как Instant Cast. Скрипты автономны — они рождают снаряды, списывают ману, а персонаж остаётся в дефолтном стейте движения. Маг может бежать и спамить.
Берсерки в стойках: Физические комбо Выносливости («Двойной выпад», «Град клинков») жестко фиксируют тело героя. Под них написаны выделенные скрипты-состояния (STATES), которые намертво обрубают WASD-ходьбу, выжимают скорость анимации на 200% и наносят урон строго по кадрам взмаха меча.
🩸 Ультимативный костыль, которым я горжусь
Когда я написал ультимейты Танка («Каменный щит» и «Бастион бессмертия»), возникла проблема. Вся математика урона прописана на стороне скриптов мобов. Переписывать ИИ каждого зомби, чтобы он проверял наличие щита на герое, — это путь к депрессии.
Я написал квантовый перехватчик урона на стороне игрока. Он стоит на самой первой строчке покадрового Step-ивента героя.
Как это работает: если мобы нанесли урон на текущем кадре, игрок ловит дельту здоровья, на микросекунду откатывает здоровье назад, пропускает урон через прочность Каменного щита (или обнуляет Бастионом) и заносит уже порезанный остаток. Раздел проверки смерти получает честный урон, а код мобов остался девственно чистым.
🧟♂️ Бестиарий получил зубы
Чтобы игра не превратилась в избиение младенцев, я распределил всех запланированных монстров (от Гоблинов до будущих Вампиров и Орков) по 6 автономным группам: Crypt, Magic, Rocks, Steel, Toxic, Underworld.
Каждая группа получила по 3 автономных баффа и 3 дебаффа. Теперь Некроманты умеют вешать на героя «Печать безмолвия» (Сало), которая намертво блокирует хотбар магии, а призраки накладывают «Леденящий ужас», замедляя откат скиллов в два раза.
Сейчас я ушёл на генеральные тесты в катакомбы — проверять, как это всё синергирует между собой. Дальше на очереди — вывод тикающих иконок баффов на HUD и прописка полноценных квестовых цепочек.
Буду рад фидбеку и советам в комментариях! Как вам идея с откатом урона для просчёта щитов?
Silent Throne: большой апдейт навыков и мастерства
Всем привет!
Очередной апдейт по Silent Throne — и да, игра снова обросла системами, как будто я специально решил проверить, когда код начнёт смотреть на меня с осуждением.
На этот раз хорошо так прокачал сразу несколько вещей:
переработал дерево навыков;
добавил мастерство и очки навыков;
сделал экипировку пассивок и активок по слотам;
ввёл сюжетные блокировки для части умений;
доработал торговлю и логику торговцев;
расширил боевые эффекты;
связал квесты, журнал и прогрессию в одну более вменяемую систему.
Самое приятное — игра наконец-то начинает ощущаться не как “набор интересных идей в одном архиве”, а как нормальная RPG, где всё связано между собой.
Хочешь сильный билд — думай, что качаешь.
Хочешь крутую способность — сначала заслужи.
Хочешь магический щит — сначала разберись с сюжетом. Ну и всё в таком духе.
Отдельно порадовало, как начали выглядеть боевые эффекты. Теперь удары, вихри, ауры и прочие красивые спецэффекты не просто “есть”, а реально добавляют ощущение, что в руках у игрока что-то опасное, а не палка с хорошим настроением.
Короче, Silent Throne медленно, но уверенно перестаёт быть “черновиком, который стыдно показывать” и всё больше похож на настоящую игру.
А это, как мне кажется, уже маленькая победа.
Silent Throne "Безмолвный трон"
Давненько не было вестей из полей разработки моего пиксельного Action-RPG слэшера Silent Throne. Буду честен: разработка затягивается. Последние недели я провёл в самом настоящем программистском аду, перерабатывая под корень систему квестов и диалогов.
Делюсь болью и тем, к чему в итоге пришёл.
Как было (и почему это сдохло)
Изначально диалоги я писал на коленке, используя громоздкие массивы и конструкторы. Всё это завязывалось на динамические инжекторы, которые пытались подменять текст кнопок прямо на лету (например, менять кнопку «У тебя есть работа?» на «Я убил Некроманта!», когда триггер квеста переключался в памяти).
Итог — классический капкан синтаксиса и Scope-баги (области видимости) в GameMaker. Стоило добавить NPC одну новую реплику, как вся игра ломалась как карточный домик: индексы съезжали, квесты зависали намертво в состоянии 0/1, а прямоугольные кнопки интерфейса сжимали длинный текст в нечитаемую кашу.
В общем, я понял, что динамические костыли — это тупик, выпил кофейку и решил переписать всё с чистого листа.
Я оставил старую, уже отлаженную квестовую систему в покое, но полностью перестроил архитектуру общения с NPC. (НО И СИСТЕМУ КВЕСТОВ ПОЗЖЕ ТОЖЕ ПЕРЕДЕЛАЮ).
Теперь система диалогов построена на статичных switch-case блоках и уникальных текстовых ID-ключах вместо цифр.
И в итоге я придумал название игры! Silent Throne "Безмолвный трон"





