Календарь по методу счёта Юлианских дней
Календарь по методу счёта Юлианских дней
Календарь по рецепту evp. Примечания авторские.
Код:
JDN = JDNStart + time/1440
hour = (time/60) MOD 24
minut = time MOD 60
weekday = (JDN MOD 7) + 1
JDa = JDN + 32044
JDb = (4*JDa + 3)/146097
JDc = JDa - (146097*JDb/4)
JDd = (4*JDc + 3)/1461
JDe = JDc - 1461*JDd/4
JDm = (5*JDe + 2)/153
day = JDe - (153*JDm+2)/5 + 1
month = JDm + 3 - 12*(JDm/10)
year = 100*JDb + JDd - 4800 + JDm/10
$hour = iif (hour < 10, '0<<hour>>', '<<hour>>')
$minut = iif (minut < 10, '0<<minut>>', '<<minut>>')
Этот код можно поместить в $ONNEWLOC или любую другую локацию по вашему вкусу.
JDNStart для любой даты можно вычислить, например, здесь (не забудьте указать время после полудня, т.к. Юлианский день начинается в полдень, в отличие от привычной нам даты).
Для интересующихся: теория.
Ну и для представления в текстовом виде:
Код:
$weekday[1] = 'Понедельник'
$weekday[2] = 'Вторник'
$weekday[3] = 'Среда'
$weekday[4] = 'Четверг'
$weekday[5] = 'Пятница'
$weekday[6] = 'Суббота'
$weekday[7] = 'Воскресенье'
$month[1] = 'Январь'
$month[2] = 'Февраль'
$month[3] = 'Март'
$month[4] = 'Апрель'
$month[5] = 'Май'
$month[6] = 'Июнь'
$month[7] = 'Июль'
$month[8] = 'Август'
$month[9] = 'Сентябрь'
$month[10] = 'Октябрь'
$month[11] = 'Ноябрь'
$month[12] = 'Декабрь'
Теперь вы можете пользоваться нормальным календарем.
Чтобы использовать Григорианский календарь в своей игре, вы должны определить JDN того дня, когда игра начинается. (Популярное объяснение концепции счета Юлианских дней дано, например, тут).
К примеру, ваша игра должна начаться 7 ноября 1917 года, среда. Для своих целей вы можете воспользоваться калькулятором. Подставив в нужные поля дату, вы получите JDN = 2421539.5. Но вы же прочитали предыдущую ссылку? Тогда вы знаете, что 2421539-й Юлианский день начался в полдень 6 ноября 1917, а в полдень 7 ноября 1917 начнется 2421540-й Юлианский день. Ок. На стартовой локации присваиваем значение переменной:
Код:
JDNstart = 2421540
Далее заполняем текстовые массивы с названиями дней недели и месяцев. Это можно сделать в той-же стартовой локации, либо другой, специально для этого созданной и вызываемой при старте через оператор gs. Код для этого приведен во второй половине моего сообщения.
Создаем локацию 'calendar'. В нее вставляем код, приведенный мной там же в первой части сообщения.
Время в вашей игре будет храниться в переменной с непредсказуемым именем time. Каждый раз, когда вы совершаете действие, которое должно занять какое-то время, то в коде этого действия вы должны предусмотреть изменение переменной time. Например:
Код:
act 'Ехать в Смольный':
time += 45
gt 'smolny'
end
Итак, мы обеспечили непрерывное течение времени в игре и можем вывести дату и время тогда, когда нам нужно, например, так:
Код:
gs 'calendar'
*nl $weekday[weekday] + ',' + day + $month[month] + ' ' + year + 'года' + '. ' + $hour + ':' + $minut
17.Июн.15 13:20:27
Re: Календарь по методу счёта Юлианских дней
Логично было бы добавить сюда и вот этот текст.
Этот алгоритм хорошо работает на датах от 1 г. н.э. и дальше. Но если вы хотите его использовать для отображения дат до нашей эры, то рекомендую добавить вот это:
Код:
$year = iif (year < 1, '<<-year+1>> г. до н.э.', '<<year>> г.'))
Это становится необходимым, если вы действительно хотите, чтобы отображение дат полностью соответствовало Григорианскому календарю. Дело тут в том, что алгоритм вычисляет астрономический счет лет, при котором за -1-м годом следует нулевой год, а затем 1-й год. В Григорианском же календаре принято, что первому году н.э. предшествовал 1-й год до н.э. Нулевого года в Григорианском календаре нет.
Re: Календарь по методу счёта Юлианских дней
Мне в личку поступают вопросы. Люди не могут разобраться как же правильно использовать календарь в игре. Сейчас попробую все изложить по порядку (многое будет цитированием предыдущих сообщений, но разложено в логической последовательности.
Первое.
Создаем локацию calendar с вот таким кодом:
Код:
JDN = JDNStart + time/1440
hour = (time/60) MOD 24
minut = time MOD 60
weekday = (JDN MOD 7) + 1
JDa = JDN + 32044
JDb = (4*JDa + 3)/146097
JDc = JDa - (146097*JDb/4)
JDd = (4*JDc + 3)/1461
JDe = JDc - 1461*JDd/4
JDm = (5*JDe + 2)/153
day = JDe - (153*JDm+2)/5 + 1
month = JDm + 3 - 12*(JDm/10)
year = 100*JDb + JDd - 4800 + JDm/10
$hour = iif (hour < 10, '0<<hour>>', '<<hour>>')
$minut = iif (minut < 10, '0<<minut>>', '<<minut>>')
Этот код не надо понимать, важно только знать, что арифметический алгоритм, положенный в его основу, работает. Ссылки есть выше.
Второе.
Создаем локацию constants с вот таким кодом:
Код:
$weekday[1] = 'Понедельник'
$weekday[2] = 'Вторник'
$weekday[3] = 'Среда'
$weekday[4] = 'Четверг'
$weekday[5] = 'Пятница'
$weekday[6] = 'Суббота'
$weekday[7] = 'Воскресенье'
$month[1] = 'Январь'
$month[2] = 'Февраль'
$month[3] = 'Март'
$month[4] = 'Апрель'
$month[5] = 'Май'
$month[6] = 'Июнь'
$month[7] = 'Июль'
$month[8] = 'Август'
$month[9] = 'Сентябрь'
$month[10] = 'Октябрь'
$month[11] = 'Ноябрь'
$month[12] = 'Декабрь'
Третье.
Чтобы эти массивы с константами инициализировались, в стартовую локацию поместим строчку:
Код:
gs 'constants'
Четвертое.
Дата с которой начинается игра хранится в переменной JDNstart. Вам необходимо знать значение этой переменной. Вот как это можно сделать.
К примеру, ваша игра должна начаться 7 ноября 1917 года, среда. Для своих целей вы можете воспользоваться калькулятором. Подставив в нужные поля дату (7 ноября 1917 года), вы получите JDN = 2421539.5. Но надо иметь ввиду, что 2421539-й Юлианский день начался в полдень 6 ноября 1917, а в полдень 7 ноября 1917 начнется 2421540-й Юлианский день. На стартовой локации присваиваем значение переменной:
Код:
JDNstart = 2421540
Это все. Следующим сообщением приведу пример использования.
Re: Календарь по методу счёта Юлианских дней
Пусть у нас есть локации:
smolny
Код:
*nl'Смольный'
*nl $weekday[weekday] + ', ' + day + ' ' + $month[month] + ' ' + year + 'года' + '. ' + $hour + ':' + $minut
act 'Ехать на вокзал':
time += 45
gs 'calendar'
gt 'station'
end
station
Код:
*nl'Вокзал'
*nl $weekday[weekday] + ', ' + day + ' ' + $month[month] + ' ' + year + 'года' + '. ' + $hour + ':' + $minut
act 'Ехать в Смольный':
time += 45
gs 'calendar'
gt 'smolny'
end
act 'Ехать в Москву (время в пути 1 сутки, 3 часа)':
time += 1620
gs 'calendar'
gt 'moscow'
end
moscow
Код:
*nl'Москва'
*nl $weekday[weekday] + ', ' + day + ' ' + $month[month] + ' ' + year + 'года' + '. ' + $hour + ':' + $minut
act 'Ехать в Питер (время в пути 1 сутки, 3 часа 45 минут)':
time += 1665
gs 'calendar'
gt 'station'
end
В стартовой локации у нас есть строчки:
Код:
gs 'constants'
JDNstart = 2421540
gs 'calendar'
gt 'smolny'
Пробуйте и следите за датой
example.qsp
- Список
- » Обсуждение и разработка игр
- » Календарь по методу счёта Юлианских дней
Информация
- Статистика форума:
- Всего тем:
- 1013
- Всего опросов:
- 14
- Всего сообщений:
- 16790943
- Всего сообщений сегодня:
- 6
- Пользователи форума:
- Всего пользователей:
- 2613
- Последним зарегистрировался:
- noexky