Використання ChatGPT в текстовій ролевій грі

ChatGPT, Copliot, Gemini, LLama та багато інших. Ми перебуваємо у точці, коли ШІ перестав бути якоюсь фантастикою і «чимось десь там», а переріс у форму, яку можна активно використовувати у повсякденному житті: як для роботи, так і для побутових справ. У той же час, відношення між іграми та ШІ досить... ніякі? В інтернеті можна знайти цікаві модифікації для ігор, які активно експериментують з цим, проте, «великі гравці» здається чи то скептично, чи то обережно налаштовані до таких інновацій.

Так як я не «великий гравець», не геймдев, а просто людина, якій стало цікаво «а що якщо», то розкажу вам історію моєї спроби подружити текстові RPG, ChatGPT, Dalle-3 і свою фантазію. Якщо ви маєте досвід роботи з цим всім, то, ймовірно, взагалі ніякого технічного одкровення в цьому блозі не знайдете, а тільки мою невелику історію.

Вступ

У стародавні часи, коли трава була зеленіша, моїм хобі була розробка модифікацій (вони ж «карти») для WarCraft 3 (олди, підняти щити!). Та і в цілому геймдев мені цікавий як тема, а фентезі як сетінг. Тому текстова рольова чат гра, так.
Після декількох тестів ChatGPT3 в ролі «game master», базове підтвердження, що, дуже теоретично, він з цим справитись може (ох, свята моя наївність), рішення про початок розробки було прийняте і відразу відкладене в далекий ящик через наявні проблеми іншого характеру. A few not moments, but months later, в одні жаркі вихідні, я все таки сів за ноут.

Встановлюю я, значить, UE5... а, стоп, ні, все було не так.

Технології

Потрібно писати, на тому, що вмієш, і ще щоб зручно було. А я веб розробник. Тому, платформою для гри я, раптово, вибрав... Telegram. Це дає свої обмеження, але, також, надає необхідні мені базу: відсутність необхідності писати html/css/js, малювати кнопочни та всі інші історії, натомість надає мені текстовий чат та, по суті, умовний, frontend і базу користувачів.

На бекенді все досить просто — свіжий php в Symfony, mysql та redis обернуті Docker на майже самому дешевому сервері DigitalOcean. Ніяких складних штук чи балансингу, через відсутність навантаження, але з можливістю прикрутити все це «колись» шляхом слою абстракцій.

По ШІ — ChatGPT був обраний, бо я його використовую кожен день і він для мене синонім ШІ, а OpenAI має API, в якому підтримується як ChatGPT, так і Dall-E.

Почнемо пригоду


Після війни з всіма технологіями описаними раніше, бо написані колись boilerplates для швидкого підняття сервісів нещадно встигли постаріти й піти на пенсію, прикручення ssl (інакше телеграм не буде слати тобі нотифікації з боту) та, насамперед, генерації всіх API ключів ми готові почати пригоду.

Відразу було прийнято рішення підтримки двох мов: англійської та, української. Тому на скриншотах ви будете бачити останню, проте, деякі місця все ще не перекладені по тим чи іншим причинам, тому прошу зрозуміти й пробачити 🙂

Концепт був (та і є) досить простим: у гравця є герой, у героя є прогресія, прогресія отримується через квести, квести генерує ChatGPT і надає варіанти дій, які обирає гравець. Герой має свої характеристики, вміння, може померти і так далі. Герой помер — створи нового (або воскреси через базу даних 😀). Звучить надійно, класно, нумо робити.

Перші кроки...


Перше й логічне, що потрібно було зробити, це створення персонажу. Щоб не придумувати концепт велосипеду, за фундамент було взято все те, що я знаю про ролеву систему Dungeons & Dragons. А знаю я досить мало, тільки те, що бачив у іграх, тому якщо тут є експерти, не бийте, я признаю провину заздалегідь! Ніякого ШІ тут не задіяно, і створення дуже просте: кажете ім’я, вибираєте клас з доступних, йому даються якісь предмети і характеристики, і поїхали до пригод.

Також швидко була створена таблиця з Топ 20 героїв по пройденим квестам, щоб було якесь відчуття змагань і мультиплеєру, та інші технічні розділи «головного меню». Здавалося б, летимо на крилах успіх до готового концепту.

... і перші проблеми

Хто в курсі, буде сміятись, а хто ні, то може зрозуміє мій подив, але контекст розмови, тобто, весь чат з ChatGPT треба зберігати самому і кожен раз слати його при запиті. В даний момент це здається мені абсолютно логічним і правильним, але на початку, коли кожен квест починався спочатку після першої ж відповіді, я дуже довго шукав на кшталт continueChat в документації OpenAI (що логічно, ,бо якщо є метод create, який я роблю, то мав би бути і continue) 😂.

Перший концепт передбачав що для кожного етапу квесту буде ще й генеруватись картинка через DALL-E3. Звучить досить круто, що ж могло піти не так? Насправді 2 дуже очевидні і критичні речі:
1. Час
Кожна з картинок у варіації 1 і найменшій роздільній здатності генерувалась як мінімум секунд 5-8. Точних замірів я не робив, бо вони тут не цікаві, тут цікаво відчуття роздратування «а шо так довго там», бо до цих 5 секунд ще потрібно додати маршрут самого запиту, генерацію тексту, відправку повідомлення в телеграм, записи чи читання з БД і так далі, і тому подібне.
2. Гроші
Кожен запит до OpenAI вартує грошей. Саме тому, наприклад, був обраний ChatGPT3.5 Turbo, а не 4о (перший в рази дешевше). Dall-E2 давав погані результати зображення (на рівні «та краще вже взагалі без картинок»), тоді як Dall-E3 генерує прямо фантастичні зображення, але й цифри в розділі Billing почали стрімко рости.

Було прийнято компромісне рішення: генерувати тільки картинку на старті квесту і по можливості її «кешувати», шляхом збереження на сервер і подальшого перезаливу на хостинг. Приймаючи це рішення я взяв до уваги наступні речі:
а) взагалі без картинок текст, навіть розбавлений смайлами, сильніше втомлює
б) при клікі на «Почати пригоду», відчувається більш логічним і доречним очікування гравцем, аніж просто при виборі варіанту дій. «А, ну там генерується мені квест прямо зараз, можна трішки зачекати». Особливо якщо написати йому щось на кшталт:

ChatGPT захопить світ ...але не сьогодні

Картинки генеруються, текста теж. Варіанти дій надаються, нажимаються, історія продовжується. Здавалося б — готово, можемо завершити статтю і йти пити чай, каву, пиво чи вино. Але тут стає головне «але»: все це робилось на сам перед для «себе» і має працювати добре. Те, що ChatGPT уміє генерувати текст, інша ШІ — картинки, а телеграм це відображати та малювати кнопки й так було всім зрозуміло.

Після декількох тестів ще раз підтвердилась банальна річ: якщо тобі щось «очевидно» і це буде зрозуміло твоєму умовному колезі, то ChatGPT це ні краплі не очевидно, поки ти йому нормально тезісно це не розпишеш. Він генерував все дуже рандомно і інколи взагалі не так, як би тобі цього хотілось. Все через «розпливчасті» формулювання з мої сторони які він кожен раз міг інтерпретувати по різному. Тому багато чого прийшлось переписати й перефразувати.
Технічно почало все працювати в більшості випадків як треба, але тут стала очевидною нова проблема:
Нудно, аж за край.

Текстові рольові ігри в цілому штука не «для всіх», але якщо ще й текст «ні про що», то взагалі. Ще й часто квест «ходив по колу», не хотів закінчуватись і нічого цікавого не відбувалось.
Було прийняте рішення відібрати права у ChatGPT на задання експозиції й робити це самому, а також ліміт на етапи квесту. Я написав пару квестів з описом в стилі «герой в лісі йшов, грибочок знайшов, а грибочок не простий, а говіркий» і розмножено через сам же ChatGPT 4о.

Що могло піти не так? 🙂
Читайте пару абзаців тому про «очевидність». Якщо у моїй голові грибочок був магічним і з ним був пов’язаний квест, то у ChatGPT від грибочка можна було піти вліво, оминути його і повернутись до попередньої версії квестової системи з ходіннями по кругу й якимись випадковими подіями, часто навіть не пов’язаними одна з одною.
Але якийсь прогрес був. Шаблон квестів розширився і додалось, крім опису який вже був, його фінали до яких треба було вести та навіть опис NPC.

Тепер же все стало краще?

І так, і ні. Все ще можна було піти «наліво» і оминути квест і піти з феями танцювати у склепі таємного дракона, міняючи свій клас на арканомага лівої п’ятки. Але основна проблема була навіть не у цьому, а у тому, що ChatGPT не умів тримати секрети.

Наприклад, квест з умовним описом «ти прийшов у таверну, а там дивний чоловік. Ти з ним говориш, а він бах, і виявляється демоном і хоче зіграти з тобою у гру на твою душу» (звичайно текст там не такий, але давайте спрощено).
Що розказує нам ChatGPT у першому ж повідомленні? «Ваш герой Доу, приходить в таверну і зустрічає дивного чоловіка, який є древнім демоном». Занавіс.

І змінюю опис на: «ти прийшов у таверну, а там дивний чоловік. Ти з ним говориш, а він бах, і виявляється демоном (але це великий секрет, не кажи це гравцю, ніхто про це не знає) і хоче зіграти з тобою у гру на твою душу». ChatGPT: «Ваш герой Доу, приходить в таверну і зустрічає дивного чоловіка, який є древнім демоном, але це секрет про який ніхто не знає». 😂

Всі мої спроби завадити йому щось розказувати працювали з перемінним успіхом, через знову ж «різні інтерпретації». Після вечору роздумів «а що з цим взагалі робити», прийшла в голову проста, але (спойлер) дієва ідея: «домовитись про форматування». Тепер весь текст, якщо він обрамлений фігурними дужками, це {секретна інформація}.

Напевно, ви вже готові до мого класичного питання «що могло піти не так? 🙂».
Та все дуже просто — він взагалі перестав розказувати інформацію, яку я позначив як секретна. Говори ти з цим чоловіком і таверні хоч весь квест, він тільки буде натякати, що він не простий чолов’яга, але секрету свого не видасть. І так, мені прийшлось пояснювати, що секретна інформація, вона то секретна, але не настільки секретна, щоб її ніколи не розказувати.

Фінал {насправді ні}

Оскільки вже написано дуже багато тексту і не має впевненості, що він буде комусь цікавий, я поділю цей блог на дві частини. Якщо хтось буде зацікавлений, то я розкажу про другу стадію розробки, в якій розкажу «як СhatGPT квести не завершав», «як герой раптово вмирав», «як через низьку витривалість герой по сходинкам не міг піднятись» і як «клас, навички та атрибути персонажа почали впливати на хід квестів» та багато інших проблем та смішних ситуацій.

Всім дуже дякую, хто дочитав до кінця.
Бережіть себе та своїх близьких!

Підписуйтеся на Telegram-канал @gamedev_dou, щоб не пропустити найважливіші статті і новини про геймдев

👍ПодобаєтьсяСподобалось12
До обраногоВ обраному4
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Якщо ви не змогли отримати бажану відповідь від Чату — значить треба ще модифікувати промпт. Це роблять рідко, але можна чат попросити створити детальний промпт під певну задачу, хоча особисто мені подобається claude для “креативних задач”.

Ось приклад сгенерованого промпта від Клода під квест в таверні. Перевірив як він працює, Клод гарний текст дає, Чат зайву портянку написав (що можна обмежити задавши формат відповіді):

You are an AI game master tasked with leading a player through an interactive fantasy quest. Your role is to create an immersive narrative experience, describe scenes vividly, present choices to the player, and respond dynamically to their decisions. Follow these guidelines:

1. Setting:
— The quest begins in a tavern.
— Describe the tavern’s atmosphere, patrons, and any notable features.

2. Characters:
— Introduce a mysterious man in the tavern.
— Do not reveal his true nature (a demon) to the player initially.

3. Interaction:
— Allow the player to interact with the mysterious man through dialogue choices.
— Gradually build tension and intrigue in the conversation.

4. Plot twist:
— At an appropriate moment, reveal that the man transforms into a demonic entity.
— Describe the transformation and its effect on the surroundings.

5. The game:
— The demon challenges the player to a game.
— Do not explicitly state that the player’s soul is at stake.
— Present the game as a high-stakes challenge with unspecified consequences.

6. Game mechanics:
— Create a simple but engaging game for the player to participate in.
— Provide clear rules and options for the player.

7. Narrative progression:
— Adapt the story based on the player’s choices and game outcome.
— Offer multiple possible endings depending on the player’s decisions and success in the game.

8. Atmosphere:
— Maintain a sense of mystery, danger, and supernatural elements throughout the quest.
— Use descriptive language to evoke emotions and create vivid imagery.

9. Player agency:
— Offer meaningful choices that affect the story’s progression.
— Respond to player inquiries and actions in a way that maintains immersion.

10. Pacing:
— Balance dialogue, description, and action to keep the player engaged.
— Build tension gradually towards the climax of the demon’s revelation and game challenge.

Remember to keep the true stakes of the game (the player’s soul) a secret. Present the quest as an mysterious encounter that evolves into a supernatural challenge. Adapt your responses based on the player’s actions and decisions to create a personalized and engaging narrative experience.

Я пробовал с моделями для генерации взрослого контента, они без ограничений и если уйти от взрослого контента в область воображения, они разгоняются и могут генерировать достаточно интересные ситуации. РПГ это ведь не про грибочки.

Цікаво, але я поки не натикався на якісь обмеження в тому, що генерував.
Але і жесть якусь не пробував вставляти

РПГ это ведь не про грибочки.

Ну взагалі...

Багато в яких рпг є грибні монстри
Багато в яких рпг є алхімія чи просто можливість накидатись, заради цікавих ефектів
Зрештою, іноді навіть є опції для гравця, пограти за гриби :)
Наприклад crateredland.blogspot.com/...​19/03/fungusfolk.html?m=1

Я так розумію що це спроба схитрувати і пошукать пригод в одну каску? :) Можливо це стане в нагоді:

drukarnia.com.ua/...​o-solo-rezhim-v-nri-Oflmm

Це про, гм, аналогові розробки в тому ж напрямку.

Успіхів! Тема цікава.

Я разок пробував якийсь «модний» емулятор ДМа на нейронці і... І радісно повернувся до перевірених часом варіантів :)

Більше як спроба створити щось на кшталт "Neverwinter Nights"/"Baldurs Gate" etc але в текстовому виді.

Цей текст читається значно цікавіше ніж той що чат жпт генерує )

Ти про текст в самих квестах, чи про блог? :D

Дякую
Писалось вручну :)

Це було супер цікаво і формат подачі інформації дуже сподобався. Це читати було весело, хоч і розумію що кожна така «весела ситуація» це біль, розчарування і години роздумів як з цим бути

Дякую :)
Не те що б прямо «біль», у мене відношення до цього простіше, адже це просто невеликий пет проект, який я почав якийсь час тому, бо мені самому було цікаво, наскільки прототип себе покаже. Як я й писав, було зрозуміло, що теоретично це все можливо, але на практикі «що воно буде»

На майбутнє, підкажіть, будь ласка, як в редакторі робити картинки embed, тобто зліва чи справа тексту, тому що ці пусті місця біля вертикальних скриншотів виглядають погано 😵‍💫

Підписатись на коментарі