Есть такая проблема в современных играх, как "дикий рэндом".
Например, учёные могут обнаружить звезду, планету, или может произойти какое-то случайное событие, но если игрок начнёт с сейва, сохранённого ходом ранее, то этого скорее всего не произойдёт и может не произойти и 50 ходов и 100 и более. Казалось бы, если астрономы туда смотрят, работают так сказать в этом направлении, то они уже на пороге открытия. Откроют эту звезду не сегодня так завтра. Да и случайному событию есть какие-то предпосылки. Но нет.
Вот это, убивает реалистичность и бесит игрока гораздо сильнее чем строительство поселенца 200 лет. Строительство поселенца 200 лет, это игровые условности, которые принимаются как данность и уже не замечаются, а вот когда происходит нечто подобное со случайными событиями, игрок сразу понимает, что его жестоко надувают. Никакие учёные не заняты поиском звёзд и планет, и к случайному событию никаких предпосылок тоже не было. Просто формула рэндома сработала, выпало на кубиках так, а могло и не выпасть.
Во первых, это убивает атмосферу игры. Если игрок вжился во вселенную и процесс, это его за шкирку оттуда достаёт.
Во вторых, это порождает сейв/лоад. Игрок начинает с сейва, и переигрывает переход хода многократно, пока не произойдёт нужное событие. Оффтоп
Так как решить эту проблему?
Обычно, для этого используется bool переменная (true/false - Видим/Невидим - Произошло/Не произошло).
Так вот что я предлагаю. Я предлагаю использовать не bool переменную, а byte. И значения от 0 до 254 будут означать невидима, а значение 255 - видима (произошло/не произошло).
При этом, каждый ход по какой-то там формуле вычисляется (рэндомно) возможность обнаружения звезды, и если сработала эта вероятность, мы добавляем единичку (где-то может и больше). Так этот параметр накапливается, а по достижении 244, включается счётчик, который каждый ход добавляет единичку уже независимо ни от чего. Тогда такой ситуации как я описал выше уже не возникнет.
Если игрок начнёт с ближайшего сейва, то он всё равно обнаружит в этот же ход звезду. А если с более далёкого, ну всё равно, где-то в этом районе (по времени) она будет обнаружена. И чем дальше от этого момента, тем больше могут быть отличия, хотя всё равно такого дикого рэндома уже не будет.
И игрок будет вживаться в мир игры. Будет понимать что его учёные изучают, его телескопы ищут, и процесс идёт, данные накапливаются, а по достижении какого-то момента уже нужно лишь обобщить эти данные и всё готово. "МЫ ОТКРЫЛИ НЕОБЫЧНУЮ ЗВЕЗДУ! Она появляется каждый месяц семнадцатого числа, а двадцатого числа исчезает!!!"
Примерно так.
Оффтоп
Механизм случайных событий.
Механизм случайных событий.
Если нужен рандом, который после множества загрузок с одной сохраненки выдает одну и туже последоваительность событий, есть множество примитивных и активно использующихся вариантов:
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. выбор целей в империи/галактике (если нужно, к примеру для пулучения исследовательского бонуса может быть нужна только империя без места, а для случайной аномалии переносящей корабль нужно целых две цели - корабль и его новые координаты)
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. выбор целей в империи/галактике (если нужно, к примеру для пулучения исследовательского бонуса может быть нужна только империя без места, а для случайной аномалии переносящей корабль нужно целых две цели - корабль и его новые координаты)
Механизм случайных событий.
Тут много умных мыслей прозвучало которых я от части не понял, ну да ладно, выскажу свои соображения.
События исследования можно сделать "накопительные".
Например, мы выделяем людей на изучение звёзд. И каждый ход мы имеем шанс сделать открытие в этой области (обнаружить странность в "поведении" звезды, например). Каждый ход наши учёные прочёсывают сектор неба за сектором. В первый ход исследований мы выкидываем число от 0 до 100 например, и если выпадет скажем 90-100, то обнаружение свершилось. Во второй ход, также выкидываем 0-100, но свершение события скажем произойдёт уже при выпадании 85-100, и так ход за ходом шанс "джекпота" увеличивается.
События исследования можно сделать "накопительные".
Например, мы выделяем людей на изучение звёзд. И каждый ход мы имеем шанс сделать открытие в этой области (обнаружить странность в "поведении" звезды, например). Каждый ход наши учёные прочёсывают сектор неба за сектором. В первый ход исследований мы выкидываем число от 0 до 100 например, и если выпадет скажем 90-100, то обнаружение свершилось. Во второй ход, также выкидываем 0-100, но свершение события скажем произойдёт уже при выпадании 85-100, и так ход за ходом шанс "джекпота" увеличивается.
Механизм случайных событий.
я предлагаю обсуждать не как реализовать, а что вы хотите получить в результате...
обсуждение как это сделать, это следующий этап..
обсуждение как это сделать, это следующий этап..
Механизм случайных событий.
Этот метод скорее можно задействовать для древа технологий. Тема открывалась на случайные события а не планомерные.Malin писал(а): ↑08 фев 2012, 23:28События исследования можно сделать "накопительные".
Например, мы выделяем людей на изучение звёзд. И каждый ход мы имеем шанс сделать открытие в этой области (обнаружить странность в "поведении" звезды, например). Каждый ход наши учёные прочёсывают сектор неба за сектором. В первый ход исследований мы выкидываем число от 0 до 100 например, и если выпадет скажем 90-100, то обнаружение свершилось. Во второй ход, также выкидываем 0-100, но свершение события скажем произойдёт уже при выпадании 85-100, и так ход за ходом шанс "джекпота" увеличивается.
С исследованием космоса вопрос уже обсуждался - чем выше светимость/ниже стелс обьекта и выше детектирующая способность, тем ывше шанс обнаружить обьект.
В таком случае тему можно закрытвать до лучших времен - создать тему куда остоянно добавлять планируемые случайные собыития и в ней же стараться их классифицировать и разбить на группы по необходимым действиям.
Механизм случайных событий.
Я только "ЗА".
Создашь?
Хотя бы просто перечень случайных событий составить, это уже было бы очень неплохо.
Ещё такой момент. Надо составить список всяких необычностей, которые могут быть на планете. Не повспоминаешь, что встречалось в других играх подобной тематики?
Механизм случайных событий.
А это как раз очень не срочное дело. Это же надстройка, а не каркас концепции.
Можно даже и того реже обобщать, да и вряд ли за месяц много напишут.
Но смотри сам. Естественно тут всё добровольно и в удовольствие. По другому делать не надо.