Зазеркалье: как сбросить все изменения переменных?
У меня очень странный вопрос, надеюсь, что хоть объяснить смогу)
В общем, например, игрок попадает в какое-нибудь зазеркалье, из которого очень сложно выбраться. И вот он наконец, потратив уйму времени, сил и нервов - выбирается. Дальше он играет в обычном мире по обычным правилам, зарабатывает игровые деньги, продвигается по сюжетным квестам и т.д., и вдруг - ложится в какой-нибудь гостинце спать - и бац! попадает обратно в зазеркалье, и его ставят перед фактом, что он так и не выбрался оттуда и вся его жизнь после была всего лишь иллюзией. И вот если он все-таки сможет выбраться во второй раз, по-настоящему, то все его достижения произошедшие после первого “выхода” - сбрасываются как будто их и не было. То есть по сути речь идет о том, как сбросить все изменения переменных, все добавления и удаления obj, которые происходили после первого выхода? Возможно, речь идет о “сохранении” данных игры и последующей загрузке, однако одно изменение должно быть - т.е. игровой персонаж должен сознавать что с ним это не в первый раз и отсюда кое-какие действия появляются и возможности, и запись в дневнике, например, т.е. какие-то переменные после подобной загрузки все-таки меняются.
PS. Если совсем непонятно, что я хотел объяснить, может быть, кто смотрел фильмец - “1408”, там похожая ситуация есть)
mkir,
т.е. ты хочешь сделать нормальный мир, потом вбросить персонаж в зазеркалье, а потом снова вернуть в нормальный мир, где всё должно быть в точности так, как в первый раз?
Это одновременно и просто и трудоёмко. Тебе нужно написать локацию (назовём её локацией обнуления), в которой всем переменным-маркерам, описывающим мир, присваиваются значения в момент 0. Потом в процессе прохождения мира эти маркеры будут менять значения, пока герой вновь не попадёт в зазеркалье и не вернётся опять в нормальный мир. Тут, чтобы сбросить все значения всех-переменных маркеров, тебе достаточно будет обратиться к локации обнуления через gs. Естественно маркер, который отвечает за факт того, что герой уже побывал в этом мире, на этой локации не пишется.
Не, ну походу это надо будет тогда вместо обнуления заводить переменные-двойники - это слишком много для моей игры, вручную не сдюжу) В общем, ладно, я решил пойти другим путем - просто на самом деле создать иллюзию, что игрок вернулся в нормальный мир - написать пару локаций, его имитирующих, но с небольшим сводящим с ума изъяном)
mkir,
я не говорил про обнуление. Я говорил про выставление значений в исходное состояние. Например, было у тебя в реальном мире такое время
time['minute']=23
time['hour']=19
time['day']=35
time['year']=2015
на момент входа в реальный мир. Ты ведь всё равно выставляешь где-то эти значения. Так почему не выставить на отдельной локации, и обратиться к ней в момент входа в реальный мир? Потом, естественно проходит время, и значения переменных меняются, но ты всегда можешь вновь обратиться к этой локации и значения вернутся в исходное состояние.
Aleks Versus, как я понял, у mkir проблема в том, что таких переменных очень много, следовательно легко можно допустить ошибку, не “запомнив” одно или несколько важных значений.
evp,
да, поэтому я и сказал, что это с одной стороны просто, с другой - трудоёмко. Конечно, если у каждой переменной уникальное имя, можно воспользоваться анализатором кода и выписать все нужные переменные, тогда ни одной не пропустишь. Но если используются не только уникальные переменные, но ещё массивы и переменные, формируемые динамически, отследить (если не отслеживал заранее) всё - почти невозможно.
Все именно так! Действительно слишком трудоемко. Моя надежда была именно на возможность сохранять “состояние” всей игры одним магическим махом, а затем возвращать это состояние с небольшими корректировками. Но что-то слишком мозгов много уходит на один маленький внесюжетный квест, тогда как еще много работы. Спасибо за ваши ответы!
mkir,
Я немножко опоздал, но всё-таки… Может сделать Зазеркалье отдельным модулем, со своими переменными. Что-то останется общим, что-то, например деньги, можно обозначить альтернативной переменной. Тогда не надо будет переживать, что что-то забыл переписать - вернувшись в Прямой мир стоит опять начать пользоваться старыми переменными, которые за время путешествия не изменились. Конечно, если часы и минуты стоят на счётчике, их придётся запоминать отдельно, как и предметы из рюкзака, но это уже не так много…
svandrus,
добавление и удаление модуля никак не влияет на значение переменных. Если ты используешь i в модуле, то это та же самая i, что и в основной игре.
Svandrus, я примерно по этому пути и пошел. Просто создал несколько локаций “имитирующих” реальный мир, но с ограничениями, чтобы игрок сразу не смог понять, в чем дело. Получилось забавно вроде, хотя так и не стал заморачиваться с запоминанием переменных - списав все на “Игровую условность” - ну, например, это не просто зазеркалье, а альтернативная реальность и вообще тут все так переплетено, что сразу не разберешься. Просто если брать те же календарные дни- их недостаточно просто запомнить! у меня на каждое изменение - суток, недель, месяцев и лет - происходят те или регулярные события, которые либо в зазеркалье нужно вроде б отключать, но некоторые отключать неприемлимо, а они за собой ведут все другие изменения - в общем голова кругом идет, когда пытаюсь ничего не упустить, потому и сделал “имитацию”
Aleks Versus:
добавление и удаление модуля никак не влияет на значение переменных. Если ты используешь i в модуле, то это та же самая i, что и в основной игре.
Это я знаю.. Потому и предлагал использовать в модуле не i, a i_alt. Просто в отдельном модуле, наверное, будет проще писать - как бы с нуля.
В момент Х подключаем модуль, назначаем новые счётчики, новые переменные и пишем квест. В момент У - назначаем старые счётчики обратно и пользуемся старыми переменными. Как-то так.
Вынес обсуждение в отдельную тему.
svandrus,
нет, если писать как бы с нуля, то фиксировать переменные в отдельной локации не составит труда. Я полагал у mkir уже есть “мир” и он решает, как возвратить этот “мир” к началу.
ЗЫ: может тему обозвать “Откат состояний в игре”, или как-то так? Название “зазеркалье” не отражает сути темы и будет непонятно непосвящённым. Хотя, признаю, оно очень эффектное.
Переименовал тему.
К слову, весь требуемый функционал реализуется существующим модулем чекпойнтов.
1. На выходе из Зазеркалья в реальный мир, делаем: чекпойнт А.
2. Сразу после чекпойнта A, делаем проверку на существование чекпойнта B.
3. Если чекпойнт B не существует, создаём его и выходим из Зазеркалья.
4. Если чекпойнт B существует, то мы уже выходили из Зазеркалья. Вносим все нужные изменения - делаем запись в журнал и т.п.
5. В момент принудительного возврата в Зазеркалье, выполняется загрузка чекпойнта A.
Nex,
вопрос не в том, чтобы откатить состояние всех переменных, а в том, чтобы откатить состояние части переменных. Если воспользоваться способом, описанным тобой, придётся восстанавливать как раз таки значения тех переменных, которые не должны были откатиться. Он подходит, если таких переменных немного.