Я играю в Heroes of Might and Magic со времен царя Гороха королевы Ламанды, и за это время накопилось такое количество карт для 3-х Героев, что я решил их как-то упорядочить и структурировать.

Цели были следующие:

  1. Избавиться от дубликатов карт
  2. Точно знать, играл я в эту карту или нет, если играл, то знать статус: выиграл, проиграл или пропустил
  3. Иметь возможность загружать в органайзер новые карты с проверкой на уникальность
  4. Писать свой личный комментарий к карте
  5. Иметь возможность мгновенно отсортировать каталог карт по следующим параметрам:
    названию, статусу, версии, кодировке, размеру карты, наличию подземелья, уровню сложности и размеру файла

Скриншоты


Скриншоты кликабельные


Полный каталог карт


Работа с фильтрами. Здесь я отсортировал карты, в которые я не играл, версии SOD (The Shadow of Death), кодировка ascii, размер Extra Large, на картах есть подземелье, уровень сложности Impossible. Зеленая иконка — для загрузки карты из каталога на локальный компьютер.


Работа с картой, если нажать на иконку с ручкой. В модальном окне все очевидно и видно, когда я последний раз играл в эту карту.


Попытка загрузки карты, которая уже есть в каталоге.

Установка и запуск


  1. Скачиваем и распаковываем архив с виртуальной-машиной:
    Скачать с yadisk 1,44GB
  2. Скачиваем и устанавливаем VMware Workstation Player (Пропускаем этот пункт, если VMware-Workstation установлен).
  3. Запускаем виртуальную машину. Дожидаемся, когда она загрузится, и смотрим 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)


  1. Radjah
    11.05.2018 19:38
    +1

    > Скачиваем и распаковываем архив с виртуальной-машиной
    А есть какой-нибудь менее ресурсоёмкий формат? Архив с настроенными демонами или конфигами с данными, например.


    1. pcdesign Автор
      11.05.2018 19:40

      Да, можете с гитхаба взять код. Запустить его и начать закачивать карты с нуля.


    1. Captcha
      12.05.2018 12:07
      +1

      Докер прям просится сюда


      1. 3lo1i
        12.05.2018 19:36
        +1

        1. kot5150
          13.05.2018 23:00

          В докере органайзер завёлся. А карты то в виртуалке.
          pcdesign выложите, пожалуйста, архив с картами отдельно.


          1. pcdesign Автор
            13.05.2018 23:59

            Хорошо, завтра выложу.
            Но вам надо будет решать с базой данных монгодб, чтобы ее заполнить.


  1. igrig
    11.05.2018 19:56

    Ценю всё, что вы проделали, просто оффтоп тогда, ну или вопрос нетехнического характера:

    А правда, имеет место быть потребность знать, какие карты ты еще не играл, учитывая озвученные порядки чисел? Обычно я включаю Random Map Generator и не парюсь. Зато очень даже парюсь над шаблоном этого самого RMG.

    Ну и второе, если экстраполировать Ваши «Цели были следующие» и «Точно знать, играл я в эту карту или нет», то полезнее русло было бы направить в «Смотрел я этот фильм или нет», читай каталогизатор фильмов.

    Еще раз повторюсь, это лирика и техническую сторону я вообще не затрагивал (где, по всей видимости, Вы молодец). Хотя VM в качестве дистрибутива…


    1. pcdesign Автор
      11.05.2018 20:00
      +1

      — Я все это сделал для себя, еще год назад. И сам этим пользуюсь, просто сейчас дошли руки выложить.

      — На счет рандомных карт… Я их люблю, но под настроение, а так обычно предпочитаю то что создали люди.

      — На счет каталогизатора фильмов, так есть же ведь https://www.kinopoisk.ru, достаточно удобно :)


  1. walkingpendulum
    11.05.2018 22:23

    дважды просмотрел гитхаб и не нашел карт. начинаю подозревать, что, даже выкачав 4.7Гб, карт я не найду :(


    1. pcdesign Автор
      11.05.2018 22:34

      Внутри виртуалки найдете, я не стал все эти гигабайты выкладывать на гитхаб.


      1. walkingpendulum
        11.05.2018 22:50

        спасибо, уже качаю :)
        из статьи этот момент непонятен


  1. helg1978
    11.05.2018 22:26

    Зашел на сайт Убисофта, так и не понял под какой лицензией сейчас третьи Герои.
    В виртуальной машине взломанная версия?


    1. pcdesign Автор
      11.05.2018 22:33

      Пятница удалась? :)


      1. helg1978
        11.05.2018 22:37

        tl;dr; :)
        уже разобрался


  1. Radjah
    11.05.2018 23:02
    +1

    Почистил немного от мусора, затёр свободное место нулями, заменил zip на rar5. Образ ужался до 1 гига. yadi.sk/d/G2lqtyas3Vjn6Q


    1. pcdesign Автор
      12.05.2018 09:23

      Radjah, спасибо. А какими программами затирали свободное место нулями?


      1. Radjah
        12.05.2018 09:32
        +1

        dd if=/dev/zero of=/zero.tmp


        1. pcdesign Автор
          12.05.2018 09:59

          Благодарю.
          Получается забили файл /zero.tmp нулями, потом его удалили и таким макаром он лучше сжался архиватором?


          1. Radjah
            12.05.2018 11:01

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


            1. win32asm
              12.05.2018 14:23
              +1

              Для ext{2,3,4} работает fsck.ext4 -E discard
              На б/м современной оси есть ещё fstrim искаропки


              1. pcdesign Автор
                12.05.2018 14:32

                win32asm, а для windows какую программу посоветуете для такой же цели?



  1. MagisterLudi
    11.05.2018 23:27

    Герои…


  1. UksusoFF
    11.05.2018 23:39

    А на df2 и wog forum запостили? Хорошо бы развернуть где-нибудь на хостинге и добаить возможность регистрироваться другим пользоватедям.


    1. pcdesign Автор
      12.05.2018 09:31
      +4

      На форумах не постил. Идея выложить на хостинг была. Но подумал, что выложу на сервер, мало ли что со мной случится и люди потеряют данные. Нужна команда людей, которые бы могли проект поддерживать десятки лет. Поэтому и решил сделать эту штуку локальной.


      1. UksusoFF
        12.05.2018 14:01

        Возможно там найдутся такие люди, каталог модов же вот держат: http://wakeofgods.org/repository/


        1. Evengard
          12.05.2018 15:26

          В Вог давно не играет никто, лучше бы координировались с HotA-вской командой. Кстати реально неплохой неофициальный аддон, без излишних наворотов как в Воге.


          1. semmaxim
            12.05.2018 17:14

            HotA? Этот примитив с новым дурацким городом и перерисованной кое-где графикой? Все в WoG играют, а про HotA практически никто не слышал.
            К тому же WoG настраивается и его можно обрубить по-минимуму.


            1. DaylightIsBurning
              12.05.2018 18:35

              HotA — это сейчас стандарт дефакто для онлайновых сражений в комьюнити героев 3, наравне с SoD. Под героевским комьюнити я подразумеваю наиболее активную его часть которая тусуется на HW.


            1. igrig
              12.05.2018 23:03

              HotA я бы отнес к вылизанному оригиналу, учитывая заброшенность последнего. А WoG более смахивает на форк. Ой, не пытаюсь встать ни на чью сторону, просто не путайте так категорично вновь прибывших.


              1. UksusoFF
                12.05.2018 23:44

                Да тут холиварчик устроили на ровном месте :/


    1. Seiffear
      12.05.2018 18:28

      Оставил ссылку на статью на дф2. Интересная работа.


      1. pcdesign Автор
        12.05.2018 18:28

        Я там не зареган, если не сложно.


  1. forcam
    12.05.2018 03:37

    Лучше бы кто рандомный генератор допилил до состояния идеальности) сори за офтоп


    1. pcdesign Автор
      12.05.2018 10:41

      А в HoMM 3 HD моде генератор тоже далек от совершенства?


  1. GeneAYak
    12.05.2018 07:54

    То есть сейчас можно работать с каталогом только локально? Нет желания сделать его сервисом? Чтоб любой человек просто мог зайти на сайт и скачать?



  1. mSnus
    12.05.2018 12:54

    Карты — понимаю, скрипты — понимаю.
    Виртуалка зачем — не понимаю… зачем?


    1. pcdesign Автор
      12.05.2018 13:05
      -1

      Чтобы могли пользоваться люди вне зависимости от уровня квалификации.
      И виртуалка кроссплатформенна и будет работать и на винде, и на линуксе.


  1. semmaxim
    12.05.2018 13:12
    +3

    А можно карты отдельно выложить?


    1. questor
      12.05.2018 14:36
      +2

      Да! Прощай, выходные!!! ))


      1. mapron
        13.05.2018 08:30

        Выходные в смысле «все-все выходные до конца жизни»? Это вообще реально одному человеку пройти всё?


    1. kot5150
      13.05.2018 13:07

      Поддерживаю. Карты отдельно были бы очень кстати.


  1. xcyberx
    13.05.2018 07:50

    Кто может сказать как перевод интерфейса Wog 3.58f поднять под Wine на Mac OS в правильной кодировке? У меня как ни старался получаются кракозябры, даже ENV прописывал…