Як я робив мод на Dark Souls Remastered ⚔️
Я великий фанат ігор FromSoftware, а конкретно серії Dark Souls (так, так, навіть другої частини). В певний момент я зацікавився стримерами, що роблять нестандартні проходження цієї серії ігор. Одним з таких був LilAggy і його проходження з модом, на випадкову зміну зброї у персонажа кожні кілька секунд
Пройшло кілька років, я сам почав стрімити і мені захотілося повторити цей забіг. І хоча на Nexus Mods таки мод був присутній, для моїх потреб він не підходив. На щастя, автор моду зробив його open-source і дав згоду на переробку. Тож не довго думаючи, я почав свою подорож у всесвіт модінгу. Як то було - розповідаю нижче
З чим довелося працювати 🧐
Першою перешкодою на шляху стало те, що оригінальний мод був написаний на Visual Basic. І хоча мої пізнання у .Net були великі, я не мав часу вчитися новій мові програмування
Тож знайшовши спосіб конвертувати все до C# та після виправлення помилок, я отримав на руки повноцінно працюючий C# проєкт, який почав модифікувати
На жаль, його функціонал був абсолютно рудиментарний:
- Зброя змінювалася тільки у правій руці;
- Жодного натяку на рівні прокачки зброї;
- Можливість відфільтрувати тільки по каталізаторам, ближньому бою та дальньому бою;
- Баги аж до вильотів моду та/або гри. Якщо спростити, то мод взагалі не намагався вирішити проблему, а просто крашився при найменшій незручності для своєї роботи.

Проте він мав 2 величезні плюси:
- Підготований шаблон під мої задуми, який крім всього іншого міг зберігати налаштування гравця;
- Базова логіка для читання та запису у пам’ять гри (якось за 6,5 років кар’єри програміста мені не доводилося такого робити ¯\_(ツ)_/¯)
То чого ж хочеться МЕНІ⁉️
Наступним логічним кроком стало визначення того, що саме я хочу бачити у цьому моді. Вийшло наступне:
- Можливість налаштувати, в якій руці змінюється зброя, ну або в обох руках;
- Рівні прокачки: дати змогу якимось чином змінювати зброю в руках персонажа на вже прокачану; При чому хотілося як дати змогу відстежувати рівень прокачки гравцем (WeaponMemory, пояснено нижче), так і якісь цікаві варіанти типу рандомного рівня;
- Сортування по класам: дати змогу гравцеві виключити з переліку зброї ті класи, що він не хоче використовувати;
- Зберегти функціонал збереження даних;
- Покращити стабільність.
Окресливши предметну область, я почав втілювати це у життя :)

Знаю, знаю - мої навички ̶ф̶о̶т̶о̶ш̶о̶п̶у̶ Paint 3D просто космічні, не заздріть 😅
У пошуках даних 🪙🏴☠️
Я давно знав про наявність таблиць для Cheat Engine до Dark Souls Remastered, величезних онлайн-екселів зі всіма мислимими та немислимими статами зброї і багато якої ще інформації, яку накопали датамайнери і використовувати можуть тільки найбільш прожжені хардкорщики. Чого я не знав, так те що знайти таблицю з ID кожної зброї з урахуванням рівня прокачи та закалки просто неможливоТочніше я знайшов один такий ексель, який, я майже на 100% впевнений, мав необхідну інформацію. Але його автори не проявили бажання співпрацювати тож довелося створювати милиці 🙂
Chat GPT мені у цьому питанні також не допоміг. Він як зазвичай вирішив галюцінувати замість робити роботу 🫠

Зібравши інфу з файлів оригінального моду та з тієї самої таблиці назви зброї з рвінями прокачки (але без ID) я отримав наступне:
- Перелік усіх (або ні, я не перевіряв) видів зброї + ID та клас (кинджал, молот, спис) з урахуванням закалки: кинджал, блискавичний кинджал, грубий кинжал тощо;
- Перелік усіх видів зброї з урахуванням рівня прокачки та закалки: Кинджал, Кинджал + 1, Кинджал +2 і тд.
Поєднання цієї інформації дало мені змогу отримати максимальний і мінімальний рівень зброї для кожної закалки, що дасть змогу спавнити гравцеві вже прокачану зброю. А також клас зброї, що дасть змогу налаштувати сортування. Проте “Кинджал +1” і “Кинджал + 2” це два різні предмети, кожен зі своїм ID. Поки що на руках я маю лише ID для простого "Кинджал" (без прокачки). У цей момент я почав експериментувати, щоб знайти закономірність між ID зброї та рівнем прокачки

Для цього було використано Cheat Engine, таблицю для Dark Souls Remastered з Nexus Mods та трішки часу. Методологія була проста:
- заспавнив зброю +0;
- записав ID;
- заспавнив зброю +1;
- записав ID;
- заспавнив зброю +2;
- записа ID;
- побачив закономірність;
- спробував самотужки записати ID для +5;
- все вийшло;
- Great Success!

*зауважте українізатор - він також включає озвучку що звісно повний відвал башки *
Ну і останній шматочок пазлу, якого мені не вистачало це адреса у пам’яті для лівої руки та так званої WeaponMemory - значення у файлі збереження, що вказує на максимальний рівень прокачки зброї що гравець будь-коли мав у інвенторі. Це значення мені знадобиться для того, щоб власне відстежувати прогрес гравця і видавати йому відповідну зброю
Для пошуку цих значень я також використав Cheat Engine - а саме “код” таблиць. Це скоріше просто скрипт на чомусь типу Lua, але я не впевнений. Головне що мене там цікавило так це базові значення, з яких цей скрипт починає шукати дані у пам’яті гри та офсети, тобто на скільки ці базові значення треба зсунути щоб отримати секцію пам’яті з моєю інформацією. Також корисно знати розмір даних, що необхідно прочитати

Залишилося всю цю інформацію поєднати до купи, оформити в щось робоче і затестити!
То що, вийшло ⁉️
Вийшло майже бомбічно-ідеально!

Є кілька багів, на які варто звернути увагу. Наприклад, при використанні Естусу (лікування) міцність зброї у правій руці зменшується на кількість відновлених очок здоров’я. Через це зброя ламається посередині битви з босом. Той самий ефект має Людскість та Метальні ножі (?!)

Крім того, вже після розробки я знайшов бібліотеку, яка теоретично має мені спростити роботу з пам’яттю гри і надати можливість поглибити функціонал
Але то можливо якось потім, коли буде час 🙃
Весь той функціонал, що я хотів - я маю і це головне!
**Дисклеймер** Заходячи на мій канал ви автоматично даєте згоду на отримання величезної дози крінжі Повернення не приймаються Робіть на свій власний острах та ризик 😅🤣
Відповісти
Супер крутий пост, дякую. Прочитав і кайфанув 😍
Відповісти
Дякую🤗 Ледь стримався щоб не передушнити 😅😅
Відповісти