changeset 2548:87e5590d034b

All Books windows are refactored into respective classes
author a.parshin
date Tue, 12 May 2015 03:24:19 +0200
parents fed97f15d1e1
children 3121fb54a110
files Build/Visual Studio 2013/World of Might and Magic.vcxproj Build/Visual Studio 2013/World of Might and Magic.vcxproj.filters GUI/GUIButton.cpp GUI/GUIWindow.cpp GUI/GUIWindow.h GUI/UI/Books/AutonotesBook.cpp GUI/UI/Books/AutonotesBook.h GUI/UI/Books/CalendarBook.cpp GUI/UI/Books/CalendarBook.h GUI/UI/Books/JournalBook.cpp GUI/UI/Books/JournalBook.h GUI/UI/Books/LloydsBook.cpp GUI/UI/Books/LloydsBook.h GUI/UI/Books/MapBook.cpp GUI/UI/Books/MapBook.h GUI/UI/Books/QuestBook.cpp GUI/UI/Books/QuestBook.h GUI/UI/Books/TownPortalBook.cpp GUI/UI/Books/TownPortalBook.h GUI/UI/Books/UIMapBook.cpp GUI/UI/Books/UIMapBook.h GUI/UI/Books/UINotesBooks.cpp GUI/UI/Books/UINotesBooks.h GUI/UI/Books/UISpellBook.cpp GUI/UI/UIBooks.cpp GUI/UI/UIBooks.h GUI/UI/UIMainMenu.cpp GUI/UI/UIPopup.cpp Game/Game.cpp IO/Keyboard.cpp IO/Mouse.cpp
diffstat 30 files changed, 1935 insertions(+), 1599 deletions(-) [+]
line wrap: on
line diff
--- a/Build/Visual Studio 2013/World of Might and Magic.vcxproj	Tue May 12 01:45:31 2015 +0200
+++ b/Build/Visual Studio 2013/World of Might and Magic.vcxproj	Tue May 12 03:24:19 2015 +0200
@@ -160,8 +160,13 @@
     <ClCompile Include="..\..\GUI\GUIWindow.cpp" />
     <ClCompile Include="..\..\GUI\NewUI\Core\UIControlModule_wrap.cxx" />
     <ClCompile Include="..\..\GUI\NewUI\MainMenu.cpp" />
-    <ClCompile Include="..\..\GUI\UI\Books\UIMapBook.cpp" />
-    <ClCompile Include="..\..\GUI\UI\Books\UINotesBooks.cpp" />
+    <ClCompile Include="..\..\GUI\UI\Books\AutonotesBook.cpp" />
+    <ClCompile Include="..\..\GUI\UI\Books\CalendarBook.cpp" />
+    <ClCompile Include="..\..\GUI\UI\Books\JournalBook.cpp" />
+    <ClCompile Include="..\..\GUI\UI\Books\LloydsBook.cpp" />
+    <ClCompile Include="..\..\GUI\UI\Books\MapBook.cpp" />
+    <ClCompile Include="..\..\GUI\UI\Books\QuestBook.cpp" />
+    <ClCompile Include="..\..\GUI\UI\Books\TownPortalBook.cpp" />
     <ClCompile Include="..\..\GUI\UI\Books\UISpellBook.cpp" />
     <ClCompile Include="..\..\GUI\UI\UIArena.cpp" />
     <ClCompile Include="..\..\GUI\UI\UIBooks.cpp" />
@@ -333,8 +338,13 @@
     <ClInclude Include="..\..\GUI\GUIWindow.h" />
     <ClInclude Include="..\..\GUI\NewUI\Core\UIControl.h" />
     <ClInclude Include="..\..\GUI\NewUI\MainMenu.h" />
-    <ClInclude Include="..\..\GUI\UI\Books\UIMapBook.h" />
-    <ClInclude Include="..\..\GUI\UI\Books\UINotesBooks.h" />
+    <ClInclude Include="..\..\GUI\UI\Books\AutonotesBook.h" />
+    <ClInclude Include="..\..\GUI\UI\Books\CalendarBook.h" />
+    <ClInclude Include="..\..\GUI\UI\Books\JournalBook.h" />
+    <ClInclude Include="..\..\GUI\UI\Books\LloydsBook.h" />
+    <ClInclude Include="..\..\GUI\UI\Books\MapBook.h" />
+    <ClInclude Include="..\..\GUI\UI\Books\QuestBook.h" />
+    <ClInclude Include="..\..\GUI\UI\Books\TownPortalBook.h" />
     <ClInclude Include="..\..\GUI\UI\Books\UISpellBook.h" />
     <ClInclude Include="..\..\GUI\UI\UIArena.h" />
     <ClInclude Include="..\..\GUI\UI\UIBooks.h" />
--- a/Build/Visual Studio 2013/World of Might and Magic.vcxproj.filters	Tue May 12 01:45:31 2015 +0200
+++ b/Build/Visual Studio 2013/World of Might and Magic.vcxproj.filters	Tue May 12 03:24:19 2015 +0200
@@ -490,12 +490,6 @@
     <ClCompile Include="..\..\GUI\UI\Books\UISpellBook.cpp">
       <Filter>GUI\UI\Books</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\GUI\UI\Books\UIMapBook.cpp">
-      <Filter>GUI\UI\Books</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\GUI\UI\Books\UINotesBooks.cpp">
-      <Filter>GUI\UI\Books</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\GUI\UI\UIGuilds.cpp">
       <Filter>GUI\UI</Filter>
     </ClCompile>
@@ -583,6 +577,27 @@
     <ClCompile Include="..\..\GUI\UI\UIModal.cpp">
       <Filter>GUI\UI</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\GUI\UI\Books\LloydsBook.cpp">
+      <Filter>GUI\UI\Books</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\GUI\UI\Books\TownPortalBook.cpp">
+      <Filter>GUI\UI\Books</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\GUI\UI\Books\QuestBook.cpp">
+      <Filter>GUI\UI\Books</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\GUI\UI\Books\AutonotesBook.cpp">
+      <Filter>GUI\UI\Books</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\GUI\UI\Books\MapBook.cpp">
+      <Filter>GUI\UI\Books</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\GUI\UI\Books\CalendarBook.cpp">
+      <Filter>GUI\UI\Books</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\GUI\UI\Books\JournalBook.cpp">
+      <Filter>GUI\UI\Books</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\lib\libavcodec\avcodec.h">
@@ -1237,12 +1252,6 @@
     <ClInclude Include="..\..\GUI\UI\Books\UISpellBook.h">
       <Filter>GUI\UI\Books</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\GUI\UI\Books\UIMapBook.h">
-      <Filter>GUI\UI\Books</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\GUI\UI\Books\UINotesBooks.h">
-      <Filter>GUI\UI\Books</Filter>
-    </ClInclude>
     <ClInclude Include="..\..\GUI\UI\UIGame.h">
       <Filter>GUI\UI</Filter>
     </ClInclude>
@@ -1333,6 +1342,27 @@
     <ClInclude Include="..\..\GUI\UI\UIModal.h">
       <Filter>GUI\UI</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\GUI\UI\Books\LloydsBook.h">
+      <Filter>GUI\UI\Books</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\GUI\UI\Books\TownPortalBook.h">
+      <Filter>GUI\UI\Books</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\GUI\UI\Books\QuestBook.h">
+      <Filter>GUI\UI\Books</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\GUI\UI\Books\AutonotesBook.h">
+      <Filter>GUI\UI\Books</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\GUI\UI\Books\MapBook.h">
+      <Filter>GUI\UI\Books</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\GUI\UI\Books\CalendarBook.h">
+      <Filter>GUI\UI\Books</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\GUI\UI\Books\JournalBook.h">
+      <Filter>GUI\UI\Books</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\lib\OpenAL\lib\x86\avcodec-55.def">
--- a/GUI/GUIButton.cpp	Tue May 12 01:45:31 2015 +0200
+++ b/GUI/GUIButton.cpp	Tue May 12 03:24:19 2015 +0200
@@ -88,7 +88,7 @@
 struct GUIWindow *pGUIWindow_Settings;
 struct GUIWindow *pModalWindow;
 struct GUIWindow *pGUIWindow_EscMessageWindow;
-struct GUIWindow *pBooksWindow;
+struct GUIWindow *pBooksButtonOverlay;
 struct GUIWindow *pGUIWindow2;
 
 
--- a/GUI/GUIWindow.cpp	Tue May 12 01:45:31 2015 +0200
+++ b/GUI/GUIWindow.cpp	Tue May 12 03:24:19 2015 +0200
@@ -219,7 +219,7 @@
 GUIWindow_Spellbook::GUIWindow_Spellbook(unsigned int x, unsigned int y, unsigned int width, unsigned int height, int button, const char *hint) :
     GUIWindow(x, y, width, height, button, hint)
 {
-    InitializeBookTextures();
+    InitializeSpellBookTextures();
     OpenSpellBook();
 }
 
@@ -398,12 +398,6 @@
 
 
 
-void GUIWindow_Book::Release()
-{
-    OnCloseBook();
-
-    GUIWindow::Release();
-}
 
 void GUIWindow_Dialogue::Release()
 {
@@ -507,259 +501,6 @@
   return result;
 }
 
-//----- (00411BFC) --------------------------------------------------------
-void GUIWindow::InitializeBookView()
-{
-  char *pString; // eax@12
-  int pTextHeight; // eax@12
-  //__int64 page_count; // qax@12
-  unsigned int page_count; // esi@12
-  unsigned __int16 v18; // ax@38
-  signed int max_beacons; // [sp+10h] [bp-5Ch]@38
-  GUIWindow journal_window; // [sp+18h] [bp-54h]@8
-
-  pAudioPlayer->StopChannels(-1, -1);
-  InitializeBookFonts();
-  this->CreateButton(475, 445, 158, 34, 1, 0, UIMSG_Escape, 0, 0, pGlobalTXT_LocalizationStrings[79], 0); // Close
-  current_screen_type = SCREEN_BOOKS;
-  full_num_items_in_book = 0;
-  books_primary_item_per_page = 0;
-  books_page_number = 0;
-  num_achieved_awards = 0; 
-  switch (this->par1C)
-  {
-    case WINDOW_LloydsBeacon:
-    {
-      byte_506360 = 0;
-      pTexture_CurrentBook = pIcons_LOD->LoadTexturePtr("lb_bordr", TEXTURE_16BIT_PALETTE);
-      pTexture_LloydBeacons[0] = pIcons_LOD->LoadTexturePtr("sbmap", TEXTURE_16BIT_PALETTE);
-      pTexture_LloydBeacons[1] = pIcons_LOD->LoadTexturePtr("sbmap", TEXTURE_16BIT_PALETTE);
-      pTex_book_button1_on  = pIcons_LOD->LoadTexturePtr("tab-an-6b", TEXTURE_16BIT_PALETTE);
-      pTex_book_button1_off = pIcons_LOD->LoadTexturePtr("tab-an-6a", TEXTURE_16BIT_PALETTE);
-
-      pBtn_Book_1 = this->CreateButton(415, 13, 39, 36, 1, 0, UIMSG_LloydsBeacon_FlippingBtn, 0, 0, pGlobalTXT_LocalizationStrings[375], 0); // Set Beacon
-      pBtn_Book_2 = this->CreateButton(415, 48, 39, 36, 1, 0, UIMSG_LloydsBeacon_FlippingBtn, 1, 0, pGlobalTXT_LocalizationStrings[523], 0); // Recall Beacon
-
-      max_beacons = 1;
-      v18 = pParty->pPlayers[_506348_current_lloyd_playerid].pActiveSkills[PLAYER_SKILL_WATER];
-      if ( v18 & 0x100 || (v18 & 0x80) )
-          max_beacons = 5;
-      else if ( v18 & 0x40 )
-          max_beacons = 3;
-
-      for ( int i = 0; i < max_beacons; ++i )
-            CreateButton(pLloydsBeaconsPreviewXs[i], pLloydsBeaconsPreviewYs[i],
-                           92, 68, 1, 180, UIMSG_InstallBeacon, i, 0, "", 0);
-
-      for ( int i = 0; i < 5; ++i )
-      {
-        if (pParty->pPlayers[_506348_current_lloyd_playerid].pInstalledBeacons[i].uBeaconTime  >= (signed __int64)pParty->uTimePlayed)
-            LoadThumbnailLloydTexture(i, _506348_current_lloyd_playerid + 1);
-        else 
-          memset(&pParty->pPlayers[_506348_current_lloyd_playerid].pInstalledBeacons[i], 0, sizeof(LloydBeacon));
-      }
-    }
-    break;
-
-    case WINDOW_TownPortal:
-    {
-      pTexture_CurrentBook        = pIcons_LOD->LoadTexturePtr("townport", TEXTURE_16BIT_PALETTE);
-      pTexture_TownPortalIcons[0] = pIcons_LOD->LoadTexturePtr("tpharmndy", TEXTURE_16BIT_PALETTE);
-      pTexture_TownPortalIcons[1] = pIcons_LOD->LoadTexturePtr("tpelf", TEXTURE_16BIT_PALETTE);
-      pTexture_TownPortalIcons[2] = pIcons_LOD->LoadTexturePtr("tpwarlock", TEXTURE_16BIT_PALETTE);
-      pTexture_TownPortalIcons[3] = pIcons_LOD->LoadTexturePtr("tpisland", TEXTURE_16BIT_PALETTE);
-      pTexture_TownPortalIcons[4] = pIcons_LOD->LoadTexturePtr("tpheaven", TEXTURE_16BIT_PALETTE);
-      pTexture_TownPortalIcons[5] = pIcons_LOD->LoadTexturePtr("tphell", TEXTURE_16BIT_PALETTE);
-      
-      static int pTownPortalBook_ws[6] = { 80,  66,  68,  72,  67,  74};
-      static int pTownPortalBook_hs[6] = { 55,  56,  65,  67,  67,  59};
-      for ( uint i = 0; i < 6; ++i )
-        this->CreateButton(pTownPortalBook_xs[i], pTownPortalBook_ys[i], pTownPortalBook_ws[i], pTownPortalBook_hs[i], 1, 182, UIMSG_ClickTownInTP, i, 0, "", nullptr);
-      
-    }
-    break;
-
-  case WINDOW_QuestBook:
-  {
-      pTexture_CurrentBook    = pIcons_LOD->LoadTexturePtr("sbquiknot", TEXTURE_16BIT_PALETTE);
-      pSpellBookPagesTextr_10 = pIcons_LOD->LoadTexturePtr( "divbar", TEXTURE_16BIT_PALETTE);
-      pTex_book_button1_on = pIcons_LOD->LoadTexturePtr("tab-an-6b", TEXTURE_16BIT_PALETTE);
-      pTex_book_button2_on = pIcons_LOD->LoadTexturePtr("tab-an-7b", TEXTURE_16BIT_PALETTE);
-      pTex_book_button1_off = pIcons_LOD->LoadTexturePtr("tab-an-6a", TEXTURE_16BIT_PALETTE);
-      pTex_book_button2_off = pIcons_LOD->LoadTexturePtr("tab-an-7a", TEXTURE_16BIT_PALETTE);
-      pBtn_Book_1 = this->CreateButton(pViewport->uViewportTL_X + 398,         pViewport->uViewportTL_Y + 1,
-                                     pTex_book_button1_on->uTextureWidth, pTex_book_button1_on->uTextureHeight,
-                                     1, 0, UIMSG_ClickBooksBtn, 0xBu, 0, pGlobalTXT_LocalizationStrings[192],// "Scroll Up"
-                                     pTex_book_button1_on, 0);
-      pBtn_Book_2 = this->CreateButton(pViewport->uViewportTL_X + 398,          pViewport->uViewportTL_Y + 38,
-                                     pTex_book_button2_on->uTextureHeight, pTex_book_button2_on->uTextureHeight,
-                                     1, 0, UIMSG_ClickBooksBtn, 0xAu, 0, pGlobalTXT_LocalizationStrings[193],// "Scroll Down"
-                                     pTex_book_button2_on, 0);
-      num_achieved_awards = 0;
-      memset(achieved_awards.data(), 0, 4000);
-      for ( uint i = books_primary_item_per_page; i < 512; ++i )
-      {
-        if ( _449B57_test_bit(pParty->_quest_bits, i) && pQuestTable[i] )
-        {
-          achieved_awards[num_achieved_awards] = (AwardType)i;
-          ++num_achieved_awards;
-        }
-      }
-      full_num_items_in_book = num_achieved_awards;
-      num_achieved_awards = 0;
-    }
-    break;
-
-    case WINDOW_AutonotesBook:
-    {
-      pTexture_AutonotesBook   = pIcons_LOD->LoadTexturePtr("sbautnot", TEXTURE_16BIT_PALETTE);
-      pSpellBookPagesTextr_10  = pIcons_LOD->LoadTexturePtr("divbar", TEXTURE_16BIT_PALETTE);
-      pTex_book_button1_on  = pIcons_LOD->LoadTexturePtr("tab-an-6b", TEXTURE_16BIT_PALETTE);
-      pTex_book_button2_on  = pIcons_LOD->LoadTexturePtr("tab-an-7b", TEXTURE_16BIT_PALETTE);
-      pTex_book_button1_off = pIcons_LOD->LoadTexturePtr("tab-an-6a", TEXTURE_16BIT_PALETTE);
-      pTex_book_button2_off = pIcons_LOD->LoadTexturePtr("tab-an-7a", TEXTURE_16BIT_PALETTE);
-      pTex_book_button3_on = pIcons_LOD->LoadTexturePtr("tab-an-1b", TEXTURE_16BIT_PALETTE);
-      pTex_book_button3_off = pIcons_LOD->LoadTexturePtr("tab-an-1a", TEXTURE_16BIT_PALETTE);
-      pTex_book_button4_on = pIcons_LOD->LoadTexturePtr("tab-an-2b", TEXTURE_16BIT_PALETTE);
-      pTex_book_button4_off = pIcons_LOD->LoadTexturePtr("tab-an-2a", TEXTURE_16BIT_PALETTE);
-      pTex_book_button5_on = pIcons_LOD->LoadTexturePtr("tab-an-3b", TEXTURE_16BIT_PALETTE);
-      pTex_book_button5_off = pIcons_LOD->LoadTexturePtr("tab-an-3a", TEXTURE_16BIT_PALETTE);
-      pTex_book_button6_on = pIcons_LOD->LoadTexturePtr("tab-an-5b", TEXTURE_16BIT_PALETTE);
-      pTex_book_button6_off = pIcons_LOD->LoadTexturePtr("tab-an-5a", TEXTURE_16BIT_PALETTE);
-      pTex_book_button7_on = pIcons_LOD->LoadTexturePtr("tab-an-4b", TEXTURE_16BIT_PALETTE);
-      pTex_book_button7_off = pIcons_LOD->LoadTexturePtr("tab-an-4a", TEXTURE_16BIT_PALETTE);
-      pTex_book_button8_on = pIcons_LOD->LoadTexturePtr("tab-an-8b", TEXTURE_16BIT_PALETTE);
-      pTex_book_button8_off = pIcons_LOD->LoadTexturePtr("tab-an-8a", TEXTURE_16BIT_PALETTE);
-
-      pBtn_Book_1                = this->CreateButton(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 1,   50, 34, 1, 0, 
-                                                    UIMSG_ClickBooksBtn, 11, 0, pGlobalTXT_LocalizationStrings[193], pTex_book_button1_on, 0);
-      pBtn_Book_2                = this->CreateButton(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 38,  50, 34, 1, 0, 
-                                                    UIMSG_ClickBooksBtn, 10, 0, pGlobalTXT_LocalizationStrings[192], pTex_book_button2_on, 0);
-      pBtn_Book_3                = this->CreateButton(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 113, 50, 34, 1, 0, 
-                                                    UIMSG_ClickBooksBtn,  2, 0, pGlobalTXT_LocalizationStrings[85], pTex_book_button3_on, 0); // "Potion Notes"
-      pBtn_Book_4                = this->CreateButton(pViewport->uViewportTL_X + 399, pViewport->uViewportTL_Y + 150, 50, 34, 1, 0, 
-                                                    UIMSG_ClickBooksBtn,  3, 0, pGlobalTXT_LocalizationStrings[137], pTex_book_button4_on, 0); // "Fountain Notes"
-      pBtn_Book_5                = this->CreateButton(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 188, 50, 34, 1, 0, 
-                                                    UIMSG_ClickBooksBtn,  4, 0, pGlobalTXT_LocalizationStrings[8], pTex_book_button5_on, 0); // "Obelisk Notes"
-      pBtn_Book_6                = this->CreateButton(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 226, 50, 34, 1, 0, 
-                                                    UIMSG_ClickBooksBtn,  5, 0, pGlobalTXT_LocalizationStrings[141], pTex_book_button6_on, 0); // "Seer Notes"
-      pBtn_Autonotes_Misc        = this->CreateButton(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 264, 50, 34, 1, 0, 
-                                                    UIMSG_ClickBooksBtn,  6, 0, pGlobalTXT_LocalizationStrings[123], pTex_book_button7_on, 0); // "Miscellaneous Notes"
-      pBtn_Autonotes_Instructors = this->CreateButton(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 302, 50, 34, 1, 0, 
-                                                    UIMSG_ClickBooksBtn,  7, 0, pGlobalTXT_LocalizationStrings[662], pTex_book_button8_on, 0); // "Instructors"
-
-      num_achieved_awards = 0;
-      for ( uint i = books_primary_item_per_page; i < 196; ++i )
-      {
-        if ( _506568_autonote_type == pAutonoteTxt[i].eType)//dword_72371C[2 * v10] )
-        {
-          if ( i )
-          {
-            if ( _449B57_test_bit(pParty->_autonote_bits, i) && pAutonoteTxt[i].pText )
-            {
-              achieved_awards[num_achieved_awards] = (AwardType)i;
-              ++num_achieved_awards;
-            }
-          }
-        }
-      }
-      full_num_items_in_book = num_achieved_awards;
-      num_achieved_awards = 0;
-    }
-    break;
-
-    case WINDOW_MapsBook:
-    {
-      dword_506364 = 1;
-      pSpellBookPagesTextr_12  = pIcons_LOD->LoadTexturePtr("sbmap", TEXTURE_16BIT_PALETTE);
-      pTex_book_button1_on  = pIcons_LOD->LoadTexturePtr("zoom-on", TEXTURE_16BIT_PALETTE);
-      pTex_book_button2_on  = pIcons_LOD->LoadTexturePtr("zoot-on", TEXTURE_16BIT_PALETTE);
-      pTex_book_button1_off = pIcons_LOD->LoadTexturePtr("zoom-off", TEXTURE_16BIT_PALETTE);
-      pTex_book_button2_off = pIcons_LOD->LoadTexturePtr("zoot-off", TEXTURE_16BIT_PALETTE);
-      pTex_book_button3_on = pIcons_LOD->LoadTexturePtr("tabNon", TEXTURE_16BIT_PALETTE);
-      pTex_book_button3_off = pIcons_LOD->LoadTexturePtr("tabNoff", TEXTURE_16BIT_PALETTE);
-      pTex_book_button4_on = pIcons_LOD->LoadTexturePtr("tabSon", TEXTURE_16BIT_PALETTE);
-      pTex_book_button4_off = pIcons_LOD->LoadTexturePtr("tabSoff", TEXTURE_16BIT_PALETTE);
-      pTex_book_button5_on = pIcons_LOD->LoadTexturePtr("tabEon", TEXTURE_16BIT_PALETTE);
-      pTex_book_button5_off = pIcons_LOD->LoadTexturePtr("tabEoff", TEXTURE_16BIT_PALETTE);
-      pTex_book_button6_on = pIcons_LOD->LoadTexturePtr("tabWon", TEXTURE_16BIT_PALETTE);
-      pTex_book_button6_off = pIcons_LOD->LoadTexturePtr("tabWoff", TEXTURE_16BIT_PALETTE);
-
-      pBtn_Book_1 = this->CreateButton(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 1,   50, 34, 1, 0, 
-                                     UIMSG_ClickBooksBtn, 0, 0, pGlobalTXT_LocalizationStrings[251], pTex_book_button1_on, 0);// "Zoom In"
-      pBtn_Book_2 = this->CreateButton(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 38,  50, 34, 1, 0, 
-                                     UIMSG_ClickBooksBtn, 1, 0, pGlobalTXT_LocalizationStrings[252], pTex_book_button2_on, 0);// "Zoom Out"
-      pBtn_Book_3 = this->CreateButton(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 113, 50, 34, 1, 0, 
-                                     UIMSG_ClickBooksBtn, 2, 0, pGlobalTXT_LocalizationStrings[192], (Texture *)"", 0);// Scroll Up
-      pBtn_Book_4 = this->CreateButton(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 150, 50, 34, 1, 0, 
-                                     UIMSG_ClickBooksBtn, 3, 0, pGlobalTXT_LocalizationStrings[193], (Texture *)"", 0);// Scroll Down
-      pBtn_Book_5 = this->CreateButton(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 188, 50, 34, 1, 0, 
-                                     UIMSG_ClickBooksBtn, 4, 0, pGlobalTXT_LocalizationStrings[573], (Texture *)"", 0);// "Scroll Right"
-      pBtn_Book_6 = this->CreateButton(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 226, 50, 34, 1, 0, 
-                                      UIMSG_ClickBooksBtn, 5, 0, pGlobalTXT_LocalizationStrings[572], (Texture *)"", 0);// "Scroll Left"
-    }
-    break;
-
-    case WINDOW_CalendarBook:
-    {
-      pSpellBookPagesTextr_13 = pIcons_LOD->LoadTexturePtr("sbdate-time", TEXTURE_16BIT_PALETTE);
-      pTex_moon_new = pIcons_LOD->LoadTexturePtr("moon_new", TEXTURE_16BIT_PALETTE);
-      pTex_moon_4   = pIcons_LOD->LoadTexturePtr("moon_4", TEXTURE_16BIT_PALETTE);
-      pTex_moon_2   = pIcons_LOD->LoadTexturePtr("moon_2", TEXTURE_16BIT_PALETTE);
-      pTex_moon_2_2 = pIcons_LOD->LoadTexturePtr("moon_2", TEXTURE_16BIT_PALETTE);
-      pTex_moon_ful = pIcons_LOD->LoadTexturePtr("moon_ful", TEXTURE_16BIT_PALETTE);
-    }
-    break;
-
-    case WINDOW_JournalBook:
-    {
-      pSpellBookPagesTextr_11  = pIcons_LOD->LoadTexturePtr("sbplayrnot", TEXTURE_16BIT_PALETTE);
-      pTex_book_button1_on  = pIcons_LOD->LoadTexturePtr("tab-an-6b", TEXTURE_16BIT_PALETTE);
-      pTex_book_button2_on  = pIcons_LOD->LoadTexturePtr("tab-an-7b", TEXTURE_16BIT_PALETTE);
-      pTex_book_button1_off = pIcons_LOD->LoadTexturePtr("tab-an-6a", TEXTURE_16BIT_PALETTE);
-      pTex_book_button2_off = pIcons_LOD->LoadTexturePtr("tab-an-7a", TEXTURE_16BIT_PALETTE);
-
-      pBtn_Book_1 = this->CreateButton(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 1,  
-                      pTex_book_button1_on->uTextureWidth,  pTex_book_button1_on->uTextureHeight, 1, 0, 
-                      UIMSG_ClickBooksBtn, 11, 0, pGlobalTXT_LocalizationStrings[192], pTex_book_button1_on, 0);
-      pBtn_Book_2 = this->CreateButton(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 38, pTex_book_button2_on->uTextureHeight,
-                                      pTex_book_button2_on->uTextureHeight, 1, 0, UIMSG_ClickBooksBtn, 10, 0, 
-                                      pGlobalTXT_LocalizationStrings[193], pTex_book_button2_on, 0);
-
-      num_achieved_awards = 0;
-      journal_window.uFrameX = 48;
-      journal_window.uFrameY = 70;
-      journal_window.uFrameWidth = 360;
-      journal_window.uFrameHeight = 264;
-      journal_window.uFrameZ = 407;
-      journal_window.uFrameHeight = (LOBYTE(pAutonoteFont->uFontHeight) - 3) * 264 / LOBYTE(pAutonoteFont->uFontHeight) - 3;
-      journal_window.uFrameW = journal_window.uFrameHeight + 69;
-      memset(&achieved_awards, 0, 4000);
-      memset(Journal_limitation_factor.data(), 0, 100);
-      if ( books_primary_item_per_page < 29 )
-      {
-        for ( int i = books_primary_item_per_page; i < books_primary_item_per_page + 29; i++ )
-        {
-          if ( pParty->PartyTimes.HistoryEventTimes[i] > 0 )
-          {
-            if ( pStorylineText->StoreLine[i + 1].pText )
-            {
-              pString = BuildDialogueString(pStorylineText->StoreLine[i + 1].pText, uActiveCharacter - 1, 0, 0, 0, &pParty->PartyTimes.HistoryEventTimes[i]);
-              pTextHeight = pAutonoteFont->CalcTextHeight(pString, &journal_window, 1, 0);
-              page_count = ((pTextHeight - (pAutonoteFont->uFontHeight - 3)) / (signed int)journal_window.uFrameHeight) + 1;
-              memset32((char *)&achieved_awards[num_achieved_awards] , i + 1, page_count);
-              for ( uint j = 0; j <= page_count - 1; ++j )
-                Journal_limitation_factor[num_achieved_awards++] = j;
-            }
-          }
-        }
-      }
-      full_num_items_in_book = num_achieved_awards;
-      num_achieved_awards = 0;
-    }
-    break;
-  }
-}
 
 //----- (00415551) --------------------------------------------------------
 void GUIWindow::DrawMessageBox(int arg0)
@@ -1614,15 +1355,7 @@
 }
 
 
-
-void GUIWindow_Book::Update()
-{
-// -----------------------------------
-// 004156F0 GUI_UpdateWindows --- part
-    BookUI_Draw((WindowType)(int)ptr_1C);
-}
-
-void GUIWindow_BooksWindow::Update()
+void GUIWindow_BooksButtonOverlay::Update()
 {
 // -----------------------------------
 // 004156F0 GUI_UpdateWindows --- part
--- a/GUI/GUIWindow.h	Tue May 12 01:45:31 2015 +0200
+++ b/GUI/GUIWindow.h	Tue May 12 03:24:19 2015 +0200
@@ -300,7 +300,7 @@
   WINDOW_CloseRestWindowBtn  = 96,
   WINDOW_ExitCharacterWindow = 97, // OnCancel2
   WINDOW_RestWindow          = 0x62,
-  WINDOW_BooksWindow         = 99,
+  WINDOW_BooksButtonOverlay         = 99,
   WINDOW_CharacterWindow_Stats     = 0x64,
   WINDOW_CharacterWindow_Skills    = 0x65,
   WINDOW_CharacterWindow_Awards    = 0x66,
@@ -343,7 +343,6 @@
   void DrawShops_next_generation_time_string(__int64 next_generation_time);
   void HouseDialogManager();
   void OpenSpellBook();
-  void InitializeBookView();
   void DrawMessageBox(int arg0);
   GUIButton *GetControl(unsigned int uID);
   void _41D08F_set_keyboard_control_group(int num_buttons, int a3, int a4, int a5);
@@ -380,24 +379,13 @@
 #pragma pack(pop)
 
 
-struct GUIWindow_Book : public GUIWindow
+
+struct GUIWindow_BooksButtonOverlay : public GUIWindow
 {
-    GUIWindow_Book(unsigned int x, unsigned int y, unsigned int width, unsigned int height, int button, const char *hint) :
-        GUIWindow(x, y, width, height, button, hint)
-    {
-        InitializeBookView();
-    }
-    virtual ~GUIWindow_Book() {}
-
-    virtual void Update();
-    virtual void Release();
-};
-struct GUIWindow_BooksWindow : public GUIWindow
-{
-    GUIWindow_BooksWindow(unsigned int x, unsigned int y, unsigned int width, unsigned int height, int button, const char *hint) :
+    GUIWindow_BooksButtonOverlay(unsigned int x, unsigned int y, unsigned int width, unsigned int height, int button, const char *hint) :
         GUIWindow(x, y, width, height, button, hint)
     {}
-    virtual ~GUIWindow_BooksWindow() {}
+    virtual ~GUIWindow_BooksButtonOverlay() {}
 
     virtual void Update();
 };
@@ -709,19 +697,8 @@
 
 
 // book ui
-void BookUI_Draw(WindowType book);
-void BookUI_Questbook_Draw();
-void BookUI_Autonotes_Draw();
-void BookUI_Map_Draw();
-void BookUI_Calendar_Draw();
-void BookUI_Journal_Draw();
-
-void OnCloseBook();
-void InitializeBookTextures();
-void InitializeBookFonts();
+void InitializeSpellBookTextures();
 void DrawSpellBookContent(Player *player);
-unsigned int  DrawLloydBeaconsScreen();
-void BookUI_DrawTownPortalMap();
 void LoadSpellbook(unsigned int uID); // idb
 void DrawSpellDescriptionPopup(int spell_index);
 void OnCloseSpellBookPage();
@@ -902,7 +879,7 @@
 extern struct GUIWindow *pGUIWindow_Settings;
 extern struct GUIWindow *pModalWindow;
 extern struct GUIWindow *pGUIWindow_EscMessageWindow;
-extern struct GUIWindow *pBooksWindow;
+extern struct GUIWindow *pBooksButtonOverlay;
 extern struct GUIWindow *pGUIWindow2;
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GUI/UI/Books/AutonotesBook.cpp	Tue May 12 03:24:19 2015 +0200
@@ -0,0 +1,331 @@
+#include "Engine/Engine.h"
+#include "Engine/LOD.h"
+#include "Engine/Party.h"
+#include "Engine/Timer.h"
+#include "Engine/Autonotes.h"
+#include "Engine/Awards.h"
+#include "Engine/texts.h"
+#include "Engine/Graphics/IRender.h"
+#include "Engine/Graphics/Viewport.h"
+
+#include "GUI/GUIFont.h"
+#include "GUI/UI/Books/AutonotesBook.h"
+
+#include "Media/Audio/AudioPlayer.h"
+
+GUIWindow_AutonotesBook::GUIWindow_AutonotesBook() :
+    GUIWindow_Book()
+{
+    this->ptr_1C = (void *)WINDOW_AutonotesBook; // inherited from GUIWindow::GUIWindow
+    BasicBookInitialization();
+
+// --------------------------------
+// 004304E7 Game_EventLoop --- part
+    pEventTimer->Pause();
+    pAudioPlayer->StopChannels(-1, -1);
+    pBooksButtonOverlay = new GUIWindow_BooksButtonOverlay(527, 353, 0, 0, (int)pBtn_Autonotes, 0);
+    bFlashAutonotesBook = 0;
+
+// ----------------------------------------------
+// 00411BFC GUIWindow::InitializeBookView -- part
+    pTexture_AutonotesBook = pIcons_LOD->LoadTexturePtr("sbautnot", TEXTURE_16BIT_PALETTE);
+    pSpellBookPagesTextr_10 = pIcons_LOD->LoadTexturePtr("divbar", TEXTURE_16BIT_PALETTE);
+    pTex_book_button1_on = pIcons_LOD->LoadTexturePtr("tab-an-6b", TEXTURE_16BIT_PALETTE);
+    pTex_book_button2_on = pIcons_LOD->LoadTexturePtr("tab-an-7b", TEXTURE_16BIT_PALETTE);
+    pTex_book_button1_off = pIcons_LOD->LoadTexturePtr("tab-an-6a", TEXTURE_16BIT_PALETTE);
+    pTex_book_button2_off = pIcons_LOD->LoadTexturePtr("tab-an-7a", TEXTURE_16BIT_PALETTE);
+    pTex_book_button3_on = pIcons_LOD->LoadTexturePtr("tab-an-1b", TEXTURE_16BIT_PALETTE);
+    pTex_book_button3_off = pIcons_LOD->LoadTexturePtr("tab-an-1a", TEXTURE_16BIT_PALETTE);
+    pTex_book_button4_on = pIcons_LOD->LoadTexturePtr("tab-an-2b", TEXTURE_16BIT_PALETTE);
+    pTex_book_button4_off = pIcons_LOD->LoadTexturePtr("tab-an-2a", TEXTURE_16BIT_PALETTE);
+    pTex_book_button5_on = pIcons_LOD->LoadTexturePtr("tab-an-3b", TEXTURE_16BIT_PALETTE);
+    pTex_book_button5_off = pIcons_LOD->LoadTexturePtr("tab-an-3a", TEXTURE_16BIT_PALETTE);
+    pTex_book_button6_on = pIcons_LOD->LoadTexturePtr("tab-an-5b", TEXTURE_16BIT_PALETTE);
+    pTex_book_button6_off = pIcons_LOD->LoadTexturePtr("tab-an-5a", TEXTURE_16BIT_PALETTE);
+    pTex_book_button7_on = pIcons_LOD->LoadTexturePtr("tab-an-4b", TEXTURE_16BIT_PALETTE);
+    pTex_book_button7_off = pIcons_LOD->LoadTexturePtr("tab-an-4a", TEXTURE_16BIT_PALETTE);
+    pTex_book_button8_on = pIcons_LOD->LoadTexturePtr("tab-an-8b", TEXTURE_16BIT_PALETTE);
+    pTex_book_button8_off = pIcons_LOD->LoadTexturePtr("tab-an-8a", TEXTURE_16BIT_PALETTE);
+
+    pBtn_Book_1 = CreateButton(
+        pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 1, 50, 34, 1, 0,
+        UIMSG_ClickBooksBtn, 11, 0, pGlobalTXT_LocalizationStrings[193], pTex_book_button1_on, 0
+    );
+    pBtn_Book_2 = CreateButton(
+        pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 38, 50, 34, 1, 0,
+        UIMSG_ClickBooksBtn, 10, 0, pGlobalTXT_LocalizationStrings[192], pTex_book_button2_on, 0
+    );
+    pBtn_Book_3 = CreateButton(
+        pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 113, 50, 34, 1, 0,
+        UIMSG_ClickBooksBtn, 2, 0, pGlobalTXT_LocalizationStrings[85], pTex_book_button3_on, 0
+    ); // "Potion Notes"
+    pBtn_Book_4 = CreateButton(
+        pViewport->uViewportTL_X + 399, pViewport->uViewportTL_Y + 150, 50, 34, 1, 0,
+        UIMSG_ClickBooksBtn, 3, 0, pGlobalTXT_LocalizationStrings[137], pTex_book_button4_on, 0
+    ); // "Fountain Notes"
+    pBtn_Book_5 = CreateButton(
+        pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 188, 50, 34, 1, 0,
+        UIMSG_ClickBooksBtn, 4, 0, pGlobalTXT_LocalizationStrings[8], pTex_book_button5_on, 0
+    ); // "Obelisk Notes"
+    pBtn_Book_6 = CreateButton(
+        pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 226, 50, 34, 1, 0,
+        UIMSG_ClickBooksBtn, 5, 0, pGlobalTXT_LocalizationStrings[141], pTex_book_button6_on, 0
+    ); // "Seer Notes"
+    pBtn_Autonotes_Misc = CreateButton(
+        pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 264, 50, 34, 1, 0,
+        UIMSG_ClickBooksBtn, 6, 0, pGlobalTXT_LocalizationStrings[123], pTex_book_button7_on, 0
+    ); // "Miscellaneous Notes"
+    pBtn_Autonotes_Instructors = CreateButton(
+        pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 302, 50, 34, 1, 0,
+        UIMSG_ClickBooksBtn, 7, 0, pGlobalTXT_LocalizationStrings[662], pTex_book_button8_on, 0
+    ); // "Instructors"
+
+    int num_achieved_awards = 0;
+    for (uint i = books_primary_item_per_page; i < 196; ++i)
+    {
+        if (_506568_autonote_type == pAutonoteTxt[i].eType)//dword_72371C[2 * v10] )
+        {
+            if (i)
+            {
+                if (_449B57_test_bit(pParty->_autonote_bits, i) && pAutonoteTxt[i].pText)
+                {
+                    achieved_awards[num_achieved_awards] = (AwardType)i;
+                    ++num_achieved_awards;
+                }
+            }
+        }
+    }
+    full_num_items_in_book = num_achieved_awards;
+    num_achieved_awards = 0;
+}
+
+
+
+void GUIWindow_AutonotesBook::Update()
+{
+// -----------------------------------
+// 004156F0 GUI_UpdateWindows --- part
+// {
+//     BookUI_Draw((WindowType)(int)ptr_1C);
+// }
+
+// ----- (00413CC6) --------------------------------------------------------
+// void BookUI_Draw(WindowType book) --- part
+// {
+    pRenderer->DrawTextureIndexed(471, 445, pIcons_LOD->GetTexture(uExitCancelTextureId));
+//     BookUI_Autonotes_Draw();
+
+// ----- (0041338E) --------------------------------------------------------
+// void BookUI_Autonotes_Draw()
+// {
+    int pTextHeight; // eax@65
+    bool change_flag; // [sp+10h] [bp-58h]@1
+    GUIWindow autonotes_window; // [sp+14h] [bp-54h]@46
+
+    change_flag = false;
+    pRenderer->DrawTextureIndexed(pViewport->uViewportTL_X, pViewport->uViewportTL_Y, pTexture_AutonotesBook);
+    if (BtnUp_flag || !books_primary_item_per_page)
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 407, pViewport->uViewportTL_Y + 2, pTex_book_button1_off);
+    else
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 1, pTex_book_button1_on);
+
+    if (BtnDown_flag || books_primary_item_per_page + num_achieved_awards >= full_num_items_in_book)
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 407, pViewport->uViewportTL_Y + 38, pTex_book_button2_off);
+    else
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 38, pTex_book_button2_on);
+
+    if (Book_PageBtn3_flag)//Potions_page_flag
+    {
+        if (_506568_autonote_type == AUTONOTE_POTION_RECEPIE)//press again(повторное нажатие)
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 113, pTex_book_button3_on);
+        else//press(нажатие)
+        {
+            change_flag = true;
+            pAudioPlayer->PlaySound(SOUND_StartMainChoice02, 0, 0, -1, 0, 0, 0, 0);
+            _506568_autonote_type = AUTONOTE_POTION_RECEPIE;
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 113, pTex_book_button3_on);
+        }
+    }
+    else
+    {
+        if (_506568_autonote_type == AUTONOTE_POTION_RECEPIE)// default(по умолчанию при запуске окна)
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 113, pTex_book_button3_on);
+        else//Potions_page not active(вкладка снадобья не активна)
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 113, pTex_book_button3_off);
+    }
+
+    if (Book_PageBtn4_flag)//Fontains_page_flag
+    {
+        if (_506568_autonote_type == AUTONOTE_STAT_HINT)
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 399, pViewport->uViewportTL_Y + 150, pTex_book_button4_on);
+        else
+        {
+            change_flag = true;
+            pAudioPlayer->PlaySound(SOUND_StartMainChoice02, 0, 0, -1, 0, 0, 0, 0);
+            _506568_autonote_type = AUTONOTE_STAT_HINT;
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 399, pViewport->uViewportTL_Y + 150, pTex_book_button4_on);
+        }
+    }
+    else
+    {
+        if (_506568_autonote_type == AUTONOTE_STAT_HINT)
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 399, pViewport->uViewportTL_Y + 150, pTex_book_button4_on);
+        else
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 150, pTex_book_button4_off);
+    }
+
+    if (Book_PageBtn5_flag)//Autonotes_Obelisks_page_flag
+    {
+        if (_506568_autonote_type == AUTONOTE_OBELISK)
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 188, pTex_book_button5_on);
+        else
+        {
+            change_flag = true;
+            pAudioPlayer->PlaySound(SOUND_StartMainChoice02, 0, 0, -1, 0, 0, 0, 0);
+            _506568_autonote_type = AUTONOTE_OBELISK;
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 188, pTex_book_button5_on);
+        }
+    }
+    else
+    {
+        if (_506568_autonote_type == AUTONOTE_OBELISK)
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 188, pTex_book_button5_on);
+        else
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 188, pTex_book_button5_off);
+    }
+
+    if (Book_PageBtn6_flag)//Autonotes_Seer_page_flag
+    {
+        if (_506568_autonote_type == AUTONOTE_SEER)
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 226, pTex_book_button6_on);
+        else
+        {
+            change_flag = true;
+            pAudioPlayer->PlaySound(SOUND_StartMainChoice02, 0, 0, -1, 0, 0, 0, 0);
+            _506568_autonote_type = AUTONOTE_SEER;
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 226, pTex_book_button6_on);
+        }
+    }
+    else
+    {
+        if (_506568_autonote_type == AUTONOTE_SEER)
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 226, pTex_book_button6_on);
+        else
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 226, pTex_book_button6_off);
+    }
+
+    if (Autonotes_Misc_page_flag)
+    {
+        if (_506568_autonote_type == AUTONOTE_MISC)
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 264, pTex_book_button7_on);
+        else
+        {
+            change_flag = true;
+            pAudioPlayer->PlaySound(SOUND_StartMainChoice02, 0, 0, -1, 0, 0, 0, 0);
+            _506568_autonote_type = AUTONOTE_MISC;
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 264, pTex_book_button7_on);
+        }
+    }
+    else
+    {
+        if (_506568_autonote_type == AUTONOTE_MISC)
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 264, pTex_book_button7_on);
+        else
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 263, pTex_book_button7_off);
+    }
+
+    if (Autonotes_Instructors_page_flag)
+    {
+        if (_506568_autonote_type == AUTONOTE_TEACHER)
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 302, pTex_book_button8_on);
+        else
+        {
+            change_flag = true;
+            pAudioPlayer->PlaySound(SOUND_StartMainChoice02, 0, 0, -1, 0, 0, 0, 0);
+            _506568_autonote_type = AUTONOTE_TEACHER;
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 302, pTex_book_button8_on);
+        }
+    }
+    else
+    {
+        if (_506568_autonote_type == AUTONOTE_TEACHER)
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 302, pTex_book_button8_on);
+        else
+            pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 302, pTex_book_button8_off);
+    }
+
+    //for title
+    autonotes_window.uFrameWidth = game_viewport_width;
+    autonotes_window.uFrameHeight = game_viewport_height;
+    autonotes_window.uFrameX = game_viewport_x;
+    autonotes_window.uFrameY = game_viewport_y;
+    autonotes_window.uFrameZ = game_viewport_z;
+    autonotes_window.uFrameW = game_viewport_w;
+    autonotes_window.DrawTitleText(pBook2Font, 0, 22, ui_book_autonotes_title_color, pGlobalTXT_LocalizationStrings[154], 3); // "Auto notes"
+
+    //for other text
+    autonotes_window.uFrameX = 48;
+    autonotes_window.uFrameY = 70;
+    autonotes_window.uFrameWidth = 360;
+    autonotes_window.uFrameHeight = 264;
+    autonotes_window.uFrameZ = 407;
+    autonotes_window.uFrameW = 333;
+    if (change_flag)//change bookmark(смена закладки)
+    {
+        full_num_items_in_book = 0;
+        books_primary_item_per_page = 0;
+        books_page_number = 0;
+        num_achieved_awards = 0;
+        for (uint i = 1; i <= 195; ++i)
+        {
+            if (pAutonoteTxt[i].eType == _506568_autonote_type)
+            {
+                if ((unsigned __int16)_449B57_test_bit(pParty->_autonote_bits, i) && (char *)pAutonoteTxt[i].pText)
+                    achieved_awards[num_achieved_awards++] = (AwardType)i;
+            }
+        }
+        full_num_items_in_book = num_achieved_awards;
+    }
+    else//not change bookmark(не меняется закладка)
+    {
+        if (BtnDown_flag)// press Down bookmark(нажатие закладки пролистать дальше)
+        {
+            if (num_achieved_awards + books_primary_item_per_page < full_num_items_in_book)
+            {
+                books_num_items_per_page[books_page_number++] = num_achieved_awards;
+                books_primary_item_per_page = num_achieved_awards + books_primary_item_per_page;
+                pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0, 0, 0);
+            }
+        }
+        if (BtnUp_flag && books_page_number)// press Up bookmark(нажатие закладки пролистать назад)
+        {
+            --books_page_number;
+            books_primary_item_per_page -= (unsigned __int8)books_num_items_per_page[books_page_number];
+            pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0, 0, 0);
+        }
+        if (!num_achieved_awards || !books_primary_item_per_page)//количество записей 0 или номер первой страницы 0
+        {
+            books_primary_item_per_page = 0;
+            books_page_number = 0;
+        }
+    }
+    BtnUp_flag = 0;
+    BtnDown_flag = 0;
+    Book_PageBtn3_flag = 0;//Potions_page_flag
+    Book_PageBtn4_flag = 0;//Fontains_page_flag
+    Book_PageBtn5_flag = 0;//Autonotes_Obelisks_page_flag
+    Book_PageBtn6_flag = 0;//Autonotes_Seer_page_flag
+    Autonotes_Misc_page_flag = 0;
+    Autonotes_Instructors_page_flag = 0;
+    num_achieved_awards = 0;
+    for (uint i = books_primary_item_per_page; i < full_num_items_in_book; ++i)
+    {
+        ++num_achieved_awards;
+        autonotes_window.DrawText(pAutonoteFont, 1, 0, ui_book_autonotes_text_color, pAutonoteTxt[achieved_awards[i]].pText, 0, 0, 0);
+        pTextHeight = pAutonoteFont->CalcTextHeight(pAutonoteTxt[achieved_awards[i]].pText, &autonotes_window, 1, 0);
+        if ((signed int)(autonotes_window.uFrameY + pTextHeight) > (signed int)autonotes_window.uFrameHeight)
+            break;
+        pRenderer->DrawTextureIndexedAlpha(100, (autonotes_window.uFrameY + pTextHeight) + 12, pSpellBookPagesTextr_10);
+        autonotes_window.uFrameY = (autonotes_window.uFrameY + pTextHeight) + 24;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GUI/UI/Books/AutonotesBook.h	Tue May 12 03:24:19 2015 +0200
@@ -0,0 +1,10 @@
+#pragma once
+#include "GUI/UI/UIBooks.h"
+
+struct GUIWindow_AutonotesBook : public GUIWindow_Book
+{
+             GUIWindow_AutonotesBook();
+    virtual ~GUIWindow_AutonotesBook() {}
+
+    virtual void Update();
+};
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GUI/UI/Books/CalendarBook.cpp	Tue May 12 03:24:19 2015 +0200
@@ -0,0 +1,135 @@
+#include "Engine/Engine.h"
+#include "Engine/LOD.h"
+#include "Engine/Party.h"
+#include "Engine/Timer.h"
+#include "Engine/texts.h"
+#include "Engine/Graphics/IRender.h"
+#include "Engine/Graphics/Viewport.h"
+
+#include "GUI/GUIFont.h"
+#include "GUI/UI/Books/CalendarBook.h"
+
+#include "Media/Audio/AudioPlayer.h"
+
+
+
+GUIWindow_CalendarBook::GUIWindow_CalendarBook() :
+    GUIWindow_Book()
+{
+    this->ptr_1C = (void *)WINDOW_CalendarBook; // inherited from GUIWindow::GUIWindow
+    BasicBookInitialization();
+
+// --------------------------------
+// 004304E7 Game_EventLoop --- part
+    pEventTimer->Pause();
+    pAudioPlayer->StopChannels(-1, -1);
+    pBooksButtonOverlay = new GUIWindow_BooksButtonOverlay(570, 354, 0, 0, (int)pBtn_Calendar, 0);
+
+// ----------------------------------------------
+// 00411BFC GUIWindow::InitializeBookView -- part
+    pSpellBookPagesTextr_13 = pIcons_LOD->LoadTexturePtr("sbdate-time", TEXTURE_16BIT_PALETTE);
+    pTex_moon_new = pIcons_LOD->LoadTexturePtr("moon_new", TEXTURE_16BIT_PALETTE);
+    pTex_moon_4 = pIcons_LOD->LoadTexturePtr("moon_4", TEXTURE_16BIT_PALETTE);
+    pTex_moon_2 = pIcons_LOD->LoadTexturePtr("moon_2", TEXTURE_16BIT_PALETTE);
+    pTex_moon_2_2 = pIcons_LOD->LoadTexturePtr("moon_2", TEXTURE_16BIT_PALETTE);
+    pTex_moon_ful = pIcons_LOD->LoadTexturePtr("moon_ful", TEXTURE_16BIT_PALETTE);
+}
+
+
+
+//----- (00413D3C) --------------------------------------------------------
+static const char *GetDayPart()
+{
+    if (pParty->uCurrentHour > 5 && pParty->uCurrentHour < 20)
+        return pGlobalTXT_LocalizationStrings[56]; // "Day"
+    else if (pParty->uCurrentHour == 5)
+        return pGlobalTXT_LocalizationStrings[55]; // "Dawn"
+    else if (pParty->uCurrentHour == 20)
+        return pGlobalTXT_LocalizationStrings[566]; // "Dusk"
+    else
+        return pGlobalTXT_LocalizationStrings[567]; // "Night"
+}
+
+
+
+void GUIWindow_CalendarBook::Update()
+{
+// -----------------------------------
+// 004156F0 GUI_UpdateWindows --- part
+// {
+//     BookUI_Draw((WindowType)(int)ptr_1C);
+// }
+
+// ----- (00413CC6) --------------------------------------------------------
+// void BookUI_Draw(WindowType book) --- part
+// {
+    pRenderer->DrawTextureIndexed(471, 445, pIcons_LOD->GetTexture(uExitCancelTextureId));
+//     BookUI_Calendar_Draw();
+
+// ----- (00413D6F) --------------------------------------------------------
+// void BookUI_Calendar_Draw()
+// {
+    int am; // ecx@5
+    char *pMapName; // eax@6
+    GUIWindow calendar_window; // [sp+Ch] [bp-60h]@5
+    unsigned int pMapID; // [sp+60h] [bp-Ch]@1
+    unsigned int pHour;
+
+    static unsigned int pDayMoonPhase[28] = // 4E1B18
+    {
+        0, 0, 0,
+        1, 1, 1, 1,
+        2, 2, 2,
+        3, 3, 3, 3,
+        4, 4, 4,
+        3, 3, 3, 3,
+        2, 2, 2,
+        1, 1, 1, 1
+    };
+
+    pRenderer->DrawTextureIndexed(pViewport->uViewportTL_X, pViewport->uViewportTL_Y, pSpellBookPagesTextr_13);
+    pHour = pParty->uCurrentHour;
+    if ((signed int)pHour >= 12)
+    {
+        pHour -= 12;
+        if (!pHour)
+            pHour = 12;
+        am = 1;
+    }
+    else
+        am = 0;
+
+    calendar_window.uFrameX = game_viewport_x;
+    calendar_window.uFrameY = game_viewport_y;
+    calendar_window.uFrameWidth = game_viewport_width;
+    calendar_window.uFrameHeight = game_viewport_height;
+    calendar_window.uFrameZ = game_viewport_z;
+    calendar_window.uFrameW = game_viewport_w;
+    calendar_window.DrawTitleText(pBook2Font, 0, 22, ui_book_calendar_title_color, pGlobalTXT_LocalizationStrings[186], 3); // "Time in Erathia"
+
+    sprintf(pTmpBuf.data(), "%s\t100:\t110%d:%02d %s - %s", pGlobalTXT_LocalizationStrings[526], // "Time"
+        pHour, pParty->uCurrentMinute, aAMPMNames[am], GetDayPart());
+    calendar_window.DrawText(pBookFont, 70, 55, ui_book_calendar_time_color, pTmpBuf.data(), 0, 0, 0);
+
+    sprintf(pTmpBuf.data(), "%s\t100:\t110%d - %s", pGlobalTXT_LocalizationStrings[56], // "Day"
+        pParty->uDaysPlayed + 1, aDayNames[pParty->uDaysPlayed % 7]);
+    calendar_window.DrawText(pBookFont, 70, 2 * LOBYTE(pBookFont->uFontHeight) + 49, ui_book_calendar_day_color, pTmpBuf.data(), 0, 0, 0);
+
+    sprintf(pTmpBuf.data(), "%s\t100:\t110%d - %s", pGlobalTXT_LocalizationStrings[146], // "Month"
+        pParty->uCurrentMonth + 1, aMonthNames[pParty->uCurrentMonth]);
+    calendar_window.DrawText(pBookFont, 70, 4 * LOBYTE(pBookFont->uFontHeight) + 43, ui_book_calendar_month_color, pTmpBuf.data(), 0, 0, 0);
+
+    sprintf(pTmpBuf.data(), "%s\t100:\t110%d", pGlobalTXT_LocalizationStrings[245], pParty->uCurrentYear); // "Year"
+    calendar_window.DrawText(pBookFont, 70, 6 * LOBYTE(pBookFont->uFontHeight) + 37, ui_book_calendar_year_color, pTmpBuf.data(), 0, 0, 0);
+
+    sprintf(pTmpBuf.data(), "%s\t100:\t110%s", pGlobalTXT_LocalizationStrings[530], aMoonPhaseNames[pDayMoonPhase[pParty->uDaysPlayed]]); // "Moon"
+    calendar_window.DrawText(pBookFont, 70, 8 * LOBYTE(pBookFont->uFontHeight) + 31, ui_book_calendar_moon_color, pTmpBuf.data(), 0, 0, 0);
+
+    pMapID = pMapStats->GetMapInfo(pCurrentMapName);
+    if (pMapID)
+        pMapName = pMapStats->pInfos[pMapID].pName;
+    else
+        pMapName = "Unknown";
+    sprintf(pTmpBuf.data(), "%s\t100:\t110%s", pGlobalTXT_LocalizationStrings[531], pMapName); // "Location"
+    calendar_window.DrawText(pBookFont, 70, 10 * LOBYTE(pBookFont->uFontHeight) + 25, ui_book_calendar_location_color, pTmpBuf.data(), 0, 0, 0);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GUI/UI/Books/CalendarBook.h	Tue May 12 03:24:19 2015 +0200
@@ -0,0 +1,10 @@
+#pragma once
+#include "GUI/UI/UIBooks.h"
+
+struct GUIWindow_CalendarBook : public GUIWindow_Book
+{
+             GUIWindow_CalendarBook();
+    virtual ~GUIWindow_CalendarBook() {}
+
+    virtual void Update();
+};
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GUI/UI/Books/JournalBook.cpp	Tue May 12 03:24:19 2015 +0200
@@ -0,0 +1,166 @@
+#include "Engine/Engine.h"
+#include "Engine/LOD.h"
+#include "Engine/Party.h"
+#include "Engine/Timer.h"
+#include "Engine/Awards.h"
+#include "Engine/texts.h"
+#include "Engine/Graphics/IRender.h"
+#include "Engine/Graphics/Viewport.h"
+#include "Engine/Tables/StorylineTextTable.h"
+
+#include "GUI/GUIFont.h"
+#include "GUI/UI/Books/JournalBook.h"
+
+#include "Media/Audio/AudioPlayer.h"
+
+
+
+GUIWindow_JournalBook::GUIWindow_JournalBook() :
+    GUIWindow_Book()
+{
+    this->ptr_1C = (void *)WINDOW_JournalBook; // inherited from GUIWindow::GUIWindow
+    BasicBookInitialization();
+
+// --------------------------------
+// 004304E7 Game_EventLoop --- part
+    pEventTimer->Pause();
+    pAudioPlayer->StopChannels(-1, -1);
+    pBooksButtonOverlay = new GUIWindow_BooksButtonOverlay(0x258u, 0x169u, 0, 0, (int)pBtn_History, 0);
+    bFlashHistoryBook = 0;
+
+// ----------------------------------------------
+// 00411BFC GUIWindow::InitializeBookView -- part
+    char *pString; // eax@12
+    int pTextHeight; // eax@12
+    unsigned int page_count; // esi@12
+    GUIWindow journal_window; // [sp+18h] [bp-54h]@8
+
+    pSpellBookPagesTextr_11 = pIcons_LOD->LoadTexturePtr("sbplayrnot", TEXTURE_16BIT_PALETTE);
+    pTex_book_button1_on = pIcons_LOD->LoadTexturePtr("tab-an-6b", TEXTURE_16BIT_PALETTE);
+    pTex_book_button2_on = pIcons_LOD->LoadTexturePtr("tab-an-7b", TEXTURE_16BIT_PALETTE);
+    pTex_book_button1_off = pIcons_LOD->LoadTexturePtr("tab-an-6a", TEXTURE_16BIT_PALETTE);
+    pTex_book_button2_off = pIcons_LOD->LoadTexturePtr("tab-an-7a", TEXTURE_16BIT_PALETTE);
+
+    pBtn_Book_1 = this->CreateButton(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 1,
+        pTex_book_button1_on->uTextureWidth, pTex_book_button1_on->uTextureHeight, 1, 0,
+        UIMSG_ClickBooksBtn, 11, 0, pGlobalTXT_LocalizationStrings[192], pTex_book_button1_on, 0);
+    pBtn_Book_2 = this->CreateButton(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 38, pTex_book_button2_on->uTextureHeight,
+        pTex_book_button2_on->uTextureHeight, 1, 0, UIMSG_ClickBooksBtn, 10, 0,
+        pGlobalTXT_LocalizationStrings[193], pTex_book_button2_on, 0);
+
+    num_achieved_awards = 0;
+    journal_window.uFrameX = 48;
+    journal_window.uFrameY = 70;
+    journal_window.uFrameWidth = 360;
+    journal_window.uFrameHeight = 264;
+    journal_window.uFrameZ = 407;
+    journal_window.uFrameHeight = (LOBYTE(pAutonoteFont->uFontHeight) - 3) * 264 / LOBYTE(pAutonoteFont->uFontHeight) - 3;
+    journal_window.uFrameW = journal_window.uFrameHeight + 69;
+    memset(&achieved_awards, 0, 4000);
+    memset(Journal_limitation_factor.data(), 0, 100);
+    if (books_primary_item_per_page < 29)
+    {
+        for (int i = books_primary_item_per_page; i < books_primary_item_per_page + 29; i++)
+        {
+            if (pParty->PartyTimes.HistoryEventTimes[i] > 0)
+            {
+                if (pStorylineText->StoreLine[i + 1].pText)
+                {
+                    pString = BuildDialogueString(pStorylineText->StoreLine[i + 1].pText, uActiveCharacter - 1, 0, 0, 0, &pParty->PartyTimes.HistoryEventTimes[i]);
+                    pTextHeight = pAutonoteFont->CalcTextHeight(pString, &journal_window, 1, 0);
+                    page_count = ((pTextHeight - (pAutonoteFont->uFontHeight - 3)) / (signed int)journal_window.uFrameHeight) + 1;
+                    memset32((char *)&achieved_awards[num_achieved_awards], i + 1, page_count);
+                    for (uint j = 0; j <= page_count - 1; ++j)
+                        Journal_limitation_factor[num_achieved_awards++] = j;
+                }
+            }
+        }
+    }
+    full_num_items_in_book = num_achieved_awards;
+    num_achieved_awards = 0;
+}
+
+
+
+void GUIWindow_JournalBook::Update()
+{
+// -----------------------------------
+// 004156F0 GUI_UpdateWindows --- part
+// {
+//     BookUI_Draw((WindowType)(int)ptr_1C);
+// }
+
+// ----- (00413CC6) --------------------------------------------------------
+// void BookUI_Draw(WindowType book) --- part
+// {
+    pRenderer->DrawTextureIndexed(471, 445, pIcons_LOD->GetTexture(uExitCancelTextureId));
+//     BookUI_Journal_Draw();
+
+// ----- (00412E85) --------------------------------------------------------
+// void BookUI_Journal_Draw()
+// {
+    char *pDialogueString; // eax@21
+    char* pStringOnPage; // eax@22
+    GUIWindow journal_window; // [sp+8h] [bp-54h]@10
+
+    pRenderer->DrawTextureIndexed(pViewport->uViewportTL_X, pViewport->uViewportTL_Y, pSpellBookPagesTextr_11);
+    if (BtnUp_flag || !books_primary_item_per_page)
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 407, pViewport->uViewportTL_Y + 2, pTex_book_button1_off);
+    else
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 1, pTex_book_button1_on);
+
+    if (BtnDown_flag || books_primary_item_per_page + num_achieved_awards >= full_num_items_in_book)
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 407, pViewport->uViewportTL_Y + 38, pTex_book_button2_off);
+    else
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 38, pTex_book_button2_on);
+
+    if (!Journal_limitation_factor[books_primary_item_per_page])//for title
+    {
+        journal_window.uFrameWidth = game_viewport_width;
+        journal_window.uFrameX = game_viewport_x;
+        journal_window.uFrameY = game_viewport_y;
+        journal_window.uFrameHeight = game_viewport_height;
+        journal_window.uFrameZ = game_viewport_z;
+        journal_window.uFrameW = game_viewport_w;
+        if (pStorylineText->StoreLine[achieved_awards[books_primary_item_per_page]].pPageTitle)
+            journal_window.DrawTitleText(pBook2Font, 0, 22, ui_book_journal_title_color, pStorylineText->StoreLine[achieved_awards[books_primary_item_per_page]].pPageTitle, 3);
+    }
+
+    //for other text
+    journal_window.uFrameX = 48;
+    journal_window.uFrameY = 70;
+    journal_window.uFrameWidth = 360;
+    journal_window.uFrameHeight = 264;
+    journal_window.uFrameZ = 407;
+    journal_window.uFrameW = journal_window.uFrameHeight + 69;
+    if (BtnDown_flag && books_primary_item_per_page + num_achieved_awards < full_num_items_in_book)//Press bookmark next page
+    {
+        pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0, 0, 0);
+        books_primary_item_per_page += num_achieved_awards;
+        books_num_items_per_page[books_page_number++] = num_achieved_awards;
+    }
+    if (BtnUp_flag && books_page_number)//Press bookmark previous page
+    {
+        pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0, 0, 0);
+        --books_page_number;
+        books_primary_item_per_page -= (unsigned __int8)books_num_items_per_page[books_page_number];
+    }
+    if (!num_achieved_awards || books_primary_item_per_page < 1)
+    {
+        books_primary_item_per_page = 0;
+        books_page_number = 0;
+    }
+    BtnDown_flag = 0;
+    BtnUp_flag = 0;
+    num_achieved_awards = 0;
+    if (achieved_awards[books_primary_item_per_page])
+    {
+        int index = ((int)achieved_awards[books_primary_item_per_page] - 1);
+        pDialogueString = BuildDialogueString(pStorylineText->StoreLine[achieved_awards[books_primary_item_per_page]].pText, uActiveCharacter - 1,
+            0, 0, 0, &pParty->PartyTimes.HistoryEventTimes[index]);
+        pStringOnPage = pAutonoteFont->GetPageTop(pDialogueString, &journal_window, 1, (unsigned __int8)Journal_limitation_factor[books_primary_item_per_page]);
+        journal_window.DrawText(pAutonoteFont, 1, 0, ui_book_journal_text_color, pStringOnPage, 0,
+            journal_window.uFrameY + journal_window.uFrameHeight, ui_book_journal_text_shadow);
+        ++num_achieved_awards;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GUI/UI/Books/JournalBook.h	Tue May 12 03:24:19 2015 +0200
@@ -0,0 +1,10 @@
+#pragma once
+#include "GUI/UI/UIBooks.h"
+
+struct GUIWindow_JournalBook : public GUIWindow_Book
+{
+             GUIWindow_JournalBook();
+    virtual ~GUIWindow_JournalBook() {}
+
+    virtual void Update();
+};
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GUI/UI/Books/LloydsBook.cpp	Tue May 12 03:24:19 2015 +0200
@@ -0,0 +1,179 @@
+#include "Engine/Engine.h"
+#include "Engine/LOD.h"
+#include "Engine/Party.h"
+#include "Engine/texts.h"
+#include "Engine/Graphics/IRender.h"
+
+#include "GUI/GUIFont.h"
+#include "GUI/UI/Books/LloydsBook.h"
+
+
+std::array<unsigned int, 5> pLloydsBeaconsPreviewXs = { { 61, 281, 61, 281, 171 } }; // 004E249C
+std::array<unsigned int, 5> pLloydsBeaconsPreviewYs = { { 84, 84, 228, 228, 155 } };
+std::array<unsigned int, 5> pLloydsBeacons_SomeXs = { { 59, 279, 59, 279, 169 } };
+std::array<unsigned int, 5> pLloydsBeacons_SomeYs = { { 82, 82, 226, 226, 153 } };
+
+GUIWindow_LloydsBook::GUIWindow_LloydsBook() :
+    GUIWindow_Book()
+{
+    this->ptr_1C = (void *)WINDOW_LloydsBeacon; // inherited from GUIWindow::GUIWindow
+    BasicBookInitialization();
+
+// ----------------------------------------------
+// 00411BFC GUIWindow::InitializeBookView -- part
+    byte_506360 = 0;
+    pTexture_CurrentBook = pIcons_LOD->LoadTexturePtr("lb_bordr", TEXTURE_16BIT_PALETTE);
+    pTexture_LloydBeacons[0] = pIcons_LOD->LoadTexturePtr("sbmap", TEXTURE_16BIT_PALETTE);
+    pTexture_LloydBeacons[1] = pIcons_LOD->LoadTexturePtr("sbmap", TEXTURE_16BIT_PALETTE);
+    pTex_book_button1_on = pIcons_LOD->LoadTexturePtr("tab-an-6b", TEXTURE_16BIT_PALETTE);
+    pTex_book_button1_off = pIcons_LOD->LoadTexturePtr("tab-an-6a", TEXTURE_16BIT_PALETTE);
+
+    pBtn_Book_1 = CreateButton(415, 13, 39, 36, 1, 0, UIMSG_LloydsBeacon_FlippingBtn, 0, 0, pGlobalTXT_LocalizationStrings[375], 0); // Set Beacon
+    pBtn_Book_2 = CreateButton(415, 48, 39, 36, 1, 0, UIMSG_LloydsBeacon_FlippingBtn, 1, 0, pGlobalTXT_LocalizationStrings[523], 0); // Recall Beacon
+
+    int max_beacons = 1;
+    int v18 = pParty->pPlayers[_506348_current_lloyd_playerid].pActiveSkills[PLAYER_SKILL_WATER];
+    if (v18 & 0x100 || (v18 & 0x80))
+        max_beacons = 5;
+    else if (v18 & 0x40)
+        max_beacons = 3;
+
+    for (int i = 0; i < max_beacons; ++i)
+        CreateButton(
+            pLloydsBeaconsPreviewXs[i], pLloydsBeaconsPreviewYs[i],
+            92, 68, 1, 180, UIMSG_InstallBeacon, i, 0, "", 0
+        );
+
+    for (int i = 0; i < 5; ++i)
+    {
+        if (pParty->pPlayers[_506348_current_lloyd_playerid].pInstalledBeacons[i].uBeaconTime >= (signed __int64)pParty->uTimePlayed)
+            LoadThumbnailLloydTexture(i, _506348_current_lloyd_playerid + 1);
+        else
+            memset(&pParty->pPlayers[_506348_current_lloyd_playerid].pInstalledBeacons[i], 0, sizeof(LloydBeacon));
+    }
+}
+
+
+void GUIWindow_LloydsBook::Update()
+{
+// -----------------------------------
+// 004156F0 GUI_UpdateWindows --- part
+// {
+//     BookUI_Draw((WindowType)(int)ptr_1C);
+// }
+
+// ----- (00413CC6) --------------------------------------------------------
+// void BookUI_Draw(WindowType book) --- part
+// {
+    pRenderer->DrawTextureIndexed(471, 445, pIcons_LOD->GetTexture(uExitCancelTextureId));
+//     DrawLloydBeaconsScreen();
+
+// ----- (00410DEC) --------------------------------------------------------
+// unsigned int DrawLloydBeaconsScreen()
+// {
+    Player *pPlayer; // esi@1
+    const char *pText; // eax@1
+    int pTextHeight; // eax@14
+    int RemainingTime; // kr08_8@14
+    unsigned int pHours; // esi@14
+    unsigned int pDays; // eax@14
+    const char *pSelectionText; // eax@19
+    Texture *v19; // [sp-4h] [bp-8Ch]@4
+    GUIWindow pWindow; // [sp+Ch] [bp-7Ch]@1
+    char *Str; // [sp+74h] [bp-14h]@14
+    int BeaconID; // [sp+78h] [bp-10h]@11
+    int uNumMaxBeacons; // [sp+84h] [bp-4h]@6
+
+    pPlayer = &pParty->pPlayers[_506348_current_lloyd_playerid];
+    pRenderer->DrawTextureIndexed(8, 8, pTexture_LloydBeacons[(unsigned __int8)bRecallingBeacon]);
+    pText = pGlobalTXT_LocalizationStrings[523];     // Recall Beacon
+    pWindow.uFrameX = game_viewport_x;
+    pWindow.uFrameY = game_viewport_y;
+    pWindow.uFrameWidth = 428;
+    pWindow.uFrameHeight = game_viewport_height;
+    pWindow.uFrameZ = 435;
+    pWindow.uFrameW = game_viewport_w;
+    if (!bRecallingBeacon)
+        pText = pGlobalTXT_LocalizationStrings[375];   // Set Beacon
+    sprintf(pTmpBuf.data(), "%s", pText);
+    pWindow.DrawTitleText(pBook2Font, 0, 22, 0, pTmpBuf.data(), 3);
+    if (bRecallingBeacon)
+    {
+        pRenderer->DrawTextureIndexedAlpha(pBtn_Book_1->uX, pBtn_Book_1->uY, pTex_book_button1_on);
+        v19 = pTex_book_button1_off;
+    }
+    else
+    {
+        pRenderer->DrawTextureIndexedAlpha(pBtn_Book_1->uX, pBtn_Book_1->uY, pTex_book_button1_off);
+        v19 = pTex_book_button1_on;
+    }
+    pRenderer->DrawTextureIndexedAlpha(pBtn_Book_2->uX, pBtn_Book_2->uY, v19);
+    uNumMaxBeacons = 1;
+    if (HIBYTE(pPlayer->pActiveSkills[PLAYER_SKILL_WATER]) & 1 || (pPlayer->pActiveSkills[PLAYER_SKILL_WATER] & 0x80u) != 0)
+    {
+        uNumMaxBeacons = 5;
+    }
+    else
+    {
+        if (pPlayer->pActiveSkills[PLAYER_SKILL_WATER] & 0x40)
+            uNumMaxBeacons = 3;
+    }
+    if (uNumMaxBeacons > 0)
+    {
+        for (BeaconID = 0; BeaconID < uNumMaxBeacons; BeaconID++)
+        {
+            pWindow.uFrameWidth = 92;
+            pWindow.uFrameHeight = 68;
+            pWindow.uFrameY = pLloydsBeaconsPreviewYs[BeaconID];
+            pWindow.uFrameX = pLloydsBeaconsPreviewXs[BeaconID];
+            pWindow.uFrameW = pWindow.uFrameY + 67;
+            pWindow.uFrameZ = pLloydsBeaconsPreviewXs[BeaconID] + 91;
+            //if ( pSavegameThumbnails[BeaconID].pPixels != 0 )
+            if (pPlayer->pInstalledBeacons[BeaconID].SaveFileID != 0)
+            {
+                pRenderer->DrawTextureIndexedAlpha(pLloydsBeacons_SomeXs[BeaconID], pLloydsBeacons_SomeYs[BeaconID], pTexture_CurrentBook);
+                pRenderer->DrawTextureRGB(pLloydsBeaconsPreviewXs[BeaconID], pLloydsBeaconsPreviewYs[BeaconID], &pSavegameThumbnails[BeaconID]);
+                Str = pMapStats->pInfos[pMapStats->sub_410D99_get_map_index(pPlayer->pInstalledBeacons[BeaconID].SaveFileID)].pName;
+                pTextHeight = pSpellFont->CalcTextHeight(Str, &pWindow, 0, 0);
+                pWindow.uFrameY += -6 - pTextHeight;
+                pWindow.DrawTitleText(pSpellFont, 0, 0, 1, Str, 3);
+                RemainingTime = pPlayer->pInstalledBeacons[BeaconID].uBeaconTime - pParty->uTimePlayed;
+                pHours = (signed __int64)((double)RemainingTime * 0.234375) / 60 / 60;
+                pDays = pHours / 24;
+                if (pDays)
+                {
+                    sprintf(pTmpBuf.data(), "%lu %s", pDays + 1, pGlobalTXT_LocalizationStrings[57]);//days
+                    pWindow.uFrameY = pWindow.uFrameY + pWindow.uFrameHeight + 4;
+                    pWindow.DrawTitleText(pSpellFont, 0, 0, 1, pTmpBuf.data(), 3);
+                    continue;
+                }
+                else
+                {
+                    if (pHours + 1 <= 23)
+                    {
+                        if (pHours < 1)
+                            pSelectionText = pGlobalTXT_LocalizationStrings[109];// Hour
+                        else
+                            pSelectionText = pGlobalTXT_LocalizationStrings[110];// Hours
+                        sprintf(pTmpBuf.data(), "%lu %s", pHours + 1, pSelectionText);
+                        pWindow.uFrameY = pWindow.uFrameY + pWindow.uFrameHeight + 4;
+                        pWindow.DrawTitleText(pSpellFont, 0, 0, 1, pTmpBuf.data(), 3);
+                        continue;
+                    }
+                }
+                sprintf(pTmpBuf.data(), "%lu %s", pDays + 1, pGlobalTXT_LocalizationStrings[56]);//Day
+                pWindow.uFrameY = pWindow.uFrameY + pWindow.uFrameHeight + 4;
+                pWindow.DrawTitleText(pSpellFont, 0, 0, 1, pTmpBuf.data(), 3);
+                continue;
+            }
+            if (!bRecallingBeacon)
+            {
+                pRenderer->DrawTextureIndexedAlpha(pLloydsBeacons_SomeXs[BeaconID], pLloydsBeacons_SomeYs[BeaconID], pTexture_CurrentBook);
+                pTextHeight = pSpellFont->CalcTextHeight(pGlobalTXT_LocalizationStrings[19], &pWindow, 0, 0);
+                pWindow.DrawTitleText(pSpellFont, 0, (signed int)pWindow.uFrameHeight / 2 - pTextHeight / 2, 1, pGlobalTXT_LocalizationStrings[19], 3);//Доступно
+            }
+        }
+    }
+    if (byte_506360)
+        pMessageQueue_50CBD0->AddGUIMessage(UIMSG_CloseAfterInstallBeacon, 0, 0);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GUI/UI/Books/LloydsBook.h	Tue May 12 03:24:19 2015 +0200
@@ -0,0 +1,10 @@
+#pragma once
+#include "GUI/UI/UIBooks.h"
+
+struct GUIWindow_LloydsBook : public GUIWindow_Book
+{
+             GUIWindow_LloydsBook();
+    virtual ~GUIWindow_LloydsBook() {}
+
+    virtual void Update();
+};
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GUI/UI/Books/MapBook.cpp	Tue May 12 03:24:19 2015 +0200
@@ -0,0 +1,584 @@
+#include "Engine/Engine.h"
+#include "Engine/LOD.h"
+#include "Engine/Party.h"
+#include "Engine/Timer.h"
+#include "Engine/Events.h"
+#include "Engine/OurMath.h"
+#include "Engine/texts.h"
+#include "Engine/Graphics/IRender.h"
+#include "Engine/Graphics/Viewport.h"
+#include "Engine/Graphics/Outdoor.h"
+#include "Engine/Graphics/Indoor.h"
+#include "Engine/Graphics/Level/Decoration.h"
+
+#include "IO/Mouse.h"
+
+#include "GUI/GUIFont.h"
+#include "GUI/UI/Books/MapBook.h"
+
+#include "Media/Audio/AudioPlayer.h"
+
+void DrawBook_Map_sub(unsigned int tl_x, unsigned int tl_y, unsigned int br_x, int br_y, int _48074); // idb
+
+
+GUIWindow_MapBook::GUIWindow_MapBook() :
+    GUIWindow_Book()
+{
+    this->ptr_1C = (void *)WINDOW_MapsBook; // inherited from GUIWindow::GUIWindow
+    BasicBookInitialization();
+
+// ----------------------------------------------
+// 00411BFC GUIWindow::InitializeBookView -- part
+    pEventTimer->Pause();
+    viewparams->sViewCenterX = pParty->vPosition.x;
+    viewparams->sViewCenterY = pParty->vPosition.y;
+    pAudioPlayer->StopChannels(-1, -1);
+    pBooksButtonOverlay = new GUIWindow_BooksButtonOverlay(546, 353, 0, 0, (int)pBtn_Maps, 0);
+
+// ----------------------------------------------
+// 00411BFC GUIWindow::InitializeBookView -- part
+    dword_506364 = 1;
+    pSpellBookPagesTextr_12 = pIcons_LOD->LoadTexturePtr("sbmap", TEXTURE_16BIT_PALETTE);
+    pTex_book_button1_on = pIcons_LOD->LoadTexturePtr("zoom-on", TEXTURE_16BIT_PALETTE);
+    pTex_book_button2_on = pIcons_LOD->LoadTexturePtr("zoot-on", TEXTURE_16BIT_PALETTE);
+    pTex_book_button1_off = pIcons_LOD->LoadTexturePtr("zoom-off", TEXTURE_16BIT_PALETTE);
+    pTex_book_button2_off = pIcons_LOD->LoadTexturePtr("zoot-off", TEXTURE_16BIT_PALETTE);
+    pTex_book_button3_on = pIcons_LOD->LoadTexturePtr("tabNon", TEXTURE_16BIT_PALETTE);
+    pTex_book_button3_off = pIcons_LOD->LoadTexturePtr("tabNoff", TEXTURE_16BIT_PALETTE);
+    pTex_book_button4_on = pIcons_LOD->LoadTexturePtr("tabSon", TEXTURE_16BIT_PALETTE);
+    pTex_book_button4_off = pIcons_LOD->LoadTexturePtr("tabSoff", TEXTURE_16BIT_PALETTE);
+    pTex_book_button5_on = pIcons_LOD->LoadTexturePtr("tabEon", TEXTURE_16BIT_PALETTE);
+    pTex_book_button5_off = pIcons_LOD->LoadTexturePtr("tabEoff", TEXTURE_16BIT_PALETTE);
+    pTex_book_button6_on = pIcons_LOD->LoadTexturePtr("tabWon", TEXTURE_16BIT_PALETTE);
+    pTex_book_button6_off = pIcons_LOD->LoadTexturePtr("tabWoff", TEXTURE_16BIT_PALETTE);
+
+    pBtn_Book_1 = this->CreateButton(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 1, 50, 34, 1, 0,
+        UIMSG_ClickBooksBtn, 0, 0, pGlobalTXT_LocalizationStrings[251], pTex_book_button1_on, 0);// "Zoom In"
+    pBtn_Book_2 = this->CreateButton(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 38, 50, 34, 1, 0,
+        UIMSG_ClickBooksBtn, 1, 0, pGlobalTXT_LocalizationStrings[252], pTex_book_button2_on, 0);// "Zoom Out"
+    pBtn_Book_3 = this->CreateButton(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 113, 50, 34, 1, 0,
+        UIMSG_ClickBooksBtn, 2, 0, pGlobalTXT_LocalizationStrings[192], (Texture *)"", 0);// Scroll Up
+    pBtn_Book_4 = this->CreateButton(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 150, 50, 34, 1, 0,
+        UIMSG_ClickBooksBtn, 3, 0, pGlobalTXT_LocalizationStrings[193], (Texture *)"", 0);// Scroll Down
+    pBtn_Book_5 = this->CreateButton(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 188, 50, 34, 1, 0,
+        UIMSG_ClickBooksBtn, 4, 0, pGlobalTXT_LocalizationStrings[573], (Texture *)"", 0);// "Scroll Right"
+    pBtn_Book_6 = this->CreateButton(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 226, 50, 34, 1, 0,
+        UIMSG_ClickBooksBtn, 5, 0, pGlobalTXT_LocalizationStrings[572], (Texture *)"", 0);// "Scroll Left"
+}
+
+
+
+
+void GUIWindow_MapBook::Update()
+{
+// -----------------------------------
+// 004156F0 GUI_UpdateWindows --- part
+// {
+//     BookUI_Draw((WindowType)(int)ptr_1C);
+// }
+
+// ----- (00413CC6) --------------------------------------------------------
+// void BookUI_Draw(WindowType book) --- part
+// {
+    pRenderer->DrawTextureIndexed(471, 445, pIcons_LOD->GetTexture(uExitCancelTextureId));
+//     BookUI_Map_Draw();
+
+// ----- (00413980) --------------------------------------------------------
+// void BookUI_Map_Draw()
+// {
+    unsigned int map_id; // eax@35
+    char party_coord[120]; // [sp+Ch] [bp-CCh]@37
+    GUIWindow map_window; // [sp+84h] [bp-54h]@35
+
+    pRenderer->DrawTextureIndexed(pViewport->uViewportTL_X, pViewport->uViewportTL_Y, pSpellBookPagesTextr_12);
+    if (BtnUp_flag || viewparams->uMapBookMapZoom / 128 >= 12)//Button 1
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 2, pTex_book_button1_off);
+    else
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 1, pTex_book_button1_on);
+
+    if (BtnDown_flag || viewparams->uMapBookMapZoom / 128 <= 3)//Button 2
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 38, pTex_book_button2_off);
+    else
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 38, pTex_book_button2_on);
+
+    if (Book_PageBtn3_flag)//Button 3
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 113, pTex_book_button3_off);
+    else
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 113, pTex_book_button3_on);
+
+    if (Book_PageBtn4_flag)//Button 4
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 150, pTex_book_button4_off);
+    else
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 399, pViewport->uViewportTL_Y + 150, pTex_book_button4_on);
+
+    if (Book_PageBtn5_flag)//Button 5
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 188, pTex_book_button5_off);
+    else
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 188, pTex_book_button5_on);
+
+    if (Book_PageBtn6_flag)//Button 6
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 226, pTex_book_button6_off);
+    else
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 226, pTex_book_button6_on);
+
+    if (BtnDown_flag)
+        viewparams->CenterOnParty2();
+    if (BtnUp_flag)
+        viewparams->CenterOnParty();
+    if (Book_PageBtn3_flag)
+        viewparams->_443219();
+    if (Book_PageBtn4_flag)
+        viewparams->_443231();
+    if (Book_PageBtn5_flag)
+        viewparams->_44323D();
+    if (Book_PageBtn6_flag)
+        viewparams->_443225();
+
+    if (BtnUp_flag | BtnDown_flag | Book_PageBtn3_flag | Book_PageBtn4_flag | Book_PageBtn5_flag | Book_PageBtn6_flag)
+        pAudioPlayer->PlaySound(SOUND_StartMainChoice02, 0, 0, -1, 0, 0, 0, 0);
+    BtnUp_flag = 0;
+    BtnDown_flag = 0;
+    Book_PageBtn6_flag = 0;
+    Book_PageBtn5_flag = 0;
+    Book_PageBtn4_flag = 0;
+    Book_PageBtn3_flag = 0;
+    DrawBook_Map_sub(97, 49, 361, 313, 0);
+    pRenderer->DrawTextureIndexedAlpha(75, 22, pTexture_mapbordr);
+    map_window.uFrameWidth = game_viewport_width;
+    map_window.uFrameHeight = game_viewport_height;
+    map_window.uFrameX = game_viewport_x;
+    map_window.uFrameY = game_viewport_y;
+    map_window.uFrameZ = game_viewport_z;
+    map_window.uFrameW = game_viewport_w;
+    map_id = pMapStats->GetMapInfo(pCurrentMapName);
+    if (map_id)
+        map_window.DrawTitleText(pBook2Font, -14, 12, ui_book_map_title_color, pMapStats->pInfos[map_id].pName, 3);
+
+    map_window.uFrameX = 0;
+    sprintf(party_coord, pGlobalTXT_LocalizationStrings[659], pParty->vPosition.x, pParty->vPosition.y); //"x: %d  y: %d"
+    map_window.DrawTitleText(pFontComic, 0, 320, ui_book_map_coordinates_color, party_coord, 0);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+//----- (00442955) --------------------------------------------------------
+void DrawBook_Map_sub(unsigned int tl_x, unsigned int tl_y, unsigned int br_x, int br_y, int _48074)
+{
+    int v20; // eax@16
+    int v26; // ecx@21
+    unsigned __int16 *v27; // edi@21
+    int v28; // edx@21
+    int v29; // eax@21
+    double v30; // st7@23
+    int textr_width; // esi@23
+    signed int v47; // esi@38
+    signed int v48; // ecx@38
+    int v49; // eax@38
+    signed int v50; // edx@55
+    unsigned int v51; // ecx@55
+    int v54; // esi@75
+    int v55; // eax@75
+    double v57; // st7@85
+    signed int v60; // edi@85
+    signed int v62; // ebx@85
+    signed int v63; // esi@85
+    int v64; // eax@87
+    unsigned __int16 *pPalette_16; // [sp+48014h] [bp-50h]@23
+    int map_tile_X; // [sp+48020h] [bp-44h]@23
+    unsigned char* texture8_data;
+    unsigned char* curr_line;
+    int scale_increment;
+    int scaled_posX;
+    int scaled_posY;
+    int stepX_r;
+    int stepY_r;
+    unsigned int teal; // [sp+48028h] [bp-3Ch]@8
+    int pCenterY; // [sp+4802Ch] [bp-38h]@1
+    int screenCenter_X; // [sp+48030h] [bp-34h]@1
+    int pCenterX; // [sp+48034h] [bp-30h]@1
+    int v87; // [sp+48038h] [bp-2Ch]@16
+    unsigned int v88; // [sp+4803Ch] [bp-28h]@16
+    int black; // [sp+48040h] [bp-24h]@8
+    int screenCenterY; // [sp+48044h] [bp-20h]@1
+    unsigned int screenHeight; // [sp+4804Ch] [bp-18h]@16
+    unsigned __int16 *v93; // [sp+48050h] [bp-14h]@16
+    signed int screenWidth; // [sp+48054h] [bp-10h]@8
+    unsigned int v95; // [sp+48058h] [bp-Ch]@16
+    int map_tile_Y; // [sp+4805Ch] [bp-8h]@10
+    const void *v97; // [sp+48060h] [bp-4h]@16
+
+    screenCenter_X = (signed int)(tl_x + br_x) / 2;
+    screenCenterY = (signed int)(tl_y + br_y) / 2;
+    pRenderer->SetRasterClipRect(tl_x, tl_y, br_x, br_y);
+    pCenterX = viewparams->sViewCenterX;
+    pCenterY = viewparams->sViewCenterY;
+    if (viewparams->uMapBookMapZoom != 384)
+    {
+        if (viewparams->uMapBookMapZoom == 768)
+        {
+            if (uCurrentlyLoadedLevelType == LEVEL_Indoor)
+                viewparams->uMapBookMapZoom = 680;
+        }
+    }
+    else
+    {
+        viewparams->sViewCenterX = viewparams->indoor_center_x;
+        pCenterX = viewparams->indoor_center_x;
+        pCenterY = viewparams->indoor_center_y;
+        if (uCurrentlyLoadedLevelType == LEVEL_Indoor)
+            viewparams->uMapBookMapZoom = viewparams->uMapBookMapZoom - 34;
+    }
+    if (uCurrentlyLoadedLevelType != LEVEL_Indoor)
+    {
+        screenWidth = br_x - tl_x + 1;
+        screenHeight = br_y - tl_y + 1;
+        //render16_data = &pRenderer->pTargetSurface[tl_x + tl_y * pRenderer->uTargetSurfacePitch];
+        texture8_data = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].pLevelOfDetail0_prolly_alpha_mask;
+        pPalette_16 = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].pPalette16;
+        scale_increment = (1 << (pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uWidthLn2 + 16)) / viewparams->uMapBookMapZoom;
+
+        v30 = (double)(1 << (16 - pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uWidthLn2));
+
+        teal = (unsigned int)(signed __int64)((double)(viewparams->sViewCenterX - 22528 / (viewparams->uMapBookMapZoom / 384) + 32768) / v30) << 16;
+
+        textr_width = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uTextureWidth;
+        stepY_r = (int)(signed __int64)((double)(-pCenterY - 22528 / (viewparams->uMapBookMapZoom / 384) + 32768) / v30) << 16;
+        black = (signed __int16)(signed __int64)((double)(viewparams->sViewCenterX - 22528 / (viewparams->uMapBookMapZoom / 384) + 32768) / v30);
+
+        scaled_posY = stepY_r >> 16;
+        //nearest neiborhood scaling
+        if (texture8_data)
+        {
+            for (uint i = 0; i < screenHeight; ++i)
+            {
+                curr_line = &texture8_data[scaled_posY*textr_width];
+                stepX_r = teal;
+                for (uint j = 0; j < screenWidth; ++j)
+                {
+                    scaled_posX = stepX_r >> 16;
+                    //map_texture_16[i*screenWidth+j]=pPalette_16[*(curr_line+scaled_posX)];
+                    pRenderer->WritePixel16(tl_x + j, tl_y + i, pPalette_16[*(curr_line + scaled_posX)]);
+                    stepX_r += scale_increment;
+                }
+                stepY_r += scale_increment;
+                scaled_posY = stepY_r >> 16;
+            }
+        }
+
+        /*//move visible square to render
+        for( uint i = 0; i < screenHeight; ++i )
+        {
+        if ( screenWidth > 0 )
+        memcpy((void*)&render16_data[pRenderer->uTargetSurfacePitch * i],(void*)&map_texture_16[i*screenWidth], screenWidth*2);
+        }*/
+    }
+    else
+    {
+        black = Color16(0, 0, 0);
+        teal = Color16(0, 0xFF, 0xFF);
+        uNumBlueFacesInBLVMinimap = 0;
+        if (pIndoor->pMapOutlines->uNumOutlines)
+        {
+            for (uint i = 0; i < pIndoor->pMapOutlines->uNumOutlines; ++i)
+            {
+                if (!(pIndoor->pFaces[pIndoor->pMapOutlines->pOutlines[i].uFace1ID].Invisible()
+                    || (pIndoor->pFaces[pIndoor->pMapOutlines->pOutlines[i].uFace2ID].Invisible())))
+                {
+                    if (!(pIndoor->pMapOutlines->pOutlines[i].uFlags & 1))
+                    {
+                        if (!(!(pIndoor->pFaces[pIndoor->pMapOutlines->pOutlines[i].uFace1ID].uAttributes & FACE_UNKNOW7)
+                            && !(pIndoor->pFaces[pIndoor->pMapOutlines->pOutlines[i].uFace2ID].uAttributes & FACE_UNKNOW7)))
+                        {
+                            pIndoor->pMapOutlines->pOutlines[i].uFlags = pIndoor->pMapOutlines->pOutlines[i].uFlags | 1;
+                            pIndoor->_visible_outlines[i >> 3] |= 1 << (7 - i % 8);
+                        }
+                    }
+                    if ((!(pIndoor->pMapOutlines->pOutlines[i].uFlags & 1)
+                        && !(!(pIndoor->pFaces[pIndoor->pMapOutlines->pOutlines[i].uFace1ID].uAttributes & FACE_UNKNOW7)
+                        && !(pIndoor->pFaces[pIndoor->pMapOutlines->pOutlines[i].uFace2ID].uAttributes & FACE_UNKNOW7)))
+                        || pIndoor->pMapOutlines->pOutlines[i].uFlags & 1)
+                    {
+                        v93 = (unsigned __int16 *)(pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex1ID].x - viewparams->sViewCenterX);
+                        screenHeight = pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex1ID].y - pCenterY;
+                        v20 = pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex2ID].y - pCenterY;
+                        v95 = pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex2ID].x - viewparams->sViewCenterX;
+
+                        v88 = fixpoint_mul((pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex1ID].x - viewparams->sViewCenterX), viewparams->uMapBookMapZoom);
+                        v87 = fixpoint_mul(screenHeight, viewparams->uMapBookMapZoom);
+                        v93 = (unsigned __int16 *)(fixpoint_mul((pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex2ID].x - viewparams->sViewCenterX), viewparams->uMapBookMapZoom));
+                        screenHeight = fixpoint_mul(v20, viewparams->uMapBookMapZoom);
+                        pRenderer->RasterLine2D(screenCenter_X + v88, screenCenterY - v87,
+                            screenCenter_X + (fixpoint_mul((pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex2ID].x - viewparams->sViewCenterX), viewparams->uMapBookMapZoom)), screenCenterY - screenHeight, black);
+                    }
+                }
+            }
+        }
+        if ((signed int)uNumBlueFacesInBLVMinimap > 0)
+        {
+            for (uint j = 0; j < (signed int)uNumBlueFacesInBLVMinimap; ++j)
+            {
+                v26 = pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[pBlueFacesInBLVMinimapIDs[j]].uVertex2ID].x;
+                v27 = (unsigned __int16 *)(pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[pBlueFacesInBLVMinimapIDs[j]].uVertex1ID].x - pCenterX);
+                v28 = pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[pBlueFacesInBLVMinimapIDs[j]].uVertex1ID].y - pCenterY;
+                v29 = pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[pBlueFacesInBLVMinimapIDs[j]].uVertex2ID].y - pCenterY;
+
+                v87 = fixpoint_mul((signed int)v27, viewparams->uMapBookMapZoom);
+                v88 = fixpoint_mul(v28, viewparams->uMapBookMapZoom);
+                uint i = fixpoint_mul((v26 - pCenterX), viewparams->uMapBookMapZoom);
+                v95 = fixpoint_mul(v29, viewparams->uMapBookMapZoom);
+                pRenderer->RasterLine2D(screenCenter_X + (fixpoint_mul((signed int)v27, viewparams->uMapBookMapZoom)),
+                    screenCenterY - v88, screenCenter_X + (fixpoint_mul((v26 - pCenterX), viewparams->uMapBookMapZoom)), screenCenterY - v95, teal);
+            }
+            viewparams->sViewCenterX = pCenterX;
+        }
+    }
+    v47 = (fixpoint_mul((pParty->vPosition.x - viewparams->sViewCenterX), viewparams->uMapBookMapZoom)) + screenCenter_X - 3;
+    v97 = (const void *)(fixpoint_mul((pParty->vPosition.y - pCenterY), viewparams->uMapBookMapZoom));
+    v48 = 1;
+    v49 = screenCenterY - (int)v97 - 3;
+    if (v47 >= (signed int)tl_x)
+    {
+        if (v47 > (signed int)br_x)
+        {
+            if ((signed int)((fixpoint_mul((pParty->vPosition.x - viewparams->sViewCenterX), viewparams->uMapBookMapZoom)) + screenCenter_X - 6) > (signed int)br_x)
+                v48 = 0;
+            v47 = br_x;
+        }
+    }
+    else
+    {
+        if ((signed int)((fixpoint_mul((pParty->vPosition.x - viewparams->sViewCenterX), viewparams->uMapBookMapZoom)) + screenCenter_X) < (signed int)tl_x)
+            v48 = 0;
+        v47 = tl_x;
+    }
+    if (v49 >= (signed int)tl_y)
+    {
+        if (v49 > br_y)
+        {
+            if (screenCenterY - (signed int)v97 - 6 > br_y)
+                v48 = 0;
+            v49 = br_y;
+        }
+    }
+    else
+    {
+        if (screenCenterY - (signed int)v97 < (signed int)tl_y)
+            v48 = 0;
+        v49 = tl_y;
+    }
+    if (v48 == 1)
+    {
+        v51 = pParty->sRotationY & stru_5C6E00->uDoublePiMask;
+        if ((signed int)v51 <= 1920)
+            v50 = 6;
+        if ((signed int)v51 < 1664)
+            v50 = 5;
+        if ((signed int)v51 <= 1408)
+            v50 = 4;
+        if ((signed int)v51 < 1152)
+            v50 = 3;
+        if ((signed int)v51 <= 896)
+            v50 = 2;
+        if ((signed int)v51 < 640)
+            v50 = 1;
+        if ((signed int)v51 <= 384)
+            v50 = 0;
+        if ((signed int)v51 < 128 || (signed int)v51 > 1920)
+            v50 = 7;
+        pRenderer->DrawTransparentRedShade(v47, v49, pIcons_LOD->GetTexture(pTextureIDs_pMapDirs[v50]));
+    }
+    if ((signed int)uNumLevelDecorations > 0)
+    {
+        for (uint i = 0; i < (signed int)uNumLevelDecorations; ++i)
+        {
+            if (pLevelDecorations[i].uFlags & LEVEL_DECORATION_VISIBLE_ON_MAP)
+            {
+                screenHeight = pLevelDecorations[i].vPosition.y - pCenterY;
+                v93 = (unsigned __int16 *)(pLevelDecorations[i].vPosition.x - viewparams->sViewCenterX);
+                v54 = (fixpoint_mul((signed int)v93, viewparams->uMapBookMapZoom)) + screenCenter_X;
+                v97 = (const void *)(fixpoint_mul(screenHeight, viewparams->uMapBookMapZoom));
+                v55 = screenCenterY - (int)v97;
+                //if ( v54 >= pRenderer->raster_clip_x && v54 <= pRenderer->raster_clip_z
+                //  && v55 >= pRenderer->raster_clip_y && v55 <= pRenderer->raster_clip_w )
+                {
+                    if (viewparams->uMapBookMapZoom > 512)
+                    {
+                        pRenderer->RasterLine2D(v54 - 1, v55 - 1, v54 - 1, v55 + 1, Color16(0xFFu, 0xFFu, 0xFFu));
+                        pRenderer->RasterLine2D(v54, v55 - 1, v54, v55 + 1, Color16(0xFFu, 0xFFu, 0xFFu));
+                        pRenderer->RasterLine2D(v54 + 1, v55 - 1, v54 + 1, v55 + 1, Color16(0xFFu, 0xFFu, 0xFFu));
+                    }
+                    else
+                        pRenderer->RasterLine2D(v54, screenCenterY - (int)v97,
+                        (fixpoint_mul((signed int)v93, viewparams->uMapBookMapZoom)) + screenCenter_X,
+                        screenCenterY - (int)v97, Color16(0xFF, 0xFF, 0xFF));
+                }
+            }
+        }
+    }
+    if (uCurrentlyLoadedLevelType == LEVEL_Outdoor)
+    {
+        screenCenterY = br_x - tl_x + 1;
+        v95 = br_y - tl_y + 1;
+        //v77 = &pRenderer->pTargetSurface[tl_x + tl_y * pRenderer->uTargetSurfacePitch];
+        black = (1 << (pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uWidthLn2 + 16)) / viewparams->uMapBookMapZoom;
+        v57 = (double)(1 << (16 - pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uWidthLn2));
+        v60 = (int)((signed __int64)((double)(viewparams->sViewCenterX - (22528 / (viewparams->uMapBookMapZoom / 384)) + 32768) / v57)) << 16;
+        teal = v60 >> 16;
+        pPalette_16 = (unsigned __int16 *)(v60 >> 16);
+        v97 = (const void *)((int)((signed __int64)((double)(viewparams->sViewCenterX - (22528 / (viewparams->uMapBookMapZoom / 384)) + 32768) / v57)) << 16);
+        v62 = (int)((signed __int64)((double)(32768 - (22528 / (viewparams->uMapBookMapZoom / 384)) - pCenterY) / v57)) << 16;
+        v63 = (signed __int16)((signed __int64)((double)(32768 - (22528 / (viewparams->uMapBookMapZoom / 384)) - pCenterY) / v57));
+
+
+        for (int y = 0; y < (signed int)v95; ++y)
+        {
+            map_tile_Y = (v63 - 80) / 4;
+            v64 = teal;
+            for (int x = 0; x < screenCenterY; ++x)
+            {
+                map_tile_X = (v64 - 80) / 4;
+                if (!pOutdoor->IsMapCellFullyRevealed(map_tile_X, map_tile_Y))
+                {
+                    if (pOutdoor->IsMapCellPartiallyRevealed(map_tile_X, map_tile_Y))
+                    {
+                        if (!((x + screenCenter_X) % 2))
+                            //*a4a = Color16(12, 12, 12);
+                            pRenderer->WritePixel16(tl_x + x, tl_y + y, Color16(12, 12, 12));
+                    }
+                    else
+                        //*a4a = 0;
+                        pRenderer->WritePixel16(tl_x + x, tl_y + y, Color16(0, 0, 0));
+                }
+                v97 = (char *)v97 + black;
+                v64 = (signed int)v97 >> 16;
+            }
+
+            v62 += black;
+            v97 = (const void *)v60;
+            v63 = v62 >> 16;
+            teal = (unsigned int)pPalette_16;
+        }
+        /*a4a = map_texture_16;
+        for ( screenCenter_X = 0; screenCenter_X < (signed int)v95; ++screenCenter_X )
+        {
+        if ( screenCenterY > 0 )
+        {
+        map_tile_Y = (v63 - 80) / 4;
+        v64 = teal;
+        for ( a5a = 0; a5a < screenCenterY; ++a5a )
+        {
+        map_tile_X = (v64 - 80) / 4;
+        if ( !pOutdoor->_47F04C(map_tile_X, map_tile_Y) )
+        {
+        if ( pOutdoor->_47F097(map_tile_X, map_tile_Y) )
+        {
+        if ( !((a5a + screenCenter_X) % 2) )
+        *a4a = Color16(0xCu, 0xCu, 0xCu);
+        }
+        else
+        *a4a = 0;
+        }
+        ++a4a;
+        v97 = (char *)v97 + black;
+        v64 = (signed int)v97 >> 16;
+        }
+        }
+        v62 += black;
+        v97 = (const void *)v60;
+        a4a += screenCenterY - a5a;
+        v63 = v62 >> 16;
+        teal = (unsigned int)pPalette_16;
+        }
+
+        v66 = map_texture_16;
+        if ( (signed int)v95 > 0 )
+        {
+        v67 = v77;
+        result = 2 * (pRenderer->uTargetSurfacePitch - screenCenterY);
+        for ( v65 = v95; v65; --v65 )
+        {
+        if ( screenCenterY > 0 )
+        {
+        for ( v68 = screenCenterY; v68; --v68 )
+        {
+        v69 = *(short *)v66;
+        if ( !*(short *)v66 || v69 == (short)result )
+        *v67 = v69;
+        ++v66;
+        ++v67;
+        }
+        }
+        v67 = (unsigned __int16 *)((char *)v67 + result);
+        }
+        }*/
+    }
+}
+
+//----- (00444564) --------------------------------------------------------
+const char * GetMapBookHintText()
+{
+    int v20;
+    int v21; // [sp+14h] [bp-Ch]@1
+    double v0; // st7@3
+    unsigned int pX; // [sp+1Ch] [bp-4h]@3
+    unsigned int pY; // [sp+8h] [bp-18h]@3
+    int global_coord_X; // ebx@3
+    int global_coord_Y;
+    int map_tile_X; // edi@3
+    int map_tile_Y; // eax@3
+    const char *result; // eax@15
+
+    v20 = viewparams->sViewCenterX;
+    v21 = viewparams->sViewCenterY;
+    if (viewparams->uMapBookMapZoom == 384)
+    {
+        v20 = viewparams->indoor_center_x;
+        v21 = viewparams->indoor_center_y;
+    }
+    pMouse->GetClickPos(&pX, &pY);
+    v0 = 1.0 / (float)((signed int)viewparams->uMapBookMapZoom * 0.000015258789);
+
+    global_coord_X = (signed __int64)((double)(pX - 229) * v0 + (double)v20);
+    global_coord_Y = (signed __int64)((double)v21 - (double)(pY - 181) * v0);
+
+    result = 0;
+    map_tile_X = abs(global_coord_X + 22528) / 512;//In the mapbook only lady Margaret dispays for defoult zoom(В книге карты только Леди Маргарита всплывает при дефолтном зуме)
+    map_tile_Y = abs(global_coord_Y - 22528) / 512;
+    if (pOutdoor->IsMapCellFullyRevealed(map_tile_X, map_tile_Y) && uCurrentlyLoadedLevelType == LEVEL_Outdoor && (signed int)pOutdoor->uNumBModels > 0)
+    {
+        for (int i = 0; i < pOutdoor->uNumBModels && !result; i++)
+        {
+            if (int_get_vector_length(abs((signed)pOutdoor->pBModels[i].vBoundingCenter.x - global_coord_X),
+                abs((signed)pOutdoor->pBModels[i].vBoundingCenter.y - global_coord_Y), 0) < pOutdoor->pBModels[i].sBoundingRadius)
+            {
+                if (pOutdoor->pBModels[i].uNumFaces > 0)
+                {
+                    for (int j = 0; j < pOutdoor->pBModels[i].uNumFaces; j++)
+                    {
+                        if (pOutdoor->pBModels[i].pFaces[j].sCogTriggeredID)
+                        {
+                            if (!(pOutdoor->pBModels[i].pFaces[j].uAttributes & FACE_HAS_EVENT))
+                            {
+                                if (GetEventHintString(pOutdoor->pBModels[i].pFaces[j].sCogTriggeredID))
+                                {
+                                    if (_stricmp(GetEventHintString(pOutdoor->pBModels[i].pFaces[j].sCogTriggeredID), ""))
+                                        result = GetEventHintString(pOutdoor->pBModels[i].pFaces[j].sCogTriggeredID);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return result;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GUI/UI/Books/MapBook.h	Tue May 12 03:24:19 2015 +0200
@@ -0,0 +1,14 @@
+#pragma once
+#include "GUI/UI/UIBooks.h"
+
+
+const char *GetMapBookHintText();//sub_444564
+
+
+struct GUIWindow_MapBook : public GUIWindow_Book
+{
+             GUIWindow_MapBook();
+    virtual ~GUIWindow_MapBook() {}
+
+    virtual void Update();
+};
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GUI/UI/Books/QuestBook.cpp	Tue May 12 03:24:19 2015 +0200
@@ -0,0 +1,141 @@
+#include "Engine/Engine.h"
+#include "Engine/LOD.h"
+#include "Engine/Party.h"
+#include "Engine/Timer.h"
+#include "Engine/Awards.h"
+#include "Engine/texts.h"
+#include "Engine/Graphics/IRender.h"
+#include "Engine/Graphics/Viewport.h"
+
+#include "GUI/GUIFont.h"
+#include "GUI/UI/Books/QuestBook.h"
+
+#include "Media/Audio/AudioPlayer.h"
+
+GUIWindow_QuestBook::GUIWindow_QuestBook() :
+    GUIWindow_Book()
+{
+    this->ptr_1C = (void *)WINDOW_QuestBook; // inherited from GUIWindow::GUIWindow
+    BasicBookInitialization();
+
+// --------------------------------
+// 004304E7 Game_EventLoop --- part
+    pEventTimer->Pause();
+    pAudioPlayer->StopChannels(-1, -1);
+    pBooksButtonOverlay = new GUIWindow_BooksButtonOverlay(493u, 355u, 0, 0, (int)pBtn_Quests, 0);
+    bFlashQuestBook = 0;
+
+// ----------------------------------------------
+// 00411BFC GUIWindow::InitializeBookView -- part
+    pTexture_CurrentBook = pIcons_LOD->LoadTexturePtr("sbquiknot", TEXTURE_16BIT_PALETTE);
+    pSpellBookPagesTextr_10 = pIcons_LOD->LoadTexturePtr("divbar", TEXTURE_16BIT_PALETTE);
+    pTex_book_button1_on = pIcons_LOD->LoadTexturePtr("tab-an-6b", TEXTURE_16BIT_PALETTE);
+    pTex_book_button2_on = pIcons_LOD->LoadTexturePtr("tab-an-7b", TEXTURE_16BIT_PALETTE);
+    pTex_book_button1_off = pIcons_LOD->LoadTexturePtr("tab-an-6a", TEXTURE_16BIT_PALETTE);
+    pTex_book_button2_off = pIcons_LOD->LoadTexturePtr("tab-an-7a", TEXTURE_16BIT_PALETTE);
+    pBtn_Book_1 = CreateButton(
+        pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 1,
+        pTex_book_button1_on->uTextureWidth, pTex_book_button1_on->uTextureHeight,
+        1, 0, UIMSG_ClickBooksBtn, 0xBu, 0, pGlobalTXT_LocalizationStrings[192],// "Scroll Up"
+        pTex_book_button1_on, 0
+    );
+    pBtn_Book_2 = CreateButton(
+        pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 38,
+        pTex_book_button2_on->uTextureHeight, pTex_book_button2_on->uTextureHeight,
+        1, 0, UIMSG_ClickBooksBtn, 0xAu, 0, pGlobalTXT_LocalizationStrings[193],// "Scroll Down"
+        pTex_book_button2_on, 0
+    );
+    num_achieved_awards = 0;
+    memset(achieved_awards.data(), 0, 4000);
+    for (uint i = books_primary_item_per_page; i < 512; ++i)
+    {
+        if (_449B57_test_bit(pParty->_quest_bits, i) && pQuestTable[i])
+        {
+            achieved_awards[num_achieved_awards] = (AwardType)i;
+            ++num_achieved_awards;
+        }
+    }
+    full_num_items_in_book = num_achieved_awards;
+    num_achieved_awards = 0;
+}
+
+
+
+void GUIWindow_QuestBook::Update()
+{
+// -----------------------------------
+// 004156F0 GUI_UpdateWindows --- part
+// {
+//     BookUI_Draw((WindowType)(int)ptr_1C);
+// }
+
+// ----- (00413CC6) --------------------------------------------------------
+// void BookUI_Draw(WindowType book) --- part
+// {
+    pRenderer->DrawTextureIndexed(471, 445, pIcons_LOD->GetTexture(uExitCancelTextureId));
+//     BookUI_Questbook_Draw();
+
+// ----- (00413126) --------------------------------------------------------
+// void BookUI_Questbook_Draw()
+// {
+    int pTextHeight; // eax@19
+    GUIWindow questbook_window; // [sp+Ch] [bp-54h]@9
+
+    pRenderer->DrawTextureIndexed(pViewport->uViewportTL_X, pViewport->uViewportTL_Y, pTexture_CurrentBook);
+    if (BtnUp_flag || !books_primary_item_per_page)//Bookmark Up(Закладка вверх)
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 407, pViewport->uViewportTL_Y + 2, pTex_book_button1_off);
+    else
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 1, pTex_book_button1_on);
+
+    if (BtnDown_flag || books_primary_item_per_page + num_achieved_awards >= full_num_items_in_book)//Bookmark Down(Закладка вниз)
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 407, pViewport->uViewportTL_Y + 38, pTex_book_button2_off);
+    else
+        pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 38, pTex_book_button2_on);
+
+    //for title
+    questbook_window.uFrameWidth = game_viewport_width;
+    questbook_window.uFrameHeight = game_viewport_height;
+    questbook_window.uFrameX = game_viewport_x;
+    questbook_window.uFrameY = game_viewport_y;
+    questbook_window.uFrameZ = game_viewport_z;
+    questbook_window.uFrameW = game_viewport_w;
+    questbook_window.DrawTitleText(pBook2Font, 0, 22, ui_book_quests_title_color, pGlobalTXT_LocalizationStrings[174], 3); //"Current Quests"
+
+    //for other text
+    questbook_window.uFrameX = 48;
+    questbook_window.uFrameY = 70;
+    questbook_window.uFrameWidth = 360;
+    questbook_window.uFrameHeight = 264;
+    questbook_window.uFrameZ = 407;
+    questbook_window.uFrameW = 333;
+    if (BtnDown_flag && books_primary_item_per_page + num_achieved_awards < full_num_items_in_book)//Click Bookmark Down(нажатие закладки вниз)
+    {
+        pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0, 0, 0);
+        books_primary_item_per_page += num_achieved_awards;
+        books_num_items_per_page[books_page_number++] = num_achieved_awards;
+    }
+    if (BtnUp_flag && books_page_number)//Click Bookmark Up(Нажатие закладки вверх)
+    {
+        pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0, 0, 0);
+        --books_page_number;
+        books_primary_item_per_page -= (unsigned __int8)books_num_items_per_page[books_page_number];
+    }
+    if (!num_achieved_awards || !books_primary_item_per_page)
+    {
+        books_page_number = 0;
+        books_primary_item_per_page = 0;
+    }
+    BtnDown_flag = 0;
+    BtnUp_flag = 0;
+    num_achieved_awards = 0;
+    for (uint i = books_primary_item_per_page; i < full_num_items_in_book; ++i)
+    {
+        ++num_achieved_awards;
+        questbook_window.DrawText(pAutonoteFont, 1, 0, ui_book_quests_text_color, pQuestTable[achieved_awards[i]], 0, 0, 0);
+        pTextHeight = pAutonoteFont->CalcTextHeight(pQuestTable[achieved_awards[i]], &questbook_window, 1, 0);
+        if ((signed int)(questbook_window.uFrameY + pTextHeight) > (signed int)questbook_window.uFrameHeight)
+            break;
+        pRenderer->DrawTextureIndexedAlpha(100, (questbook_window.uFrameY + pTextHeight) + 12, pSpellBookPagesTextr_10);
+        questbook_window.uFrameY = (questbook_window.uFrameY + pTextHeight) + 24;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GUI/UI/Books/QuestBook.h	Tue May 12 03:24:19 2015 +0200
@@ -0,0 +1,10 @@
+#pragma once
+#include "GUI/UI/UIBooks.h"
+
+struct GUIWindow_QuestBook : public GUIWindow_Book
+{
+             GUIWindow_QuestBook();
+    virtual ~GUIWindow_QuestBook() {}
+
+    virtual void Update();
+};
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GUI/UI/Books/TownPortalBook.cpp	Tue May 12 03:24:19 2015 +0200
@@ -0,0 +1,106 @@
+#include "Engine/Engine.h"
+#include "Engine/LOD.h"
+#include "Engine/Party.h"
+#include "Engine/texts.h"
+#include "Engine/Graphics/IRender.h"
+
+#include "GUI/GUIFont.h"
+#include "GUI/UI/Books/TownPortalBook.h"
+
+#include "IO/Mouse.h"
+
+static int pTownPortalBook_xs[6] = { 260, 324, 147, 385, 390,  19 };
+static int pTownPortalBook_ys[6] = { 206,  84, 182, 239,  17, 283 };
+static int pTownPortalBook_ws[6] = {  80,  66,  68,  72,  67,  74 };
+static int pTownPortalBook_hs[6] = {  55,  56,  65,  67,  67,  59 };
+
+GUIWindow_TownPortalBook::GUIWindow_TownPortalBook(const char *a1) :
+    GUIWindow_Book()
+{
+    this->Hint = a1; // inherited from GUIWindow::GUIWindow
+    this->ptr_1C = (void *)WINDOW_TownPortal; // inherited from GUIWindow::GUIWindow
+    BasicBookInitialization();
+
+// ----------------------------------------------
+// 00411BFC GUIWindow::InitializeBookView -- part
+    pTexture_CurrentBook = pIcons_LOD->LoadTexturePtr("townport", TEXTURE_16BIT_PALETTE);
+    pTexture_TownPortalIcons[0] = pIcons_LOD->LoadTexturePtr("tpharmndy", TEXTURE_16BIT_PALETTE);
+    pTexture_TownPortalIcons[1] = pIcons_LOD->LoadTexturePtr("tpelf", TEXTURE_16BIT_PALETTE);
+    pTexture_TownPortalIcons[2] = pIcons_LOD->LoadTexturePtr("tpwarlock", TEXTURE_16BIT_PALETTE);
+    pTexture_TownPortalIcons[3] = pIcons_LOD->LoadTexturePtr("tpisland", TEXTURE_16BIT_PALETTE);
+    pTexture_TownPortalIcons[4] = pIcons_LOD->LoadTexturePtr("tpheaven", TEXTURE_16BIT_PALETTE);
+    pTexture_TownPortalIcons[5] = pIcons_LOD->LoadTexturePtr("tphell", TEXTURE_16BIT_PALETTE);
+
+    for (uint i = 0; i < 6; ++i)
+        CreateButton(
+            pTownPortalBook_xs[i],
+            pTownPortalBook_ys[i],
+            pTownPortalBook_ws[i],
+            pTownPortalBook_hs[i],
+            1, 182, UIMSG_ClickTownInTP, i, 0, "", nullptr
+        );
+}
+
+
+void GUIWindow_TownPortalBook::Update()
+{
+// -----------------------------------
+// 004156F0 GUI_UpdateWindows --- part
+// {
+//     BookUI_Draw((WindowType)(int)ptr_1C);
+// }
+
+// ----- (00413CC6) --------------------------------------------------------
+// void BookUI_Draw(WindowType book) --- part
+// {
+    pRenderer->DrawTextureIndexed(471, 445, pIcons_LOD->GetTexture(uExitCancelTextureId));
+//     BookUI_DrawTownPortalMap();
+
+// ----- (00411150) --------------------------------------------------------
+// void BookUI_DrawTownPortalMap()
+// {
+    int v3; // edi@17
+    GUIWindow TownPortalWindow; // [sp+Ch] [bp-64h]@1
+    POINT a2; // [sp+68h] [bp-8h]@17
+
+    pRenderer->ClearZBuffer(0, 479);
+    pRenderer->DrawTextureIndexedAlpha(8, 8, pTexture_CurrentBook);
+    pRenderer->DrawTextureIndexedAlpha(471, 445, pIcons_LOD->GetTexture(uExitCancelTextureId));
+
+    TownPortalWindow.uFrameX = game_viewport_x;
+    TownPortalWindow.uFrameY = game_viewport_y;
+    TownPortalWindow.uFrameWidth = game_viewport_width;
+    TownPortalWindow.uFrameHeight = game_viewport_height;
+    TownPortalWindow.uFrameZ = game_viewport_z;
+    TownPortalWindow.uFrameW = game_viewport_w;
+
+    const uint fountain_bits_lut[] =
+    {
+        PARTY_QUEST_FOUNTAIN_HARMONDALE,
+        PARTY_QUEST_FOUNTAIN_PIERPONT,
+        PARTY_QUEST_FOUNTAIN_NIGHON,
+        PARTY_QUEST_FOUNTAIN_EVENMORN_ISLE,
+        PARTY_QUEST_FOUNTAIN_CELESTIA,
+        PARTY_QUEST_FOUNTAIN_THE_PIT
+    };
+    for (uint i = 0; i < 6; ++i)
+    {
+
+        if (_449B57_test_bit(pParty->_quest_bits, fountain_bits_lut[i]))
+            pRenderer->DrawMaskToZBuffer(
+                pTownPortalBook_xs[i],
+                pTownPortalBook_ys[i],
+                pTexture_TownPortalIcons[i], i + 1
+            );
+    }
+
+    pMouse->GetCursorPos(&a2);
+    v3 = pRenderer->pActiveZBuffer[a2.x + pSRZBufferLineOffsets[a2.y]] & 0xFFFF;
+
+    if (v3)
+    {
+        if (_449B57_test_bit(pParty->_quest_bits, fountain_bits_lut[v3 - 1]))
+            pRenderer->DrawTextureIndexed(pTownPortalBook_xs[v3 - 1], pTownPortalBook_ys[v3 - 1], pTexture_TownPortalIcons[v3 - 1]);
+    }
+    TownPortalWindow.DrawTitleText(pBook2Font, 0, 22, 0, pGlobalTXT_LocalizationStrings[10], 3);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GUI/UI/Books/TownPortalBook.h	Tue May 12 03:24:19 2015 +0200
@@ -0,0 +1,10 @@
+#pragma once
+#include "GUI/UI/UIBooks.h"
+
+struct GUIWindow_TownPortalBook : public GUIWindow_Book
+{
+             GUIWindow_TownPortalBook(const char *a1);
+    virtual ~GUIWindow_TownPortalBook() {}
+
+    virtual void Update();
+};
\ No newline at end of file
--- a/GUI/UI/Books/UIMapBook.cpp	Tue May 12 01:45:31 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,677 +0,0 @@
-#define _CRT_SECURE_NO_WARNINGS
-
-#include "Engine/Engine.h"
-
-#include "UIMapBook.h"
-#include "..\..\..\Engine/Events.h"
-#include "..\..\..\Engine/Graphics/Render.h"
-#include "..\..\..\IO/Mouse.h"
-#include "..\UIBooks.h"
-#include "..\..\..\Engine/MapInfo.h"
-#include "..\..\..\GUI/GUIWindow.h"
-#include "..\..\..\GUI/GUIFont.h"
-#include "..\..\..\Engine/Party.h"
-#include "..\..\..\Media/Audio/AudioPlayer.h"
-#include "..\..\..\Engine/Graphics/Outdoor.h"
-#include "..\..\..\Engine/LOD.h"
-#include "..\..\..\Engine/Graphics/Viewport.h"
-#include "..\..\..\Engine/OurMath.h"
-#include "..\..\..\Engine/texts.h"
-#include "..\..\..\Engine/Graphics/Level/Decoration.h"
-
-
-
-std::array<__int16, 6> pTownPortalBook_xs = {{260, 324, 147, 385, 390,  19}};
-std::array<__int16, 6> pTownPortalBook_ys = {{206,  84, 182, 239,  17, 283}};
-
-std::array<unsigned int, 5> pLloydsBeaconsPreviewXs = {{61, 281,  61, 281, 171}}; // 004E249C
-std::array<unsigned int, 5> pLloydsBeaconsPreviewYs = {{84,  84, 228, 228, 155}};
-std::array<unsigned int, 5> pLloydsBeacons_SomeXs = {{59, 279, 59, 279, 169}};
-std::array<unsigned int, 5> pLloydsBeacons_SomeYs = {{82, 82, 226, 226, 153}};
-
-
-
-
-//----- (00411150) --------------------------------------------------------
-void BookUI_DrawTownPortalMap()
-{
-  int v3; // edi@17
-  GUIWindow TownPortalWindow; // [sp+Ch] [bp-64h]@1
-  POINT a2; // [sp+68h] [bp-8h]@17
-
-  pRenderer->ClearZBuffer(0, 479);
-  pRenderer->DrawTextureIndexedAlpha(8, 8, pTexture_CurrentBook);
-  pRenderer->DrawTextureIndexedAlpha(471, 445, pIcons_LOD->GetTexture(uExitCancelTextureId));
-
-  TownPortalWindow.uFrameX = game_viewport_x;
-  TownPortalWindow.uFrameY = game_viewport_y;
-  TownPortalWindow.uFrameWidth = game_viewport_width;
-  TownPortalWindow.uFrameHeight = game_viewport_height;
-  TownPortalWindow.uFrameZ = game_viewport_z;
-  TownPortalWindow.uFrameW = game_viewport_w;
-
-  const uint fountain_bits_lut[] = {PARTY_QUEST_FOUNTAIN_HARMONDALE,
-                                    PARTY_QUEST_FOUNTAIN_PIERPONT,
-                                    PARTY_QUEST_FOUNTAIN_NIGHON,
-                                    PARTY_QUEST_FOUNTAIN_EVENMORN_ISLE,
-                                    PARTY_QUEST_FOUNTAIN_CELESTIA,
-                                    PARTY_QUEST_FOUNTAIN_THE_PIT};
-  for (uint i = 0; i < 6; ++i)
-  {
-
-    if (_449B57_test_bit(pParty->_quest_bits, fountain_bits_lut[i]))
-      pRenderer->DrawMaskToZBuffer(pTownPortalBook_xs[i],
-                                   pTownPortalBook_ys[i],
-                                   pTexture_TownPortalIcons[i], i + 1);
-  }
-
-  pMouse->GetCursorPos(&a2);
-  v3 = pRenderer->pActiveZBuffer[a2.x + pSRZBufferLineOffsets[a2.y]] & 0xFFFF;
-
-  if (v3)
-  {
-    if (_449B57_test_bit(pParty->_quest_bits, fountain_bits_lut[v3 - 1]))
-      pRenderer->DrawTextureIndexed(pTownPortalBook_xs[v3 - 1], pTownPortalBook_ys[v3 - 1], pTexture_TownPortalIcons[v3 - 1]);
-  }
-  TownPortalWindow.DrawTitleText(pBook2Font, 0, 22, 0, pGlobalTXT_LocalizationStrings[10], 3);
-}
-
-//----- (00410DEC) --------------------------------------------------------
-unsigned int  DrawLloydBeaconsScreen()
-{
-  Player *pPlayer; // esi@1
-  const char *pText; // eax@1
-  int pTextHeight; // eax@14
-  int RemainingTime; // kr08_8@14
-  unsigned int pHours; // esi@14
-  unsigned int pDays; // eax@14
-  const char *pSelectionText; // eax@19
-  Texture *v19; // [sp-4h] [bp-8Ch]@4
-  GUIWindow pWindow; // [sp+Ch] [bp-7Ch]@1
-  char *Str; // [sp+74h] [bp-14h]@14
-  int BeaconID; // [sp+78h] [bp-10h]@11
-  int uNumMaxBeacons; // [sp+84h] [bp-4h]@6
-
-  pPlayer = &pParty->pPlayers[_506348_current_lloyd_playerid];
-  pRenderer->DrawTextureIndexed(8, 8, pTexture_LloydBeacons[(unsigned __int8)bRecallingBeacon]);
-  pText = pGlobalTXT_LocalizationStrings[523];     // Recall Beacon
-  pWindow.uFrameX = game_viewport_x;
-  pWindow.uFrameY = game_viewport_y;
-  pWindow.uFrameWidth = 428;
-  pWindow.uFrameHeight = game_viewport_height;
-  pWindow.uFrameZ = 435;
-  pWindow.uFrameW = game_viewport_w;
-  if ( !bRecallingBeacon )
-    pText = pGlobalTXT_LocalizationStrings[375];   // Set Beacon
-  sprintf(pTmpBuf.data(), "%s", pText);
-  pWindow.DrawTitleText(pBook2Font, 0, 22, 0, pTmpBuf.data(), 3);
-  if ( bRecallingBeacon )
-  {
-    pRenderer->DrawTextureIndexedAlpha(pBtn_Book_1->uX, pBtn_Book_1->uY, pTex_book_button1_on);
-    v19 = pTex_book_button1_off;
-  }
-  else
-  {
-    pRenderer->DrawTextureIndexedAlpha(pBtn_Book_1->uX, pBtn_Book_1->uY, pTex_book_button1_off);
-    v19 = pTex_book_button1_on;
-  }
-  pRenderer->DrawTextureIndexedAlpha(pBtn_Book_2->uX, pBtn_Book_2->uY, v19);
-  uNumMaxBeacons = 1;
-  if ( HIBYTE(pPlayer->pActiveSkills[PLAYER_SKILL_WATER]) & 1 || (pPlayer->pActiveSkills[PLAYER_SKILL_WATER] & 0x80u) != 0 )
-  {
-    uNumMaxBeacons = 5;
-  }
-  else
-  {
-    if ( pPlayer->pActiveSkills[PLAYER_SKILL_WATER] & 0x40 )
-      uNumMaxBeacons = 3;
-  }
-  if ( uNumMaxBeacons > 0 )
-  {
-    for ( BeaconID = 0; BeaconID < uNumMaxBeacons; BeaconID++ )
-    {
-      pWindow.uFrameWidth = 92;
-      pWindow.uFrameHeight = 68;
-      pWindow.uFrameY = pLloydsBeaconsPreviewYs[BeaconID];
-      pWindow.uFrameX = pLloydsBeaconsPreviewXs[BeaconID];
-      pWindow.uFrameW = pWindow.uFrameY + 67;
-      pWindow.uFrameZ = pLloydsBeaconsPreviewXs[BeaconID] + 91;
-      //if ( pSavegameThumbnails[BeaconID].pPixels != 0 )
-      if ( pPlayer->pInstalledBeacons[BeaconID].SaveFileID != 0 )
-      {
-        pRenderer->DrawTextureIndexedAlpha(pLloydsBeacons_SomeXs[BeaconID], pLloydsBeacons_SomeYs[BeaconID], pTexture_CurrentBook);
-        pRenderer->DrawTextureRGB(pLloydsBeaconsPreviewXs[BeaconID], pLloydsBeaconsPreviewYs[BeaconID], &pSavegameThumbnails[BeaconID]);
-        Str = pMapStats->pInfos[pMapStats->sub_410D99_get_map_index(pPlayer->pInstalledBeacons[BeaconID].SaveFileID)].pName;
-        pTextHeight = pSpellFont->CalcTextHeight(Str, &pWindow, 0, 0);
-        pWindow.uFrameY += -6 - pTextHeight;
-        pWindow.DrawTitleText(pSpellFont, 0, 0, 1, Str, 3);
-        RemainingTime = pPlayer->pInstalledBeacons[BeaconID].uBeaconTime - pParty->uTimePlayed;
-        pHours = (signed __int64)((double)RemainingTime * 0.234375) / 60 / 60;
-        pDays = pHours / 24;
-        if ( pDays )
-        {
-          sprintf(pTmpBuf.data(), "%lu %s", pDays + 1, pGlobalTXT_LocalizationStrings[57]);//days
-          pWindow.uFrameY = pWindow.uFrameY + pWindow.uFrameHeight + 4;
-          pWindow.DrawTitleText(pSpellFont, 0, 0, 1, pTmpBuf.data(), 3);
-          continue;
-        }
-        else
-        {
-          if ( pHours + 1 <= 23 )
-          {
-            if ( pHours < 1 )
-              pSelectionText = pGlobalTXT_LocalizationStrings[109];// Hour
-            else
-              pSelectionText = pGlobalTXT_LocalizationStrings[110];// Hours
-            sprintf(pTmpBuf.data(), "%lu %s", pHours + 1, pSelectionText);
-            pWindow.uFrameY = pWindow.uFrameY + pWindow.uFrameHeight + 4;
-            pWindow.DrawTitleText(pSpellFont, 0, 0, 1, pTmpBuf.data(), 3);
-            continue;
-          }
-        }
-        sprintf(pTmpBuf.data(), "%lu %s", pDays + 1, pGlobalTXT_LocalizationStrings[56]);//Day
-        pWindow.uFrameY = pWindow.uFrameY + pWindow.uFrameHeight + 4;
-        pWindow.DrawTitleText(pSpellFont, 0, 0, 1, pTmpBuf.data(), 3);
-        continue;
-      }
-      if ( !bRecallingBeacon )
-      {
-        pRenderer->DrawTextureIndexedAlpha(pLloydsBeacons_SomeXs[BeaconID], pLloydsBeacons_SomeYs[BeaconID], pTexture_CurrentBook);
-        pTextHeight = pSpellFont->CalcTextHeight(pGlobalTXT_LocalizationStrings[19], &pWindow, 0, 0);
-        pWindow.DrawTitleText(pSpellFont, 0, (signed int)pWindow.uFrameHeight / 2 - pTextHeight / 2, 1, pGlobalTXT_LocalizationStrings[19], 3);//Доступно
-      }
-    }
-  }
-  if ( byte_506360 )
-    pMessageQueue_50CBD0->AddGUIMessage(UIMSG_CloseAfterInstallBeacon, 0, 0);
-  return BeaconID;
-}
-
-//----- (00413980) --------------------------------------------------------
-void BookUI_Map_Draw()
-{
-  unsigned int map_id; // eax@35
-  char party_coord[120]; // [sp+Ch] [bp-CCh]@37
-  GUIWindow map_window; // [sp+84h] [bp-54h]@35
-
-  pRenderer->DrawTextureIndexed(pViewport->uViewportTL_X, pViewport->uViewportTL_Y, pSpellBookPagesTextr_12);
-  if ( BtnUp_flag || viewparams->uMapBookMapZoom / 128 >= 12 )//Button 1
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 2, pTex_book_button1_off);
-  else
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 1, pTex_book_button1_on);
-
-  if ( BtnDown_flag || viewparams->uMapBookMapZoom / 128 <= 3 )//Button 2
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 38, pTex_book_button2_off);
-  else
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 38, pTex_book_button2_on);
-
-  if ( Book_PageBtn3_flag )//Button 3
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 113, pTex_book_button3_off);
-  else
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 113, pTex_book_button3_on);
-
-  if ( Book_PageBtn4_flag )//Button 4
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 150, pTex_book_button4_off);
-  else
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 399, pViewport->uViewportTL_Y + 150, pTex_book_button4_on);
-
-  if ( Book_PageBtn5_flag )//Button 5
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 188, pTex_book_button5_off);
-  else
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 188, pTex_book_button5_on);
-
-  if ( Book_PageBtn6_flag )//Button 6
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 226, pTex_book_button6_off);
-  else
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 226, pTex_book_button6_on);
-
-  if ( BtnDown_flag )
-    viewparams->CenterOnParty2();
-  if ( BtnUp_flag )
-    viewparams->CenterOnParty();
-  if ( Book_PageBtn3_flag )
-    viewparams->_443219();
-  if ( Book_PageBtn4_flag )
-    viewparams->_443231();
-  if ( Book_PageBtn5_flag )
-    viewparams->_44323D();
-  if ( Book_PageBtn6_flag )
-    viewparams->_443225();
-
-  if ( BtnUp_flag | BtnDown_flag | Book_PageBtn3_flag | Book_PageBtn4_flag | Book_PageBtn5_flag | Book_PageBtn6_flag )
-    pAudioPlayer->PlaySound(SOUND_StartMainChoice02, 0, 0, -1, 0, 0, 0, 0);
-  BtnUp_flag = 0;
-  BtnDown_flag = 0;
-  Book_PageBtn6_flag = 0;
-  Book_PageBtn5_flag = 0;
-  Book_PageBtn4_flag = 0;
-  Book_PageBtn3_flag = 0;
-  DrawBook_Map_sub(97, 49, 361, 313, 0);
-  pRenderer->DrawTextureIndexedAlpha(75, 22, pTexture_mapbordr);
-  map_window.uFrameWidth = game_viewport_width;
-  map_window.uFrameHeight = game_viewport_height;
-  map_window.uFrameX = game_viewport_x;
-  map_window.uFrameY = game_viewport_y;
-  map_window.uFrameZ = game_viewport_z;
-  map_window.uFrameW = game_viewport_w;
-  map_id = pMapStats->GetMapInfo(pCurrentMapName);
-  if ( map_id )
-    map_window.DrawTitleText(pBook2Font, -14, 12, ui_book_map_title_color, pMapStats->pInfos[map_id].pName, 3);
-
-  map_window.uFrameX = 0;
-  sprintf(party_coord, pGlobalTXT_LocalizationStrings[659], pParty->vPosition.x, pParty->vPosition.y); //"x: %d  y: %d"
-  map_window.DrawTitleText(pFontComic, 0, 320, ui_book_map_coordinates_color, party_coord, 0);
-}
-
-//----- (00442955) --------------------------------------------------------
-void DrawBook_Map_sub( unsigned int tl_x, unsigned int tl_y, unsigned int br_x, int br_y, int _48074 )
-{
-  int v20; // eax@16
-  int v26; // ecx@21
-  unsigned __int16 *v27; // edi@21
-  int v28; // edx@21
-  int v29; // eax@21
-  double v30; // st7@23
-  int textr_width; // esi@23
-  signed int v47; // esi@38
-  signed int v48; // ecx@38
-  int v49; // eax@38
-  signed int v50; // edx@55
-  unsigned int v51; // ecx@55
-  int v54; // esi@75
-  int v55; // eax@75
-  double v57; // st7@85
-  signed int v60; // edi@85
-  signed int v62; // ebx@85
-  signed int v63; // esi@85
-  int v64; // eax@87
-  unsigned __int16 *pPalette_16; // [sp+48014h] [bp-50h]@23
-  int map_tile_X; // [sp+48020h] [bp-44h]@23
-  unsigned char* texture8_data;
-  unsigned char* curr_line;
-  int scale_increment;
-  int scaled_posX;
-  int scaled_posY;
-  int stepX_r;
-  int stepY_r;
-  unsigned int teal; // [sp+48028h] [bp-3Ch]@8
-  int pCenterY; // [sp+4802Ch] [bp-38h]@1
-  int screenCenter_X; // [sp+48030h] [bp-34h]@1
-  int pCenterX; // [sp+48034h] [bp-30h]@1
-  int v87; // [sp+48038h] [bp-2Ch]@16
-  unsigned int v88; // [sp+4803Ch] [bp-28h]@16
-  int black; // [sp+48040h] [bp-24h]@8
-  int screenCenterY; // [sp+48044h] [bp-20h]@1
-  unsigned int screenHeight; // [sp+4804Ch] [bp-18h]@16
-  unsigned __int16 *v93; // [sp+48050h] [bp-14h]@16
-  signed int screenWidth; // [sp+48054h] [bp-10h]@8
-  unsigned int v95; // [sp+48058h] [bp-Ch]@16
-  int map_tile_Y; // [sp+4805Ch] [bp-8h]@10
-  const void *v97; // [sp+48060h] [bp-4h]@16
-
-  screenCenter_X = (signed int)(tl_x + br_x) / 2;
-  screenCenterY = (signed int)(tl_y + br_y) / 2;
-  pRenderer->SetRasterClipRect(tl_x, tl_y, br_x, br_y);
-  pCenterX = viewparams->sViewCenterX;
-  pCenterY = viewparams->sViewCenterY;
-  if ( viewparams->uMapBookMapZoom != 384 )
-  {
-    if ( viewparams->uMapBookMapZoom == 768 )
-    {
-      if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
-        viewparams->uMapBookMapZoom = 680;
-    }
-  }
-  else
-  {
-    viewparams->sViewCenterX = viewparams->indoor_center_x;
-    pCenterX = viewparams->indoor_center_x;
-    pCenterY = viewparams->indoor_center_y;
-    if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
-      viewparams->uMapBookMapZoom = viewparams->uMapBookMapZoom - 34;
-  }
-  if ( uCurrentlyLoadedLevelType != LEVEL_Indoor)
-  {
-    screenWidth = br_x - tl_x + 1;
-    screenHeight = br_y - tl_y + 1;
-    //render16_data = &pRenderer->pTargetSurface[tl_x + tl_y * pRenderer->uTargetSurfacePitch];
-    texture8_data = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].pLevelOfDetail0_prolly_alpha_mask;
-    pPalette_16 = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].pPalette16;
-    scale_increment = (1 << (pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uWidthLn2 + 16)) / viewparams->uMapBookMapZoom;
-
-    v30 = (double)(1 << (16 - pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uWidthLn2));
-
-    teal = (unsigned int)(signed __int64)((double)(viewparams->sViewCenterX - 22528 / (viewparams->uMapBookMapZoom / 384) + 32768) / v30) << 16;
-
-    textr_width = pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uTextureWidth;
-    stepY_r =            (int)(signed __int64)((double)(- pCenterY - 22528 / (viewparams->uMapBookMapZoom / 384)+ 32768) / v30) << 16;
-    black = (signed __int16)(signed __int64)((double)(viewparams->sViewCenterX - 22528 / (viewparams->uMapBookMapZoom / 384) + 32768) / v30);
-
-    scaled_posY = stepY_r >> 16;
-    //nearest neiborhood scaling
-    if ( texture8_data)  
-    {
-      for( uint i = 0; i < screenHeight; ++i )
-      {
-        curr_line = &texture8_data[scaled_posY*textr_width];
-        stepX_r = teal;
-        for( uint j = 0; j < screenWidth; ++j )
-        {
-          scaled_posX = stepX_r>>16;
-          //map_texture_16[i*screenWidth+j]=pPalette_16[*(curr_line+scaled_posX)];
-          pRenderer->WritePixel16(tl_x + j, tl_y + i, pPalette_16[*(curr_line+scaled_posX)]);
-          stepX_r += scale_increment;
-        }
-        stepY_r+=scale_increment;
-        scaled_posY=stepY_r>>16;
-      }
-    }
-
-    /*//move visible square to render
-    for( uint i = 0; i < screenHeight; ++i )
-    {
-      if ( screenWidth > 0 )
-        memcpy((void*)&render16_data[pRenderer->uTargetSurfacePitch * i],(void*)&map_texture_16[i*screenWidth], screenWidth*2);
-    }*/
-  }
-  else
-  {
-    black = Color16(0, 0, 0);
-    teal = Color16(0, 0xFF, 0xFF);
-    uNumBlueFacesInBLVMinimap = 0;
-    if ( pIndoor->pMapOutlines->uNumOutlines )
-    {
-     for ( uint i = 0; i < pIndoor->pMapOutlines->uNumOutlines; ++i )
-      {
-        if ( !(pIndoor->pFaces[pIndoor->pMapOutlines->pOutlines[i].uFace1ID].Invisible() 
-           || (pIndoor->pFaces[pIndoor->pMapOutlines->pOutlines[i].uFace2ID].Invisible()) ))
-        {
-          if ( !(pIndoor->pMapOutlines->pOutlines[i].uFlags & 1) )
-          {
-            if ( !(!(pIndoor->pFaces[pIndoor->pMapOutlines->pOutlines[i].uFace1ID].uAttributes & FACE_UNKNOW7)
-                && !(pIndoor->pFaces[pIndoor->pMapOutlines->pOutlines[i].uFace2ID].uAttributes & FACE_UNKNOW7) ))
-            {
-              pIndoor->pMapOutlines->pOutlines[i].uFlags = pIndoor->pMapOutlines->pOutlines[i].uFlags | 1;
-              pIndoor->_visible_outlines[i >> 3] |= 1 << (7 - i % 8);
-            }
-          }
-          if ( (!(pIndoor->pMapOutlines->pOutlines[i].uFlags & 1) 
-            && !(!(pIndoor->pFaces[pIndoor->pMapOutlines->pOutlines[i].uFace1ID].uAttributes & FACE_UNKNOW7)
-            && !(pIndoor->pFaces[pIndoor->pMapOutlines->pOutlines[i].uFace2ID].uAttributes & FACE_UNKNOW7) ))
-            || pIndoor->pMapOutlines->pOutlines[i].uFlags & 1)
-          {
-            v93 = (unsigned __int16 *)(pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex1ID].x - viewparams->sViewCenterX);
-            screenHeight = pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex1ID].y - pCenterY;
-            v20 = pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex2ID].y - pCenterY;
-            v95 = pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex2ID].x - viewparams->sViewCenterX;
-
-            v88 = fixpoint_mul((pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex1ID].x - viewparams->sViewCenterX), viewparams->uMapBookMapZoom);
-            v87 = fixpoint_mul(screenHeight, viewparams->uMapBookMapZoom);
-            v93 = (unsigned __int16 *)(fixpoint_mul((pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex2ID].x - viewparams->sViewCenterX), viewparams->uMapBookMapZoom));
-            screenHeight = fixpoint_mul(v20, viewparams->uMapBookMapZoom);
-            pRenderer->RasterLine2D(screenCenter_X + v88, screenCenterY - v87,
-              screenCenter_X + (fixpoint_mul((pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uVertex2ID].x - viewparams->sViewCenterX), viewparams->uMapBookMapZoom)), screenCenterY - screenHeight, black);
-          }
-        }
-      }
-    }
-    if ( (signed int)uNumBlueFacesInBLVMinimap > 0 )
-    {
-      for ( uint j = 0; j < (signed int)uNumBlueFacesInBLVMinimap; ++j )
-      {
-        v26 = pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[pBlueFacesInBLVMinimapIDs[j]].uVertex2ID].x;
-        v27 = (unsigned __int16 *)(pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[pBlueFacesInBLVMinimapIDs[j]].uVertex1ID].x - pCenterX);
-        v28 = pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[pBlueFacesInBLVMinimapIDs[j]].uVertex1ID].y - pCenterY;
-        v29 = pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[pBlueFacesInBLVMinimapIDs[j]].uVertex2ID].y - pCenterY;
-
-        v87 = fixpoint_mul((signed int)v27, viewparams->uMapBookMapZoom);
-        v88 = fixpoint_mul(v28, viewparams->uMapBookMapZoom);
-        uint i = fixpoint_mul((v26 - pCenterX), viewparams->uMapBookMapZoom);
-        v95 = fixpoint_mul(v29, viewparams->uMapBookMapZoom);
-        pRenderer->RasterLine2D(screenCenter_X + (fixpoint_mul((signed int)v27, viewparams->uMapBookMapZoom)),
-          screenCenterY - v88, screenCenter_X + (fixpoint_mul((v26 - pCenterX), viewparams->uMapBookMapZoom)), screenCenterY - v95, teal);
-      }
-      viewparams->sViewCenterX = pCenterX;
-    }
-  }
-  v47 = (fixpoint_mul((pParty->vPosition.x - viewparams->sViewCenterX), viewparams->uMapBookMapZoom)) + screenCenter_X - 3;
-  v97 = (const void *)(fixpoint_mul((pParty->vPosition.y - pCenterY), viewparams->uMapBookMapZoom));
-  v48 = 1;
-  v49 = screenCenterY - (int)v97 - 3;
-  if ( v47 >= (signed int)tl_x )
-  {
-    if ( v47 > (signed int)br_x )
-    {
-      if ( (signed int)((fixpoint_mul((pParty->vPosition.x - viewparams->sViewCenterX), viewparams->uMapBookMapZoom)) + screenCenter_X - 6) > (signed int)br_x )
-        v48 = 0;
-      v47 = br_x;
-    }
-  }
-  else
-  {
-    if ( (signed int)((fixpoint_mul((pParty->vPosition.x - viewparams->sViewCenterX), viewparams->uMapBookMapZoom)) + screenCenter_X) < (signed int)tl_x )
-      v48 = 0;
-    v47 = tl_x;
-  }
-  if ( v49 >= (signed int)tl_y )
-  {
-    if ( v49 > br_y )
-    {
-      if ( screenCenterY - (signed int)v97 - 6 > br_y )
-        v48 = 0;
-      v49 = br_y;
-    }
-  }
-  else
-  {
-    if ( screenCenterY - (signed int)v97 < (signed int)tl_y )
-      v48 = 0;
-    v49 = tl_y;
-  }
-  if ( v48 == 1 )
-  {
-    v51 = pParty->sRotationY & stru_5C6E00->uDoublePiMask;
-    if ( (signed int)v51 <= 1920 )
-      v50 = 6;
-    if ( (signed int)v51 < 1664 )
-      v50 = 5;
-    if ( (signed int)v51 <= 1408 )
-      v50 = 4;
-    if ( (signed int)v51 < 1152 )
-      v50 = 3;
-    if ( (signed int)v51 <= 896 )
-      v50 = 2;
-    if ( (signed int)v51 < 640 )
-      v50 = 1;
-    if ( (signed int)v51 <= 384 )
-      v50 = 0;
-    if ( (signed int)v51 < 128 || (signed int)v51 > 1920 )
-      v50 = 7;
-    pRenderer->DrawTransparentRedShade(v47, v49, pIcons_LOD->GetTexture(pTextureIDs_pMapDirs[v50]));
-  }
-  if ( (signed int)uNumLevelDecorations > 0 )
-  {
-    for ( uint i = 0; i < (signed int)uNumLevelDecorations; ++i )
-    {
-      if (pLevelDecorations[i].uFlags & LEVEL_DECORATION_VISIBLE_ON_MAP)
-      {
-        screenHeight = pLevelDecorations[i].vPosition.y - pCenterY;
-        v93 = (unsigned __int16 *)(pLevelDecorations[i].vPosition.x - viewparams->sViewCenterX);
-        v54 = (fixpoint_mul((signed int)v93, viewparams->uMapBookMapZoom)) + screenCenter_X;
-        v97 = (const void *)(fixpoint_mul(screenHeight, viewparams->uMapBookMapZoom));
-        v55 = screenCenterY - (int)v97;
-        //if ( v54 >= pRenderer->raster_clip_x && v54 <= pRenderer->raster_clip_z
-        //  && v55 >= pRenderer->raster_clip_y && v55 <= pRenderer->raster_clip_w )
-        {
-          if ( viewparams->uMapBookMapZoom > 512 )
-          {
-            pRenderer->RasterLine2D(v54 - 1, v55 - 1, v54 - 1, v55 + 1, Color16(0xFFu, 0xFFu, 0xFFu));
-            pRenderer->RasterLine2D(v54,     v55 - 1, v54,     v55 + 1, Color16(0xFFu, 0xFFu, 0xFFu));
-            pRenderer->RasterLine2D(v54 + 1, v55 - 1, v54 + 1, v55 + 1, Color16(0xFFu, 0xFFu, 0xFFu));
-          }
-          else
-            pRenderer->RasterLine2D(v54, screenCenterY - (int)v97,
-                   (fixpoint_mul((signed int)v93, viewparams->uMapBookMapZoom)) + screenCenter_X,
-                   screenCenterY - (int)v97, Color16(0xFF, 0xFF, 0xFF));
-        }
-      }
-    }
-  }
-  if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor)
-  {
-    screenCenterY = br_x - tl_x + 1;
-    v95 = br_y - tl_y + 1;
-    //v77 = &pRenderer->pTargetSurface[tl_x + tl_y * pRenderer->uTargetSurfacePitch];
-    black = (1 << (pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uWidthLn2 + 16)) / viewparams->uMapBookMapZoom;
-    v57 = (double)(1 << (16 - pIcons_LOD->pTextures[viewparams->uTextureID_LocationMap].uWidthLn2));
-    v60 = (int)((signed __int64)((double)(viewparams->sViewCenterX - (22528 / (viewparams->uMapBookMapZoom / 384)) + 32768) / v57)) << 16;
-    teal = v60 >> 16;
-    pPalette_16 = (unsigned __int16 *)(v60 >> 16);
-    v97 = (const void *)((int)((signed __int64)((double)(viewparams->sViewCenterX - (22528 / (viewparams->uMapBookMapZoom / 384)) + 32768) / v57)) << 16);
-    v62 = (int)((signed __int64)((double)(32768 - (22528 / (viewparams->uMapBookMapZoom / 384)) - pCenterY) / v57)) << 16;
-    v63 = (signed __int16)((signed __int64)((double)(32768 - (22528 / (viewparams->uMapBookMapZoom / 384)) - pCenterY) / v57));
-
-
-    for (int y = 0; y < (signed int)v95; ++y)
-    {
-        map_tile_Y = (v63 - 80) / 4;
-        v64 = teal;
-        for (int x = 0; x < screenCenterY; ++x)
-        {
-          map_tile_X = (v64 - 80) / 4;
-          if ( !pOutdoor->IsMapCellFullyRevealed(map_tile_X, map_tile_Y) )
-          {
-            if ( pOutdoor->IsMapCellPartiallyRevealed(map_tile_X, map_tile_Y) )
-            {
-              if ( !((x + screenCenter_X) % 2) )
-                //*a4a = Color16(12, 12, 12);
-                  pRenderer->WritePixel16(tl_x + x, tl_y + y, Color16(12, 12, 12));
-            }
-            else
-              //*a4a = 0;
-                  pRenderer->WritePixel16(tl_x + x, tl_y + y, Color16(0, 0, 0));
-          }
-          v97 = (char *)v97 + black;
-          v64 = (signed int)v97 >> 16;
-        }
-
-      v62 += black;
-      v97 = (const void *)v60;
-      v63 = v62 >> 16;
-      teal = (unsigned int)pPalette_16;
-    }
-    /*a4a = map_texture_16;
-    for ( screenCenter_X = 0; screenCenter_X < (signed int)v95; ++screenCenter_X )
-    {
-      if ( screenCenterY > 0 )
-      {
-        map_tile_Y = (v63 - 80) / 4;
-        v64 = teal;
-        for ( a5a = 0; a5a < screenCenterY; ++a5a )
-        {
-          map_tile_X = (v64 - 80) / 4;
-          if ( !pOutdoor->_47F04C(map_tile_X, map_tile_Y) )
-          {
-            if ( pOutdoor->_47F097(map_tile_X, map_tile_Y) )
-            {
-              if ( !((a5a + screenCenter_X) % 2) )
-                *a4a = Color16(0xCu, 0xCu, 0xCu);
-            }
-            else
-              *a4a = 0;
-          }
-          ++a4a;
-          v97 = (char *)v97 + black;
-          v64 = (signed int)v97 >> 16;
-        }
-      }
-      v62 += black;
-      v97 = (const void *)v60;
-      a4a += screenCenterY - a5a;
-      v63 = v62 >> 16;
-      teal = (unsigned int)pPalette_16;
-    }
-
-    v66 = map_texture_16;
-    if ( (signed int)v95 > 0 )
-    {
-      v67 = v77;
-      result = 2 * (pRenderer->uTargetSurfacePitch - screenCenterY);
-      for ( v65 = v95; v65; --v65 )
-      {
-        if ( screenCenterY > 0 )
-        {
-          for ( v68 = screenCenterY; v68; --v68 )
-          {
-            v69 = *(short *)v66;
-            if ( !*(short *)v66 || v69 == (short)result )
-              *v67 = v69;
-            ++v66;
-            ++v67;
-          }
-        }
-        v67 = (unsigned __int16 *)((char *)v67 + result);
-      }
-    }*/
-  }
-}
-
-//----- (00444564) --------------------------------------------------------
-const char * GetMapBookHintText()
-{
-  int v20;
-  int v21; // [sp+14h] [bp-Ch]@1
-  double v0; // st7@3
-  unsigned int pX; // [sp+1Ch] [bp-4h]@3
-  unsigned int pY; // [sp+8h] [bp-18h]@3
-  int global_coord_X; // ebx@3
-  int global_coord_Y;
-  int map_tile_X; // edi@3
-  int map_tile_Y; // eax@3
-  const char *result; // eax@15
-
-  v20 = viewparams->sViewCenterX;
-  v21 = viewparams->sViewCenterY;
-  if ( viewparams->uMapBookMapZoom == 384 )
-  {
-    v20 = viewparams->indoor_center_x;
-    v21 = viewparams->indoor_center_y;
-  }
-  pMouse->GetClickPos(&pX, &pY);
-  v0 = 1.0 / (float)((signed int)viewparams->uMapBookMapZoom * 0.000015258789);
-
-  global_coord_X = (signed __int64)((double)(pX - 229) * v0 + (double)v20);
-  global_coord_Y = (signed __int64)((double)v21 - (double)(pY - 181) * v0);
-
-  result = 0;
-  map_tile_X = abs(global_coord_X + 22528) / 512;//In the mapbook only lady Margaret dispays for defoult zoom(В книге карты только Леди Маргарита всплывает при дефолтном зуме)
-  map_tile_Y = abs(global_coord_Y - 22528) / 512;
-  if ( pOutdoor->IsMapCellFullyRevealed(map_tile_X, map_tile_Y) && uCurrentlyLoadedLevelType == LEVEL_Outdoor && (signed int)pOutdoor->uNumBModels > 0 )
-  {
-    for(int i = 0; i < pOutdoor->uNumBModels && !result; i++)
-    {
-      if ( int_get_vector_length(abs((signed)pOutdoor->pBModels[i].vBoundingCenter.x - global_coord_X),
-                                 abs((signed)pOutdoor->pBModels[i].vBoundingCenter.y - global_coord_Y), 0) < pOutdoor->pBModels[i].sBoundingRadius )
-      {
-        if ( pOutdoor->pBModels[i].uNumFaces > 0 )
-        {
-          for( int j = 0; j < pOutdoor->pBModels[i].uNumFaces; j++ )
-          {
-            if ( pOutdoor->pBModels[i].pFaces[j].sCogTriggeredID )
-            {
-              if ( !(pOutdoor->pBModels[i].pFaces[j].uAttributes & FACE_HAS_EVENT) )
-              {
-                if ( GetEventHintString(pOutdoor->pBModels[i].pFaces[j].sCogTriggeredID) )
-                {
-                  if ( _stricmp(GetEventHintString(pOutdoor->pBModels[i].pFaces[j].sCogTriggeredID), "") )
-                    result = GetEventHintString(pOutdoor->pBModels[i].pFaces[j].sCogTriggeredID);
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  return result;
-}
\ No newline at end of file
--- a/GUI/UI/Books/UIMapBook.h	Tue May 12 01:45:31 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-
-void DrawBook_Map_sub(unsigned int tl_x, unsigned int tl_y, unsigned int br_x, int br_y, int _48074); // idb
-const char *GetMapBookHintText();//sub_444564
\ No newline at end of file
--- a/GUI/UI/Books/UINotesBooks.cpp	Tue May 12 01:45:31 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,448 +0,0 @@
-#define _CRT_SECURE_NO_WARNINGS
-
-#include "Engine/Engine.h"
-
-#include "..\..\..\Engine/Graphics/Render.h"
-#include "..\..\..\IO/Mouse.h"
-#include "..\UIBooks.h"
-#include "..\..\..\Engine/MapInfo.h"
-#include "..\..\..\GUI/GUIWindow.h"
-#include "..\..\..\GUI/GUIFont.h"
-#include "..\..\..\Engine/Party.h"
-#include "..\..\..\Media/Audio/AudioPlayer.h"
-#include "..\..\..\Engine/LOD.h"
-#include "..\..\..\Engine/Graphics/Viewport.h"
-#include "..\..\..\Engine/Awards.h"
-#include "..\..\..\Engine/Autonotes.h"
-#include "..\..\..\Engine/Tables/StorylineTextTable.h"
-#include "..\..\..\Engine/texts.h"
-
-//----- (00413D3C) --------------------------------------------------------
-static const char *GetDayPart()
-{
-  if ( pParty->uCurrentHour > 5 && pParty->uCurrentHour < 20 )
-    return pGlobalTXT_LocalizationStrings[56]; // "Day"
-  else if ( pParty->uCurrentHour == 5 )
-    return pGlobalTXT_LocalizationStrings[55]; // "Dawn"
-  else if ( pParty->uCurrentHour == 20 )
-    return pGlobalTXT_LocalizationStrings[566]; // "Dusk"
-  else
-    return pGlobalTXT_LocalizationStrings[567]; // "Night"
-}
-
-//----- (00413D6F) --------------------------------------------------------
-void BookUI_Calendar_Draw()
-{
-  int am; // ecx@5
-  char *pMapName; // eax@6
-  GUIWindow calendar_window; // [sp+Ch] [bp-60h]@5
-  unsigned int pMapID; // [sp+60h] [bp-Ch]@1
-  unsigned int pHour;
-
-  static unsigned int pDayMoonPhase[28] = // 4E1B18
-  {
-    0, 0, 0,
-    1, 1, 1, 1,
-    2, 2, 2,
-    3, 3, 3, 3,
-    4, 4, 4,
-    3, 3, 3, 3,
-    2, 2, 2,
-    1, 1, 1, 1
-  };
-
-  pRenderer->DrawTextureIndexed(pViewport->uViewportTL_X, pViewport->uViewportTL_Y, pSpellBookPagesTextr_13);
-  pHour = pParty->uCurrentHour;
-  if ( (signed int)pHour >= 12 )
-  {
-    pHour -= 12;
-    if ( !pHour )
-      pHour = 12;
-    am = 1;
-  }
-  else
-    am = 0;
-
-  calendar_window.uFrameX = game_viewport_x;
-  calendar_window.uFrameY = game_viewport_y;
-  calendar_window.uFrameWidth = game_viewport_width;
-  calendar_window.uFrameHeight = game_viewport_height;
-  calendar_window.uFrameZ = game_viewport_z;
-  calendar_window.uFrameW = game_viewport_w;
-  calendar_window.DrawTitleText(pBook2Font, 0, 22, ui_book_calendar_title_color, pGlobalTXT_LocalizationStrings[186], 3); // "Time in Erathia"
-
-  sprintf(pTmpBuf.data(), "%s\t100:\t110%d:%02d %s - %s", pGlobalTXT_LocalizationStrings[526], // "Time"
-     pHour, pParty->uCurrentMinute, aAMPMNames[am], GetDayPart());
-  calendar_window.DrawText(pBookFont, 70, 55, ui_book_calendar_time_color, pTmpBuf.data(), 0, 0, 0);
-
-  sprintf(pTmpBuf.data(), "%s\t100:\t110%d - %s", pGlobalTXT_LocalizationStrings[56], // "Day"
-     pParty->uDaysPlayed + 1, aDayNames[pParty->uDaysPlayed % 7]);
-  calendar_window.DrawText(pBookFont, 70, 2 * LOBYTE(pBookFont->uFontHeight) + 49, ui_book_calendar_day_color, pTmpBuf.data(), 0, 0, 0);
-
-  sprintf(pTmpBuf.data(), "%s\t100:\t110%d - %s", pGlobalTXT_LocalizationStrings[146], // "Month"
-        pParty->uCurrentMonth + 1, aMonthNames[pParty->uCurrentMonth]);
-  calendar_window.DrawText(pBookFont, 70, 4 * LOBYTE(pBookFont->uFontHeight) + 43, ui_book_calendar_month_color, pTmpBuf.data(), 0, 0, 0);
-
-  sprintf(pTmpBuf.data(), "%s\t100:\t110%d", pGlobalTXT_LocalizationStrings[245], pParty->uCurrentYear); // "Year"
-  calendar_window.DrawText(pBookFont, 70, 6 * LOBYTE(pBookFont->uFontHeight) + 37, ui_book_calendar_year_color, pTmpBuf.data(), 0, 0, 0);
-
-  sprintf(pTmpBuf.data(), "%s\t100:\t110%s", pGlobalTXT_LocalizationStrings[530], aMoonPhaseNames[pDayMoonPhase[pParty->uDaysPlayed]]); // "Moon"
-  calendar_window.DrawText(pBookFont, 70, 8 * LOBYTE(pBookFont->uFontHeight) + 31, ui_book_calendar_moon_color, pTmpBuf.data(), 0, 0, 0);
-
-  pMapID = pMapStats->GetMapInfo(pCurrentMapName);
-  if ( pMapID )
-    pMapName = pMapStats->pInfos[pMapID].pName;
-  else
-    pMapName = "Unknown";
-  sprintf(pTmpBuf.data(), "%s\t100:\t110%s", pGlobalTXT_LocalizationStrings[531], pMapName); // "Location"
-  calendar_window.DrawText(pBookFont, 70, 10 * LOBYTE(pBookFont->uFontHeight) + 25, ui_book_calendar_location_color, pTmpBuf.data(), 0, 0, 0);
-}
-
-//----- (00413126) --------------------------------------------------------
-void BookUI_Questbook_Draw()
-{
-  int pTextHeight; // eax@19
-  GUIWindow questbook_window; // [sp+Ch] [bp-54h]@9
-
-  pRenderer->DrawTextureIndexed(pViewport->uViewportTL_X, pViewport->uViewportTL_Y, pTexture_CurrentBook);
-  if ( BtnUp_flag || !books_primary_item_per_page )//Bookmark Up(Закладка вверх)
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 407, pViewport->uViewportTL_Y + 2, pTex_book_button1_off);
-  else
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 1, pTex_book_button1_on);
-
-  if ( BtnDown_flag || books_primary_item_per_page + num_achieved_awards >= full_num_items_in_book )//Bookmark Down(Закладка вниз)
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 407, pViewport->uViewportTL_Y + 38, pTex_book_button2_off);
-  else
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 38, pTex_book_button2_on);
-
-  //for title
-  questbook_window.uFrameWidth = game_viewport_width;
-  questbook_window.uFrameHeight = game_viewport_height;
-  questbook_window.uFrameX = game_viewport_x;
-  questbook_window.uFrameY = game_viewport_y;
-  questbook_window.uFrameZ = game_viewport_z;
-  questbook_window.uFrameW = game_viewport_w;
-  questbook_window.DrawTitleText(pBook2Font, 0, 22, ui_book_quests_title_color, pGlobalTXT_LocalizationStrings[174], 3); //"Current Quests"
-
-  //for other text
-  questbook_window.uFrameX = 48;
-  questbook_window.uFrameY = 70;
-  questbook_window.uFrameWidth = 360;
-  questbook_window.uFrameHeight = 264;
-  questbook_window.uFrameZ = 407;
-  questbook_window.uFrameW = 333;
-  if ( BtnDown_flag && books_primary_item_per_page + num_achieved_awards < full_num_items_in_book )//Click Bookmark Down(нажатие закладки вниз)
-  {
-    pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0, 0, 0);
-    books_primary_item_per_page += num_achieved_awards;
-    books_num_items_per_page[books_page_number++] = num_achieved_awards;
-  }
-  if ( BtnUp_flag && books_page_number )//Click Bookmark Up(Нажатие закладки вверх)
-  {
-    pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0, 0, 0);
-    --books_page_number;
-    books_primary_item_per_page -= (unsigned __int8)books_num_items_per_page[books_page_number];
-  }
-  if ( !num_achieved_awards || !books_primary_item_per_page )
-  {
-    books_page_number = 0;
-    books_primary_item_per_page = 0;
-  }
-  BtnDown_flag = 0;
-  BtnUp_flag = 0;
-  num_achieved_awards = 0;
-  for ( uint i = books_primary_item_per_page; i < full_num_items_in_book; ++i )
-  {
-    ++num_achieved_awards;
-    questbook_window.DrawText(pAutonoteFont, 1, 0, ui_book_quests_text_color, pQuestTable[achieved_awards[i]], 0, 0, 0);
-    pTextHeight = pAutonoteFont->CalcTextHeight(pQuestTable[achieved_awards[i]], &questbook_window, 1, 0);
-    if ( (signed int)(questbook_window.uFrameY + pTextHeight) > (signed int)questbook_window.uFrameHeight )
-      break;
-    pRenderer->DrawTextureIndexedAlpha(100, (questbook_window.uFrameY + pTextHeight) + 12, pSpellBookPagesTextr_10);
-    questbook_window.uFrameY = (questbook_window.uFrameY + pTextHeight) + 24;
-  }
-}
-
-//----- (0041338E) --------------------------------------------------------
-void BookUI_Autonotes_Draw()
-{
-  int pTextHeight; // eax@65
-  bool change_flag; // [sp+10h] [bp-58h]@1
-  GUIWindow autonotes_window; // [sp+14h] [bp-54h]@46
-
-  change_flag = false;
-  pRenderer->DrawTextureIndexed(pViewport->uViewportTL_X, pViewport->uViewportTL_Y, pTexture_AutonotesBook);
-  if ( BtnUp_flag || !books_primary_item_per_page )
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 407, pViewport->uViewportTL_Y + 2, pTex_book_button1_off);
-  else
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 1, pTex_book_button1_on);
-
-  if ( BtnDown_flag || books_primary_item_per_page + num_achieved_awards >= full_num_items_in_book )
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 407, pViewport->uViewportTL_Y + 38, pTex_book_button2_off);
-  else
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 38, pTex_book_button2_on);
-
-  if ( Book_PageBtn3_flag )//Potions_page_flag
-  {
-    if (_506568_autonote_type == AUTONOTE_POTION_RECEPIE)//press again(повторное нажатие)
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 113, pTex_book_button3_on);
-    else//press(нажатие)
-    {
-      change_flag = true;
-      pAudioPlayer->PlaySound(SOUND_StartMainChoice02, 0, 0, -1, 0, 0, 0, 0);
-      _506568_autonote_type = AUTONOTE_POTION_RECEPIE;
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 113, pTex_book_button3_on);
-    }
-  }
-  else 
-  {
-    if (_506568_autonote_type == AUTONOTE_POTION_RECEPIE)// default(по умолчанию при запуске окна)
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 113, pTex_book_button3_on);
-    else//Potions_page not active(вкладка снадобья не активна)
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 113, pTex_book_button3_off);
-  }
-
-  if ( Book_PageBtn4_flag )//Fontains_page_flag
-  {
-    if ( _506568_autonote_type == AUTONOTE_STAT_HINT )
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 399, pViewport->uViewportTL_Y + 150, pTex_book_button4_on);
-    else
-    {
-      change_flag = true;
-      pAudioPlayer->PlaySound(SOUND_StartMainChoice02, 0, 0, -1, 0, 0, 0, 0);
-      _506568_autonote_type = AUTONOTE_STAT_HINT;
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 399, pViewport->uViewportTL_Y + 150, pTex_book_button4_on);
-    }
-  }
-  else
-  {
-    if ( _506568_autonote_type == AUTONOTE_STAT_HINT )
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 399, pViewport->uViewportTL_Y + 150, pTex_book_button4_on);
-    else
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 150, pTex_book_button4_off);
-  }
-
-  if ( Book_PageBtn5_flag )//Autonotes_Obelisks_page_flag
-  {
-    if ( _506568_autonote_type == AUTONOTE_OBELISK)
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 188, pTex_book_button5_on);
-    else
-    {
-      change_flag = true;
-      pAudioPlayer->PlaySound(SOUND_StartMainChoice02, 0, 0, -1, 0, 0, 0, 0);
-      _506568_autonote_type = AUTONOTE_OBELISK;
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 188, pTex_book_button5_on);
-    }
-  }
-  else
-  {
-    if ( _506568_autonote_type == AUTONOTE_OBELISK)
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 188, pTex_book_button5_on);
-    else
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 188, pTex_book_button5_off);
-  }
-
-  if ( Book_PageBtn6_flag )//Autonotes_Seer_page_flag
-  {
-    if ( _506568_autonote_type == AUTONOTE_SEER)
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 226, pTex_book_button6_on);
-    else
-    {
-      change_flag = true;
-      pAudioPlayer->PlaySound(SOUND_StartMainChoice02, 0, 0, -1, 0, 0, 0, 0);
-      _506568_autonote_type = AUTONOTE_SEER;
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 226, pTex_book_button6_on);
-    }
-  }
-  else
-  {
-    if ( _506568_autonote_type == AUTONOTE_SEER)
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 226, pTex_book_button6_on);
-    else
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 226, pTex_book_button6_off);
-  }
-
-  if ( Autonotes_Misc_page_flag )
-  {
-    if ( _506568_autonote_type == AUTONOTE_MISC)
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 264, pTex_book_button7_on);
-    else
-    {
-      change_flag = true;
-      pAudioPlayer->PlaySound(SOUND_StartMainChoice02, 0, 0, -1, 0, 0, 0, 0);
-      _506568_autonote_type = AUTONOTE_MISC;
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 264, pTex_book_button7_on);
-    }
-  }
-  else
-  {
-    if ( _506568_autonote_type == AUTONOTE_MISC)
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 264, pTex_book_button7_on);
-    else
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 263, pTex_book_button7_off);
-  }
-
-  if ( Autonotes_Instructors_page_flag )
-  {
-    if ( _506568_autonote_type == AUTONOTE_TEACHER)
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 302, pTex_book_button8_on);
-    else
-    {
-      change_flag = true;
-      pAudioPlayer->PlaySound(SOUND_StartMainChoice02, 0, 0, -1, 0, 0, 0, 0);
-      _506568_autonote_type = AUTONOTE_TEACHER;
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 302, pTex_book_button8_on);
-    }
-  }
-  else
-  {
-    if ( _506568_autonote_type == AUTONOTE_TEACHER)
-      pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 397, pViewport->uViewportTL_Y + 302, pTex_book_button8_on);
-    else
-     pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 408, pViewport->uViewportTL_Y + 302, pTex_book_button8_off);
-  }
-
-  //for title
-  autonotes_window.uFrameWidth = game_viewport_width;
-  autonotes_window.uFrameHeight = game_viewport_height;
-  autonotes_window.uFrameX = game_viewport_x;
-  autonotes_window.uFrameY = game_viewport_y;
-  autonotes_window.uFrameZ = game_viewport_z;
-  autonotes_window.uFrameW = game_viewport_w;
-  autonotes_window.DrawTitleText(pBook2Font, 0, 22, ui_book_autonotes_title_color, pGlobalTXT_LocalizationStrings[154], 3); // "Auto notes"
-
-  //for other text
-  autonotes_window.uFrameX = 48;
-  autonotes_window.uFrameY = 70;
-  autonotes_window.uFrameWidth = 360;
-  autonotes_window.uFrameHeight = 264;
-  autonotes_window.uFrameZ = 407;
-  autonotes_window.uFrameW = 333;
-  if ( change_flag )//change bookmark(смена закладки)
-  {
-    full_num_items_in_book = 0;
-    books_primary_item_per_page = 0;
-    books_page_number = 0;
-    num_achieved_awards = 0;
-    for ( uint i = 1; i <= 195; ++i )
-    {
-      if ( pAutonoteTxt[i].eType == _506568_autonote_type )
-      {
-        if ( (unsigned __int16)_449B57_test_bit(pParty->_autonote_bits, i) && (char *)pAutonoteTxt[i].pText )
-          achieved_awards[num_achieved_awards++] = (AwardType)i;
-      }
-    }
-    full_num_items_in_book = num_achieved_awards;
-  }
-  else//not change bookmark(не меняется закладка)
-  {
-    if ( BtnDown_flag )// press Down bookmark(нажатие закладки пролистать дальше)
-    {
-      if ( num_achieved_awards + books_primary_item_per_page < full_num_items_in_book )
-      {
-        books_num_items_per_page[books_page_number++] = num_achieved_awards;
-        books_primary_item_per_page = num_achieved_awards + books_primary_item_per_page;
-        pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0, 0, 0);
-      }
-    }
-    if ( BtnUp_flag && books_page_number )// press Up bookmark(нажатие закладки пролистать назад)
-    {
-      --books_page_number;
-      books_primary_item_per_page -= (unsigned __int8)books_num_items_per_page[books_page_number];
-      pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0, 0, 0);
-    }
-    if ( !num_achieved_awards || !books_primary_item_per_page )//количество записей 0 или номер первой страницы 0
-    {
-      books_primary_item_per_page = 0;
-      books_page_number = 0;
-    }
-  }
-  BtnUp_flag = 0;
-  BtnDown_flag = 0;
-  Book_PageBtn3_flag = 0;//Potions_page_flag
-  Book_PageBtn4_flag = 0;//Fontains_page_flag
-  Book_PageBtn5_flag = 0;//Autonotes_Obelisks_page_flag
-  Book_PageBtn6_flag = 0;//Autonotes_Seer_page_flag
-  Autonotes_Misc_page_flag = 0;
-  Autonotes_Instructors_page_flag = 0;
-  num_achieved_awards = 0;
-  for ( uint i = books_primary_item_per_page; i < full_num_items_in_book; ++i )
-  {
-    ++num_achieved_awards;
-    autonotes_window.DrawText(pAutonoteFont, 1, 0, ui_book_autonotes_text_color, pAutonoteTxt[achieved_awards[i]].pText, 0, 0, 0);
-    pTextHeight = pAutonoteFont->CalcTextHeight(pAutonoteTxt[achieved_awards[i]].pText, &autonotes_window, 1, 0);
-    if ( (signed int)(autonotes_window.uFrameY + pTextHeight) > (signed int)autonotes_window.uFrameHeight )
-      break;
-    pRenderer->DrawTextureIndexedAlpha(100, (autonotes_window.uFrameY + pTextHeight) + 12, pSpellBookPagesTextr_10);
-    autonotes_window.uFrameY = (autonotes_window.uFrameY + pTextHeight) + 24;
-  }
-}
-
-    //----- (00412E85) --------------------------------------------------------
-void BookUI_Journal_Draw()
-{
-  char *pDialogueString; // eax@21
-  char* pStringOnPage; // eax@22
-  GUIWindow journal_window; // [sp+8h] [bp-54h]@10
-
-  pRenderer->DrawTextureIndexed(pViewport->uViewportTL_X, pViewport->uViewportTL_Y, pSpellBookPagesTextr_11);
-  if ( BtnUp_flag || !books_primary_item_per_page )
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 407, pViewport->uViewportTL_Y + 2, pTex_book_button1_off);
-  else
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 1, pTex_book_button1_on);
-
-  if ( BtnDown_flag || books_primary_item_per_page + num_achieved_awards >= full_num_items_in_book )
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 407, pViewport->uViewportTL_Y + 38, pTex_book_button2_off);
-  else
-    pRenderer->DrawTextureIndexedAlpha(pViewport->uViewportTL_X + 398, pViewport->uViewportTL_Y + 38, pTex_book_button2_on);
-
-  if ( !Journal_limitation_factor[books_primary_item_per_page] )//for title
-  {
-    journal_window.uFrameWidth = game_viewport_width;
-    journal_window.uFrameX = game_viewport_x;
-    journal_window.uFrameY = game_viewport_y;
-    journal_window.uFrameHeight = game_viewport_height;
-    journal_window.uFrameZ = game_viewport_z;
-    journal_window.uFrameW = game_viewport_w;
-    if ( pStorylineText->StoreLine[achieved_awards[books_primary_item_per_page]].pPageTitle )
-      journal_window.DrawTitleText(pBook2Font, 0, 22, ui_book_journal_title_color, pStorylineText->StoreLine[achieved_awards[books_primary_item_per_page]].pPageTitle, 3);
-  }
-
-  //for other text
-  journal_window.uFrameX = 48;
-  journal_window.uFrameY = 70;
-  journal_window.uFrameWidth = 360;
-  journal_window.uFrameHeight = 264;
-  journal_window.uFrameZ = 407;
-  journal_window.uFrameW = journal_window.uFrameHeight + 69;
-  if ( BtnDown_flag && books_primary_item_per_page + num_achieved_awards < full_num_items_in_book )//Press bookmark next page
-  {
-    pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0, 0, 0);
-    books_primary_item_per_page += num_achieved_awards;
-    books_num_items_per_page[books_page_number++] = num_achieved_awards;
-  }
-  if ( BtnUp_flag && books_page_number )//Press bookmark previous page
-  {
-    pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0, 0, 0);
-    --books_page_number;
-    books_primary_item_per_page -= (unsigned __int8)books_num_items_per_page[books_page_number];
-  }
-  if ( !num_achieved_awards || books_primary_item_per_page < 1 )
-  {
-    books_primary_item_per_page = 0;
-    books_page_number = 0;
-  }
-  BtnDown_flag = 0;
-  BtnUp_flag = 0;
-  num_achieved_awards = 0;
-  if ( achieved_awards[books_primary_item_per_page] )
-  {
-    int index = ((int)achieved_awards[books_primary_item_per_page] - 1);
-    pDialogueString = BuildDialogueString(pStorylineText->StoreLine[ achieved_awards[books_primary_item_per_page]].pText, uActiveCharacter - 1,
-                                          0, 0, 0, &pParty->PartyTimes.HistoryEventTimes[index]);
-    pStringOnPage = pAutonoteFont->GetPageTop(pDialogueString, &journal_window, 1, (unsigned __int8)Journal_limitation_factor[books_primary_item_per_page]);
-    journal_window.DrawText(pAutonoteFont, 1, 0, ui_book_journal_text_color, pStringOnPage, 0,
-                            journal_window.uFrameY + journal_window.uFrameHeight, ui_book_journal_text_shadow);
-    ++num_achieved_awards;
-  }
-}
--- a/GUI/UI/Books/UISpellBook.cpp	Tue May 12 01:45:31 2015 +0200
+++ b/GUI/UI/Books/UISpellBook.cpp	Tue May 12 03:24:19 2015 +0200
@@ -39,23 +39,6 @@
   }
 }
 
-//----- (00411597) --------------------------------------------------------
-void OnCloseBook()
-{
-  free(pSpellFont);
-  pSpellFont = nullptr;
-  free(pBookFont);
-  pBookFont = nullptr;
-  free(pBook2Font);
-  pBook2Font = nullptr;
-  free(pAutonoteFont);
-  pAutonoteFont = nullptr;
-  pTexture_mapbordr->Release();
-  pAudioPlayer->PlaySound(SOUND_closebook, 0, 0, -1, 0, 0, 0, 0);
-  pIcons_LOD->RemoveTexturesPackFromTextureList();
-  dword_506364 = 0;
-}
-
 //----- (00412AF9) --------------------------------------------------------
 static void BookUI_Spellbook_DrawCurrentSchoolBackground()
 {
--- a/GUI/UI/UIBooks.cpp	Tue May 12 01:45:31 2015 +0200
+++ b/GUI/UI/UIBooks.cpp	Tue May 12 03:24:19 2015 +0200
@@ -1,37 +1,78 @@
 #define _CRTDBG_MAP_ALLOC
+#define _CRT_SECURE_NO_WARNINGS
 #include <stdlib.h>
 #include <crtdbg.h>
 
-#define _CRT_SECURE_NO_WARNINGS
+#include "Engine/Engine.h"
+#include "Engine/Graphics/Render.h"
+#include "Engine/LOD.h"
+#include "Engine/texts.h"
+#include "Engine/Awards.h"
 
-#include "Engine/Engine.h"
+#include "GUI/GUIFont.h"
+#include "GUI/UI/UIBooks.h"
+
+#include "Media/Audio/AudioPlayer.h"
+
+
 
-#include "UIBooks.h"
-#include "..\../Engine/Graphics/Render.h"
-#include "..\../GUI/GUIWindow.h"
-#include "..\../GUI/GUIFont.h"
-#include "..\../Media/Audio/AudioPlayer.h"
-#include "..\../Engine/LOD.h"
+//----- (00411597) --------------------------------------------------------
+void GUIWindow_Book::Release()
+{
+    free(pSpellFont);
+    pSpellFont = nullptr;
+    free(pBookFont);
+    pBookFont = nullptr;
+    free(pBook2Font);
+    pBook2Font = nullptr;
+    free(pAutonoteFont);
+    pAutonoteFont = nullptr;
+    pTexture_mapbordr->Release();
+    pAudioPlayer->PlaySound(SOUND_closebook, 0, 0, -1, 0, 0, 0, 0);
+    pIcons_LOD->RemoveTexturesPackFromTextureList();
+    dword_506364 = 0;
+
+    GUIWindow::Release();
+}
+
 
-//----- (00413CC6) --------------------------------------------------------
-void BookUI_Draw(WindowType book)
+GUIWindow_Book::GUIWindow_Book() :
+    GUIWindow(0, 0, window->GetWidth(), window->GetHeight(), 0, nullptr)
+{
+}
+
+void GUIWindow_Book::BasicBookInitialization()
 {
-  pRenderer->DrawTextureIndexed(471, 445, pIcons_LOD->GetTexture(uExitCancelTextureId));
-  switch (book)
-  {
-    case WINDOW_QuestBook:     BookUI_Questbook_Draw();  break;
-    case WINDOW_AutonotesBook: BookUI_Autonotes_Draw();  break;
-    case WINDOW_MapsBook:      BookUI_Map_Draw();        break;
-    case WINDOW_CalendarBook:  BookUI_Calendar_Draw();   break;
-    case WINDOW_JournalBook:   BookUI_Journal_Draw();    break;
+// ----- (00411BFC) --------------------------------------------------------
+// void GUIWindow::InitializeBookView() --- part
+// {
+    pAudioPlayer->StopChannels(-1, -1);
+    InitializeFonts();
+    CreateButton(475, 445, 158, 34, 1, 0, UIMSG_Escape, 0, 0, pGlobalTXT_LocalizationStrings[79], 0); // Close
+    current_screen_type = SCREEN_BOOKS;
+    full_num_items_in_book = 0;
+    books_primary_item_per_page = 0;
+    books_page_number = 0;
+    num_achieved_awards = 0;
+}
 
-    case WINDOW_LloydsBeacon:  DrawLloydBeaconsScreen(); break;
-    case WINDOW_TownPortal:    BookUI_DrawTownPortalMap();   break;
-  }
+//----- (00411AAA) --------------------------------------------------------
+void GUIWindow_Book::InitializeFonts()
+{
+    pAudioPlayer->StopChannels(-1, -1);
+    ++pIcons_LOD->uTexturePacksCount;
+    if (!pIcons_LOD->uNumPrevLoadedFiles)
+        pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles;
+    pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0, 0, 0);
+    pTexture_mapbordr = pIcons_LOD->LoadTexturePtr("mapbordr", TEXTURE_16BIT_PALETTE);
+    pBookFont = LoadFont("book.fnt", "FONTPAL", NULL);
+    pBook2Font = LoadFont("book2.fnt", "FONTPAL", NULL);
+    pAutonoteFont = LoadFont("autonote.fnt", "FONTPAL", NULL);
+    pSpellFont = LoadFont("spell.fnt", "FONTPAL", NULL);
 }
 
 //----- (0041192C) --------------------------------------------------------
-void InitializeBookTextures()
+void InitializeSpellBookTextures()
 {
   pAudioPlayer->StopChannels(-1, -1);
   ++pIcons_LOD->uTexturePacksCount;
@@ -61,21 +102,6 @@
   }
 }
 
-//----- (00411AAA) --------------------------------------------------------
-void InitializeBookFonts()
-{
-  pAudioPlayer->StopChannels(-1, -1);
-  ++pIcons_LOD->uTexturePacksCount;
-  if ( !pIcons_LOD->uNumPrevLoadedFiles )
-    pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles;
-  pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0, 0, 0);
-  pTexture_mapbordr = pIcons_LOD->LoadTexturePtr("mapbordr", TEXTURE_16BIT_PALETTE);
-  pBookFont = LoadFont("book.fnt", "FONTPAL", NULL);
-  pBook2Font = LoadFont("book2.fnt", "FONTPAL", NULL);
-  pAutonoteFont = LoadFont("autonote.fnt", "FONTPAL", NULL);
-  pSpellFont = LoadFont("spell.fnt", "FONTPAL", NULL);
-}
-
 //----- (0041140B) --------------------------------------------------------
 void OnCloseSpellBookPage()
 {
--- a/GUI/UI/UIBooks.h	Tue May 12 01:45:31 2015 +0200
+++ b/GUI/UI/UIBooks.h	Tue May 12 03:24:19 2015 +0200
@@ -1,12 +1,19 @@
 #pragma once
+#include "GUI/GUIWindow.h"
 
+extern std::array<std::array<unsigned char, 12>, 9> pSpellbookSpellIndices; // 4E2430   from pSpellbookSpellIndices[9][12]
 
 
-extern std::array<__int16, 6> pTownPortalBook_xs;
-extern std::array<__int16, 6> pTownPortalBook_ys;
+struct GUIWindow_Book : public GUIWindow
+{
+             GUIWindow_Book();
+    virtual ~GUIWindow_Book() {}
+
+    virtual void Release();
 
-extern std::array<std::array<unsigned char, 12>, 9> pSpellbookSpellIndices; // 4E2430   from pSpellbookSpellIndices[9][12]
-extern std::array<unsigned int, 5> pLloydsBeaconsPreviewXs; // 004E249C
-extern std::array<unsigned int, 5> pLloydsBeaconsPreviewYs;
-extern std::array<unsigned int, 5> pLloydsBeacons_SomeXs;
-extern std::array<unsigned int, 5> pLloydsBeacons_SomeYs; // idb
\ No newline at end of file
+    protected:
+        void BasicBookInitialization();
+
+    private:
+        void InitializeFonts();
+};
\ No newline at end of file
--- a/GUI/UI/UIMainMenu.cpp	Tue May 12 01:45:31 2015 +0200
+++ b/GUI/UI/UIMainMenu.cpp	Tue May 12 03:24:19 2015 +0200
@@ -127,29 +127,39 @@
   pPrimaryWindow->CreateButton(443, 404, 5, 49, 1, 93, UIMSG_0, 4, 0, "", 0);
 
   uTextureID_ib_td1_A = pIcons_LOD->LoadTexture("ib-td1-A", TEXTURE_16BIT_PALETTE);
-  pBtn_Quests = pPrimaryWindow->CreateButton(491, 353, pIcons_LOD->GetTexture(uTextureID_ib_td1_A)->uTextureWidth,
+  pBtn_Quests = pPrimaryWindow->CreateButton(
+      491, 353, pIcons_LOD->GetTexture(uTextureID_ib_td1_A)->uTextureWidth,
       pIcons_LOD->GetTexture(uTextureID_ib_td1_A)->uTextureHeight, 1, 0, UIMSG_OpenQuestBook, 0, pKeyActionMap->GetActionVKey(INPUT_Quest),
-      pGlobalTXT_LocalizationStrings[174], pIcons_LOD->GetTexture(uTextureID_ib_td1_A), 0); //Quests
+      pGlobalTXT_LocalizationStrings[174], pIcons_LOD->GetTexture(uTextureID_ib_td1_A), 0
+  ); //Quests
 
   uTextureID_ib_td2_A = pIcons_LOD->LoadTexture("ib-td2-A", TEXTURE_16BIT_PALETTE);
-  pBtn_Autonotes = pPrimaryWindow->CreateButton(527, 353, pIcons_LOD->GetTexture(uTextureID_ib_td2_A)->uTextureWidth,
+  pBtn_Autonotes = pPrimaryWindow->CreateButton(527, 353, pIcons_LOD->GetTexture(
+      uTextureID_ib_td2_A)->uTextureWidth,
      pIcons_LOD->GetTexture(uTextureID_ib_td2_A)->uTextureHeight, 1, 0, UIMSG_OpenAutonotes, 0, pKeyActionMap->GetActionVKey(INPUT_Autonotes),
-     pGlobalTXT_LocalizationStrings[154], pIcons_LOD->GetTexture(uTextureID_ib_td2_A), 0);//Autonotes
+     pGlobalTXT_LocalizationStrings[154], pIcons_LOD->GetTexture(uTextureID_ib_td2_A), 0
+  );//Autonotes
 
   uTextureID_ib_td3_A = pIcons_LOD->LoadTexture("ib-td3-A", TEXTURE_16BIT_PALETTE);
-  pBtn_Maps = pPrimaryWindow->CreateButton(546, 353, pIcons_LOD->GetTexture(uTextureID_ib_td3_A)->uTextureWidth,
+  pBtn_Maps = pPrimaryWindow->CreateButton(
+      546, 353, pIcons_LOD->GetTexture(uTextureID_ib_td3_A)->uTextureWidth,
      pIcons_LOD->GetTexture(uTextureID_ib_td3_A)->uTextureHeight, 1, 0, UIMSG_OpenMapBook, 0, pKeyActionMap->GetActionVKey(INPUT_Mapbook),
-     pGlobalTXT_LocalizationStrings[139], pIcons_LOD->GetTexture(uTextureID_ib_td3_A), 0); //Maps
+     pGlobalTXT_LocalizationStrings[139], pIcons_LOD->GetTexture(uTextureID_ib_td3_A), 0
+  ); //Maps
 
   uTextureID_ib_td4_A = pIcons_LOD->LoadTexture("ib-td4-A", TEXTURE_16BIT_PALETTE);
-  pBtn_Calendar = pPrimaryWindow->CreateButton(570, 353, pIcons_LOD->GetTexture(uTextureID_ib_td4_A)->uTextureWidth,
+  pBtn_Calendar = pPrimaryWindow->CreateButton(
+      570, 353, pIcons_LOD->GetTexture(uTextureID_ib_td4_A)->uTextureWidth,
      pIcons_LOD->GetTexture(uTextureID_ib_td4_A)->uTextureHeight, 1, 0, UIMSG_OpenCalendar, 0, pKeyActionMap->GetActionVKey(INPUT_TimeCal),
-     pGlobalTXT_LocalizationStrings[78], pIcons_LOD->GetTexture(uTextureID_ib_td4_A), 0);//Calendar
+     pGlobalTXT_LocalizationStrings[78], pIcons_LOD->GetTexture(uTextureID_ib_td4_A), 0
+  );//Calendar
 
   uTextureID_ib_td5_A = pIcons_LOD->LoadTexture("ib-td5-A", TEXTURE_16BIT_PALETTE);
-  pBtn_History = pPrimaryWindow->CreateButton(600, 361, pIcons_LOD->GetTexture(uTextureID_ib_td5_A)->uTextureWidth,
+  pBtn_History = pPrimaryWindow->CreateButton(
+      600, 361, pIcons_LOD->GetTexture(uTextureID_ib_td5_A)->uTextureWidth,
       pIcons_LOD->GetTexture(uTextureID_ib_td5_A)->uTextureHeight, 1, 0, UIMSG_OpenHistoryBook, 0, 72,//ascii
-      pGlobalTXT_LocalizationStrings[602], pIcons_LOD->GetTexture(uTextureID_ib_td5_A), 0);//History
+      pGlobalTXT_LocalizationStrings[602], pIcons_LOD->GetTexture(uTextureID_ib_td5_A), 0
+  );//History
 
   bFlashAutonotesBook = 0;
   bFlashQuestBook = 0;
--- a/GUI/UI/UIPopup.cpp	Tue May 12 01:45:31 2015 +0200
+++ b/GUI/UI/UIPopup.cpp	Tue May 12 03:24:19 2015 +0200
@@ -1,34 +1,33 @@
 #define _CRTDBG_MAP_ALLOC
+#define _CRT_SECURE_NO_WARNINGS
 #include <stdlib.h>
 #include <crtdbg.h>
 
-#define _CRT_SECURE_NO_WARNINGS
+#include "Engine/Engine.h"
+#include "Engine/Graphics/Sprites.h"
+#include "Engine/Graphics/Vis.h"
+#include "Engine/Party.h"
+#include "Engine/LOD.h"
+#include "Engine/Objects/Actor.h"
+#include "Engine/Graphics/Viewport.h"
+#include "Engine/Objects/SpriteObject.h"
+#include "Engine/Objects/ObjectList.h"
+#include "Engine/Objects/Chest.h"
+#include "Engine/Graphics/PaletteManager.h"
+#include "Engine/Timer.h"
+#include "Engine/texts.h"
+#include "Engine/Events.h"
 
-#include "Engine/Engine.h"
+#include "IO/Mouse.h"
+
+#include "GUI/UI/Books/MapBook.h"
+#include "GUI/GUIFont.h"
+
+#include "Media/Audio/AudioPlayer.h"
 
 #include "UIPopup.h"
-#include "Books\UIMapBook.h"
 #include "UIShops.h"
 
-#include "..\../IO/Mouse.h"
-
-#include "..\../Engine/Graphics/Sprites.h"
-#include "..\../Engine/Graphics/Vis.h"
-#include "..\../GUI/GUIWindow.h"
-#include "..\../GUI/GUIFont.h"
-#include "..\../Engine/Party.h"
-#include "..\../Media/Audio/AudioPlayer.h"
-#include "..\../Engine/LOD.h"
-#include "..\../Engine/Objects/Actor.h"
-#include "..\../Engine/Graphics/Viewport.h"
-#include "..\../Engine/Objects/SpriteObject.h"
-#include "..\../Engine/Objects/ObjectList.h"
-#include "..\../Engine/Objects/Chest.h"
-#include "..\../Engine/Graphics/PaletteManager.h"
-#include "..\../Engine/Timer.h"
-#include "..\../Engine/texts.h"
-#include "..\../Engine/Events.h"
-
 static char static_sub_417BB5_out_string[1200]; // static to a file, not sub actually
 
 
--- a/Game/Game.cpp	Tue May 12 01:45:31 2015 +0200
+++ b/Game/Game.cpp	Tue May 12 03:24:19 2015 +0200
@@ -41,6 +41,14 @@
 #include "GUI/UI/UIQuickReference.h"
 #include "GUI/UI/UISaveLoad.h"
 #include "GUI/UI/UIModal.h"
+#include "GUI/UI/UIBooks.h"
+#include "GUI/UI/Books/LloydsBook.h"
+#include "GUI/UI/Books/TownPortalBook.h"
+#include "GUI/UI/Books/QuestBook.h"
+#include "GUI/UI/Books/AutonotesBook.h"
+#include "GUI/UI/Books/MapBook.h"
+#include "GUI/UI/Books/CalendarBook.h"
+#include "GUI/UI/Books/JournalBook.h"
 
 #include "Game/Game.h"
 
@@ -690,51 +698,31 @@
                 DoThatMessageThing();
                 if (current_screen_type != SCREEN_GAME)
                     pGUIWindow_CurrentMenu->Release();
-                pEventTimer->Pause();
-                pAudioPlayer->StopChannels(-1, -1);
-                pGUIWindow_CurrentMenu = new GUIWindow_Book(0, 0, window->GetWidth(), window->GetHeight(), uMessage, 0);
-                pBooksWindow = new GUIWindow_BooksWindow(493u, 355u, 0, 0, (int)pBtn_Quests, 0);
-                bFlashQuestBook = 0;
+                pGUIWindow_CurrentMenu = new GUIWindow_QuestBook();
                 continue;
             case UIMSG_OpenAutonotes:
                 DoThatMessageThing();
                 if (current_screen_type != SCREEN_GAME)
                     pGUIWindow_CurrentMenu->Release();
-                pEventTimer->Pause();
-                pAudioPlayer->StopChannels(-1, -1);
-                pGUIWindow_CurrentMenu = new GUIWindow_Book(0, 0, window->GetWidth(), window->GetHeight(), uMessage, 0);
-                pBooksWindow = new GUIWindow_BooksWindow(527u, 353u, 0, 0, (int)pBtn_Autonotes, 0);
-                bFlashAutonotesBook = 0;
+                pGUIWindow_CurrentMenu = new GUIWindow_AutonotesBook();
                 continue;
             case UIMSG_OpenMapBook:
                 DoThatMessageThing();
                 if (current_screen_type != SCREEN_GAME)
                     pGUIWindow_CurrentMenu->Release();
-                pEventTimer->Pause();
-                viewparams->sViewCenterX = pParty->vPosition.x;
-                viewparams->sViewCenterY = pParty->vPosition.y;
-                pAudioPlayer->StopChannels(-1, -1);
-                pGUIWindow_CurrentMenu = new GUIWindow_Book(0, 0, window->GetWidth(), window->GetHeight(), uMessage, 0);
-                pBooksWindow = new GUIWindow_BooksWindow(546, 353, 0, 0, (int)pBtn_Maps, 0);
+                pGUIWindow_CurrentMenu = new GUIWindow_MapBook();
                 continue;
             case UIMSG_OpenCalendar:
                 DoThatMessageThing();
                 if (current_screen_type != SCREEN_GAME)
                     pGUIWindow_CurrentMenu->Release();
-                pEventTimer->Pause();
-                pAudioPlayer->StopChannels(-1, -1);
-                pGUIWindow_CurrentMenu = new GUIWindow_Book(0, 0, window->GetWidth(), window->GetHeight(), uMessage, 0);
-                pBooksWindow = new GUIWindow_BooksWindow(570, 354, 0, 0, (int)pBtn_Calendar, 0);
+                pGUIWindow_CurrentMenu = new GUIWindow_CalendarBook();
                 continue;
             case UIMSG_OpenHistoryBook:
                 DoThatMessageThing();
                 if (current_screen_type != SCREEN_GAME)
                     pGUIWindow_CurrentMenu->Release();
-                pEventTimer->Pause();
-                pAudioPlayer->StopChannels(-1, -1);
-                pGUIWindow_CurrentMenu = new GUIWindow_Book(0, 0, window->GetWidth(), window->GetHeight(), uMessage, 0);
-                pBooksWindow = new GUIWindow_BooksWindow(0x258u, 0x169u, 0, 0, (int)pBtn_History, 0);
-                bFlashHistoryBook = 0;
+                pGUIWindow_CurrentMenu = new GUIWindow_JournalBook();
                 continue;
             case UIMSG_Escape:// нажатие Escape and return to game
                 back_to_game();
@@ -853,9 +841,9 @@
                                     pIcons_LOD->RemoveTexturesFromTextureList();
                                     continue;
                                 case SCREEN_BOOKS:
-                                    pBooksWindow->Release();
+                                    pBooksButtonOverlay->Release();
                                     //crt_deconstruct_ptr_6A0118();
-                                    pBooksWindow = 0;
+                                    pBooksButtonOverlay = 0;
                                     pEventTimer->Resume();
                                     if (pGUIWindow_Settings)
                                     {
@@ -1651,25 +1639,17 @@
                     dword_5B65C0 = v55 | _5B65AC_npcdata_fame_or_other | v56 | v57;
                 }
                 HouseDialogPressCloseBtn();
-                //goto LABEL_434;
-                /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 )
-                {
-                pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape;
-                pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v0;
-                *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0;
-                ++pMessageQueue_50CBD0->uNumMessages;
-                }*/
                 pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
                 continue;
 
             case UIMSG_OnCastTownPortal:
                 pAudioPlayer->StopChannels(-1, -1);
-                pGUIWindow_CurrentMenu = new GUIWindow_Book(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_TownPortal, (char *)uMessageParam);
+                pGUIWindow_CurrentMenu = new GUIWindow_TownPortalBook((char *)uMessageParam);
                 continue;
 
             case UIMSG_OnCastLloydsBeacon:
                 pAudioPlayer->StopChannels(-1, -1);
-                pGUIWindow_CurrentMenu = new GUIWindow_Book(0, 0, window->GetWidth(), window->GetHeight(), WINDOW_LloydsBeacon, 0);
+                pGUIWindow_CurrentMenu = new GUIWindow_LloydsBook();
                 continue;
 
             case UIMSG_LloydsBeacon_FlippingBtn:
@@ -1708,12 +1688,6 @@
             case UIMSG_CloseAfterInstallBeacon:
                 dword_50CDC8 = 1;
                 pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 0, 0);
-                /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 )
-                continue;
-                pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape;
-                pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0;
-                *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0;
-                ++pMessageQueue_50CBD0->uNumMessages;*/
                 continue;
             case UIMSG_InstallBeacon:
                 pPlayer9 = pPlayers[_506348_current_lloyd_playerid + 1];
@@ -1759,9 +1733,9 @@
                         pParty->sRotationX = pPlayer9->pInstalledBeacons[uMessageParam].PartyRot_Y;
                     }
                     pMessageQueue_50CBD0->AddGUIMessage(UIMSG_Escape, 1, 0);
-                    pBooksWindow->Release();
+                    pBooksButtonOverlay->Release();
                     pGUIWindow_CurrentMenu->Release();
-                    pBooksWindow = 0;
+                    pBooksButtonOverlay = 0;
                     pGUIWindow_CurrentMenu = 0;
                 }
                 else
--- a/IO/Keyboard.cpp	Tue May 12 01:45:31 2015 +0200
+++ b/IO/Keyboard.cpp	Tue May 12 03:24:19 2015 +0200
@@ -1,23 +1,22 @@
 #define _CRTDBG_MAP_ALLOC
+#define _CRT_SECURE_NO_WARNINGS
 #include <stdlib.h>
 #include <crtdbg.h>
 
-#define _CRT_SECURE_NO_WARNINGS
-
 #include "Engine/Engine.h"
-
-#include "Keyboard.h"
-#include "GUI/GUIWindow.h"
-
-#include "Engine/Graphics/Vis.h"
-#include "Engine/Objects/Actor.h"
 #include "Engine/Party.h"
 #include "Engine/Timer.h"
+#include "Engine/Registry.h"
 #include "Engine/TurnEngine/TurnEngine.h"
+#include "Engine/Graphics/Vis.h"
 #include "Engine/Graphics/Weather.h"
+#include "Engine/Graphics/Indoor.h"
 #include "Engine/Spells/CastSpellInfo.h"
-#include "Engine/Graphics/Indoor.h"
-#include "Engine/Registry.h"
+#include "Engine/Objects/Actor.h"
+
+#include "IO/Keyboard.h"
+
+#include "GUI/GUIWindow.h"
 
 #include <tuple>
 #include <vector>
--- a/IO/Mouse.cpp	Tue May 12 01:45:31 2015 +0200
+++ b/IO/Mouse.cpp	Tue May 12 03:24:19 2015 +0200
@@ -1,24 +1,24 @@
 #define _CRTDBG_MAP_ALLOC
+#define _CRT_SECURE_NO_WARNINGS
 #include <stdlib.h>
 #include <crtdbg.h>
 
-#define _CRT_SECURE_NO_WARNINGS
-
 #include "Engine/Engine.h"
-
-#include "Mouse.h"
 #include "Engine/Party.h"
 #include "Engine/LOD.h"
-
 #include "Engine/TurnEngine/TurnEngine.h"
 #include "Engine/Graphics/Viewport.h"
-#include "GUI/GUIWindow.h"
 #include "Engine/Graphics/Vis.h"
 #include "Engine/Objects/Actor.h"
+
+#include "IO/Mouse.h"
+
+#include "GUI/GUIWindow.h"
+
 #include "Media/Audio/AudioPlayer.h"
 
 
-Mouse *pMouse;
+Mouse *pMouse = nullptr;