Русский
Русский
English
Статистика
Реклама

Концепт

Концепт как усилить защиту паролей 12345 от bruteforce атаки (попытка вторая)

05.12.2020 00:04:30 | Автор: admin
Всегда хотелось, чтобы хакер не мог взломать перебором чужой пароль на сайте.
Например, если пользователь похвастается хакеру, что его пароль состоит только из цифр, то скоро пользователь потеряет свой аккаунт.
А как быть, если пользователь сообщил по телефону свой пароль жене, а хакер его услышал?

Что?! Хакер знает пароль? Все, это фиаско. Можно ли помочь такому пользователю усложнить угон его аккаунта? Меня всегда волновал этот вопрос и, кажется, я нашел способ как это сделать. Или переоткрыл его, как это часто бывает. Ведь все уже давно придумано до нас.

Вводная.

  • Пользователь хочет на сайте иметь пароль 12345.
  • Хакер может легко подобрать этот пароль.
  • Но пользователь должен войти, а хакер нет. Даже если логин и пароль хакеру известны.
  • и никаких SMS с секретными кодами и посредниками в виде дополнительных сервисов. Только пользователь и ваш сайт со страницей логина.
  • а еще можно будет сравнительно безопасно в троллейбусе сказать своей жене: Галя, я на сайте site для нашего логина alice поменял пароль на 123456 говорят, он более популярный, чем наш 12345. И не бояться, что аккаунт взломают за секунду.


Как работает метод? Вся конкретика под катом.



Что потребуется?

  • концепт объясняет только метод аутентификации
  • реализация требует хранить только "имя пользователя", "пароль", "соль1" и "соль2". Да, две соли.
  • обойдемся без таблиц логирования и счетчиков в redis
  • не будем вести таблицы с IP-адресами
  • не будем использовать SMS
  • не будем блокировать попытки входа в систему. Как известно из моей прошлой неуспешной попытки, бесполезно блокировать вход даже если хакер упрется в ограничение по времени, он просто начнет подбирать пароли сразу у нескольких пользователей. Кроме того, от ограничений пострадает и сам пользователь. Не звонить же ему в поддержку, чтобы авторизоваться на вашем сайте с прикольными картинками?
  • пользователь может поменять пароль в любое время и сделать его недействительным на остальных устройствах. Это обычное правило, но мне кажется его стоит упомянуть.
  • можно сделать процесс подбора пароля по словарю более тяжелым для хакера (опционально, будет упомянуто ниже).


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

Как?
Представьте, если бы в браузере всегда была уникальная соль, которой можно было солить пароль. Каждому пользователю по соли. Зачем она нужна? Чтобы шифровать. Например, если зашифровать строку 12345 с солью saltsalt в argon2id, то получится "$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg". Поменяй соль и хэш будет другим. Один алгоритм зашифрует одинаковые пароли по-разному, если использовать разную соль для каждого. Годится.

Но где взять эту соль изначально? Да вот же она сидит перед монитором. Пусть выдавит из себя два-три лишних символа и авторизуется уже наконец по-человечески. Рядом кот бегает? Ну, пусть будет cat. Что такое cat? Это наше секретное слово. Мы его сообщим на сервер при регистрации, а он сгенерирует по этому слову соль. А потом эту соль пришлет нам. Все соль в браузере есть. Теперь пароль. А пароль тоже шифруем и солим той солью, что прислал сервер.

Теперь мы не шлем 12345. Мы шлем хэш, и так-как у каждого пользователя своя соль, хэш получается разный.

Кажется, брутфорсу сейчас поплохеет: мало того, что придется делать дополнительные вычисления и перебирать длинные строки хэшей аргона вместо простых цифр, так еще и у каждого пользователя будет свой хэш теперь бесполезно пробовать одну и ту же строку в виде пароля для проверки ее у всех пользователей. Допустим, три пользователя выбрали один и тот же пароль: 12345. Но хэш у них получится разный. Потому что у каждого разная соль.

  • Браузер должен вычислять хэш пароля используя соль, которую ему ранее прислал сервер. Отправлять он должен хэш, а не сам пароль.
  • Сервер присылает соль по секретному слову, которое известно только пользователю. Оно может быть простым. Например cat.
  • У каждого пользователя должна быть своя соль.
  • Два пользователя, выбравшие одинаковое секретное слово, должны иметь разную соль.
  • Сервер не должен сообщать было ли использовано правильное секретное слово и верна ли соль для этого пользователя иначе это будет подбор двух простых паролей вместо одного.
  • Если пользователь меняет секретное слово, меняется и соль.

То есть, для защиты своего простого пароля, пользователь должен придумать еще одно очень простое слово. Он вводит это слово везде, где хочет пройти аутентификацию, а потом потребуется вводить только пароль. Пока он не почистит куки.

  • зашел на сайт
  • ввел логин и секретное слово
  • ввел пароль
  • готово


Пароль и секретное слово могут быть очень простыми. Один или два символа. Например, пароль 12345 и секретное слово 42. И если кто-то еще придумает секретное слово 42, то это будет не страшно.

Как это работает. Пошаговый концепт.

У нас есть следующие элементы:
  • веб-сервер
  • база данных и таблица users:
    • login
    • password_hash
    • salt_unique_for_each_user
    • salt_for_password
  • браузер пользователя
  • браузер хакера
  • страницы логина и регистрации на сайте
  • скрипт, который перехватывает событие submit для формы логина


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

  • ALG1 асимметричный алгоритм шифрования, который генерирует хэш из строки и соли. ALG1(str, salt) = hash1. Этот алгоритм используется только на сервере.
  • ALG2 асимметричный алгоритм шифрования, который генерирует хэш из строки и соли. ALG2(str, salt) = hash2. Этот алгоритм используется публично и должна быть возможность его реализации на клиенте (в нашем примере на javascript).


Кроме того нам понадобится еще два алгоритма попроще:
  • ALG_SALT алгоритм, который вычисляет случайную соль в виде строки символов. ALG_SALT() = salt. Этот алгоритм используется только на сервере.
  • ALG_PASS алгоритм, который генерирует случайный простой пароль. ALG_PASS() = pass. Этот алгоритм используется только на сервере.


События пошагово:

  • Пользователь переходит на страницу регистрации, так-как у него пока нет логина.
  • Сервер показывает форму с двумя полями: логин + простое секретное слово.
  • Пользователь выбирает логин alice
  • Пользователь выбирает секретное слово cat
  • Пользователь нажимает кнопку Отправить.


Cервер проверяет и удостоверяется, что пользователь alice отсутствует в БД.
Сервер вычисляет следующие значения:
$salt_unique_for_each_user = ALG_SALT(); // строка "saltsalt"


$salt_for_password = ALG1("cat", $salt_unique_for_each_user); // строка "$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg"


$user_simple_password = ALG_PASS(); // строка "12345"


$user_simple_password_hashed = ALG2($user_simple_password , $salt_for_password); // строка "$argon2id$v=19$m=16,t=2,p=1$JGFyZ29uMmlkJHY9MTkkbT0xNix0PTIscD0xJGMyRnNkSE5oYkhRJGpYOTRsYVNpNnZvOUFoUytiSHdia2c$b+6ROJVsZ62UXA7hEAg0AQ"


Сервер создает в таблице пользователей запись и сохраняет данные:
INSERT INTO `users` (login, password_hashed, salt_unique_for_each_user, salt_for_password) VALUES ("alice", "$argon2id$v=19$m=16,t=2,p=1$JGFyZ29uMmlkJHY9MTkkbT0xNix0PTIscD0xJGMyRnNkSE5oYkhRJGpYOTRsYVNpNnZvOUFoUytiSHdia2c$b+6ROJVsZ62UXA7hEAg0AQ", "saltsalt", "$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg").


Сервер показывает пользователю страницу успеха регистрации с сообщением: Пользователь alice успешно создан. Используйте временный пароль 12345 для входа.

Пользователь радостно кричит: Ура, я зарегистрировался на сайте site под ником alice и мне дали пароль 12345. Какой смешной и простой пароль!. Но у квартиры пользователя очень плохая звукоизоляция, и его хакер-сосед все услышал.

  • Хакер вбивает адрес сайта в своем браузере.
  • Браузер хакера отсылает пустые куки.
  • Сервер проверяет запрос хакера есть ли кука salt. Не находит ее.
  • Прежде, чем хакер пришлет украденные логин и пароль, браузер должен знать соль, чтобы ей зашифровать пароль.
  • Браузер хакера пока не хранит соль в куке salt.
  • Сервер присылает форму логина с двумя полями: логин + секретное слово, чтобы дать пользователю возможность получить соль.


Хакер озадачен. Пока оставим его.

  • Пользователь возвращается на страницу логина.
  • Браузер пользователя отсылает пустые куки.
  • Сервер проверяет запрос пользователя есть ли кука salt. Не находит ее.
  • Прежде, чем пользователь пришлет логин и пароль, браузер должен знать соль, чтобы ей зашифровать пароль.
  • Браузер пользователя пока не хранит соль в куке salt.
  • Сервер присылает форму логина с двумя полями: логин + секретное слово, чтобы дать пользователю возможность получить соль.
  • Пользователь вводит login alice, secret cat и нажимает кнопку "Отправить".


Сервер получает запрос и видит, что вместо пароля прислали секретное слово.

  • Сервер выбирает запись из базы данных с логином alice и берет значения `salt_unique_for_each_user` -> $db_salt_unique_for_each_user и `salt_for_password -> $db_salt_for_password`.
  • Сервер делает вычисления схожие с теми, что он делал при регистрации. Вычисляет значение: $salt_for_password = ALG1(cat, $db_salt_unique_for_each_user).
  • Сервер отсылает значение соли $salt_for_password в ответе пользователю. Эта соль правильная. Если с ее помощью зашифровать пароль 12345, получится хэш, который сейчас хранится в БД. В заголовках ответа от сервера указано `установить куку salt = $db_salt_for_password`. Также давайте сохраним и логин: `установить куку login = alice`.


Пояснение: Сервер никак не уведомляет какая соль была отправлена правильная или нет. Результат ее использования будет ясен, когда с ней попытаются авторизоваться с правильными логином и паролем.

  • Пользователь получает ответ сервера. Его страница либо перегружается, либо сразу динамически меняется.
  • Браузер пользователя отсылает куки: login = alice, salt = "$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg".
  • Сервер проверяет запрос пользователя есть ли кука salt. Находит ее.
  • Браузер уже имеет соль, чтобы ей зашифровать пароль.
  • Сервер присылает форму логина с двумя полями: логин (уже имеет значение alice) + пароль.
  • Пользователь вводит свой простой пароль 12345 и нажимает кнопку "Отправить".
  • Браузер перехватывает событие onSubmit.
  • Вычисляет $password_hashed = ALG2(12345, "$argon2id$v=19$m=16,t=2,p=1$c2FsdHNhbHQ$jX94laSi6vo9AhS+bHwbkg").
  • Отправляет данные alice/$argon2id$v=19$m=16,t=2,p=1$JGFyZ29uMmlkJHY9MTkkbT0xNix0PTIscD0xJGMyRnNkSE5oYkhRJGpYOTRsYVNpNnZvOUFoUytiSHdia2c$b+6ROJVsZ62UXA7hEAg0AQ, а сам пароль 12345 никуда не шлет.


Сервер получает запрос на аутентификацию:

  • Данные логин+пароль: alice/$password_hashed
  • Идет в БД, достает значение `password_hashed` -> $db_password_hashed.
  • Сравнивает $db_password_hashed === $password_hashed?
  • Хэши совпадают, авторизация успешна.


Примечание: В моем примере сервер сличает хэши напрямую. Но хранить в БД строки, которые по факту уже являются паролями, нельзя. Их можно украсть и потом использовать в форме логина-пароля. Поэтому нужно хэшировать хэши как бы странно это не звучало. Это значит, что понадобится третья соль. Но хранить ее надо не в БД, а в переменной окружения. Впрочем, это уже детали реализации, которые я пропустил для упрощения.

Тем временем наш хакер решает проверить эту странную форму входа:
  • Хакер вводит login alice, secret dog и нажимает кнопку "Отправить".
  • Сервер получает запрос хакера и видит, что вместо пароля прислали секретное слово.
  • Сервер выбирает запись из базы данных с логином alice и берет значения `salt_unique_for_each_user` -> $db_salt_unique_for_each_user и `salt_for_password` -> $salt_for_password.


  • Сервер вычисляет значение соли и выдает ее, но она неправильная, потому что кодовое слово чужое: $result_fake_salt = ALG1(dog, $db_salt_unique_for_each_user). Впрочем, сервер об этом тактично умалчивает.


Сервер отсылает вычисленное значение соли обратно в браузер пользователя. В заголовках указано `установить куку salt = $result_fake_salt`. Также сохраняется и логин: `установить куку login = alice`.

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

  • Хакер получает ответ сервера. Его страница либо перегружается, либо сразу динамически меняется.
  • Браузер хакера отсылает куки: login = alice, salt = $result_fake_salt.
  • Сервер проверяет запрос пользователя есть ли кука salt. Находит ее.
  • Браузер хакера уже имеет соль, чтобы ей зашифровать пароль.
  • Сервер присылает форму логина с двумя полями: логин (уже имеет значение alice) + пароль.
  • Хакер вводит украденный простой пароль 12345 и нажимает кнопку "Отправить".
  • Браузер перехватывает событие onSubmit.
  • Вычисляет $password_hashed = ALG2(12345, $result_fake_salt).
  • Отправляет данные alice/$password_hashed.


Сервер получает запрос на аутентификацию alice/$password_hashed.
Идет в БД, достает значение `password_hashed` -> $db_password_hashed.
Сравнивает: $password_hashed === $db_password_hashed? Nope.

Хэши этих изначально одинаковых паролей не совпадают. Потому что их солили по-разному.

Хакер не сдается и идет регистрировать другого пользователя на сайте.
Совершенно случайно он вводит то же самое секретное слово, что и пользователь за стеной cat.
Хакер получает валидную соль для пароля к новому аккаунту, и пробует ее подставить в скрипт для хэширования.

К счастью, генерация соли для паролей использовала вторую соль (`salt_unique_for_each_user`), которая для каждого пользователя генерируется по-новому. Так что разные пользователи даже с одинаковыми паролями и что самое главное секретными словами, будут иметь разные соли. И соль пользователя с тем же секретным словом, не совпадет с солью другого. И совпадение паролей тоже не будет являться проблемой.

Теперь, что касается усложнения перебора паролей по словарю. Если мы модифицируем ALG2, который является общим и для сервера и для клиента, и сделаем его трудозатратным, это серьезно осложнит перебор для хакера. Напомню, ALG2 это процесс получения хэша пароля, который отправляется на сервер. На сервере этот хэш уже вычислен и хранится в БД:
  • сервер будет выполнять операцию ALG2 только один раз при записи пароля в БД или смене пароля на новый
  • клиент будет выполнять операцию ALG2 только во время аутентификации (которую нужно не путать с авторизацией). Допустим, клиент ошибся пару раз при вводе пароля это не страшно.
  • Хакер будет делать это постоянно для каждого пароля, с чем его и можно будет поздравить. Особенно цинично, что будут затрачиваться титанические усилия на пароли типа 123/1234/12345.


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

Завершу описание концепта бочкой дегтя:
  • Если пользователь случайно неправильно введет секретное слово, он попадет в ситуацию, когда он не сможет войти по своему паролю. Придется сбросить секретное слово (в нашем случае удалить куки) и послать запрос заново. Это можно реализовать прозрачно по нажатию одной кнопки, но до этого пользователь должен еще догадаться. Можно сбрасывать принудительно при 5 неправильных попытках входа.
  • Два пользователя на одном компьютере вынуждены будут постоянно сбрасывать соль друг друга.
  • Два разных компьютера будут получать одну и ту же соль для пароля
  • Если соль сменится на сервере через один компьютер, другой компьютер со старой солью не будет знать, что ее нужно поменять
  • Можно украсть соль с компьютера и с ее помощью осуществить очень быструю атаку на аккаунт, зная что пароль очень простой.


и ложкой меда:
  • пользователь может иметь несколько секретных слов для выполнения различных задач. Например, "cat" это зайти на почту, а "termorectal" это показать фейковую страницу с ничем не примечательными письмами. Конечно, два пароля можно организовать в любой системе. Но второй пароль должен быть таким же сложным, как и первый. Здесь же можно помнить два простых пароля любого вида, используя удобочитаемые слова.
  • Возможна интеграция секретного слова в уже существующие системы аутентификации. Если у пользователя значение в БД `salt_for_password` не пустое, значит, что пользователь придумал секретное слово, и можно применять новый метод аутентификации. В противном случае использовать старый аутентификатор.
Подробнее..

Квеструм по ашановски (ux)

21.01.2021 00:20:21 | Автор: admin

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

обобщенный вариант оформленияобобщенный вариант оформления

В прошлом году в некоторых регионах в ашане появились терминалы, работающие по принципу кассового аппарата. Сначала пробиваешь всё у кассира, получаешь чек с qr-кодом, а по этому чеку оплачиваешь покупку в терминале наличными или картой. Еще нужно не забыть взять чек со штрих кодом, чтобы открыть калитку на выходе, иначе не выпустят.

внешний вид терминалов с небольшими различиями. снизу терминал для безналичной оплатывнешний вид терминалов с небольшими различиями. снизу терминал для безналичной оплаты

1. Проблемы

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



Порядок при первом использовании

- Понять что нужно делать
- Найти сканер или нечто похожее
- Отсканировать чек с qr-кодом
- Найти куда вносить купюры
- Внести купюры
- Найти куда вносить монеты
- Внести монеты
- Найти откуда брать сдачу
- Взять сдачу
- Найти откуда брать чек
- Взять чек об оплате (а почему их два?)
- Понять какой чек нужен на выходе
- Выйти

Ура! так выглядел обыденный процесс покупки пакета молока после работы.

"Почти на каждом этапе покупатель должен что-то искать и в чем-то разбираться"


При этом подразумевается, что покупатель знаком с принципом работы сканера, и тем, что такое qr-код и знает его в лицо, а также с работой купюроприёмника и монетоприёмника.
При том, что в некоторых магазинах это единственный способ, это создает трудности людям старшего возраста.

2. Проблемы оформления

  • На кислотном красном нормально читаться будет только белый

  • Белые подложки усиливают общую контрастность, выделяя все и не выделяя ничего

  • Текст у сканера закрывается корзинкой для сдачи мелочи при виде сверху

  • Нет привычной структуры, акцентов, иерархии, линии считывания. Глаз вынужден скакать

  • Инструкция на мониторе показывает схематически неправильный терминал,
    несуществующий штрих-код, и указывает на несуществующий сканер

3. Возможное решение


Меньше шума, больше информации

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

Самый сильный акцент ушел на область сканера. Это первый и основной шаг. Рядом со сканером
схематический чек с qr-кодом. Покупатель может не знать, что это такое, но штуку с похожим рисунком ему только что дали на кассе и он держит ее в руках.

два варианта оформления (темные области слепые зоны при виде сверху)два варианта оформления (темные области слепые зоны при виде сверху)

Направляющие и подсказки


Второй по важности этап оплата.

Добавим акцент на купюроприёмник,
но гораздо слабее, чем на чек.

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


Добавим стрелку к оплате монетами. Этот этап происходит одновременно с оплатой купюрами,
но менее важен.

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


Дополнительно едва выделим область выдачи второго чека, и добавим символ штрих-кода, чтобы еще перед выходом показать, какую часть сканировать на выходе.

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

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



такое оформление не требует никаких технических изменений

"Это решение уже завтра можно напечатать на плёнке и расклеить на каждый терминал"

4. Варианты без привязки к цвету корпуса


Белый вариант

На белом проще делать выделения, ничего не давит на глаза, можно использовать спокойный зеленый цвет
(второй цвет бренда), который все равно будет контрастен к фону и приёмникам.


Зеленый вариант

Спокойный и не нагруженный вариант. Хорошо выглядит в сочетании с белым и белой заставкой на экране, но немного превращается в кашу с зеленой.


















можно придумать еще несколько вариантов оформления цифр, чека, стрелок

(почти)Идеальные варианты в сферическом вакууме

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

купюроприёмники разнесены, чтобы влез банк с купюрами. монетоприёмник сохраняет привычную ориентациюкупюроприёмники разнесены, чтобы влез банк с купюрами. монетоприёмник сохраняет привычную ориентациюразличные цвета еще сильнее упрощают акцентирование, а разделение на модули помогает не запутаться/различные цвета еще сильнее упрощают акцентирование, а разделение на модули помогает не запутаться/

Чек на выходе

После пробивания товаров, кассир дает чек с qr-кодом, это чек для терминала. Сам терминал выдает стандартный чек об оплате, который обычно сразу сминается и летит в урну. Однако на дверцах на выходе стоит сканер без подсказок, какой чек из двух нужно отсканировать. Вдобавок к этому руки покупателя заняты в этот момент покупками, сдачей, и двумя чеками, а возможно и тростью, ребенком, рюкзаком.

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

В некоторых магазинах вместо первого qr-кода дают обычный чек со штрих-кодом, который, однако, также не сработает на сканер на выходе и создаст еще больше путаницы внешней идентичностью со вторым чеком

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

Подробнее..

Microspace project

14.08.2020 22:08:54 | Автор: admin
Концепция игры жанра jrpg, в сеттинге сюрреалистического космоса. В качестве героев выступают разумные звездолётики. Они летают по миру маленьких планет, перевозят различных персонажей и грузы, помогают планеткам развиваться.




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

Герои




Wanderer/Скиталец

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

У космических корабликов есть уровни, но их скорее всего будет немного (максимальный десятый, например).
Тип указывает на природу звездолёта, всего их четыре эволюционный, божественный, магический и технологический.
От класса зависит характер героя и то, как он привык обращаться с энергией. Классов тоже четыре излучатель, пожиратель, аккумулятор и трансформатор.
Способности кораблика базируются на сочетании типа и класса, но здесь всё упирается в конкретную реализацию самих этих способностей и ответа на вопрос, насколько способности кораблей будут уникальными и как появляются. То есть зашиты ли они внутрь самого носителя, и каким именно образом. Либо они полностью или частично могут быть получены любым звездолётиком. Может быть способности вовсе целиком и полностью определяются текущим составом экипажа.


Maiden Yaga. Концепт экрана инвентаря

На борту корабля могут находится различные персонажи, так сказать герои наши меньшие. По сути они выступают тут в роли некоего оружия для звездолётиков и могут дать кораблику те самые специальные способности, побывав на нём в нескольких сражениях.
Как вариант могут быть особо редкие уникальные персонажи, которых нужно найти один раз, а большую часть времени звездолёт может встречать различных неуникальных, но всё-таки именных личностей, которые сгенерированы игрой по некоторому шаблону.

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

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

Сражения




Концепт экрана сражения

В местном космосе встречаются различные враги, в том числе, видимо, враждебные звездолётики. Бой со всеми этими агрессорами происходит по канонам jrpg, с накапливающейся по времени шкалой активности. Правда было немало игр, отображающих саму очередь сражающихся, но лично мне как-то милее накапливающиеся полоски (по крайней мере в рамках данного концепта).

У каждого кораблика есть прочность (здоровье, зелёная полоска), запас сил (степень усталости, желтая полоска), энергия (аналог маны, синяя полоска).

При достижении нулевого запаса сил кораблик входит в состояние перегрузки, позволяющей совершить особо мощный приём. После этого он может делать лишь стандартные атаки, пока жёлтая шкала не будет восстановлена, но она не растёт со временем и восстанавливается только редкими предметами. Запас сил можно тратить самостоятельно, на особо мощные способности, а также его понижают определённые вражеские атаки.

Основу боевой системы я решил взять из своей тактической настольной ролёвки, для которой ранее придумывал отдельный вариант компьютерной адаптации. Только здесь сражения будут ещё проще, чем тактические. То есть здесь не будет перемещения по клеткам, поэтому нужно будет переосмыслить структуру боя, способности и прочие принципы. С другой стороны нет надобности именно в полной адаптации, скорее я для начала взял оттуда некоторые ключевые элементы а в дальнейшем что-то останется, что-то поменяется, что-то можно будет убрать, сделав акцент на другие механики.

Планетки





Тут следовало бы ожидать подхода, скажем так, а ля Master of Orion захватываем планеты, строим на них всякое, развиваем свою межзвёздную империю и так далее. Тем более что в данной игре я хотел частично воссоздать атмосферу мира маленьких планет из своей настольно-ролевой системы Малая космическая симфония, где героями были сами планеты.

Тем не менее, вместо того, чтобы делать космосим от лица планетки, у нас более активные герои команда путешествующих по космосу звездолётов. Для компьютерной игры это более интересный ракурс на происходящее, как мне кажется. К тому же кораблики не владеют планетками, а просто различным образом участвуют в их жизни. То есть само строительство на планете будет присутствовать, но как у каждой планетки личный план развития, которому можно помогать либо мешать.

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

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

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

Вид самих межпланетных перелётов вопрос достаточно открытый. Может быть это полноценный космос со всеми степенями свободы и возможностью дополнительно пострелять по всяким мелким астероидам вне битв. Может быть какой-то вариант плоского, со своими особенностями.

Прочее



Ну вот, все основные моменты вроде бы озвучил. В проект подходят ещё некоторые концепции, но это либо уже совсем частности и мелочи, либо совсем необязательные фичи, либо сложные механики, которые хотелось бы предварительно протестировать и понять, стоит ли их комплексно встраивать в общий контур.

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

Бонусом ещё немного концептуальных картинок:











Что ещё можно почитать в продолжение темы:

Малая космическая симфония
Настольно-ролевая игра про мир маленьких планет, дающая чуть более полное представление о сеттинге. Описаны принципы и можно прочесть саму книгу правил.

Монстробой
Краткий разбор основных моментов куда более тяжеловесной тактической настольно-ролевой системы, принципы которой частично можно использовать в jrpg.

Вычисляемый сюжет или настольно-ролевая зараза
Варианты системы генерации сюжета через взаимодействие идентификаторов различных объектов мира. Хотелось частично использовать этот способ в вышеизложенной концепции.
Подробнее..

Итеративный геймдизайн, Godot и мир маленьких планет

01.09.2020 20:19:15 | Автор: admin

Итеративный подход

Существуют различные подходы к организации геймдизайна. Я предпочитаю использовать итеративный способ, вернее путь к итоговым механикам и структурам через прототипирование ядра неполной концепции, с последующим многократным тестированием и дополнением. То есть под итерациями понимаются не просто новые слои улучшений, а и сама суть концепции видоизменяется под влиянием результатов её практического применения.

Можно представить себе ситуацию с созданием некоего здания. В одном случае у нас есть уже готовый просчитанный чертёж, по которому остаётся только выстроить запланированный объект, зная чего и сколько понадобится. В случае итеративного подхода, вместо точного чертежа у нас примерный образ, с намётками иерархической структуры, и некий набор инструментов, с помощью которого мы собираемся как-бы вырезать наше здание внутри скал, следуя за конфигурацией породы и вновь открывающимися обстоятельствами.

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

Таким образом, итеративный подход, он про эксперименты и как раз ожидает, что при соприкосновении концепта с реальностью будут возникать различные задачи, которые нужно будет решать, адаптируя идею, и в то же время получая через практику новые подсказки о том, в какую сторону её следует развивать.

Перейдём к большей конкретике. В разработке игры это всё означает, что приступая к более менее полноценному прототипу мы в первую очередь сфокусируемся на том, чтобы там работала какая-то самая стержневая механика и определимся с основными проблемами, которые требуют решения на ранних этапах. То есть, проектируя таким образом Марио, нам нужен условный объект-персонаж, который умеет прыгать и бегать в стороны, вот с его отображением и написанием кода прыжков-движения мы и будем разбираться. Для Квейка нам понадобится создать контроллер от первого лица и реализовать возможность создавать пули по нажатию кнопки. Для тактической стратегии - логику поведения фигурок-юнитов на поле сражения, возможность двигаться и атаковать.

Как видно, уже на данном этапе появляются различные вопросы и развилки. А так ли нужен Марио прыжок, должен ли он быть двойным (тройным, неограниченным), как быстро герой движется? Выстрелы в Квейке сделать в виде быстро летящих шариков или лучами, где закрепить камеру, как быстро она поворачивается? Всё тактическое поле боя представить в виде матрицы, хранящей все состояния клеток и положения юнитов внутри неё, или же сделать юниты полноценными отдельными сущностями, ограниченными картой, чтобы получить от такого подхода какой-то особый профит? Какой размер игрового поля, сколько участников?

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

Для того, чтобы в процессе разработки было проще маневрировать в ту или иную сторону стоит держать всё по возможности максимально простым, не ударяясь в написание какой-то там очень сложной структуры, которая никак не работает, пока не прописаны все её составные части. В первую очередь самый базовый функционал, с кубиками, пустышками, заглушками, который уже выполняется и передаёт данные, а визуал, декор прочие детали - вещи второстепенные, реализацию которых можно отложить.

Одна из первых целей - это собрать минимальную запускаемую вещь, с началом, серединой и концом. То есть банально окно входа в игру, основной игровой экран и кнопка/окошко выхода. Вход в пещеру, тоннель, свет в его конце. Минимальное приложение, которое уже работает, хотя внутри пока довольно пусто.

Что касается дальнейшей разработки - очень желательно всё фиксировать и записывать. Нет, это не только комментарии в коде, но и просто некий отдельный лог для себя, где-нибудь в элементарном блокноте. Например, я раньше вёл записи в отдельных текстовых файликах, а последнее время пользуюсь компактной опенсурсной CherryTree, где удобно создавать различные ветки и разбивать записи по категориям - сам лог изменений в проектах, лист для описания возможных багов и методов их решения, список различных приходящих в процессе идей, перечень того, что желательно реализовать в первую очередь, заметки по решению каких-то типовых задач в используемом игровом движке и так далее.

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

Прототипирование Microspace project в Godot engine

Итак, некоторое время назад я в общих чертах сформулировал концепцию rpg-игры, в которой можно собрать партию разумных звездолётиков и летать по секторам местного космоса, участвуя в жизни маленьких планеток. Подробнее тут:

Таким образом, требовалось собрать прототип, в котором на самом элементарном уровне были бы реализованы какие-то классические ингредиенты jrpg-жанра - режим глобальной карты, режим сражений. Чем я и занялся.

В качестве движка был выбран Godot engine, а конкретнее версия 3.2.1, язык GDScript и gles3 рендер. В целом данный проект относится к категории достаточно код-интенсивных, всё-таки это далеко не аркада, где можно обойтись вобще без программирования. Выбор GDScript'а не особо принципиален, просто на нём быстрее писать внутри редактора, без открытия лишних окон, а так - вся логика без каких-то особых проблем переносится на тот же C#. Gles3 тоже не принципиален, но я взял более мощный рендер в качестве целевой платформы, а на упрощённом всегда можно собрать отдельную версию, только потребуется переработать частицы.

Началось всё с набросков карты сектора и написания контроллера, чтобы добавить модель кораблика и полетать по получившемуся "космосу" (попутно придумалась музыкальная композиция для глобальной карты):

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

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

Подготавливая приблизительные иконки с персонажами/предметами для инвентаря я завёл пару текстурных атласов в формате png, размерами 512 на 512. Таким образом в каждом можно держать по 64 иконки размерами 64 на 64. Godot, кстати, сам умеет сшивать несколько выбранных картинок в атлас, но у меня почему-то эта его функция не срабатывает, поэтому набросал заготовки в графическом редакторе.

Далее был реализован экран сражения, а на карте появились видимые неподвижные враги, коснувшись которых кораблик переносится в сражение. Во время сражения у звездолётика накапливается шкала, после чего возникает пауза, пока не выбрано действие. У врага есть своя, скрытая шкала, к тому же они могут иметь не фиксированные промежутки для различных атак и приёмов. Кстати, отсюда выглядит интересной возможность для персонажа какими-то приёмами ускорять себе следующее действие - именно не разгон себе параметра "скорость" на несколько ходов, а конкретный бонус к скорости на следующее действие, когда совершаешь какую-то разовую утилитарную способность, которая сама по себе не несёт особого боевого эффекта, либо способность тратящую ресурс, которую ты не можешь делать часто.

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

Следующее обновление принесло ещё один важный момент, которого не хватало - собственно, партию героев, к основному звездолётику Wanderer добавились Spira и Vanguard. Появились новые враги, отображение получаемого урона, самописный ориентировочный трек сражения, доработки инвентаря и специальная станция, где можно отправить одного из героев с основного корабля на задние, а потом забрать его, после истечения срока.

Архитектура приложения

Теперь немного о том, как всё это устроенно за кадром. Godot представляет всё в виде иерархически связанных элементов, которые являются различными узлами либо сценами, в которые завёрнуты другие узлы и/или сцены. То есть, у нас, допустим, есть общая "сцена-океан", в которой содержится "узел-солнце" и "сцены-острова", в каждом из которых расклонированы "сцены-деревья" и так далее.

Собственно, про некоторые особенности движка Godot и я рассказывал вот в этой статье:

А внутренняя архитектура прототипа космической jrpg следующая: есть основная 2д сцена - стартовый экран, куда попадает пользователь. При выборе уровня к корню стартовой сцены крепится сцена космического сектора, в которую дочерним объектом крепится звездолётик и на него навешиваются слушатели некоторых сигналов. Сама стартовая сцена при этом скрывается, но её скрипт обрабатывает сигналы от кораблика - столкновение с врагом, открытие инвентаря, попадание в зону планеты. Когда игрок открывает инвентарь, то стартовая сцена снова показывается, но отображает не менюшку входа в игру, а окошко инвентаря.

В том случае, когда игрок решил посетить планету или вступить в сражение сцена с космическим сектором стирается и в корень крепится боевая сцена либо экран планеты. Внутри сражения свои менюшки и стартовую сцену интересует только сигнал об окончании сражения. А вот на экране планеты интерфейсное окошко снова идёт от стартовой сцены. В целом это продиктовано желанием не грузить каждый раз простой интерфейс в составе этих сцен.

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

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

В Godot предусмотрена возможность заводить в отдельном окошке синглтоны, которые будут доступны глобально. Я использую один такой для простого хранения глобальных переменных и массивов.

Где брать идеи

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

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

В плане игр компьютерных полезно изучать их геймплей, понять общий смысл и думать над его возможными интерпретациями и областями применения. Отделять важное от второстепенного, видеть скрытую иерархию. Тем не менее в игре важны буквально все аспекты, даже не те, которые являются стержневыми и важными. Надо стараться раньше замечать подобные точки притяжения интереса игрока или вещи, с которыми он часто сталкивается, чтобы тоже уделить им внимание по возможности и просто лучше себе представлять какие второстепенные аспекты оказывают заметное влияние на общий игровой опыт.

Одна из практик - это смешивать механики из разных игр и смотреть, что каждая привнесенная механика может делать ещё, кроме первой своей функции, может ли стать стать более комплексной. В то же время не стоит тащить с собой чужие костыли, у нас и собственных образуется в процессе. То есть, имплементируя какую-то уже существующую механику в состав своей концепции стоит присмотреться - а так ли нужна она вся великом или достаточно лишь части. А может быть она будет использована для другого, чем это обычно принято.

Другая практика - ограничения. Можно пробовать убирать очевидные элементы, накладывая таким образом некие рамки, в которых может придуматься что-то оригинальное. Например, что если игра будет обходиться без текста, без стрельбы, без главного героя, без интерфейса, без определённых цветов, без смертей, без бонусов, без опыта, без перемещений, без смены локации, без прогрессии. Что если механика не поощряет привычные действия, что если игрок не контролирует персонажа и так далее. Из любой игры, кстати, довольно часто есть что убрать и упростить, даже не потеряв в геймплее. В то же время убранные вещи меняют так сказать, центр масс, игры и освободившееся место может быть дополнено чем то иным, развито в другом направлении.

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

В плане разработки стоит сосредоточиться на том, что вы реально сможете сделать сами, хотя планировать и задумывать можно и довольно сложные конструкции. Но лучше быть реалистами и именно в реализацию на практике брать что-то, хотя бы частично и в общих чертах, достигаемое. То есть не говорить что "вот был бы у меня движок А, а не Б", или "вот сделают мне ролики и крутые модели, тогда я и сваяю нетленку". А просто взять и что-то сделать. Хотя бы в тетрадке нарисовать, хотя бы приблизительно, хотя бы общий план. Нарисовать одного персонажа, а не триста. Написать не рассказ, но диалог. Это всё вроде бы мелкие и незначительные шаги, но они раз за разом формируют новые условия, от которых можно оттолкнуться ещё дальше, ещё дальше и ещё дальше.

Вот нам нужна игра про партию героев, которые сражаются с врагами, исследуют различные города, имеют систему развития, разные предметы... Начните с одного героя. Одного врага. Сражение с одной только опцией - удар. Вместо города несколько примитивов изображающих дом. Отображение пустого окошка с информацией о герое. И так далее. Потом героев станет два. В статистике появится имя. Врагов станет двое. Кроме ударить, появится вторая опция, пусть она даже сначала не работает. Коробок-домов станет несколько. Появится отображение содержимого сумки, пусть сначала только одна ячейка. Затем героев станет три, и можно будет менять их местами. Враги станут попадаться группами по 2 или 3. Появятся ещё боевые опции. Появится вторая область с "домиками", до которой можно добраться. Итак далее.

Умение думать масштабно вам тем не менее тоже пригодится во время разработки. Потому как вводя новые механики, сущности, параметры, всегда стоит подумать над тем, а что если их потом будет больше. А как лучше адаптировать решения в коде для той ситуации, к которой хочется прийти в дальнейшем. А что можно оптимизировать уже сейчас, чтобы в дальнейшем стало удобнее.

Время от времени переключаться на разные виды деятельности - тоже немаловажно. Так сохраняется нужный уровень интереса и процесс не превращается в скучную рутину. В конце концов мысли и состояния приходят определёнными циклами и ритмами - если неудержимо тянет именно сейчас отвлечься от первостепенных задач и поработать над чем-то не таким важным, но более интересным, то почему бы и нет, пока есть желание.

Всегда записывайте идеи. Они пригодятся не сразу, и, возможно, не для этого проекта. Или даже вовсе не пригодятся в итоге сами по себе, но всегда есть шансы, что позднее они соединяются в нечто цельное или натолкнут на следующую мысль по цепочке. Само их существование воздействует на вас, когда идею записали - это уже не одно и то же, что просто её подумать. Пробуйте, кстати, применять какие-то свои старые идеи к новым проектам, вдруг они неожиданно раскроются в этом новом окружении.

Н

Подробнее..

Recovery mode Восстание игроков замечание об однопользовательских играх

25.03.2021 16:19:55 | Автор: admin

Всем тем, кто не хочет читать: игра не игра, когда она выступает против игрока, то есть наделяется какой-то определённой целью выступать против или за. Понятие "уровня" и "lvl", стоит только его ввести в концепт игры - убивает саму игру, превращая её в обыкновенный спорт, порождающий спидранерство. Но если на территории вашего уровня существует множество некоторых песочных мелочей, которые позволяют не следовать главной "цели", - аркадная игра превращается в отыгрыш собственной личности в пределах закодированного пространства и тех "фич", за счёт которых сие можно производить (например "кулинарии"). Если же изначально игра делается "ролевой", вы опять-таки игру наделяете "самоцелью", а потому разрушаете её бесцельность, и поэтому сталкиваетесь с тем явлением, что именуется манчикизмом. Манчкизм что в RPG, будь они настольные или в киберпространстве, что в MMORPG производится строго по той причине, что игрока обязывают соблюдать эти самые условия прохождений "сюжета" и "уровней", игнорируя тот факт, что сам по себе игрок не хочет участвовать в вашем спектакле, а хочет уйти в лес. Дайте ему возможность погулять в лесу больше, чем спускаться в ваше подзмелье. Ответ хейтерам.

Его (тип игрока*) нельзя изучить, используя методы социологии, потому что он не связан строго ни с каким определённым социумом такой игрок не есть ни человек пользы, приобретения, профессии, труда[1]. Здесь об этом стоит возразить следующим образом: игрок есть адаптирующийся субъект в условии бесцельного экзистенциирования; играть - адаптироваться в условии бесцельного экзистенциирования соответственно. И только на этом моменте понимания "игрока" как адаптатора могут вступить в полемику Юнгеровские счастливый случай, искусность и подражание, к которым сводятся все игры; с того момента как процесс адаптации завершается, то завершается и игра. Но при этом это не будет означать что игра завершится благоприятным или неблагоприятным исходом, завершение игры может произойти и посредством её прервания, ведь сама из себя игра вовсе и не обязана к чему-либо приводить.

В области математики материал, обеспечивающий удовлетворяющий запас истин есть пространство и счётная единица[2]. Сомнений не будет, если обладать таким материалом достаточно для математического воспроизводства игр, например, в киберреальности, ведь существует неединичный пример переноса популярных настольных игр в эту самую цифровую реальность на разных платформах и в формах различных приложений. Тот факт, что математика позволяет воспроизводить игру в её формах сомнения не вызывает также, как это воспроизводство позволяется нам нашим воображением. Поэтому играть, например, в шахматы в киберпространстве по очевидным причинам не является симулированием постольку, поскольку это и есть самые настоящие шахматы, пусть и в цифровом виде.

Не очевидно однако положение противоборства игрока и компьютера: в отличии от реального игрока программа не играет просто так, если играет подходящая для этого формулировка. Тот момент что для игрока программа является полноценным противником даже учитывая её ненастоящесть осуществляется лишь в форме иллюзорной видимости, и форма эта определяется с того момента как появляется уровневая сложность.

Само воззрение о тождественности рационального и игрового поведений нивелируется, и не потому что противник определяется неизвестностью (за счёт тайного знания механик) объективного оценивания сложности игроком, сколько потому, что игра для игрока таким образом может резко поиметь цель; цель победить высокий уровень сложности. Мало того, но с того момента как игрок остаётся один на один с уровневой системой, его противником начинает выступать не игрок, а сама игра, в связи с чем игра в те же шахматы симулируется, как и симулируется игра. Её бесцельное онтологическое основание становится лишь иллюзорной видимостью, ведь теперь она не существует сама по себе, а наделяется вполне конкретной целью: создавать иллюзию реального противника за счёт запрограммированного рационального поведения.

И еще раз: всё где играет компьютер в собственной игровой программе уничтожает саму бесцельность лишь постольку, поскольку симуляция игрового поведения выраженного в уровнях сложности не является отдельной категорией данное заложено в коде игры и является её неотъемлемой частью, а не зрителем, помощником или вирусом. По сему поэтому всё что относится к категории однопользовательской компьютерной игры игрой не является. Общепринято именовать геймплеем то, о чем сейчас шла речь. В этой убийственной для Игры аркадности кроется одно примечательное свойство любой нереальный уровневый противник есть симуляция игры лишь до тех пор, пока на сторону программы не присоединится реальный игрок; в этом же случае участие запрограммированной игры в игре превращается в полноценную механику, формируя самой из себя обязательные выраженные объекты (включая сам "движок"), и лишь за них отвечает программирование и IT в той равной степени, в которой заводы отвечают за изготовление спортивного инвентаря. То единственное, что объективно может предложить для Игры киберпространство многопользовательский киберспорт, или реконструкция игр без участия "уровня".

Обманным будет то суждение, что "геймплей" разрушив собой онтологическое основание Игры (бесцельную экзистенциальность) разрушает Игру как таковую внутри себя; "геймплей" есть только вид самотождественной реальности, что ограничивает свободу выбора Игровых сфер за счёт самого себя, и не больше. Тем более "аркадный геймплей" искуснее, чем более в нём можно не делать того, что изначально и должно было отразить саму игру. То есть любая игра внутри компьютерной программы есть ролевая игра от имени самой программы, а уже её внутренние механики являются инструментами для ролевой игры, и тем более она искусна, чем более побуждает к ролевой игре, нежели наделяется самосмыслом ролевого отыгрыша. Именуемый здесь термин аркада есть самовольная попытка описать уровневую логику организации игрового процесса, то есть уровень полностью отождествляется с аркадой.

Что побуждает к ролевой игре есть не механики, так как механики ролевой игры указывают на саму цель ролевого отыгрыша; они также не являются и частью баланса лишь в связи с первоосновой баланса киберпространства (кодирование, программирование, исследование и получение данных и т.д.), поэтому побуждение к ролевой игре в таком пространстве есть посредственное следствие того, что хотел отразить разработчик. Игра актёра же находится на той же самой ступени, но не как посредственное следствие, но как движимое стихийным элементом подражания основа. Ролевое отыгрывание же самого себя вопрос исключительно механик, ибо обладание собственной ролью себя экзистенциальный закон, а не следствие или взятое за основу единичное условие.

Таким образом ролевое бесцельное экзистенциирование как основа адаптации, ролевое бесцельное экзистенциирование как механизм адаптации и ролевое бесцельное экзистенциирование как следствие адаптации есть три пункта горизонтальной ролевой мобильности игрока, где само творение путей мобилизации есть искусство. Поэтому определяем: корень искусности ролевой игры лежит в искусном сочетании адаптационной роли как её следствие, механизм и основа.

Из всего этого можно вывести тезис: киберпространственные игры есть игры только ролевые для одиночного игрока, или спортивные игры для (что очевидно) спортсменов. То же, что совмещает спорт и ролевую игру в киберпространстве не есть массовая многопользовательская ролевая онлайн- игра, поскольку мморпг лишь иллюзорно обладает спортивными элементами командного соперничества: ММОРПГ не заканчивается НИКОГДА, в ней НЕЛЬЗЯ ни победить, ни проиграть, и собственно умереть в ней нельзя. ММОРПГ является в своей сути ни киберспортом, и не киберролеплеем, - это есть одно из самых настоящих порождений киберигровой мифологии.


[1] Ф.Г. Юнгер: Игры и ключ к их значению, стр.68

[2] Г.В.Ф. Гегель: Феноменология Духа, стр.28

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru