Механизм случайных событий.

(Только для группы "MOSC ДизДок") Здесь идёт написание Дизайн Документа для игры "Master of Star Control".
Закрыто
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3195
Регистрация: 24 янв 2011

Механизм случайных событий.

Сообщение Vasaka »

Есть такая проблема в современных играх, как "дикий рэндом".

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

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

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

Так как решить эту проблему?

Обычно, для этого используется bool переменная (true/false - Видим/Невидим - Произошло/Не произошло).

Так вот что я предлагаю. Я предлагаю использовать не bool переменную, а byte. И значения от 0 до 254 будут означать невидима, а значение 255 - видима (произошло/не произошло).
При этом, каждый ход по какой-то там формуле вычисляется (рэндомно) возможность обнаружения звезды, и если сработала эта вероятность, мы добавляем единичку (где-то может и больше). Так этот параметр накапливается, а по достижении 244, включается счётчик, который каждый ход добавляет единичку уже независимо ни от чего. Тогда такой ситуации как я описал выше уже не возникнет.

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

И игрок будет вживаться в мир игры. Будет понимать что его учёные изучают, его телескопы ищут, и процесс идёт, данные накапливаются, а по достижении какого-то момента уже нужно лишь обобщить эти данные и всё готово. "МЫ ОТКРЫЛИ НЕОБЫЧНУЮ ЗВЕЗДУ! Она появляется каждый месяц семнадцатого числа, а двадцатого числа исчезает!!!"
Примерно так. :D :dance2:

Оффтоп
AndreyKl
Сообщения: 51
Регистрация: 22 фев 2011

Механизм случайных событий.

Сообщение AndreyKl »

Если нужен рандом, который после множества загрузок с одной сохраненки выдает одну и туже последоваительность событий, есть множество примитивных и активно использующихся вариантов:
1. рандом инициализировать определенным числом и в сейве хранить номер елемента с которого стартовать.
2. Генерить последовательности скажем на 20-30 событий вперед, хранить оные в сейвах (есть некоторые преимущества)
3. Написать собственный рандом (не сложно на самом деле).

Заметка: еще должна быть некая расчетная функция определяющая частоту событий в зависимости от рамера империи и её активности (если событие направленно вообще по космосу, выбор империи можно пропустить или игнорировать). Эту функцию можно завязать даже на все империи сразу - тогда она будет инициализироваться неким числом среднегалактичских событий на единицу населения+активность приказов. А внутри будет в зависимости от выпавшего числа определятся империя на чью долю выпадет этакое счастье. Этот же генератор выбора с учетом псевдослучайного генератора 1-3 будет генерить события идентичными после загрузки с сейва, но только до тех пор, пока империи не меняют своё поведение слишком резко. (тоесть выбор империи, затем события, затем доп проверка, может ли у империи возникнуть такое событие, послдовательность можно менять - не критично, зависит от желаемого результата).
На этепе выбора империй можно цчесть некие общие бонусы.
Кстати функцию выбора частоты событий можно привязать обратнопропорционально к активности игроков, тогда чем меньше в космосе войн, тем больше событий (пригодится если разделять расчет вероятности события на типы - зависящие от империй типа взрыва баков и не зависящие типа взрыва сверх нов).

P.S. игры обычно не оперериют bool для случайных величин, когда у тебя несколько десятков событий, глупо проверять каждое.
пример: есть массив событий, у каждого из них есть некое число - шанс выпадения (для простоты не %, не охота ими опереривать, в процентах можно будет четче задавать шансы, но может потребоваться несколько другая арифметика, не на столько гибкая).
Событие/империя/место/обьект 1 - шанс 30
Событие 2 - шанс 300
Событие 3 - шанс 50
Событие 4 - шанс 100
*если уже выбрали империю и даже место, то можно в этом массиве сразу учесть некоторые вещи, к примеру абилку Luck сдвигающую вероятность от плохих событий сторону хороших/нейтральных либо добавив событие 5=ничего не происходит.

1. считаем сумму и генерим нашим рандомом число, от него берем остаток %сумма.
2. прогоняем весь массив выполняя операцию остаток-=событие[n] до тех пор, пока не останется чило <=0 в остатке (foreach бытсрее), как только это и произойдет, мы берем событие на котором достигли 0.
3. Выбо места удара события если такое необходимо, опять же массив мест с шансом события (на этом этапе можно учесть локальные эффекты, сдвинуть шансы от хорошо защищенных систем к слабо защищенным и т п, на пример в системах со сканером ресурсов выше шанс обнаружения ресурсных жил, а в системе с патрулем - ниже шанс нападения пиратов, вообще очень удобно исполльтзовать для саботажа и нападения пиратов - так как оба события с большей вероятностью произойдут в менее защищенных местах, крупный саботаж - наоборот).

P.P.S. Возможно, что придется реализовывать несколько разных линий для событий так как иногда желаетльно сперва знать тип события, а потом уже империю в которуюю оно ударит, я пока предлагаю общий вариант:
1. некая псевдо случайная функция выдает parametr событий на этом ходу в зависимости от общего начелеения и расходов материалов, активных приказов (возможно их важности), времени от предыдущего события
2. Выбор события, если его цена меньше параметра из 1(цена - скорее всего число обратнопропорциональное шансу), то выходим, событие игнорируется, если >, то parametr-=цена события; событие пускается к пункту 3, генерится следующее событие, пока сгенереное событие не будет больше параметра, либо параметр не уменьшится до 0 (учитывать что 0 меньше любого события, условие в коде можно не учитывать)
3. выбор империи(если имеет значение, для взрыва сверхновой империя не нужна, а вот при вирусах по любому бонусы считать)
4. выбор целей в империи/галактике (если нужно, к примеру для пулучения исследовательского бонуса может быть нужна только империя без места, а для случайной аномалии переносящей корабль нужно целых две цели - корабль и его новые координаты)
Аватара пользователя
Malin
Сообщения: 2027
Регистрация: 28 май 2023

Механизм случайных событий.

Сообщение Malin »

Тут много умных мыслей прозвучало которых я от части не понял, ну да ладно, выскажу свои соображения.
События исследования можно сделать "накопительные".
Например, мы выделяем людей на изучение звёзд. И каждый ход мы имеем шанс сделать открытие в этой области (обнаружить странность в "поведении" звезды, например). Каждый ход наши учёные прочёсывают сектор неба за сектором. В первый ход исследований мы выкидываем число от 0 до 100 например, и если выпадет скажем 90-100, то обнаружение свершилось. Во второй ход, также выкидываем 0-100, но свершение события скажем произойдёт уже при выпадании 85-100, и так ход за ходом шанс "джекпота" увеличивается.
Аватара пользователя
Snake_B
MOSC Team
Сообщения: 285
Регистрация: 25 янв 2011

Механизм случайных событий.

Сообщение Snake_B »

я предлагаю обсуждать не как реализовать, а что вы хотите получить в результате...
обсуждение как это сделать, это следующий этап..
Изображение
AndreyKl
Сообщения: 51
Регистрация: 22 фев 2011

Механизм случайных событий.

Сообщение AndreyKl »

Malin писал(а): 08 фев 2012, 23:28События исследования можно сделать "накопительные".
Например, мы выделяем людей на изучение звёзд. И каждый ход мы имеем шанс сделать открытие в этой области (обнаружить странность в "поведении" звезды, например). Каждый ход наши учёные прочёсывают сектор неба за сектором. В первый ход исследований мы выкидываем число от 0 до 100 например, и если выпадет скажем 90-100, то обнаружение свершилось. Во второй ход, также выкидываем 0-100, но свершение события скажем произойдёт уже при выпадании 85-100, и так ход за ходом шанс "джекпота" увеличивается.
Этот метод скорее можно задействовать для древа технологий. Тема открывалась на случайные события а не планомерные.
С исследованием космоса вопрос уже обсуждался - чем выше светимость/ниже стелс обьекта и выше детектирующая способность, тем ывше шанс обнаружить обьект.

Snake_B писал(а): 09 фев 2012, 01:22я предлагаю обсуждать не как реализовать, а что вы хотите получить в результате...
обсуждение как это сделать, это следующий этап..
В таком случае тему можно закрытвать до лучших времен - создать тему куда остоянно добавлять планируемые случайные собыития и в ней же стараться их классифицировать и разбить на группы по необходимым действиям.
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3195
Регистрация: 24 янв 2011

Механизм случайных событий.

Сообщение Vasaka »

AndreyKl писал(а): 09 фев 2012, 15:12В таком случае тему можно закрытвать до лучших времен - создать тему куда остоянно добавлять планируемые случайные собыития и в ней же стараться их классифицировать и разбить на группы по необходимым действиям.


Я только "ЗА". :yes:
Создашь?

Хотя бы просто перечень случайных событий составить, это уже было бы очень неплохо.

Ещё такой момент. Надо составить список всяких необычностей, которые могут быть на планете. Не повспоминаешь, что встречалось в других играх подобной тематики?
AndreyKl
Сообщения: 51
Регистрация: 22 фев 2011

Механизм случайных событий.

Сообщение AndreyKl »

Vasaka писал(а): 09 фев 2012, 15:49Создашь?
Лучше не буду - нужно будет закреплять сообщения в первом посте, а я порой пропадаю на месяц - полтора в своих проектах.
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3195
Регистрация: 24 янв 2011

Механизм случайных событий.

Сообщение Vasaka »

AndreyKl писал(а): 09 фев 2012, 18:30Лучше не буду - нужно будет закреплять сообщения в первом посте, а я порой пропадаю на месяц - полтора в своих проектах.

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

Но смотри сам. Естественно тут всё добровольно и в удовольствие. По другому делать не надо.
Закрыто