Browse Source

Merge branch 'legacy-restructure' of LotRO_Legacy/Legacy_v2 into master

Ivan Arkhipov 6 years ago
parent
commit
fbde95c2e3
100 changed files with 718 additions and 523 deletions
  1. 2 2
      build_res.pri
  2. 4 8
      src/Legacy-advanced/Legacy-advanced.pro
  3. 1 1
      src/Legacy-advanced/Legacy-advanced_resource.rc
  4. 0 2
      src/Legacy-advanced/object_script.Legacy-advanced.Release
  5. BIN
      src/Legacy-advanced/resources/appicon.ico
  6. 0 20
      src/Legacy-advanced/resources/backgrounds.qrc
  7. BIN
      src/Legacy-advanced/resources/backgrounds/bg1.png
  8. BIN
      src/Legacy-advanced/resources/backgrounds/bg10.png
  9. BIN
      src/Legacy-advanced/resources/backgrounds/bg11.png
  10. BIN
      src/Legacy-advanced/resources/backgrounds/bg12.png
  11. BIN
      src/Legacy-advanced/resources/backgrounds/bg13.png
  12. BIN
      src/Legacy-advanced/resources/backgrounds/bg14.png
  13. BIN
      src/Legacy-advanced/resources/backgrounds/bg2.png
  14. BIN
      src/Legacy-advanced/resources/backgrounds/bg3.png
  15. BIN
      src/Legacy-advanced/resources/backgrounds/bg4.png
  16. BIN
      src/Legacy-advanced/resources/backgrounds/bg5.png
  17. BIN
      src/Legacy-advanced/resources/backgrounds/bg6.png
  18. BIN
      src/Legacy-advanced/resources/backgrounds/bg7.png
  19. BIN
      src/Legacy-advanced/resources/backgrounds/bg8.png
  20. BIN
      src/Legacy-advanced/resources/backgrounds/bg9.png
  21. BIN
      src/Legacy-advanced/resources/backgrounds/loading-gear.gif
  22. BIN
      src/Legacy-advanced/resources/backgrounds/loading-gear0 (2).gif
  23. BIN
      src/Legacy-advanced/resources/backgrounds/process_dialog.png
  24. BIN
      src/Legacy-advanced/resources/buttons/close.png
  25. BIN
      src/Legacy-advanced/resources/buttons/folder.png
  26. BIN
      src/Legacy-advanced/resources/buttons/gray-button-hi.png
  27. BIN
      src/Legacy-advanced/resources/buttons/gray_btn.png
  28. BIN
      src/Legacy-advanced/resources/buttons/green-button-hi.png
  29. BIN
      src/Legacy-advanced/resources/buttons/minimize.png
  30. BIN
      src/Legacy-advanced/resources/buttons/off.png
  31. BIN
      src/Legacy-advanced/resources/buttons/on.png
  32. BIN
      src/Legacy-advanced/resources/buttons/onoff.png
  33. BIN
      src/Legacy-advanced/resources/buttons/onoff1.png
  34. BIN
      src/Legacy-advanced/resources/buttons/orange-button-hi.png
  35. BIN
      src/Legacy-advanced/resources/buttons/question.png
  36. BIN
      src/Legacy-advanced/resources/buttons/white_btn.png
  37. BIN
      src/Legacy-advanced/resources/buttons/white_btn_pressed.png
  38. 0 33
      src/Legacy-advanced/resources/common.qrc
  39. BIN
      src/Legacy-advanced/resources/fonts/title.TTF
  40. BIN
      src/Legacy-advanced/resources/fonts/trajan.ttf
  41. BIN
      src/Legacy-advanced/resources/fonts/viking.ttf
  42. 0 107
      src/Legacy-advanced/resources/legacy_patches.ini
  43. BIN
      src/Legacy-advanced/resources/patch_icons/karty-photo-small.png
  44. BIN
      src/Legacy-advanced/resources/patch_icons/shrifty-photo-small.png
  45. BIN
      src/Legacy-advanced/resources/patch_icons/teksty-photo-small.png
  46. BIN
      src/Legacy-advanced/resources/patch_icons/zagruzochnye-ekrany-photo-small.png
  47. BIN
      src/Legacy-advanced/resources/patch_icons/zvuki-photo-small.png
  48. 0 13
      src/Legacy-advanced/resources/res.qrc
  49. BIN
      src/Legacy-advanced/resources/status/critical.png
  50. BIN
      src/Legacy-advanced/resources/status/error.png
  51. BIN
      src/Legacy-advanced/resources/status/info.png
  52. BIN
      src/Legacy-advanced/resources/status/ok.png
  53. BIN
      src/Legacy-advanced/resources/status/warning.png
  54. BIN
      src/Legacy-advanced/resources/teksty-photo-normal.png
  55. 39 38
      src/Legacy/Legacy.pro
  56. 1 1
      src/Legacy/Legacy_resource.rc
  57. 0 26
      src/Legacy/build_res.pri
  58. 0 15
      src/Legacy/gui/helpwidget.cpp
  59. 0 166
      src/Legacy/gui/settingswidget.cpp
  60. 44 0
      src/Legacy/main.cpp
  61. 14 14
      src/Legacy/models/downloader.cpp
  62. 3 3
      src/Legacy/models/downloader.h
  63. 0 0
      src/Legacy/models/filesystem.cpp
  64. 0 0
      src/Legacy/models/filesystem.h
  65. 507 0
      src/Legacy/models/lotromanager.cpp
  66. 77 0
      src/Legacy/models/lotromanager.h
  67. 13 13
      src/Legacy/object_script.Legacy.Debug
  68. 13 13
      src/Legacy/object_script.Legacy.Release
  69. BIN
      src/Legacy/resources/appicon.ico
  70. 0 13
      src/Legacy/resources/backgrounds.qrc
  71. BIN
      src/Legacy/resources/backgrounds/bg1.png
  72. BIN
      src/Legacy/resources/backgrounds/bg2.png
  73. BIN
      src/Legacy/resources/backgrounds/bg3.png
  74. BIN
      src/Legacy/resources/backgrounds/bg4.png
  75. BIN
      src/Legacy/resources/backgrounds/bg5.png
  76. BIN
      src/Legacy/resources/backgrounds/bg6.png
  77. BIN
      src/Legacy/resources/backgrounds/bg7.png
  78. BIN
      src/Legacy/resources/backgrounds/bg8.png
  79. BIN
      src/Legacy/resources/backgrounds/bg9.png
  80. BIN
      src/Legacy/resources/buttons/RPG_GUI_v1.png
  81. BIN
      src/Legacy/resources/buttons/close.png
  82. BIN
      src/Legacy/resources/buttons/down_minus.png
  83. BIN
      src/Legacy/resources/buttons/down_minus_0.png
  84. BIN
      src/Legacy/resources/buttons/folder.png
  85. BIN
      src/Legacy/resources/buttons/gray-button-hi.png
  86. BIN
      src/Legacy/resources/buttons/gray_btn.png
  87. BIN
      src/Legacy/resources/buttons/green-button-hi.png
  88. BIN
      src/Legacy/resources/buttons/minimize.png
  89. BIN
      src/Legacy/resources/buttons/off.png
  90. BIN
      src/Legacy/resources/buttons/on.png
  91. BIN
      src/Legacy/resources/buttons/onoff.png
  92. BIN
      src/Legacy/resources/buttons/onoff1.png
  93. BIN
      src/Legacy/resources/buttons/orange-button-hi.png
  94. BIN
      src/Legacy/resources/buttons/question.png
  95. BIN
      src/Legacy/resources/buttons/right_plus.png
  96. BIN
      src/Legacy/resources/buttons/right_plus_0.png
  97. BIN
      src/Legacy/resources/buttons/white_btn.png
  98. BIN
      src/Legacy/resources/buttons/white_btn_pressed.png
  99. 0 35
      src/Legacy/resources/common.qrc
  100. BIN
      src/Legacy/resources/fonts/title.TTF

+ 2 - 2
src/Legacy-advanced/build_res.pri → build_res.pri

@@ -9,8 +9,8 @@ exists($$BIN_PATH/res) {
 }
 
 EXT_RES =                                                                   \
-    "$$PWD/resources/backgrounds.qrc            -o $$BIN_PATH/data01.gtr"     \
-    "$$PWD/resources/common.qrc                 -o $$BIN_PATH/data02.gtr"     \
+    "$${PROJECT_ROOT_PATH}/resources/backgrounds.qrc            -o $$BIN_PATH/data01.gtr"     \
+    "$${PROJECT_ROOT_PATH}/resources/common.qrc                 -o $$BIN_PATH/data02.gtr"     \
 
 for (RES, EXT_RES) {
     win32 {

+ 4 - 8
src/Legacy-advanced/Legacy-advanced.pro

@@ -61,11 +61,7 @@ FORMS += \
     widgets\messagedialog.ui \
     widgets\lotroprogresswidget.ui
 
-RESOURCES += \
-    resources\backgrounds.qrc \
-    resources\common.qrc
-
-win32:RC_ICONS = $$PWD/resources/appicon.ico
+win32:RC_ICONS = $${PROJECT_ROOT_PATH}/resources/appicon.ico
 
 INCLUDEPATH += $$PWD/src
 INCLUDEPATH += $$PWD/widgets
@@ -77,8 +73,8 @@ LIBS += -llibzlibstatic
 
 CONFIG(debug, debug|release) {
         RESOURCES += \
-                resources/backgrounds.qrc \
-                resources/common.qrc
+                $${PROJECT_ROOT_PATH}/resources/backgrounds.qrc \
+                $${PROJECT_ROOT_PATH}/resources/common.qrc
 } else {
-        include(build_res.pri)
+        include(../../build_res.pri)
 }

+ 1 - 1
src/Legacy-advanced/Legacy-advanced_resource.rc

@@ -1,6 +1,6 @@
 #include <windows.h>
 
-IDI_ICON1	ICON	DISCARDABLE	"D:\\Programming\\SourceRepos\\Legacy_v2\\src\\Legacy-advanced\\resources\\appicon.ico"
+IDI_ICON1	ICON	DISCARDABLE	"D:\\Programming\\SourceRepos\\Legacy_v2\\resources\\appicon.ico"
 
 VS_VERSION_INFO VERSIONINFO
 	FILEVERSION 0,0,0,0

+ 0 - 2
src/Legacy-advanced/object_script.Legacy-advanced.Release

@@ -1,6 +1,4 @@
 INPUT(
-./..\..\build\release\Legacy-advanced\rcc\qrc_backgrounds.o
-./..\..\build\release\Legacy-advanced\rcc\qrc_common.o
 ./..\..\build\release\Legacy-advanced\obj\main.o
 ./..\..\build\release\Legacy-advanced\obj\downloader.o
 ./..\..\build\release\Legacy-advanced\obj\filesystem.o

BIN
src/Legacy-advanced/resources/appicon.ico


+ 0 - 20
src/Legacy-advanced/resources/backgrounds.qrc

@@ -1,20 +0,0 @@
-<RCC>
-    <qresource prefix="/">
-        <file>backgrounds/bg1.png</file>
-        <file>backgrounds/bg2.png</file>
-        <file>backgrounds/bg3.png</file>
-        <file>backgrounds/bg4.png</file>
-        <file>backgrounds/bg5.png</file>
-        <file>backgrounds/bg6.png</file>
-        <file>backgrounds/bg7.png</file>
-        <file>backgrounds/bg8.png</file>
-        <file>backgrounds/bg9.png</file>
-        <file>backgrounds/loading-gear.gif</file>
-        <file>backgrounds/process_dialog.png</file>
-        <file>backgrounds/bg10.png</file>
-        <file>backgrounds/bg11.png</file>
-        <file>backgrounds/bg12.png</file>
-        <file>backgrounds/bg13.png</file>
-        <file>backgrounds/bg14.png</file>
-    </qresource>
-</RCC>

BIN
src/Legacy-advanced/resources/backgrounds/bg1.png


BIN
src/Legacy-advanced/resources/backgrounds/bg10.png


BIN
src/Legacy-advanced/resources/backgrounds/bg11.png


BIN
src/Legacy-advanced/resources/backgrounds/bg12.png


BIN
src/Legacy-advanced/resources/backgrounds/bg13.png


BIN
src/Legacy-advanced/resources/backgrounds/bg14.png


BIN
src/Legacy-advanced/resources/backgrounds/bg2.png


BIN
src/Legacy-advanced/resources/backgrounds/bg3.png


BIN
src/Legacy-advanced/resources/backgrounds/bg4.png


BIN
src/Legacy-advanced/resources/backgrounds/bg5.png


BIN
src/Legacy-advanced/resources/backgrounds/bg6.png


BIN
src/Legacy-advanced/resources/backgrounds/bg7.png


BIN
src/Legacy-advanced/resources/backgrounds/bg8.png


BIN
src/Legacy-advanced/resources/backgrounds/bg9.png


BIN
src/Legacy-advanced/resources/backgrounds/loading-gear.gif


BIN
src/Legacy-advanced/resources/backgrounds/loading-gear0 (2).gif


BIN
src/Legacy-advanced/resources/backgrounds/process_dialog.png


BIN
src/Legacy-advanced/resources/buttons/close.png


BIN
src/Legacy-advanced/resources/buttons/folder.png


BIN
src/Legacy-advanced/resources/buttons/gray-button-hi.png


BIN
src/Legacy-advanced/resources/buttons/gray_btn.png


BIN
src/Legacy-advanced/resources/buttons/green-button-hi.png


BIN
src/Legacy-advanced/resources/buttons/minimize.png


BIN
src/Legacy-advanced/resources/buttons/off.png


BIN
src/Legacy-advanced/resources/buttons/on.png


BIN
src/Legacy-advanced/resources/buttons/onoff.png


BIN
src/Legacy-advanced/resources/buttons/onoff1.png


BIN
src/Legacy-advanced/resources/buttons/orange-button-hi.png


BIN
src/Legacy-advanced/resources/buttons/question.png


BIN
src/Legacy-advanced/resources/buttons/white_btn.png


BIN
src/Legacy-advanced/resources/buttons/white_btn_pressed.png


+ 0 - 33
src/Legacy-advanced/resources/common.qrc

@@ -1,33 +0,0 @@
-<RCC>
-    <qresource prefix="/">
-        <file>fonts/trajan.ttf</file>
-        <file>fonts/viking.ttf</file>
-        <file>status/critical.png</file>
-        <file>status/error.png</file>
-        <file>status/info.png</file>
-        <file>status/ok.png</file>
-        <file>status/warning.png</file>
-        <file>buttons/close.png</file>
-        <file>buttons/folder.png</file>
-        <file>buttons/gray-button-hi.png</file>
-        <file>buttons/green-button-hi.png</file>
-        <file>buttons/minimize.png</file>
-        <file>buttons/off.png</file>
-        <file>buttons/on.png</file>
-        <file>buttons/onoff.png</file>
-        <file>buttons/onoff1.png</file>
-        <file>buttons/orange-button-hi.png</file>
-        <file>buttons/question.png</file>
-        <file>appicon.ico</file>
-        <file>teksty-photo-normal.png</file>
-        <file>fonts/title.TTF</file>
-        <file>buttons/white_btn.png</file>
-        <file>buttons/white_btn_pressed.png</file>
-        <file>buttons/gray_btn.png</file>
-        <file>patch_icons/karty-photo-small.png</file>
-        <file>patch_icons/shrifty-photo-small.png</file>
-        <file>patch_icons/teksty-photo-small.png</file>
-        <file>patch_icons/zagruzochnye-ekrany-photo-small.png</file>
-        <file>patch_icons/zvuki-photo-small.png</file>
-    </qresource>
-</RCC>

BIN
src/Legacy-advanced/resources/fonts/title.TTF


BIN
src/Legacy-advanced/resources/fonts/trajan.ttf


BIN
src/Legacy-advanced/resources/fonts/viking.ttf


+ 0 - 107
src/Legacy-advanced/resources/legacy_patches.ini

@@ -1,107 +0,0 @@
-[00_group_texts]
-title=Тексты
-
-[01_patch_fonts]
-title=Шрифты
-descr=Изменённые игровые шрифты для поддержки кириллических символов.\nОбязательны к установке для любого текстового патча
-parent=00_group_texts
-id=101
-patchname=fonts
-
-[02_patch_texts]
-title=Основные тексты
-descr=Интерфейс, задания и т.д. и т.п.
-id=100
-parent=00_group_texts
-deps=01_patch_fonts
-patchname=texts
-
-[03_patch_items]
-title=Предметы
-descr=Названия и описания предметов в игре. Их отключение полезно, если вы часто ищете предметы на аукционе (искать предметы по русским названиям невозможно)
-parent=00_group_texts
-id=102
-deps=01_patch_fonts
-patchname=texts
-
-[04_patch_emotes]
-title=Эмоции
-descr=Названия и описания эмоций персонажей. Можно отключить, если вы привыкли вводить команды эмоций на английском. Отображение эмоции в чате в этом случае также будет английским
-parent=00_group_texts
-id=103
-deps=01_patch_fonts
-patchname=texts
-
-[05_patch_npcs]
-title=Персонажи
-descr=Имена и некоторые реплики всех неигровых персонажей. (ТЕСТ) 
-parent=00_group_texts
-id=104
-deps=01_patch_fonts
-patchname=texts
-
-[06_patch_maps]
-title=Карты
-descr=Описание карт
-parent=rusification
-patchname=images
-
-[07_patch_logos]
-title=Логотипы игры
-descr=Описание логотипов игры
-parent=rusification
-patchname=textures
-
-[08_patch_sounds]
-title=Озвучка персонажей
-parent=rusification
-patchname=sounds
-
-[09_patch_loadscreens]
-title=Загрузочные экраны
-parent=rusification
-patchname=loadscreens
-
-[10_group_video]
-title=Видеоролики
-parent=rusification
-
-[11_patch_video_entry]
-title=Вступительный ролик
-patchname=video_entry
-parent=10_group_video
-
-[12_patch_video_race]
-title=Расовые ролики
-patchname=video_race
-parent=10_group_video
-
-[13_patch_video_class]
-title=Классовые ролики
-patchname=video_class
-parent=10_group_video
-
-[14_patch_video_book1]
-title=Книга 1: Тени Ангмара
-patchname=video_book1
-parent=10_group_video
-
-[15_patch_video_book2]
-title=Книга 2: Копи Мории
-patchname=video_book2
-parent=10_group_video
-
-[16_patch_video_book3]
-title=Книга 3: Союзники Короля
-patchname=video_book3
-parent=10_group_video
-
-[17_patch_video_book4]
-title=Книга 4: Мощь Саурона
-patchname=video_book4
-parent=10_group_video
-
-[18_patch_video_mordorbook]
-title=Книга 5: Чёрная книга Мордора
-patchname=video_book5
-parent=10_group_video

BIN
src/Legacy-advanced/resources/patch_icons/karty-photo-small.png


BIN
src/Legacy-advanced/resources/patch_icons/shrifty-photo-small.png


BIN
src/Legacy-advanced/resources/patch_icons/teksty-photo-small.png


BIN
src/Legacy-advanced/resources/patch_icons/zagruzochnye-ekrany-photo-small.png


BIN
src/Legacy-advanced/resources/patch_icons/zvuki-photo-small.png


+ 0 - 13
src/Legacy-advanced/resources/res.qrc

@@ -1,13 +0,0 @@
-<RCC>
-    <qresource prefix="/">
-        <file>close.png</file>
-        <file>minimize.png</file>
-        <file>appicon.ico</file>
-        <file>orange-button-hi.png</file>
-        <file>green-button-hi.png</file>
-        <file>folder.png</file>
-        <file>question.png</file>
-        <file>gray-button-hi.png</file>
-        <file>teksty-photo-normal.png</file>
-    </qresource>
-</RCC>

BIN
src/Legacy-advanced/resources/status/critical.png


BIN
src/Legacy-advanced/resources/status/error.png


BIN
src/Legacy-advanced/resources/status/info.png


BIN
src/Legacy-advanced/resources/status/ok.png


BIN
src/Legacy-advanced/resources/status/warning.png


BIN
src/Legacy-advanced/resources/teksty-photo-normal.png


+ 39 - 38
src/Legacy/Legacy.pro

@@ -14,49 +14,41 @@ CXXFLAGS += -O2 -fno-stack-limit
 CONFIG += resources_big
 
 SOURCES += \
-    src/main.cpp \
-    gui/mainwindow.cpp \
-    src/menuentry.cpp \
-    src/legacyapp.cpp \
-    src/filesystem.cpp \
-    gui/statuswidget.cpp \
-    gui/rusificationwidget.cpp \
-    gui/settingswidget.cpp \
-    gui/newswidget.cpp \
-    gui/helpwidget.cpp \
-    src/networkdownloader.cpp \
-    src/rusificationtreeitem.cpp
+    main.cpp \
+    models/downloader.cpp \
+    models/filesystem.cpp \
+    models/lotromanager.cpp \
+    widgets/helpwidget.cpp \
+    widgets/mainwindow.cpp \
+    widgets/menuentry.cpp \
+    widgets/newswidget.cpp \
+    widgets/rusificationtreeitem.cpp \
+    widgets/rusificationwidget.cpp \
+    widgets/settingswidget.cpp \
+    widgets/statuswidget.cpp
 
 HEADERS += \
-    gui/mainwindow.h \
-    src/menuentry.h \
-    src/legacyapp.h \
-    src/filesystem.h \
-    gui/statuswidget.h \
-    gui/rusificationwidget.h \
-    gui/settingswidget.h \
-    gui/newswidget.h \
-    gui/helpwidget.h \
-    src/networkdownloader.h \
-    src/rusificationtreeitem.h
+    models/downloader.h \
+    models/filesystem.h \
+    models/lotromanager.h \
+    widgets/helpwidget.h \
+    widgets/mainwindow.h \
+    widgets/menuentry.h \
+    widgets/newswidget.h \
+    widgets/rusificationtreeitem.h \
+    widgets/rusificationwidget.h \
+    widgets/settingswidget.h \
+    widgets/statuswidget.h
 
 FORMS += \
-    gui/mainwindow.ui \
-    gui/statuswidget.ui \
-    gui/rusificationwidget.ui \
-    gui/settingswidget.ui \
-    gui/newswidget.ui \
-    gui/helpwidget.ui
+    widgets/helpwidget.ui \
+    widgets/mainwindow.ui \
+    widgets/newswidget.ui \
+    widgets/rusificationwidget.ui \
+    widgets/settingswidget.ui \
+    widgets/statuswidget.ui
 
-CONFIG(debug, debug|release) {
-	RESOURCES += \
-                resources/backgrounds.qrc \
-                resources/common.qrc
-} else {
-	include(build_res.pri)
-}
-
-win32:RC_ICONS = $$PWD/resources/appicon.ico
+win32:RC_ICONS = $${PROJECT_ROOT_PATH}/resources/appicon.ico
 
 INCLUDEPATH += $$PWD/src
 INCLUDEPATH += $$PWD/gui
@@ -64,3 +56,12 @@ INCLUDEPATH += $$PWD/gui
 LIBS += -llibLotroDat_static
 LIBS += -llibyaml-cpp
 LIBS += -llibzlibstatic
+
+
+CONFIG(debug, debug|release) {
+        RESOURCES += \
+                $${PROJECT_ROOT_PATH}/resources/backgrounds.qrc \
+                $${PROJECT_ROOT_PATH}/resources/common.qrc
+} else {
+        include(../../build_res.pri)
+}

+ 1 - 1
src/Legacy/Legacy_resource.rc

@@ -1,6 +1,6 @@
 #include <windows.h>
 
-IDI_ICON1	ICON	DISCARDABLE	"D:\\Programming\\SourceRepos\\Legacy_v2\\src\\Legacy\\resources\\appicon.ico"
+IDI_ICON1	ICON	DISCARDABLE	"D:\\Programming\\SourceRepos\\Legacy_v2\\resources\\appicon.ico"
 
 VS_VERSION_INFO VERSIONINFO
 	FILEVERSION 0,0,0,0

+ 0 - 26
src/Legacy/build_res.pri

@@ -1,26 +0,0 @@
-message(==========BUILDING EXTERNAL RES============)
-
-guiRes.target = BuildResources
-exists($$BIN_PATH/res) {
-    message("Directory $$BIN_PATH/res already exists")
-} else {
-    message("Directory $$BIN_PATH/res DOES NOT exist")
-    guiRes.commands += $(MKDIR) \"$$BIN_PATH/res\" $$escape_expand(\n\t)
-}
-
-EXT_RES =                                                                   \
-    "$$PWD/resources/backgrounds.qrc            -o $$BIN_PATH/data01.gtr"     \
-    "$$PWD/resources/common.qrc                 -o $$BIN_PATH/data02.gtr"     \
-
-for (RES, EXT_RES) {
-    win32 {
-        message(rcc.exe -binary $${RES})
-        guiRes.commands += rcc.exe -binary $${RES} $$escape_expand(\n\t)
-    }
-    unix {
-        guiRes.commands += rcc -binary $${RES} $$escape_expand(\n\t)
-    }
-}
-
-QMAKE_EXTRA_TARGETS += guiRes
-PRE_TARGETDEPS += BuildResources

+ 0 - 15
src/Legacy/gui/helpwidget.cpp

@@ -1,15 +0,0 @@
-#include "gui\helpwidget.h"
-#include "ui_helpwidget.h"
-
-HelpWidget::HelpWidget(LegacyApp *_app, QWidget *parent) :
-    QWidget(parent),
-    ui(new Ui::HelpWidget),
-    app(_app)
-{
-    ui->setupUi(this);
-}
-
-HelpWidget::~HelpWidget()
-{
-    delete ui;
-}

+ 0 - 166
src/Legacy/gui/settingswidget.cpp

@@ -1,166 +0,0 @@
-#include "gui\settingswidget.h"
-#include "ui_settingswidget.h"
-#include "legacyapp.h"
-#include "filesystem.h"
-
-#include <QDebug>
-#include <QFileDialog>
-#include <QMessageBox>
-
-
-SettingsWidget::SettingsWidget(LegacyApp *_app, QWidget *parent) :
-    QWidget(parent),
-    ui(new Ui::SettingsWidget),
-    app(_app)
-{
-    ui->setupUi(this);
-
-    ui_update_timer.setInterval(500);
-    connect(&ui_update_timer, &QTimer::timeout, this, &SettingsWidget::updateUI);
-    ui_update_timer.start();
-}
-
-SettingsWidget::~SettingsWidget()
-{
-    ui_update_timer.stop();
-    delete ui;
-}
-
-void SettingsWidget::updateUI()
-{
-    if (!qApp)
-        return;
-
-    QString path = app->properties.value("settings/lotro_folder", "(не выбрана)").toString();
-    ui->folder_value_common->setText(path);
-
-    ui->data_protection_checkbox_common->setChecked(app->properties.value("settings/data_protection", 1).toBool());
-    ui->restore_checkbox_common->setChecked(app->properties.value("settings/auto_restore", 1).toBool());
-    ui->download_updates_checkbox_common->setChecked(app->properties.value("settings/download_updates", 1).toBool());
-    ui->expert_tabs_checkbox_common->setChecked(app->properties.value("settings/expert_mode", 0).toBool());
-    ui->restrict_download_speed_checkbox_common->setChecked(app->properties.value("settings/limit_download_speed", 0).toBool());
-    ui->download_restrict_slider->setValue(app->properties.value("settings/download_speed", 64).toInt());
-
-    if (app->properties.value("settings/expert_mode", 0).toBool()) {
-        ui->management_widget->show();
-        ui->data_protection_checkbox_common->show();
-        ui->restore_checkbox_common->show();
-    } else {
-        ui->management_widget->hide();
-        ui->data_protection_checkbox_common->hide();
-        ui->restore_checkbox_common->hide();
-    }
-
-    int locale_index = 0;
-    QString value = app->properties.value("settings/locale", "English").toString();
-
-    if (value == "English")
-        locale_index = 0;
-    if (value == "DE")
-        locale_index = 1;
-    if (value == "FR")
-        locale_index = 2;
-
-    ui->lotro_patch_language_combobox_common->setCurrentIndex(locale_index);
-}
-
-void SettingsWidget::on_download_restrict_slider_valueChanged(int value)
-{
-    if (value >= 1024) {
-        double new_value = double(value) / 1024;
-        ui->download_speed_label_common->setText(QString::number(new_value, 'g', 2) + " Мб/с");
-    } else {
-        ui->download_speed_label_common->setText(QString::number(value) + " Кб/с");
-    }
-    app->properties.setValue("settings/download_speed", value);
-    app->properties.sync();
-}
-
-void SettingsWidget::on_interface_scale_combobox_common_currentIndexChanged(const QString &arg1)
-{
-    int value = arg1.left(arg1.length() - 1).toInt();
-    app->window.changeFontSizeRecursive(value, &app->window);
-    app->window.resize(900 * value / 100, 650 * value / 100);
-    app->properties.setValue("settings/ui_scale", value);
-    app->properties.sync();
-}
-
-void SettingsWidget::on_change_folder_button_clicked()
-{
-    QStringList known_paths = FileSystem::recognizeRegistryLotroPath();
-    QString template_path = known_paths.size() > 0 ? known_paths[0] : "";
-    QString str = QFileDialog::getOpenFileName(0, "Расположение игры", template_path, "LotroLauncher.exe");
-    QString path = str.replace("/LotroLauncher.exe", "").replace("\\", "/").replace("//", "/");
-
-    if (!FileSystem::fileExists(path + "/LotroLauncher.exe")) {
-        QMessageBox error_box("Ошибка!", "Похоже, указана неверная папка с игрой. Не могу найти файл LotroLauncher.exe",
-                              QMessageBox::Critical, QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton);
-
-        return;
-    }
-
-    if (!FileSystem::fileExists(path + "/client_local_English.dat")) {
-        QMessageBox pmbx("Файл данных не найден",
-                         "Файл данных client_local_English.dat не обнаружен в папке с игрой. Запустить лаунчер игры с целью скачать недостающие данные?",
-                         QMessageBox::Warning,
-                         QMessageBox::Yes,
-                         QMessageBox::No,
-                         QMessageBox::NoButton);
-
-        if (pmbx.exec() == QMessageBox::Yes) {
-            // Start LotRO;
-            return;
-        } else {
-            // Set status Файл данных не найден
-        }
-    }
-
-    app->properties.setValue("settings/lotro_folder", path);
-    app->properties.sync();
-    ui->folder_value_common->setText(path);
-}
-
-void SettingsWidget::on_data_protection_checkbox_common_stateChanged(int arg1)
-{
-    app->properties.setValue("settings/data_protection", arg1);
-    app->properties.sync();
-}
-
-void SettingsWidget::on_restore_checkbox_common_stateChanged(int arg1)
-{
-    app->properties.setValue("settings/auto_restore", arg1);
-    app->properties.sync();
-}
-
-void SettingsWidget::on_download_updates_checkbox_common_stateChanged(int arg1)
-{
-    app->properties.setValue("settings/download_updates", arg1);
-    app->properties.sync();
-}
-
-void SettingsWidget::on_expert_tabs_checkbox_common_stateChanged(int arg1)
-{
-    app->properties.setValue("settings/expert_mode", arg1);
-    app->properties.sync();
-}
-
-void SettingsWidget::on_restrict_download_speed_checkbox_common_stateChanged(int arg1)
-{
-    app->properties.setValue("settings/limit_download_speed", arg1);
-    app->properties.sync();
-}
-
-
-void SettingsWidget::on_lotro_patch_language_combobox_common_activated(int index)
-{
-    QString value = "";
-    if (index == 0)
-        value = "English";
-    if (index == 1)
-        value = "DE";
-    if (index == 2)
-        value = "FR";
-
-    app->properties.setValue("settings/locale", value);
-    app->properties.sync();
-}

+ 44 - 0
src/Legacy/main.cpp

@@ -0,0 +1,44 @@
+#include <QApplication>
+#include <QMessageBox>
+#include <QLockFile>
+#include <QDir>
+
+#include "widgets/mainwindow.h"
+
+#include <QTextCodec>
+#include <QDebug>
+#include <QResource>
+#include <QFontDatabase>
+
+int main(int argc, char *argv[])
+{
+    setlocale(LC_ALL,"Russian");
+    QApplication a(argc, argv);
+
+    qDebug() << "Checking if there's another instance of Legacy";
+
+    QLockFile lockFile(QDir::temp().absoluteFilePath("rulotro.lock"));
+    if(!lockFile.tryLock(1)){
+        QMessageBox msgBox;
+        msgBox.setIcon(QMessageBox::Warning);
+        msgBox.setText("Приложение уже запущено.\nРазрешено запускать только один экземпляр приложения.");
+        msgBox.exec();
+        return 1;
+    }
+
+    qDebug() << "Registering resources";
+    QResource::registerResource(QApplication::applicationDirPath() + "/data01.gtr");
+    QResource::registerResource(QApplication::applicationDirPath() + "/data02.gtr");
+
+    QFontDatabase::addApplicationFont(":/assets/fonts/trajan.ttf");
+    QFontDatabase::addApplicationFont(":/assets/fonts/viking.ttf");
+    QFontDatabase::addApplicationFont(":/assets/fonts/title.ttf");
+
+    qDebug() << "Starting main frame initialisation...";
+
+    MainWindow* main_window = new MainWindow(nullptr);
+    main_window->setAttribute(Qt::WA_DeleteOnClose);
+
+    qDebug() << "Finished initialisation, starting application...";
+    return a.exec();
+}

+ 14 - 14
src/Legacy/src/networkdownloader.cpp → src/Legacy/models/downloader.cpp

@@ -1,34 +1,34 @@
-#include "networkdownloader.h"
+#include "downloader.h"
 #include <QEventLoop>
 #include <QApplication>
 #include <QDebug>
 
-NetworkDownloader::NetworkDownloader(QObject *parent) :QObject(parent), busy(false)
+Downloader::Downloader(QObject *parent) :QObject(parent), busy(false)
 {
     connect(&m_WebCtrl, SIGNAL(finished(QNetworkReply*)), this, SLOT(onDownloadFinished(QNetworkReply*)));
 }
 
-NetworkDownloader::~NetworkDownloader() {
+Downloader::~Downloader() {
 }
 
-QUrl NetworkDownloader::getUrl()
+QUrl Downloader::getUrl()
 {
     return url;
 }
 
-void NetworkDownloader::setUrl(const QUrl &_url)
+void Downloader::setUrl(const QUrl &_url)
 {
     url = _url;
 }
 
-void NetworkDownloader::waitForDownloaded()
+void Downloader::waitForDownloaded()
 {
     QEventLoop loop;
-    connect(this, &NetworkDownloader::downloadFinished, &loop, &QEventLoop::quit);
+    connect(this, &Downloader::downloadFinished, &loop, &QEventLoop::quit);
     loop.exec();
 }
 
-void NetworkDownloader::start()
+void Downloader::start()
 {
     if (busy) {
         qDebug() << "Cannot download " << url << ", downloader is busy!";
@@ -40,24 +40,24 @@ void NetworkDownloader::start()
     QNetworkRequest request(url);
     m_CurrentReply = m_WebCtrl.get(request);
     m_CurrentReply->setReadBufferSize(download_speed_limit);
-    connect(m_CurrentReply, &QNetworkReply::readyRead, this, &NetworkDownloader::onReadyRead);
-    connect(m_CurrentReply, &QNetworkReply::downloadProgress, this, &NetworkDownloader::progressChanged);
+    connect(m_CurrentReply, &QNetworkReply::readyRead, this, &Downloader::onReadyRead);
+    connect(m_CurrentReply, &QNetworkReply::downloadProgress, this, &Downloader::progressChanged);
 }
 
-void NetworkDownloader::updateDownloadSpeedLimit(int bytes_per_sec)
+void Downloader::updateDownloadSpeedLimit(int bytes_per_sec)
 {
     download_speed_limit = bytes_per_sec;
     if (m_CurrentReply)
         m_CurrentReply->setReadBufferSize(bytes_per_sec);
 }
 
-void NetworkDownloader::stop()
+void Downloader::stop()
 {
     m_CurrentReply->abort();
     busy = false;
 }
 
-void NetworkDownloader::onDownloadFinished(QNetworkReply*) {
+void Downloader::onDownloadFinished(QNetworkReply*) {
     if (m_CurrentReply)
         m_CurrentReply->deleteLater();
 
@@ -65,7 +65,7 @@ void NetworkDownloader::onDownloadFinished(QNetworkReply*) {
     emit downloadFinished();
 }
 
-void NetworkDownloader::onReadyRead()
+void Downloader::onReadyRead()
 {
     QByteArray readdata = m_CurrentReply->readAll();
     if (targetFile && targetFile->isWritable())

+ 3 - 3
src/Legacy/src/networkdownloader.h → src/Legacy/models/downloader.h

@@ -8,13 +8,13 @@
 #include <QFile>
 #include <QByteArray>
 
-class NetworkDownloader : public QObject
+class Downloader : public QObject
 {
     Q_OBJECT
 
 public:
-    explicit NetworkDownloader(QObject *parent = 0);
-    virtual ~NetworkDownloader();
+    explicit Downloader(QObject *parent = 0);
+    virtual ~Downloader();
 
     QUrl getUrl();
     void setUrl(const QUrl& _url);

+ 0 - 0
src/Legacy/src/filesystem.cpp → src/Legacy/models/filesystem.cpp


+ 0 - 0
src/Legacy/src/filesystem.h → src/Legacy/models/filesystem.h


+ 507 - 0
src/Legacy/models/lotromanager.cpp

@@ -0,0 +1,507 @@
+#include "lotromanager.h"
+#include "filesystem.h"
+#include "LotroDat/Subfiles/TextSubFile.h"
+
+#include <QtConcurrent/QtConcurrent>
+#include <QFontDatabase>
+#include <QMessageBox>
+
+#include <string>
+#include <iostream>
+#include <fstream>
+
+Q_DECLARE_METATYPE(LOTRO_DAT::FILE_TYPE)
+Q_DECLARE_METATYPE(LOTRO_DAT::SubfileData)
+
+LotroManager::LotroManager(QSettings* app_settings_, QObject *parent) :
+    QObject(parent), app_settings(app_settings_) {
+
+    qRegisterMetaType<LOTRO_DAT::FILE_TYPE>();
+    qRegisterMetaType<LOTRO_DAT::SubfileData>();
+}
+
+void LotroManager::initialiseDatFile(QString file_path) {
+    emit processStarted("initialiseDatFile", {file_path});
+
+    qDebug() << "Initialising file " << file_path;
+
+    if (!FileSystem::fileExists(file_path)) {
+        emit caughtError(QString("initialiseDatFile"), {QString("Ошибка инициализации"), QString("Файл " + file_path + " несуществует! Невозможно инициализировать файл ресурсов.")});
+        emit processFinished("initialiseDatFile", {QString("Error"), file_path});
+        return;
+    }
+
+    file.Initialise((file_path).toStdString(), 0);
+    emit processFinished("initialiseDatFile", {QString("Success"), file_path});
+}
+
+void LotroManager::deinitialiseDatFile()
+{
+    emit processStarted("deintialiseDatFile", {});
+    qDebug() << "Deinitialising file...";
+    file.Deinitialize();
+    emit processFinished("deinitialiseDatFile", {});
+}
+
+void LotroManager::changeLocale() {
+    qDebug() << "Changing locale of dat file...";
+    // Setting locale, opposite to current
+    auto current_locale = file.GetLocaleManager().GetCurrentLocale();
+    auto new_locale = current_locale == LOTRO_DAT::DatLocaleManager::PATCHED ?
+                LOTRO_DAT::DatLocaleManager::ORIGINAL :
+                LOTRO_DAT::DatLocaleManager::PATCHED;
+
+    QString old_locale_name = (current_locale == LOTRO_DAT::DatLocaleManager::PATCHED ? "Русифицированная" : "Оригинальная");
+    QString new_locale_name = (new_locale == LOTRO_DAT::DatLocaleManager::PATCHED ? "Русифицированная" : "Оригинальная");
+    emit processStarted("changeLocale", {old_locale_name, new_locale_name});
+
+
+    auto operation = file.GetLocaleManager().SetLocale(new_locale);
+
+    auto new_current_locale = file.GetLocaleManager().GetCurrentLocale();
+    QString new_current_locale_name = (new_current_locale == LOTRO_DAT::DatLocaleManager::PATCHED ? "Русифицированная" : "Оригинальная");
+
+    if (operation.result == LOTRO_DAT::SUCCESS) {
+        emit processFinished("changeLocale", {"Success", new_current_locale_name});
+    } else {
+        emit caughtError("changeLocale", {"Ошибка смены локали!", QString("Не удалось сменить локаль игры! Текущая локаль: ") + new_current_locale_name});
+        emit processFinished("changeLocale", {"Error", new_current_locale_name});
+    }
+}
+
+void LotroManager::getLocaleFileContents(long long file_id, int locale) {
+    emit processStarted("getLocaleFileContents", {file_id, locale});
+
+    auto getfile_op = file.GetLocaleManager().GetLocaleFile(file_id, (LOTRO_DAT::DatLocaleManager::LOCALE)locale);
+    if (!getfile_op.result) {
+        emit caughtError("getLocaleFileContents", {"Файл не найден!", QString("Не удаётся найти файл с id ") + QString::number(file_id)});
+        emit processFinished("getLocaleFileContents", {"Error"});
+        return;
+    }
+
+    LOTRO_DAT::SubFile subfile = getfile_op.value;
+
+    auto getrealfile_op = file.GetFileSystem().GetFile(file_id);
+    if (!getfile_op.result) {
+        emit caughtError("getLocaleFileContents", {"Файл не найден!", QString("Не удаётся найти в словаре файл с id ") + QString::number(file_id)});
+        emit processFinished("getLocaleFileContents", {"Error"});
+        return;
+    }
+
+    if (getrealfile_op.value->FileType() != LOTRO_DAT::TEXT) {
+        emit caughtError("getLocaleFileContents", {"Некорректный формат!", QString("Получение данных локали доступно только для текстовых файлов!")});
+        emit processFinished("getLocaleFileContents", {"Error"});
+        return;
+    }
+
+    LOTRO_DAT::TextSubFile text_subfile(subfile);
+
+    auto getfiledata_op = file.GetFileSystem().GetFileData(subfile, 8);
+
+    if (getfile_op.result == LOTRO_DAT::ERROR) {
+        emit caughtError("getLocaleFileContents", {"Ошибка извлечения!", QString("Обнаружены некорректные данные файла в словаре! Файл ресурсов мог быть повреждён!\nid = ") + QString::number(file_id) + ", locale_id = " + QString::number(locale)});
+        emit processFinished("getLocaleFileContents", {"Error"});
+        return;
+    }
+
+    LOTRO_DAT::SubfileData result = text_subfile.PrepareForExport(getfiledata_op.value);
+    emit localeFileContentsReceived(locale, result);
+    emit processFinished("getLocaleFileContents", {"Success", file_id, locale});
+}
+
+void LotroManager::importFilesFromDatabase(QString database_path) {
+    emit processStarted("importFilesFromDatabase", {database_path});
+
+    if (!FileSystem::fileExists(database_path)) {
+        emit caughtError(QString("importFilesFromDatabase"), {QString("Ошибка импорта!"), QString("Файл " + database_path + " не существует! Невозможно инициализировать базу данных!")});
+        emit processFinished("importFilesFromDatabase", {QString("Error")});
+        return;
+    }
+
+    LOTRO_DAT::Database db;
+    if (!db.InitDatabase(database_path.toStdString())) {
+        emit caughtError("importFilesFromDatabase", {QString("Ошибка импорта!"), QString("Внутренняя ошибка инициализации базы данных!")});
+        emit processFinished("importFilesFromDatabase", {QString("Error")});
+        return;
+    }
+
+    auto patch_operation = file.GetPatcher().PatchAllDatabase(&db);
+
+    if (patch_operation.result == LOTRO_DAT::SUCCESS) {
+        file.GetFileSystem().CommitDirectories();
+        file.GetLocaleManager().CommitLocales();
+        emit processFinished("importFilesFromDatabase", {QString("Success"), patch_operation.value});
+    } else {
+        emit processFinished("importFilesFromDatabase", {QString("Error"), 0});
+    }
+}
+
+void LotroManager::importFile(long long file_id, QString file_path) {
+    emit processStarted("importFile", {file_id, file_path});
+
+    if (!FileSystem::fileExists(file_path)) {
+        emit caughtError("importFile", {QString("Ошибка импорта!"), QString("Файл ") + file_path + QString(" не существует!")});
+        emit processFinished("importFile", {QString("Error")});
+        return;
+    }
+
+    LOTRO_DAT::SubfileData data;
+
+    data.options["fid"] = file_id;
+
+    auto getfile_op = file.GetFileSystem().GetFile(file_id);
+    if (getfile_op.result == LOTRO_DAT::ERROR) {
+        emit caughtError("importFile", {QString("Ошибка импорта!"), QString("Файл с id ") + QString::number(file_id) + QString(" не существует в ресурсах игры! Невозможно импортировать :/")});
+        emit processFinished("importFile", {QString("Error")});
+        return;
+    }
+
+    LOTRO_DAT::SubFile subfile = *(getfile_op.value);
+    data.options["ext"] = subfile.Extension();
+    data.options["cat"] = subfile.category;
+
+    if (subfile.FileType() == LOTRO_DAT::TEXT) {
+        std::basic_ifstream<char16_t> input_stream(file_path.toStdString(), std::ios::in);
+        if (!input_stream.is_open()) {
+            emit caughtError("importFile", {QString("Ошибка импорта!"), QString("Текстовый файл ") + file_path + QString(" не удаётся открыть!")});
+            emit processFinished("importFile", {QString("Error")});
+            return;
+        }
+
+        std::basic_stringstream<char16_t>  strStream;
+        strStream << input_stream.rdbuf();//read the file
+        data.text_data = strStream.str();//str holds the content of the file
+
+        input_stream.close();
+    } else {
+        QFile data_file(file_path);
+        data_file.open(QIODevice::ReadOnly);
+
+        if (!data_file.isOpen()) {
+            emit caughtError("importFile", {QString("Ошибка импорта!"), QString("Файл ") + file_path + QString(" не удаётся открыть!")});
+            emit processFinished("importFile", {QString("Error")});
+            return;
+        }
+
+        QByteArray contents = data_file.readAll();
+        data.binary_data = LOTRO_DAT::BinaryData(contents.constData(), contents.size());
+    }
+
+
+    auto patchfile_op = file.GetPatcher().PatchFile(data);
+
+    if (patchfile_op.result == LOTRO_DAT::SUCCESS) {
+        file.GetFileSystem().CommitDirectories();
+        file.GetLocaleManager().CommitLocales();
+        emit processFinished("importFile", {QString("Success")});
+    } else {
+        emit caughtError("importFile", {QString("Ошибка импорта!"), QString("Возникла внутренняя ошибка применения патча. Импорт завершился с ошибкой")});
+        emit processFinished("importFile", {QString("Error")});
+    }
+    return;
+}
+
+void LotroManager::importTextFragment(long long file_id, long long fragment_id,
+                               QString fragment_contents, QString arguments) {
+    emit processStarted("importTextFragment", {file_id, fragment_id});
+
+    if (fragment_contents.contains("DO_NOT_TOUCH-1!")) {
+        emit caughtError("importTextFragment", {"Ошибка формата!", QString("Текстовые данные содержат указатели на аргументы DO_NOT_TOUCH! с встроенным указанием порядка аргументов (как на сайте) Такого быть не должно! Пользуйтесь порядком перечисления аргументов внизу")});
+        emit processFinished("importTextFragment", {"Error"});
+        return;
+    }
+
+    auto getfile_op = file.GetFileSystem().GetFile(file_id);
+    if (!getfile_op.result) {
+        emit caughtError("importTextFragment", {"Файл не найден!", QString("Не удаётся найти в ресурсах файл с id ") + QString::number(file_id)});
+        emit processFinished("importTextFragment", {"Error"});
+        return;
+    }
+
+    auto subfile = getfile_op.value;
+
+    auto getfiledata_op = file.GetFileSystem().GetFileData(*subfile, 8);
+
+    if (getfile_op.result == LOTRO_DAT::ERROR) {
+        emit caughtError("importTextFragment", {"Ошибка импорта!", QString("Обнаружены некорректные данные файла в словаре! Файл ресурсов мог быть повреждён!\nid = ") + QString::number(file_id)});
+        emit processFinished("importTextFragment", {"Error"});
+        return;
+    }
+
+    LOTRO_DAT::SubfileData data = subfile->PrepareForExport(getfiledata_op.value);
+    if (data.Empty()) {
+        emit caughtError("importTextFragment", {"Ошибка импорта!", QString("Не удалось подготовить файл к изменению фрагмента!\nid = ") + QString::number(file_id)});
+        emit processFinished("importTextFragment", {"Error"});
+        return;
+    }
+
+    unsigned beginning = data.text_data.find(QString::number(fragment_id).toStdU16String(), 0);
+    if (beginning == std::u16string::npos) {
+        emit caughtError("importTextFragment", {"Ошибка импорта!", QString("Не удалось найти фрагмент в файле!\nid = ") + QString::number(file_id) + "\nfragment_id = " + QString::number(fragment_id)});
+        emit processFinished("importTextFragment", {"Error"});
+        return;
+    }
+
+    unsigned ending = data.text_data.find(QString("|||").toStdU16String(), beginning);
+
+    QString new_fragment = QString::number(fragment_id) + ":::" + arguments + ":::" + fragment_contents;
+    std::u16string new_text =  data.text_data.substr(0, beginning) + new_fragment.toStdU16String() + data.text_data.substr(ending);
+    data.text_data = new_text;
+
+    auto patchfile_op = file.GetPatcher().PatchFile(data);
+
+    if (patchfile_op.result == LOTRO_DAT::SUCCESS) {
+        file.GetFileSystem().CommitDirectories();
+        file.GetLocaleManager().CommitLocales();
+        emit processFinished("importTextFragment", {QString("Success")});
+    } else {
+        emit caughtError("importTextFragment", {QString("Ошибка импорта!"), QString("Возникла внутренняя ошибка применения патча. Импорт завершился с ошибкой")});
+        emit processFinished("importTextFragment", {QString("Error")});
+    }
+}
+
+void LotroManager::getTextFragment(long long file_id, long long fragment_id) {
+    emit processStarted("getTextFragment", {file_id, fragment_id});
+
+    auto getfile_op = file.GetFileSystem().GetFile(file_id);
+    if (!getfile_op.result) {
+        emit caughtError("getTextFragment", {"Файл не найден!", QString("Не удаётся найти в ресурсах файл с id ") + QString::number(file_id)});
+        emit processFinished("getTextFragment", {"Error"});
+        return;
+    }
+
+    auto subfile = getfile_op.value;
+
+    auto getfiledata_op = file.GetFileSystem().GetFileData(*subfile, 8);
+
+    if (getfile_op.result == LOTRO_DAT::ERROR) {
+        emit caughtError("getTextFragment", {"Ошибка импорта!", QString("Обнаружены некорректные данные файла в словаре! Файл ресурсов мог быть повреждён!\nid = ") + QString::number(file_id)});
+        emit processFinished("getTextFragment", {"Error"});
+        return;
+    }
+
+    LOTRO_DAT::SubfileData data = subfile->PrepareForExport(getfiledata_op.value);
+    if (data.Empty()) {
+        emit caughtError("getTextFragment", {"Ошибка импорта!", QString("Не удалось подготовить файл к изменению фрагмента!\nid = ") + QString::number(file_id)});
+        emit processFinished("getTextFragment", {"Error"});
+        return;
+    }
+
+    unsigned beginning = data.text_data.find(QString::number(fragment_id).toStdU16String(), 0);
+    if (beginning == std::u16string::npos) {
+        emit caughtError("getTextFragment", {"Ошибка импорта!", QString("Не удалось найти фрагмент в файле!\nid = ") + QString::number(file_id) + "\nfragment_id = " + QString::number(fragment_id)});
+        emit processFinished("getTextFragment", {"Error"});
+        return;
+    }
+
+    unsigned ending = data.text_data.find(QString("|||").toStdU16String(), beginning);
+
+    unsigned size = std::u16string::npos;
+
+    if (ending != std::u16string::npos)
+        size = ending - beginning;
+
+    std::u16string str = data.text_data.substr(beginning, size);
+
+    QStringList splitted_fragment = QString::fromStdU16String(str).split(":::");
+    if (splitted_fragment.size() != 3) {
+        emit caughtError("getTextFragment", {"Ошибка импорта!", QString("Получены некорректные данные фрагмента!\nДанные:") + QString::fromStdU16String(str)});
+        emit processFinished("getTextFragment", {"Error"});
+        return;
+    }
+
+    emit textFragmentReceived(splitted_fragment.at(1), splitted_fragment.at(2));
+    emit processFinished("getTextFragment", {"Success"});
+}
+
+void LotroManager::createCoreStatusFile(QString output_filename) {
+    emit processStarted("createCoreStatusFile", {output_filename});
+    auto gatherinfo_op = file.GatherInformation(output_filename.toStdString());
+
+    if (gatherinfo_op.result == LOTRO_DAT::SUCCESS) {
+        emit processFinished("createCoreStatusFile", {"Success", output_filename});
+    } else {
+        emit caughtError("createCoreStatusFile", {"Ошибка сбора информации!", QString("Не удаётся создать файл информации ядра")});
+        emit processFinished("createCoreStatusFile", {"Error", output_filename});
+    }
+}
+
+void LotroManager::extractSingleFile(QString output_filename, long long file_id) {
+    emit processStarted("extractSingleFile", {output_filename, file_id});
+    auto extractfile_op = file.GetExporter().ExtractFileById(file_id, output_filename.toStdString());
+    if (extractfile_op.result == LOTRO_DAT::SUCCESS) {
+        emit processFinished("extractSingleFile", {"Success", output_filename, file_id});
+    } else {
+        emit caughtError("extractSingleFile", {"Ошибка экспорта!", QString("Не удаётся экспортировать файл " + QString::number(file_id) + " в файл " + output_filename)});
+        emit processFinished("extractSingleFile", {"Error", output_filename});
+    }
+}
+
+void LotroManager::extractSingleFileToDatabase(QString database_path, long long file_id) {
+    emit processStarted("extractSingleFileToDatabase", {database_path, file_id});
+    LOTRO_DAT::Database db;
+    if (!db.InitDatabase(database_path.toStdString())) {
+        emit caughtError("extractSingleFileToDatabase", {"Ошибка экспорта!", QString("Не удаётся создать/открыть базу данных " + database_path)});
+        emit processFinished("extractSingleFileToDatabase", {"Error", database_path});
+        return;
+    }
+
+    auto extractfile_op = file.GetExporter().ExtractFileById(file_id, &db);
+
+    if (extractfile_op.result == LOTRO_DAT::SUCCESS) {
+        emit processFinished("extractSingleFileToDatabase", {"Success", database_path, file_id});
+    } else {
+        emit caughtError("extractSingleFileToDatabase", {"Ошибка экспорта!", QString("Не удаётся экспортировать файл " + QString::number(file_id) + " в базу данных " + database_path)});
+        emit processFinished("extractSingleFileToDatabase", {"Error", database_path});
+    }
+}
+
+void LotroManager::extractGrouppedFiles(QString output_foldername, LOTRO_DAT::FILE_TYPE type) {
+    emit processStarted("extractGrouppedFiles", {output_foldername, type});
+    auto extractfile_op = file.GetExporter().ExtractAllFilesByType(type, output_foldername.toStdString());
+    if (extractfile_op.result == LOTRO_DAT::SUCCESS) {
+        emit processFinished("extractGrouppedFiles", {"Success", output_foldername, type, extractfile_op.value});
+    } else {
+        emit caughtError("extractGrouppedFiles", {"Ошибка экспорта!", QString("Не удаётся экспортировать файлы с типом " + QString::number(type) + " в папку " + output_foldername)});
+        emit processFinished("extractGrouppedFiles", {"Error", output_foldername, type, extractfile_op.value});
+    }
+}
+
+void LotroManager::extractGrouppedFilesToDatabase(QString database_path, LOTRO_DAT::FILE_TYPE type) {
+    emit processStarted(QString("extractGrouppedFilesToDatabase"), {database_path, type});
+    LOTRO_DAT::Database db;
+    if (!db.InitDatabase(database_path.toStdString())) {
+        emit caughtError("extractGrouppedFilesToDatabase", {"Ошибка экспорта!", QString("Не удаётся создать/открыть базу данных " + database_path)});
+        emit processFinished("extractGrouppedFilesToDatabase", {"Error", database_path});
+        return;
+    }
+
+    auto extractfile_op = file.GetExporter().ExtractAllFilesByType(type, &db);
+    if (extractfile_op.result == LOTRO_DAT::SUCCESS) {
+        emit processFinished("extractGrouppedFilesToDatabase", {"Success", database_path, type, extractfile_op.value});
+    } else {
+        emit caughtError("extractGrouppedFilesToDatabase", {"Ошибка экспорта!", QString("Не удаётся экспортировать файлы с типом " + QString::number(type) + " в базу данных " + database_path)});
+        emit processFinished("extractGrouppedFilesToDatabase", {"Error", database_path, extractfile_op.value});
+    }
+}
+
+void LotroManager::getUnactiveCategories() {
+    emit processStarted("getUnactiveCategories", {});
+
+    const std::set<long long>& categories = file.GetLocaleManager().GetInactiveCategories();
+
+    QStringList result;
+    for (long long category : categories) {
+        result << QString::number(category);
+    }
+
+    emit unactiveCategoriesReceived(result);
+    emit processFinished("getUnactiveCategories", {"Success"});
+}
+
+void LotroManager::startGame() {
+    emit processStarted("startGame", {});
+
+    QStringList args;
+    args << "-skiprawdownload" << "-nosplash";
+    if (file.GetLocaleManager().GetCurrentLocale() == LOTRO_DAT::DatLocaleManager::PATCHED)
+        args << "-disablePatch";
+
+    file.Deinitialize();
+
+    if(FileSystem::fileExists(QApplication::applicationDirPath() + "/user.ini")){
+        QSettings login(QApplication::applicationDirPath() + "/user.ini", QSettings::IniFormat );
+        login.beginGroup("Account");
+        QString username = login.value("username", "").toString();
+        QString password = login.value("password", "").toString();
+        login.endGroup();
+        args << "-username" << username << "-password" << password;
+    }
+
+    qDebug() << "Запускаем игру со следующими аргументами: " << args;
+
+    QFile f(app_settings->value("Local", "folder").toString() + "/LotroLauncher.exe");
+    QProcess process;
+
+    if (FileSystem::fileExists(f.fileName())) {
+        if(f.fileName().contains(" ")) f.setFileName("\"" + f.fileName() + "\"");
+        process.startDetached(f.fileName(), args);
+        process.waitForFinished(-1);
+        emit processFinished("startGame", {});
+    } else {
+        emit caughtError("startGame", {"Ошибка запуска игры!", QString("Не удалось найти файл LotroLauncher в папке: ") + app_settings->value("Local", "folder").toString()});
+        emit processFinished("startGame", {"Error"});
+    }
+}
+
+void LotroManager::getLocaleFileInfo(long long file_id, int locale) {
+    emit processStarted("getLocaleFileInfo", {file_id, locale});
+
+    auto getfile_op = file.GetLocaleManager().GetLocaleFile(file_id, (LOTRO_DAT::DatLocaleManager::LOCALE)locale);
+    if (!getfile_op.result) {
+        emit caughtError("getLocaleFileInfo", {"Файл не найден!", QString("Не удаётся найти в ресурсах файл с id ") + QString::number(file_id)});
+        emit processFinished("getLocaleFileInfo", {"Error"});
+        return;
+    }
+
+    LOTRO_DAT::SubFile subfile = getfile_op.value;
+
+    QString result = "Locale file info:\n "
+                     "dictionary_offset: " + QString::number(subfile.dictionary_offset()) + "\n"
+                     "unknown1: " + QString::number(subfile.unknown1()) + "\n"
+                     "file_id: " + QString::number(subfile.file_id()) + "\n"
+                     "file_offset: " + QString::number(subfile.file_offset()) + "\n"
+                     "file_size: " + QString::number(subfile.file_size()) + "\n"
+                     "timestamp: " + QString::number(subfile.timestamp()) + "\n"
+                     "version: " + QString::number(subfile.version()) + "\n"
+                     "block_size: " + QString::number(subfile.block_size()) + "\n"
+                     "unknown2: " + QString::number(subfile.file_id()) + "\n"
+                     "category: " + QString::number(subfile.category) + "\n";
+
+    emit localeFileInfoReceived(locale, result);
+    emit processFinished("getLocaleFileInfo", {"Success"});
+}
+
+void LotroManager::getFileInfo(long long file_id) {
+    emit processStarted(QString("getFileInfo"), {file_id});
+
+    auto getfile_op = file.GetFileSystem().GetFile(file_id);
+    if (!getfile_op.result) {
+        emit caughtError("getFileInfo", {"Файл не найден!", QString("Не удаётся найти файл с id ") + QString::number(file_id)});
+        emit processFinished("getFileInfo", {"Error"});
+        return;
+    }
+
+    LOTRO_DAT::SubFile subfile = *getfile_op.value;
+
+    QString result = "Locale file info:\n "
+                     "dictionary_offset: " + QString::number(subfile.dictionary_offset()) + "\n"
+                     "unknown1: " + QString::number(subfile.unknown1()) + "\n"
+                     "file_id: " + QString::number(subfile.file_id()) + "\n"
+                     "file_offset: " + QString::number(subfile.file_offset()) + "\n"
+                     "file_size: " + QString::number(subfile.file_size()) + "\n"
+                     "timestamp: " + QString::number(subfile.timestamp()) + "\n"
+                     "version: " + QString::number(subfile.version()) + "\n"
+                     "block_size: " + QString::number(subfile.block_size()) + "\n"
+                     "unknown2: " + QString::number(subfile.file_id()) + "\n";
+
+    emit fileInfoReceived(result);
+    emit processFinished("getFileInfo", {"Success"});
+}
+
+LOTRO_DAT::DatStatus *LotroManager::getStatusModule()
+{
+    return &file.GetStatusModule();
+}
+
+bool LotroManager::initialised() {
+    return file.Initialized();
+}
+
+int LotroManager::currentLocale() {
+    return file.GetLocaleManager().GetCurrentLocale();
+}
+
+bool LotroManager::notPatched() {
+    return file.GetStatusModule().CheckIfNotPatched();
+}

+ 77 - 0
src/Legacy/models/lotromanager.h

@@ -0,0 +1,77 @@
+#ifndef LEGACYAPP_H
+#define LEGACYAPP_H
+
+#include <QObject>
+#include <QSettings>
+#include <QApplication>
+
+#include <LotroDat/LotroDat.h>
+
+class LotroManager : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit LotroManager(QSettings* app_settings_, QObject *parent = nullptr);
+
+    bool initialised();
+
+    int currentLocale();
+
+    bool notPatched();
+
+public slots:
+    void initialiseDatFile(QString file_path);
+
+    void deinitialiseDatFile();
+
+    void changeLocale();
+
+    void getLocaleFileContents(long long file_id, int locale);
+
+    void importFilesFromDatabase(QString database_path);
+
+    void importFile(long long file_id, QString file_path);
+
+    void importTextFragment(long long file_id, long long fragment_id, QString fragment_contents, QString arguments);
+
+    void getTextFragment(long long file_id, long long fragment_id);
+
+    void createCoreStatusFile(QString output_filename);
+
+    void extractSingleFile(QString output_filename, long long file_id);
+
+    void extractSingleFileToDatabase(QString database_path, long long file_id);
+
+    void extractGrouppedFiles(QString output_foldername, LOTRO_DAT::FILE_TYPE type);
+
+    void extractGrouppedFilesToDatabase(QString database_path, LOTRO_DAT::FILE_TYPE type);
+
+    void getUnactiveCategories();
+
+    void startGame();
+
+    void getLocaleFileInfo(long long file_id, int locale);
+
+    void getFileInfo(long long file_id);
+
+    LOTRO_DAT::DatStatus *getStatusModule();
+
+signals:
+    // general signals. First argument is process_name, second - processed values
+    void processStarted(QString, QVector<QVariant>);
+    void processFinished(QString, QVector<QVariant>);
+    void processUpdated(QString, QVector<QVariant>);
+    void caughtError(QString, QVector<QVariant>);
+
+    void textFragmentReceived(QString, QString);
+    void unactiveCategoriesReceived(QStringList);
+    void localeFileContentsReceived(int, LOTRO_DAT::SubfileData); // extention, contents
+    void localeFileInfoReceived(int, QString);
+    void fileInfoReceived(QString);
+private:
+    LOTRO_DAT::DatFile file;
+    QSettings* app_settings;
+};
+
+#endif // LEGACYAPP_H

+ 13 - 13
src/Legacy/object_script.Legacy.Debug

@@ -2,26 +2,26 @@ INPUT(
 ./..\..\build\debug\Legacy\rcc\qrc_backgrounds.o
 ./..\..\build\debug\Legacy\rcc\qrc_common.o
 ./..\..\build\debug\Legacy\obj\main.o
+./..\..\build\debug\Legacy\obj\downloader.o
+./..\..\build\debug\Legacy\obj\filesystem.o
+./..\..\build\debug\Legacy\obj\lotromanager.o
+./..\..\build\debug\Legacy\obj\helpwidget.o
 ./..\..\build\debug\Legacy\obj\mainwindow.o
 ./..\..\build\debug\Legacy\obj\menuentry.o
-./..\..\build\debug\Legacy\obj\legacyapp.o
-./..\..\build\debug\Legacy\obj\filesystem.o
-./..\..\build\debug\Legacy\obj\statuswidget.o
-./..\..\build\debug\Legacy\obj\rusificationwidget.o
-./..\..\build\debug\Legacy\obj\settingswidget.o
 ./..\..\build\debug\Legacy\obj\newswidget.o
-./..\..\build\debug\Legacy\obj\helpwidget.o
-./..\..\build\debug\Legacy\obj\networkdownloader.o
 ./..\..\build\debug\Legacy\obj\rusificationtreeitem.o
+./..\..\build\debug\Legacy\obj\rusificationwidget.o
+./..\..\build\debug\Legacy\obj\settingswidget.o
+./..\..\build\debug\Legacy\obj\statuswidget.o
 ./..\..\build\debug\Legacy\obj\legacy_plugin_import.o
+./..\..\build\debug\Legacy\obj\moc_downloader.o
+./..\..\build\debug\Legacy\obj\moc_filesystem.o
+./..\..\build\debug\Legacy\obj\moc_lotromanager.o
+./..\..\build\debug\Legacy\obj\moc_helpwidget.o
 ./..\..\build\debug\Legacy\obj\moc_mainwindow.o
 ./..\..\build\debug\Legacy\obj\moc_menuentry.o
-./..\..\build\debug\Legacy\obj\moc_legacyapp.o
-./..\..\build\debug\Legacy\obj\moc_filesystem.o
-./..\..\build\debug\Legacy\obj\moc_statuswidget.o
+./..\..\build\debug\Legacy\obj\moc_newswidget.o
 ./..\..\build\debug\Legacy\obj\moc_rusificationwidget.o
 ./..\..\build\debug\Legacy\obj\moc_settingswidget.o
-./..\..\build\debug\Legacy\obj\moc_newswidget.o
-./..\..\build\debug\Legacy\obj\moc_helpwidget.o
-./..\..\build\debug\Legacy\obj\moc_networkdownloader.o
+./..\..\build\debug\Legacy\obj\moc_statuswidget.o
 );

+ 13 - 13
src/Legacy/object_script.Legacy.Release

@@ -1,25 +1,25 @@
 INPUT(
 ./..\..\build\release\Legacy\obj\main.o
+./..\..\build\release\Legacy\obj\downloader.o
+./..\..\build\release\Legacy\obj\filesystem.o
+./..\..\build\release\Legacy\obj\lotromanager.o
+./..\..\build\release\Legacy\obj\helpwidget.o
 ./..\..\build\release\Legacy\obj\mainwindow.o
 ./..\..\build\release\Legacy\obj\menuentry.o
-./..\..\build\release\Legacy\obj\legacyapp.o
-./..\..\build\release\Legacy\obj\filesystem.o
-./..\..\build\release\Legacy\obj\statuswidget.o
-./..\..\build\release\Legacy\obj\rusificationwidget.o
-./..\..\build\release\Legacy\obj\settingswidget.o
 ./..\..\build\release\Legacy\obj\newswidget.o
-./..\..\build\release\Legacy\obj\helpwidget.o
-./..\..\build\release\Legacy\obj\networkdownloader.o
 ./..\..\build\release\Legacy\obj\rusificationtreeitem.o
+./..\..\build\release\Legacy\obj\rusificationwidget.o
+./..\..\build\release\Legacy\obj\settingswidget.o
+./..\..\build\release\Legacy\obj\statuswidget.o
 ./..\..\build\release\Legacy\obj\legacy_plugin_import.o
+./..\..\build\release\Legacy\obj\moc_downloader.o
+./..\..\build\release\Legacy\obj\moc_filesystem.o
+./..\..\build\release\Legacy\obj\moc_lotromanager.o
+./..\..\build\release\Legacy\obj\moc_helpwidget.o
 ./..\..\build\release\Legacy\obj\moc_mainwindow.o
 ./..\..\build\release\Legacy\obj\moc_menuentry.o
-./..\..\build\release\Legacy\obj\moc_legacyapp.o
-./..\..\build\release\Legacy\obj\moc_filesystem.o
-./..\..\build\release\Legacy\obj\moc_statuswidget.o
+./..\..\build\release\Legacy\obj\moc_newswidget.o
 ./..\..\build\release\Legacy\obj\moc_rusificationwidget.o
 ./..\..\build\release\Legacy\obj\moc_settingswidget.o
-./..\..\build\release\Legacy\obj\moc_newswidget.o
-./..\..\build\release\Legacy\obj\moc_helpwidget.o
-./..\..\build\release\Legacy\obj\moc_networkdownloader.o
+./..\..\build\release\Legacy\obj\moc_statuswidget.o
 );

BIN
src/Legacy/resources/appicon.ico


+ 0 - 13
src/Legacy/resources/backgrounds.qrc

@@ -1,13 +0,0 @@
-<RCC>
-    <qresource prefix="/">
-        <file>backgrounds/bg1.png</file>
-        <file>backgrounds/bg2.png</file>
-        <file>backgrounds/bg3.png</file>
-        <file>backgrounds/bg4.png</file>
-        <file>backgrounds/bg5.png</file>
-        <file>backgrounds/bg6.png</file>
-        <file>backgrounds/bg7.png</file>
-        <file>backgrounds/bg8.png</file>
-        <file>backgrounds/bg9.png</file>
-    </qresource>
-</RCC>

BIN
src/Legacy/resources/backgrounds/bg1.png


BIN
src/Legacy/resources/backgrounds/bg2.png


BIN
src/Legacy/resources/backgrounds/bg3.png


BIN
src/Legacy/resources/backgrounds/bg4.png


BIN
src/Legacy/resources/backgrounds/bg5.png


BIN
src/Legacy/resources/backgrounds/bg6.png


BIN
src/Legacy/resources/backgrounds/bg7.png


BIN
src/Legacy/resources/backgrounds/bg8.png


BIN
src/Legacy/resources/backgrounds/bg9.png


BIN
src/Legacy/resources/buttons/RPG_GUI_v1.png


BIN
src/Legacy/resources/buttons/close.png


BIN
src/Legacy/resources/buttons/down_minus.png


BIN
src/Legacy/resources/buttons/down_minus_0.png


BIN
src/Legacy/resources/buttons/folder.png


BIN
src/Legacy/resources/buttons/gray-button-hi.png


BIN
src/Legacy/resources/buttons/gray_btn.png


BIN
src/Legacy/resources/buttons/green-button-hi.png


BIN
src/Legacy/resources/buttons/minimize.png


BIN
src/Legacy/resources/buttons/off.png


BIN
src/Legacy/resources/buttons/on.png


BIN
src/Legacy/resources/buttons/onoff.png


BIN
src/Legacy/resources/buttons/onoff1.png


BIN
src/Legacy/resources/buttons/orange-button-hi.png


BIN
src/Legacy/resources/buttons/question.png


BIN
src/Legacy/resources/buttons/right_plus.png


BIN
src/Legacy/resources/buttons/right_plus_0.png


BIN
src/Legacy/resources/buttons/white_btn.png


BIN
src/Legacy/resources/buttons/white_btn_pressed.png


+ 0 - 35
src/Legacy/resources/common.qrc

@@ -1,35 +0,0 @@
-<RCC>
-    <qresource prefix="/">
-        <file>fonts/trajan.ttf</file>
-        <file>fonts/viking.ttf</file>
-        <file>status/critical.png</file>
-        <file>status/error.png</file>
-        <file>status/info.png</file>
-        <file>status/ok.png</file>
-        <file>status/warning.png</file>
-        <file>buttons/close.png</file>
-        <file>buttons/folder.png</file>
-        <file>buttons/gray-button-hi.png</file>
-        <file>buttons/green-button-hi.png</file>
-        <file>buttons/minimize.png</file>
-        <file>buttons/off.png</file>
-        <file>buttons/on.png</file>
-        <file>buttons/onoff.png</file>
-        <file>buttons/onoff1.png</file>
-        <file>buttons/orange-button-hi.png</file>
-        <file>buttons/question.png</file>
-        <file>appicon.ico</file>
-        <file>teksty-photo-normal.png</file>
-        <file>fonts/title.TTF</file>
-        <file>buttons/white_btn.png</file>
-        <file>buttons/white_btn_pressed.png</file>
-        <file>buttons/gray_btn.png</file>
-        <file>patch_icons/karty-photo-small.png</file>
-        <file>patch_icons/shrifty-photo-small.png</file>
-        <file>patch_icons/teksty-photo-small.png</file>
-        <file>patch_icons/zagruzochnye-ekrany-photo-small.png</file>
-        <file>patch_icons/zvuki-photo-small.png</file>
-        <file>buttons/down_minus.png</file>
-        <file>buttons/right_plus.png</file>
-    </qresource>
-</RCC>

BIN
src/Legacy/resources/fonts/title.TTF


Some files were not shown because too many files changed in this diff