Календарь по методу счёта Юлианских дней

Календарь по методу счёта Юлианских дней

Календарь по рецепту 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

Изменено: Nex
17.Июн.15 13:20:27
Nex
useravatar
Offline
4277 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Календарь по методу счёта Юлианских дней

Логично было бы добавить сюда и вот этот текст.

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

Код:

$year = iif (year < 1, '<<-year+1>> г. до н.э.', '<<year>> г.')) 

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

evp
useravatar
Offline
383 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

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

Это все. Следующим сообщением приведу пример использования.

evp
useravatar
Offline
383 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

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'

Пробуйте и следите за датой smile
example.qsp

evp
useravatar
Offline
383 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Информация

Статистика форума:
 
Всего тем:
970
Всего опросов:
14
Всего сообщений:
16790543
Всего сообщений сегодня:
2
Пользователи форума:
 
Всего пользователей:
2346
Последним зарегистрировался:
Rizrael