Yvision.kzYvision.kz
kk
Разное
Разное
399 772 постов41 подписчиков
Всяко-разно
0
08:05, 05 января 2014

Создание календаря Тамриэля

Blog post image

Не так давно, играя в Skyrim, решил разобраться с календарем и системой летосчисления Тамриэля. Почитал тематические вики, немного изучил тему, и пришла идея создания программы или веб-сайта, который бы просто показывал текущую дату в стиле TES, например "1-ое число месяца Вечерней звезды" (первое Декабря).

От написания программы пришлось отказаться, сделать ее достаточно красивой и полезной, чтобы ее устанавливали и скачивали было-бы очень сложно. Поэтому я решил, что это будет сайт. Т.к. с JavaScript я не очень дружу, было решено писать все на php. Забегая вперед скажу, что сразу я не подумал о том, что функция date() в php берет время и дату установленные на сервере, поэтому мой календарь будет актуален лишь для некоторой части планеты.

С тем, каким образом будет оформлен календарь проблем не было, идея пришла сразу, сделать все как в игре, просто лист бумаги, на котором "рукописным" шрифтом была-бы написана нужная информация. Поиск текстуры листа бумаги не занял много времени, вот что нашлось:

Blog post image

После чего была сверстана простая страница, с блоком содержащим это изображение как фон. Фоном же страницы стал просто затемненный скриншот из игры, в итоге получилось что-то вроде этого:

Blog post image

Теперь, когда основа страницы была готова, нужен php код который бы превращал текущую дату непосредственно в Тамриэльскую.

Реализовано при помощи простых кейсов:

 

  1. $mon = date("n");//номер месяца 1...12
  2. switch ($mon) {//кейсы выбора имени месяца
  3. case 1:
  4. $mon_name = "Утренней звезды";//название на Тамриэльском со склонением
  5. $star_keepers = "Ритуала";//созвездие покровитель со склонением
  6. $star_keeper = "Ритуал";//созвездие покровитель без склонения
  7. $mon_realname = 'Январь';//реальное название (для вывода всплывающей подсказки в теге <abbr>)
  8. break;
  9. case 2:
  10. $mon_name = "Восхода солнца";
  11. $star_keepers = "Любовника";
  12. $star_keeper = "Любовник";
  13. $mon_realname = 'Февраль';
  14. break;
  15. case 3:
  16. $mon_name = "Первого зерна";
  17. $star_keepers = "Лорда";
  18. $star_keeper = "Лорд";
  19. $mon_realname = 'Март';
  20. break;

И так далее для 12 месяцев и 7ми дней недели.

Вы могли заметить переменную содержащую простое название месяца - $mon_realname. Она необходима для всплывающего текста подсказки при наведении мыши на название месяца или дня недели.

Теперь, выведя полученный результат на страницу мы видим примерно следующее:

Blog post image

Вполне приемлемо, но, пустовато. В этот момент и пришла идея сделать на странице, помимо календаря, еще и запись о том, какой праздник сегодня празднуется. Благо, тут проблем тоже не возникло, вселенная TES имеет чуть ли не самую богатую мифологию и историю из всех вымышленных вселенных, поэтому обратившись к викия-сайту по серии игр TES я получил список праздников с описаниями и датами. Дело осталось "за малым", заставить эти данные появляться на странице.

Решение пришло быстро, возможно это конечно не самый удачный и красивый способ, но он работает, а остальное не так важно. Смысл был вот в чем, информация о празднике делится на 3 категории: дата (день/месяц), название, описание. Распределив эти данные на 3 строки в текстовом файле, можно было получить отлично машинно-читаемый файл. Правда над датой пришлось немного поработать, ее я решил записывать просто в виде двух цифр с ведущими нолями, например, второе января - 0201. Выглядит примерно так:

 

  1. 0101
  2. Новый год
  3. Описание праздника может быть довольно длинным, несколько предложений
 

Теперь нужен код, который бы при каждом обращении к сайту, проверял текущую дату, заглядывал в файл с праздниками, и в случае нахождения текущей даты в списке, выводил бы 2 строки - название и описание.

 

  1. $day=date("d");
  2. $mon = date("m");
  3. $holiday_id = "$day$mon";
  4. $arr = file("data/holidays.txt"); // Считывание файла в массив
  5. for ($i = 0; $i <= count($arr); $i++)
  6. {
  7. $string = $arr[$i];
  8. $string = str_replace("\r\n","",$string);//удаляем символы перевода строк
  9. $string = str_replace("\r","",$string);//удаляем символы перевода строк
  10. $string = str_replace("\n","",$string);//удаляем символы перевода строк
  11. if ($string == $holiday_id){//если строка массива совпала с id праздника
  12. $holiday_name=$arr[$i+1];//следующие две строки это название и описание праздника, получаем их и выводим
  13. $holiday_descr=$arr[$i+2];
  14. }

Как видно из кода, сначала мы получаем дату и месяц, потом приводим их в вид четырехзначного числа. Далее считываем файл в массив, после чего запускаем цикл поиска "id" праздника в массиве. В случае совпадения считываем последующие две строки массива $arr[$i+1] и $arr[$i+2].

Небольшое отступление:
Изначально строки никак не хотели совпадать, даже если я был уверен что искомая комбинация цифр точно присутствует в файле. Позже проблема была обнаружена, при сохранении текстового файла в конце каждой строки добавляется символ перевода строки. Этот символ также считывается и в массив, и при сравнении получается что данные не совпадают. При помощи str_replace() это быстро решилось.
В итоге, получилось так:

Blog post image

Отдельно следует отметить что на странице использован опенсорсный веб-шрифт Alexander, подключенный в css таким образом:


  1. @font-face {
  2. font-family: 'Alexander';
  3. src: url('http://64424.selcdn.ru/webfont/alexander/alexander.eot');
  4. src: local('Alexander'), local('Alexander Regular'), url('http://64424.selcdn.ru/webfont/alexander/alexander.woff') format('woff'),
  5. url('http://64424.selcdn.ru/webfont/alexander/alexander.ttf') format('truetype');
  6. font-weight: normal;
  7. font-style: normal;
  8. }

Напоследок в правый нижний угол экрана был прикреплен блок, сообщающий что информация взята с викии The Elder Scrolls, и что эта страница использует лицензию CreativeCommons (чего требует сайт wikia).

Blog post image

На данный момент сайт еще не закончен, все из-за проблемы с датой и часовыми поясами, планирую добавить JavaScript, который бы узнавал дату на компьютере посетителя, и делился этой информацией с php.

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

 
0
1624
1