RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2426006 views

Последний из Гаяр Moderator 19.01.2020 07:57 (6 years ago)

Poganec37,
Есть opengame, savegame и addqst. Можно использовать сохранение игры

Чтобы сделать дальнейший шаг, надо понять, как эта система работает. Например, я хочу в первой части игры написать персонажа. Потом в других частях о нем будут упоминать НПС. Что-то похожее. Я посмотрел теорию и мне не понятно, как система сохранений работает.

Aleks Versus Moderator 19.01.2020 16:11 (6 years ago)

Poganec37,
сохранения работают просто. Плеер сохраняет ТЕКУЩЕЕ состояние игры в момент сохранения. Это значит, что сохраняются значения всех переменных, значения передаваемые функциями и прочее, в том числе состояния окон (не расположение, только содержимое). Так же в файле сохранения прописывается хэш-сумма игры.

Если ты попытаешься открыть сохранение одной игры в другой, плеер сравнит хэш-суммы: игры и в файле сохранения, — увидит, что они разные, и не даст загрузить состояние. Чтобы этого избежать, в каждой игре нужно прописать:

debug=1

Далее, когда станет возможным использовать сохранения от других игр в новой, нужно взять логику механизма чекпойнтов и допилить до собственных нужд.

Dark[Ol(U23)leneri] #34 20.01.2020 08:55 (6 years ago)

В справке все достаточно хорошо расписано. Если все ещё сложно, можете скачать старые игры с сейвами.

Poganec37,
особо не разбирался и не тестировал, сам все проверишь, если тебе это необходимо.
Из всего вышесказанного товарищами получается что SAVEGAME - это команда для сохранения игры. Но так как оно сохраняет даже окно и текст, то надо сделать следующее:
1. В части игры, в момент ее завершения пишешь локацию завершения, к примеру, endloc типа

SHOWSTAT 0
SHOWOBJS 0
SHOWINPUT 0
DEBUG = 1

'Часть вторая'

act 'Начать игру':
SAVEGAME 'part2.sav'
gt 'nextloc'
end

В локации nextloc напишешь что-то типа продолжение еще не готово или инструкцию, какой файл нужно открыть плеером.
2. В игре-продолжении на стартовой локации предлагаешь либо начать с дефолтными условиями либо загрузить файл part2.sav из предыдущей версии и пишешь DEBUG = 1. Так же создаешь копию локации endloc:

'Часть вторая'

act 'Начать игру':
gt 'nextloc'
end

где nextloc будет стартовой локацией второй части.
Предварительно, выписываешь все ключевые переменные, от которых будет зависеть сюжет, и пишешь развилки в зависимости от их значения.
Т.е., если ты хочешь, как МЕ, то у тебя будет переменная, отвечающая за жизнь персонажа lifepers, если жив =0, если умер =1. В новой части пишешь условие:

if lifepers=0:
'Этот персонаж живет припеваючи'
else
'Этого персонажа сбила машина и он похоронен на местном кладбище.'

Это теория, на практике не проверено.

Вопрос к специалистам.
Товарищ mkir в своем проекте добавляет монстров в битву при помощи локации, в которой расписаны все характеристики всех монстров, но выбираются они по условию, которым является имя монстра. Поэтому, перед каждым боем эта локация перечитывается. Если взять 20 монстров и 30 характеристик, получим 600 строк.
Когда я делаю что-то подобное, я создаю массив на монстров и на каждую их характеристику и все это объединяю через индекс, локацию инициализирую один раз за всю игру, а потом путем поиска по массиву имен нахожу нужный индекс, а по индексу все остальные значения.
С точки зрения игры, в памяти будет находится одинаковое количество переменных в обоих случаях, но т.к. во втором случае это массивы, то значений получится больше. Суть вопроса - какой метод наиболее предпочтительнее использовать и почему?
Понятно, что при текущих аппаратных мощностях оба варианта будут срабатывать мгновенно, но все же.

Dark[Ol(U23)leneri] #34 22.01.2020 11:49 (6 years ago)

Любой. я однажды всю игру сделал в одной локации через замену переменной для отображения текста, а в другой раз всю игру засунул в 140 символов, которые прокручивали голосовые записи.

Коротко: это конкретно ваше дело как написать игру. Даже если кто-то и полезет в код, вам будет глубоко до фени, что он о нем думает.

Пространственно: имеет значение только назначение кода. Если вам нужно сделать условную боевку с парой монстров, можно и банальным выбором правильных вариантов обойтись.
С десятком - можно и ранд на проброс кубиков сделать все также лениво прописывая каждого монстра.
С сотнями - можно сделать одну локу для всех монстров и саммонить их по названию, либо зафигачить один массив для этого дерьма.
С десятками тысяч эволюционирующих и размножающихся прихвостней, живущих своей жизнью и имеющих имена - можно для них несколько разных механизмов выделить. Но на… Зачем

Aleks Versus Moderator 22.01.2020 14:26 (6 years ago)

dmvikar,
Каждая переменная в qsp - это массив. Всего можно использовать 12800 имён переменных/массивов одновременно. Вот отсюда и надо думать, что правильнее.

Aleks Versus,
Я это знаю, вопрос то не про это, а больше про железячный момент. Возьмем аналог моего примера, но объем данных будет измеряться гигабайтами. Что выгоднее, хранить эти данные в памяти, либо каждый раз перечитывать из локации?

Последний из Гаяр Moderator 23.01.2020 12:31 (6 years ago)

dmvikar,
Ну там есть ограничения, насколько я знаю. По производительности попробуй погонять Истребление, там ДеГросс что-то про лимиты писал

Последний из Гаяр,
Да ну нет же!) Наверно, я как-то не так объясняю. Мне интересен процесс обработки кода в принципе, а не конкретно qsp. Потому как для qsp 600 строк и 30 переменных это ничто и обрабатываются они незаметно для пользователя. Проблемы начинаются после 4 миллионов или 40-ка, я уже точно не помню. Ну да ладно, вопрос не столь важный, т.к. предела ресурсов достигать не предполагается.

Последний из Гаяр Moderator 23.01.2020 15:01 (6 years ago)

dmvikar,
Конкретно, насколько я помню, писал ДеГросс, что корректно обрабатываются только 50 действующих нпс, а так вроде до 300 субъектов, это Svartberg вроде писал, в теме Sanctuary[разработка], а также мой личный опыт, что нормально и достаточно быстро обрабатывает таблицу на 740 ячеек, хотя, ну может это моё железо, ваше покажет больше.

Последний из Гаяр Moderator 23.01.2020 15:02 (6 years ago)

Попробуй также поковырять North Homestead, но тут тоже не могу ничего сказать. Всё зависит ещё от твоего движка и от комплексности обрабатываемых тобой массивов.

обычно до 10 действующих лиц делают в играх

Aleks Versus Moderator 24.01.2020 08:03 (6 years ago)

dmvikar,
QSP будет отъедать оперативку по мере того, как заполняются переменные/массивы, насколько я понимаю. Неважно, будут это именно отдельные переменные или ячейки массива, данным нужно где-то храниться. Само собой лучше бы неиспользуемые данные прописать в виде кода на локации (сделать базу), а уже потом тем или иным образом выдёргивать в массивы/переменные. Однако, evp говорил (кажется), что и сама игра на момент выполнения вся лежит в оперативке.

Если вопрос о том, где легче осуществлять поиск, в переменных, массивах, или по текстовому значению отдельной переменной, всё зависит от задачи. Я знаю, что даже arrpos для массива в 100 тыс элементов заметно подвешивает игру, большой объём HTML-разметки подвешивает игру. Приходится либо практически устанавливать пределы возможностей QSP, и уже отсюда решать задачи, либо лезть в исходный код и искать пределы в конкретной реализации.

Log in or Register to post comments.