Я играю в Heroes of Might and Magic со времен
Цели были следующие:
- Избавиться от дубликатов карт
- Точно знать, играл я в эту карту или нет, если играл, то знать статус: выиграл, проиграл или пропустил
- Иметь возможность загружать в органайзер новые карты с проверкой на уникальность
- Писать свой личный комментарий к карте
- Иметь возможность мгновенно отсортировать каталог карт по следующим параметрам:
названию, статусу, версии, кодировке, размеру карты, наличию подземелья, уровню сложности и размеру файла
Скриншоты
Скриншоты кликабельные
Полный каталог карт
Работа с фильтрами. Здесь я отсортировал карты, в которые я не играл, версии SOD (The Shadow of Death), кодировка ascii, размер Extra Large, на картах есть подземелье, уровень сложности Impossible. Зеленая иконка — для загрузки карты из каталога на локальный компьютер.
Работа с картой, если нажать на иконку с ручкой. В модальном окне все очевидно и видно, когда я последний раз играл в эту карту.
Попытка загрузки карты, которая уже есть в каталоге.
Установка и запуск
- Скачиваем и распаковываем архив с виртуальной-машиной:
Скачать с yadisk 1,44GB
- Скачиваем и устанавливаем VMware Workstation Player (Пропускаем этот пункт, если VMware-Workstation установлен).
- Запускаем виртуальную машину. Дожидаемся, когда она загрузится, и смотрим IP адрес, который ей присвоил VMware:
Если IP не назначилсяТо либо перезагрузите виртуалку средствами vmware, либо авторизуйтесь
Логин: root
Пароль: hero
И введите команду:
ifconfig
Увидите текущий IP.
А с помощью команды:
nmtui
Можно его зафиксировать, чтобы он не менялся, настроив статику.
Вбиваем этот адрес в браузер и попадем в органайзер со всеми картами, как на скриншотах.
Подробности для программистов и для интересующихся
Все это «хозяйство» написано на python3.
В качестве фреймворка выбрал Flask.
База данных: MongoDB.
Фронтенд: bootstrap3 и DataTables
Парсить карту Heroes III можно с помощь стандартных python модулей: gzip и struct. Модуль gzip распаковывает файл, так как он хранится в сжатом виде. Модуль struct предлагает функцию unpack() для работы с форматами двоичных записей переменной длины, а функция calcsize возвращает размер структуры. Код «I» для четырех байтовых без знаковых чисел. Код "<" обозначает, что числа стандартного размера и байты записаны в порядке «сначала младший» (little-endian).
Нижеследующий код получает версию Героев у файла с именем Zyconia.h3m
>>> h3m_versions = {0x0E: "RoE", 0x15: "AB", 0x1C: "SoD", 0x33: "WoG"}
>>> import gzip
>>> import struct
>>> h3m_data = gzip.open('Zyconia.h3m')
>>> def r(s):
... return struct.unpack(s, h3m_data.read(struct.calcsize(s)))
...
>>> print(h3m_versions[r("<I")[0]])
RoE
- RoE — The Restoration of Erathia
- AB — Armageddon's Blade
- SoD — The Shadow of Death
- WoG — In the Wake of Gods
Полный код парсера можно посмотреть на гитхабе.
Используя работу с двоичными данными я добрался до следующих данных:
- Размер карты
- Наличие подземелья
- Название карты
- Описание карты
- Уровень сложности
Уникальный идентификатор для каждой карты (файла) посчитал обычным md5.
tmp = res['Version'] + res['underground'] + res['mapsize'] + res['name'].lower() + res['difficulty']
res['_id'] = hashlib.md5(str(tmp).encode('utf-8')).hexdigest()
Засунул в md5-хэш все данные, кроме описания, потому что в описание карты иногда добавляют название сайта, откуда ее скачали, и получится дубль, это одна из причин, почему нельзя просто взять и посчитать хэш сумму у файла с картой для проверки на уникальность.
Ссылка на гитхаб
Комментарии (44)
igrig
11.05.2018 19:56Ценю всё, что вы проделали, просто оффтоп тогда, ну или вопрос нетехнического характера:
А правда, имеет место быть потребность знать, какие карты ты еще не играл, учитывая озвученные порядки чисел? Обычно я включаю Random Map Generator и не парюсь. Зато очень даже парюсь над шаблоном этого самого RMG.
Ну и второе, если экстраполировать Ваши «Цели были следующие» и «Точно знать, играл я в эту карту или нет», то полезнее русло было бы направить в «Смотрел я этот фильм или нет», читай каталогизатор фильмов.
Еще раз повторюсь, это лирика и техническую сторону я вообще не затрагивал (где, по всей видимости, Вы молодец). Хотя VM в качестве дистрибутива…pcdesign Автор
11.05.2018 20:00+1— Я все это сделал для себя, еще год назад. И сам этим пользуюсь, просто сейчас дошли руки выложить.
— На счет рандомных карт… Я их люблю, но под настроение, а так обычно предпочитаю то что создали люди.
— На счет каталогизатора фильмов, так есть же ведь https://www.kinopoisk.ru, достаточно удобно :)
walkingpendulum
11.05.2018 22:23дважды просмотрел гитхаб и не нашел карт. начинаю подозревать, что, даже выкачав 4.7Гб, карт я не найду :(
pcdesign Автор
11.05.2018 22:34Внутри виртуалки найдете, я не стал все эти гигабайты выкладывать на гитхаб.
Radjah
11.05.2018 23:02+1Почистил немного от мусора, затёр свободное место нулями, заменил zip на rar5. Образ ужался до 1 гига. yadi.sk/d/G2lqtyas3Vjn6Q
pcdesign Автор
12.05.2018 09:23Radjah, спасибо. А какими программами затирали свободное место нулями?
Radjah
12.05.2018 09:32+1dd if=/dev/zero of=/zero.tmp
pcdesign Автор
12.05.2018 09:59Благодарю.
Получается забили файл /zero.tmp нулями, потом его удалили и таким макаром он лучше сжался архиватором?Radjah
12.05.2018 11:01Да. Нули сжимаются очень хорошо. В идеале надо сделать образ динамическим, чтобы после распаковки занимал минимум места.
Вроде еще были вайперы для xfs, но это надо изучать вопрос, искать и компилять.
UksusoFF
11.05.2018 23:39А на df2 и wog forum запостили? Хорошо бы развернуть где-нибудь на хостинге и добаить возможность регистрироваться другим пользоватедям.
pcdesign Автор
12.05.2018 09:31+4На форумах не постил. Идея выложить на хостинг была. Но подумал, что выложу на сервер, мало ли что со мной случится и люди потеряют данные. Нужна команда людей, которые бы могли проект поддерживать десятки лет. Поэтому и решил сделать эту штуку локальной.
UksusoFF
12.05.2018 14:01Возможно там найдутся такие люди, каталог модов же вот держат: http://wakeofgods.org/repository/
Evengard
12.05.2018 15:26В Вог давно не играет никто, лучше бы координировались с HotA-вской командой. Кстати реально неплохой неофициальный аддон, без излишних наворотов как в Воге.
semmaxim
12.05.2018 17:14HotA? Этот примитив с новым дурацким городом и перерисованной кое-где графикой? Все в WoG играют, а про HotA практически никто не слышал.
К тому же WoG настраивается и его можно обрубить по-минимуму.DaylightIsBurning
12.05.2018 18:35HotA — это сейчас стандарт дефакто для онлайновых сражений в комьюнити героев 3, наравне с SoD. Под героевским комьюнити я подразумеваю наиболее активную его часть которая тусуется на HW.
forcam
12.05.2018 03:37Лучше бы кто рандомный генератор допилил до состояния идеальности) сори за офтоп
GeneAYak
12.05.2018 07:54То есть сейчас можно работать с каталогом только локально? Нет желания сделать его сервисом? Чтоб любой человек просто мог зайти на сайт и скачать?
xcyberx
13.05.2018 07:50Кто может сказать как перевод интерфейса Wog 3.58f поднять под Wine на Mac OS в правильной кодировке? У меня как ни старался получаются кракозябры, даже ENV прописывал…
Radjah
> Скачиваем и распаковываем архив с виртуальной-машиной
А есть какой-нибудь менее ресурсоёмкий формат? Архив с настроенными демонами или конфигами с данными, например.
pcdesign Автор
Да, можете с гитхаба взять код. Запустить его и начать закачивать карты с нуля.
Captcha
Докер прям просится сюда
3lo1i
Сделано.
kot5150
В докере органайзер завёлся. А карты то в виртуалке.
pcdesign выложите, пожалуйста, архив с картами отдельно.
pcdesign Автор
Хорошо, завтра выложу.
Но вам надо будет решать с базой данных монгодб, чтобы ее заполнить.