Как я могу реализовать Offline Skilling

13

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

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

Благодарность!

Dream Lane
источник

Ответы:

17

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

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

Яри ​​Комппа
источник
2
Внезапно становится понятно, почему они заставляют вас приостанавливать тренировки, если вы меняете свои атрибуты, которые влияют на скорость тренировки! Потому что они пересчитывают нужную дельту ... Отлично, спасибо!
Dream Lane
5
@Dream Lane, чтобы облегчить любую потенциальную вычислительную нагрузку, которая будет иметься. Пересчитывайте заработанные навыки / очки только при входе пользователя в систему. Поэтому, если тысячи людей вышли из системы, это не повлечет за собой никаких накладных расходов.
AttackingHobo
2

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

timeRemaining = currentTime - logoutTime
while ( timeRemaining > 0 and hasQueuedSkill() ) {
     skillTime -= timeRemaining
     if ( skillTime <= 0 ) {
           popSkill()
           timeRemaining = -skillTime
     }
}
Эльва
источник