Как реализовать систему «savegame» на основе пароля в стиле ретро?

20

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

Например, Mega Man X сохраняет работу, предоставляя вам серию чисел, которые вы можете ввести позже, чтобы загрузить свое сохранение.

аккумуляторный
источник
3
Не делайте то, что делал Донки Конг (NES) - это позволяет вам сохранять в кассету, но НЕ СОХРАНЯТЬ СЧЕТ ЖИЗНИ - так что у вас будет множество жизней с первого уровня (например, 24), сохраняйте, ложитесь спать, БУДЬТЕ UP с 3 - я ненавидел это
Алек Тил
10
Педантическое примечание: система паролей не сохраняет игровое состояние, а загружает предварительно определенное .
Лилиенталь
5
@Lilienthal не обязательно. Может быть, это просто своего рода «сброс» состояния некоторых переменных, перемешанный с детерминированным двусторонним алгоритмом.
о0 '.
2
@Lohoris Да, если у вас достаточно энтропии в пароле, вы можете считать это своего рода сохраненным состоянием, достаточно близким, чтобы напоминать текущие сохраненные игры. В конце концов, оба требуют способа экспортировать и импортировать состояние игры. Однако энтропия, необходимая для чего-либо, похожего на настоящее сохранение (точное местоположение / контрольная точка, количество жизней, убитых врагов, количество боеприпасов и т. Д.), Потребует как очень длинного пароля, так и очень сложного алгоритма. В тех случаях, когда решение использовать пароли вместо сохраненных игр имеет смысл (если они вообще есть), принцип должен выполняться.
Лилиенталь
3
@AlecTeal Что именно должно быть "глупо"? Я сравниваю пароль с объемом данных, хранящихся в современных играх, где они явно не подходят для подавляющего большинства.
Лилиенталь

Ответы:

32

Во-первых, разбейте свое игровое состояние (или, скорее, аспекты состояния, которое вы хотите сохранить). В случае игры в стиле Mega Man, вы можете отследить, какого из боссов конечного уровня вы убили, сколько бонусов, похожих на энергетические танки, у вас есть, и так далее.

Упакуйте все эти данные в битовое поле, то есть назначьте соответствующее количество битов каждому значению:

  • Убитый босс 1 (один бит)
  • Убитый босс 2 (один бит)
  • Убитый босс 3 (один бит)
  • Убитый босс 4 (один бит)
  • Энергетические емкости ( х из 5 всего) (3 бита)
  • Открыто какое-то достижение (один бит)

В нашем примере всего 8 бит, что означает, что один символ может представлять пароль. На практике ваша игра, вероятно, будет иметь больше состояний и, следовательно, потребует больше битов и, следовательно, больше персонажей. Как отмечено в комментариях здесь и в других частях этого вопроса, этот подход работает для «ретро» игр или других игр, где размер захваченного игрового состояния является разумным. Помимо определенного момента, вы можете обнаружить, что сложность паролей, необходимых для кодирования вашего состояния, слишком велика.

Чтобы уменьшить вероятность случайного наблюдения за взломом пароля, вы можете преобразовать раскладку битов так, чтобы вы вводили фиктивные биты (которые не влияют на состояние игры, но заставляют пароль выглядеть иначе, когда вы интерпретируете все биты как символы), или запускаете это с помощью некоторой обратимой операции, подобной хешу, чтобы скремблировать биты так, чтобы все биты «уничтоженной коробки X » не находились рядом друг с другом, заставляя соответствующие пароли последовательного состояния выглядеть совсем иначе или вводить значения контрольной суммы.

Если вы покопаетесь вокруг, то получите немало информации о системах, используемых для некоторых из самых популярных игр с паролем:

Вы можете прочитать о них для дополнительного вдохновения.


источник
4
Не забудьте убедиться, что пароль «save state» легко вводится и, желательно, однозначный (например, используйте «0» или «O», но не оба).
Minnmass
4
Бонусные баллы @minnmass, если вы неявно конвертируете подобные символы в ваш стандарт, так что ввод «O» вместо «0» по-прежнему будет означать «0».
8
@ NPSF3000 Потому что в этом случае «пароль» не является мерой аутентификации; «пароль» - это сам носитель данных.
Schilcote
6
@ NPSF3000 Если вам не ясно из вопроса, вам нужно перечитать вопрос или изучить справочные материалы.
Хоббс
2
@ NPSF3000 OP четко говорит «Ретро стиль» и ссылается на Megaman для подтверждения, что не является двусмысленным. Узнайте о предмете, поймите, что это не связано с безопасностью, и, пожалуйста, перестаньте пытаться защищать то, что начиналось как честное и простительное невежество.
MickLH
3

Те игры только спасли состояние, в которое я верю. Пароль просто указывает уровень загрузки. Просто используйте словарь для чего-то вроде этого.

Если это немного сложнее, например, наличие определенного оружия или бустера, вы можете зашифровать состояние с помощью короткого (но достаточно длинного) хеш-кода.

Но я настоятельно советую вам не использовать это. Пароль будет быстро распространяться в Интернете, и вскоре все выиграли вашу игру.

Madmenyo
источник
9
Распространение паролей в Интернете может быть хорошим. Обман может быть забавным, и в одиночной игре игроки обманывают только себя.
Анко
@Anko Да, я не люблю мошенничать и едва сделал это, поэтому я предвзят. Но из моего собственного опыта мои игры будут пылиться намного быстрее и быстрее, когда я обманывал свой путь.
Madmenyo
"... просто указывает уровень для загрузки." Далеко не во всех случаях. Некоторые пароли также ссылаются на боссов, убитых, усилений и т. Д. Во-вторых, советовать, что пароль можно распространять, - это одна вещь - проблема в нашем гипер-связанном мире. Сказать, что варианты мошенничества должны быть удалены, потому что вы не любите мошенничество - это другое. То, что вам нравится, не совсем то, что нравится другим. Дело не в том, что вам нравится, а в потребителе . Обман / ярлыки являются важной опцией - особенно для одиночных игр.
WernerCD,
@WernerCD, во-первых, я говорю о более сложных системах, я просто начинаю с простой системы паролей. Я не требую ничего. Во-вторых, я не говорю об обмане в ответе. Я просто даю свой предвзятый ответ на комментарий и даже говорю, что я предвзят и осознаю вашу точку зрения, что это не то, что мне нравится. Но если никто не говорит, что ему нравится или не нравится, как вы узнаете, что нравится другим? Я все еще думаю, что подобная система является своевременной, и обман 21-го века достигается по-другому. В следующий раз вы должны прочитать более внимательно, прежде чем написать комментарий, как это ИМХО.
Madmenyo
Если у вас есть сохраненные игры, люди тоже смогут делиться ими.
Деви Морган
1

Ну, в принципе, вы могли бы сделать это так:

Боссы убиты = 7

Количество монет = 36

Владеет Мечом = 0 (Нет)

Владеет сердцем = 1 (да)

Текущий уровень = 6

Текущий мир = 9

Здоровье = 100

Код = 7V36R0A1T6O9A100

В основном каждая буква отделяет Типы

аанда тв
источник
-3

В то время как такие решения, как система преобразования персонажа в состояние Джоша Петри, имеют свои преимущества (небольшой размер сохранения, работает на всех копиях игры), они объединяют дизайн игры и систему состояний по своей сути с системой паролей. Любое изменение пароля или состояния или дизайна и всей системы рушится.

Гораздо более простым решением было бы создать систему сохранения в соответствии с обычным режимом и просто добавить систему паролей сверху. Это может быть так же просто, как сохранить пароль при сохранении (возможно, удвоить как имя файла) и проверить его при загрузке, или так же сложно, как использовать одну из множества библиотек шифрования (что довольно тривиально).


Кажется, есть некоторая путаница вокруг этого ответа.

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

2) Многие игры сегодня требуют значительного сохранения памяти, мы только что создали систему быстрого сохранения / загрузки, которая производила файлы размером 10 МБ ... для игры-викторины! Система сохранения Джоша Петри , хотя действительность очень ограничена - как только система хранения становится нетривиальной, пароли должны иметь огромную длину, чтобы сохранить все соответствующие данные.

Например, что произойдет, если будет 30 боссов? 20 достижений? Мы на полпути к достижению? На каком уровне он находится? Сколько бит мы откладываем на здоровье, жизни, монеты, хр? Что если снимок не в состоянии между уровнями ... а на полпути через уровень - позиции игрока, врагов, снарядов, разрушенной / измененной местности внезапно складываются во множество состояний, которые необходимо сохранить.

Для перспективы, принимая 30-символьный алфавит и десятибуквенный пароль, у нас есть информация для хранения примерно на 50 битов. Нередки случаи, когда игра / движок использует до 320 битов только для хранения позиции, поворота и масштабирования отдельного объекта. Конечно, вы можете делать все виды приемов оптимизации, чтобы делать больше с меньшими затратами ... но в конечном итоге вы тратите время, потраченное на то, чтобы сделать игру увлекательной - одна из худших оптимизаций, которую вы можете сделать.

NPSF3000
источник
3
Я думаю, что проблема здесь, и с вашим комментарием выше, состоит в том, что криптографическая безопасность не является целью сохранения состояния игры в виде битов в пароле. Пароли, составленные таким образом, легко обратимы, но трудно угадать хэши , и ничего более. И по той же причине, это не вызывает неуместную связь в том, как вы воображаете; если состояние игры становится более или менее сложным, то же самое происходит и с хешем (который делает недействительными предыдущие хеши), но система работает одинаково хорошо до и после.
Сет Баттин,
@ Сэт Бэттин: "Это не вызывает чрезмерную связь в том виде, в котором ты воображаешь" О, круто! Итак, в игре, над которой я сейчас работаю, был файл сохранения, измеренный в мегабайтах ... все, что мне нужно сделать, это сделать некоторую базовую запутанность и отобразить ее на экране и вуаля! Теперь у нас есть отличная система паролей?
NPSF3000
3
Похоже, ваша игра не подходит для этого метода.
Сет Баттин,
@ NPSF3000 Какой смысл паролей в этом случае? Если это мешает другим пользователям, использующим ту же машину, использовать свои сохраненные игры без разрешения, то почему бы просто не иметь единый вход в игру с именем пользователя / паролем? Если он указывает, какое сохранение они хотят, это «идентификатор сохраненной игры», а не пароль, и, вероятно, его следует сделать более дружественным. Как это так, если я правильно вас понял, вам требуется новый, не указанный пользователем пароль каждый раз, когда они загружают новое сохранение? ПОЧЕМУ? Какое полезное преимущество это дает кому-либо?
Деви Морган
1
@DewiMorgan Мне ничего не нужно, я просто даю ответ на вопрос опа: «Как бы я создал систему паролей для однопользовательской игры? Например, Mega Man X экономит работу, давая вам серию цифр что вы можете ввести позже, чтобы загрузить свое сохранение. " Мое решение делает это, не соединяя систему сохранения и систему паролей вместе. Ответ, получивший наибольшее количество голосов, имеет те же недостатки, что и мой, с тем дополнением, что он требует, чтобы вся игра была разработана в соответствии с методом.
NPSF3000