RU

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

Nex Moderator 17.06.2015 10:18 3 comments 13295 views

Календарь по рецепту 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
Edited at 17.06.2015 10:20 (10 years ago)

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

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

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

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

Мне в личку поступают вопросы. Люди не могут разобраться как же правильно использовать календарь в игре. Сейчас попробую все изложить по порядку (многое будет цитированием предыдущих сообщений, но разложено в логической последовательности.

Первое.
Создаем локацию 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

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

Пусть у нас есть локации:
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

Log in or Register to post comments.