World of Might and Magic  0.2.0
Open reimplementation of Might and Magic 6 7 8 game engine
Spellbook.cpp
См. документацию.
1 #include "GUI/UI/Spellbook.h"
2 
3 #include "Engine/AssetsManager.h"
4 #include "Engine/Engine.h"
5 #include "Engine/LOD.h"
6 #include "Engine/Localization.h"
7 #include "Engine/Party.h"
8 #include "Engine/Time.h"
9 
12 
13 #include "IO/Mouse.h"
14 
15 #include "GUI/GUIButton.h"
16 #include "GUI/GUIFont.h"
17 
19 
22 void OnCloseSpellBook();
23 void LoadSpellbook(unsigned int spell_school);
25 
26 std::array<char *, 9> spellbook_texture_filename_suffices = {
27  {"f", "a", "w", "e", "s", "m", "b", "l", "d"}};
28 
29 std::array<std::array<unsigned char, 12>, 9>
30  pSpellbookSpellIndices = // 4E2430 from pSpellbookSpellIndices[9][12]
31  {{ // 0 1 2 3 4 5 6 7 8 9 10 11
32  {0, 3, 1, 8, 11, 7, 4, 10, 6, 2, 5, 9},
33  {0, 11, 2, 9, 6, 8, 5, 10, 3, 7, 1, 4},
34  {0, 4, 8, 9, 1, 10, 3, 11, 7, 6, 2, 5},
35  {0, 7, 10, 8, 2, 11, 1, 5, 3, 6, 4, 9},
36  {0, 5, 10, 11, 7, 2, 8, 1, 4, 9, 3, 6},
37  {0, 5, 9, 8, 3, 7, 6, 4, 1, 11, 2, 10},
38  {0, 1, 6, 9, 3, 5, 8, 11, 7, 10, 4, 2},
39  {0, 1, 10, 11, 9, 4, 3, 6, 5, 7, 8, 2},
40  {0, 9, 3, 7, 1, 5, 2, 10, 11, 8, 6, 4}}};
41 
46 
47 std::array<Image *, 12> SBPageCSpellsTextureList;
48 std::array<Image *, 12> SBPageSSpellsTextureList;
49 
50 std::array<Image *, 9> ui_spellbook_school_backgrounds;
51 std::array<std::array<Image *, 2>, 9> ui_spellbook_school_tabs;
52 
54  : GUIWindow(WINDOW_SpellBook, 0, 0, window->GetWidth(), window->GetHeight(), 0) {
56  pEventTimer->Pause();
57 
59  OpenSpellbook();
60 
61  pAudioPlayer->PlaySound(SOUND_48, 0, 0, -1, 0, 0);
62  viewparams->field_48 = 1;
63 }
64 
67  pPlayers[uActiveCharacter]->lastOpenedSpellbookPage = page;
68  OpenSpellbook();
69  pAudioPlayer->PlaySound((SoundID)(SOUND_TurnPageU + rand() % 2), 0, 0, -1, 0, 0);
70 }
71 
73  Player *pPlayer; // edi@1
74  // GUIWindow *pWindow; // esi@1
75  // unsigned int v3; // ebp@1
76  int v4; // eax@3
78  int a2; // [sp+10h] [bp-8h]@1
79  // int v7; // [sp+14h] [bp-4h]@1
80 
81  pPlayer = pPlayers[uActiveCharacter];
82  // pWindow = this;
84  // v3 = 0;
85  a2 = 0;
86 
87  PlayerSpellbookChapter *chapter =
88  &pPlayer->spellbook.pChapters[pPlayer->lastOpenedSpellbookPage];
89  for (uint i = 0; i < 11; ++i) {
90  if (!chapter->bIsSpellAvailable[i] && !engine->config->debug_all_magic)
91  continue;
92 
93  v4 = pPlayer->lastOpenedSpellbookPage;
94  // v4 = (12 * pPlayer->lastOpenedSpellbookPage +
95  // pSpellbookSpellIndices[pPlayer->lastOpenedSpellbookPage][i + 1]);
97  pIconPos[v4][pSpellbookSpellIndices[v4][i + 1]].Xpos,
99  pIconPos[v4][pSpellbookSpellIndices[v4][i + 1]]
100  .Ypos, // dword_4E20D0
101  SBPageSSpellsTextureList[i + 1]->GetWidth(),
102  SBPageSSpellsTextureList[i + 1]->GetHeight(), 1, 79,
103  UIMSG_SelectSpell, i, 0, "");
104  ++a2;
105  // ++v3;
106  }
107  // while ( (signed int)v3 < 11 );
108 
109  CreateButton(0, 0, 0, 0, 1, 0, UIMSG_SpellBook_PressTab, 0, '\t', "");
110  if (a2) _41D08F_set_keyboard_control_group(a2, 0, 0, 0);
111 
112  if (pPlayer->pActiveSkills[PLAYER_SKILL_FIRE] || engine->config->debug_all_magic)
113  CreateButton(399, 10, 50, 36, 1, 0, UIMSG_OpenSpellbookPage, 0, 0,
115  if (pPlayer->pActiveSkills[PLAYER_SKILL_AIR] || engine->config->debug_all_magic)
116  CreateButton(399, 46, 50, 36, 1, 0, UIMSG_OpenSpellbookPage, 1, 0,
118  if (pPlayer->pActiveSkills[PLAYER_SKILL_WATER] || engine->config->debug_all_magic)
119  CreateButton(399, 83, 50, 36, 1, 0, UIMSG_OpenSpellbookPage, 2, 0,
121  if (pPlayer->pActiveSkills[PLAYER_SKILL_EARTH] || engine->config->debug_all_magic)
122  CreateButton(399, 121, 50, 36, 1, 0, UIMSG_OpenSpellbookPage, 3, 0,
124  if (pPlayer->pActiveSkills[PLAYER_SKILL_SPIRIT] || engine->config->debug_all_magic)
125  CreateButton(399, 158, 50, 36, 1, 0, UIMSG_OpenSpellbookPage, 4, 0,
127  if (pPlayer->pActiveSkills[PLAYER_SKILL_MIND] || engine->config->debug_all_magic)
128  CreateButton(400, 196, 50, 36, 1, 0, UIMSG_OpenSpellbookPage, 5, 0,
130  if (pPlayer->pActiveSkills[PLAYER_SKILL_BODY] || engine->config->debug_all_magic)
131  CreateButton(400, 234, 50, 36, 1, 0, UIMSG_OpenSpellbookPage, 6, 0,
133  if (pPlayer->pActiveSkills[PLAYER_SKILL_LIGHT] || engine->config->debug_all_magic)
134  CreateButton(400, 271, 50, 36, 1, 0, UIMSG_OpenSpellbookPage, 7, 0,
136  if (pPlayer->pActiveSkills[PLAYER_SKILL_DARK] || engine->config->debug_all_magic)
137  CreateButton(400, 307, 50, 36, 1, 0, UIMSG_OpenSpellbookPage, 8, 0,
139 
144  476, 450, 48, 32, 1, 78, UIMSG_ClickInstallRemoveQuickSpellBtn, 0, 0,
148  localization->GetString(79));
149  pBtn_CloseBook = CreateButton(561, 450, 48, 32, 1, 0, UIMSG_Escape, 0, 0,
150  localization->GetString(79),
151  {{ui_spellbook_btn_close_click}});
152 }
153 
155  auto player = pPlayers[uActiveCharacter];
156 
157  Image *pTexture; // edx@5
158  int v10; // eax@13
159  unsigned int pX_coord; // esi@18
160  unsigned int pY_coord; // edi@18
161 
162  static unsigned int texture_tab_coord1[9][2] = {
163  {406, 9}, {406, 46}, {406, 84}, {406, 121}, {407, 158},
164  {405, 196}, {405, 234}, {405, 272}, {405, 309}};
165 
166  static unsigned int texture_tab_coord0[9][2] = {
167  {415, 10}, {415, 46}, {415, 83}, {415, 121}, {415, 158},
168  {416, 196}, {416, 234}, {416, 271}, {416, 307}};
169 
171 
172  render->ClearZBuffer(0, 479);
173 
174  for (unsigned int i = 0; i < 9; i++) {
175  if (player->pActiveSkills[PLAYER_SKILL_FIRE + i] || engine->config->debug_all_magic) {
176  auto pPageTexture = ui_spellbook_school_tabs[i][0];
177  if (player->lastOpenedSpellbookPage == i) {
178  pPageTexture = ui_spellbook_school_tabs[i][1];
179  pX_coord = texture_tab_coord1[i][0];
180  pY_coord = texture_tab_coord1[i][1];
181  } else {
182  pPageTexture = ui_spellbook_school_tabs[i][0];
183  pX_coord = texture_tab_coord0[i][0];
184  pY_coord = texture_tab_coord0[i][1];
185  }
186  render->DrawTextureAlphaNew(pX_coord / 640.0f, pY_coord / 480.0f,
187  pPageTexture);
188 
189  PlayerSpellbookChapter *chapter =
190  &player->spellbook.pChapters[player->lastOpenedSpellbookPage];
191  for (unsigned int i = 0; i < 11; ++i) {
192  if (chapter->bIsSpellAvailable[i] || engine->config->debug_all_magic) {
193  // this should check if oplayer knows spell
194  if (SBPageSSpellsTextureList[i+1]) {
195  if (quick_spell_at_page == i+1)
196  pTexture = SBPageCSpellsTextureList[i+1];
197  else
198  pTexture = SBPageSSpellsTextureList[i+1];
199  if (pTexture) {
200  pX_coord =
202  pIconPos[player->lastOpenedSpellbookPage]
204  [player->lastOpenedSpellbookPage]
205  [i+1]]
206  .Xpos;
207  pY_coord =
209  pIconPos[player->lastOpenedSpellbookPage]
211  [player->lastOpenedSpellbookPage]
212  [i+1]]
213  .Ypos;
214 
215  render->DrawTextureAlphaNew(
216  pX_coord / 640.0f, pY_coord / 480.0f, pTexture);
217 
218  //
219 
220  render->ZDrawTextureAlpha(
221  pIconPos[player->lastOpenedSpellbookPage]
223  [player->lastOpenedSpellbookPage]
224  [i+1]]
225  .Xpos /
226  640.0f,
227  pIconPos[player->lastOpenedSpellbookPage]
229  [player->lastOpenedSpellbookPage]
230  [i+1]]
231  .Ypos /
232  480.0f,
233  pTexture, i+1);
234  }
235  }
236  }
237  }
238  }
239  }
240 
241  // if ((11 * player->lastOpenedSpellbookPage) || ((11 *
242  // player->lastOpenedSpellbookPage) + 11))//??? maybe structure need fix
243  //{
244 
245  // }
246 
247  Point pt = mouse->GetCursorPos();
248  if (pt.x < 640 && pt.y < 480) {
249  v10 = render->pActiveZBuffer[pt.x + pSRZBufferLineOffsets[pt.y]] & 0xFFFF;
250  if (v10) {
251  if (SBPageCSpellsTextureList[v10]) {
252  pX_coord =
254  pIconPos[player->lastOpenedSpellbookPage]
255  [pSpellbookSpellIndices[player->lastOpenedSpellbookPage]
256  [v10]]
257  .Xpos;
258  pY_coord =
260  pIconPos[player->lastOpenedSpellbookPage]
261  [pSpellbookSpellIndices[player->lastOpenedSpellbookPage]
262  [v10]]
263  .Ypos;
264 
265  render->DrawTextureAlphaNew(pX_coord / 640.0f, pY_coord / 480.0f,
267  }
268  }
269  }
270 }
271 
275 
277 }
278 
279 void LoadSpellbook(unsigned int spell_school) {
280  byte_506550 = 0;
281  if (pPlayers[uActiveCharacter]->uQuickSpell &&
282  (unsigned __int8)pPlayers[uActiveCharacter]->uQuickSpell / 11 ==
283  spell_school)
285  (unsigned __int8)pPlayers[uActiveCharacter]->uQuickSpell -
286  11 * spell_school;
287  else
289 
290  for (unsigned int i = 1; i <= 11; ++i) {
291  if (pPlayers[uActiveCharacter]->spellbook.pChapters[spell_school].bIsSpellAvailable[i - 1] ||
292  engine->config->debug_all_magic) {
293  char pContainer[20];
294  sprintf(pContainer, "SB%sS%02d",
296  pSpellbookSpellIndices[spell_school][i]);
298 
299  sprintf(pContainer, "SB%sC%02d",
301  pSpellbookSpellIndices[spell_school][i]);
303  }
304  }
305 }
306 
308  int pTexID = 0;
309  if (uActiveCharacter) {
310  pTexID = pParty->pPlayers[uActiveCharacter - 1].lastOpenedSpellbookPage;
311  }
312  render->DrawTextureAlphaNew(8 / 640.0f, 8 / 480.0f,
314 
315  render->DrawTextureAlphaNew(476 / 640.0f, 450 / 480.0f,
317  render->DrawTextureAlphaNew(561 / 640.0f, 450 / 480.0f,
319 }
320 
322  pAudioPlayer->StopChannels(-1, -1);
323  pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0);
324 
329 
330  static const char *texNames[9] = {"SBFB00", "SBAB00", "SBWB00",
331  "SBEB00", "SBSB00", "SBMB00",
332  "SBBB00", "SBLB00", "SBDB00"};
333 
334  for (unsigned int i = 0; i < 9; ++i) {
336  assets->GetImage_ColorKey(texNames[i], 0x7FF);
338  assets->GetImage_Alpha(StringPrintf("tab%da", i + 1));
340  assets->GetImage_Alpha(StringPrintf("tab%db", i + 1));
341  }
342 }
343 
347  ui_spellbook_btn_close = nullptr;
348  }
352  }
353 
356  ui_spellbook_btn_quckspell = nullptr;
357  }
361  }
362 
363  for (uint i = 0; i < 9; ++i) {
365  ui_spellbook_school_backgrounds[i]->Release();
366  ui_spellbook_school_backgrounds[i] = nullptr;
367  }
368 
369  if (ui_spellbook_school_tabs[i][0]) {
370  ui_spellbook_school_tabs[i][0]->Release();
371  ui_spellbook_school_tabs[i][0] = nullptr;
372  }
373  if (ui_spellbook_school_tabs[i][1]) {
374  ui_spellbook_school_tabs[i][1]->Release();
375  ui_spellbook_school_tabs[i][1] = nullptr;
376  }
377  }
378 
379  pAudioPlayer->PlaySound(SOUND_openbook, 0, 0, -1, 0, 0);
380 }
381 
383  for (unsigned int i = 1; i <= 11; i++) {
384  if (SBPageCSpellsTextureList[i]) {
385  SBPageCSpellsTextureList[i]->Release();
386  SBPageCSpellsTextureList[i] = nullptr;
387  }
388  if (SBPageSSpellsTextureList[i]) {
389  SBPageSSpellsTextureList[i]->Release();
390  SBPageSSpellsTextureList[i] = nullptr;
391  }
392  }
394 }
Player
Definition: Player.h:401
ViewingParams::field_48
int field_48
Definition: Viewport.h:75
Localization::GetString
const char * GetString(unsigned int index) const
Definition: Localization.cpp:13
UIMSG_Escape
@ UIMSG_Escape
Definition: GUIWindow.h:96
Viewport.h
LOD.h
Image::GetHeight
unsigned int GetHeight()
Definition: Image.cpp:230
SOUND_TurnPageU
@ SOUND_TurnPageU
Definition: AudioPlayer.h:75
Mouse::GetCursorPos
Point GetCursorPos()
Definition: Mouse.cpp:108
GUIWindow
Definition: GUIWindow.h:433
AssetsManager::GetImage_Solid
Texture * GetImage_Solid(const String &name)
Definition: AssetsManager.cpp:51
Viewport::uViewportTL_Y
int uViewportTL_Y
Definition: Viewport.h:23
pSRZBufferLineOffsets
std::array< unsigned int, 480 > pSRZBufferLineOffsets
Definition: mm7_data.cpp:511
pGUIWindow_CurrentMenu
GUIWindow * pGUIWindow_CurrentMenu
Definition: GUIWindow.cpp:54
ui_spellbook_btn_quckspell
Image * ui_spellbook_btn_quckspell
Definition: Spellbook.cpp:42
GUIWindow::CreateButton
GUIButton * CreateButton(int x, int y, int width, int height, int a6, int a7, UIMessageType msg, unsigned int msg_param, uint8_t hotkey, const String &label, const std::vector< Image * > &textures=std::vector< Image * >())
Definition: GUIWindow.cpp:717
pIconPos
std::array< std::array< struct SpellBookIconPos, 12 >, 9 > pIconPos
Definition: Spells.cpp:307
pBtn_CloseBook
GUIButton * pBtn_CloseBook
Definition: GUIButton.cpp:14
CURRENT_SCREEN::SCREEN_SPELL_BOOK
@ SCREEN_SPELL_BOOK
AudioPlayer::PlaySound
void PlaySound(SoundID eSoundID, int pid, unsigned int uNumRepeats, int x, int y, int a7)
Definition: AudioPlayer.cpp:195
engine
std::shared_ptr< Engine > engine
Definition: Engine.cpp:130
OnCloseSpellBookPage
void OnCloseSpellBookPage()
Definition: Spellbook.cpp:382
PLAYER_SKILL_EARTH
@ PLAYER_SKILL_EARTH
Definition: Player.h:186
PLAYER_SKILL_MIND
@ PLAYER_SKILL_MIND
Definition: Player.h:188
localization
Localization * localization
Definition: Localization.cpp:11
Point::x
unsigned int x
Definition: Point.h:7
Player::lastOpenedSpellbookPage
char lastOpenedSpellbookPage
Definition: Player.h:773
Party::pPlayers
std::array< Player, 4 > pPlayers
Definition: Party.h:310
GUIWindow::Release
virtual void Release()
Definition: GUIWindow.cpp:292
SBPageSSpellsTextureList
std::array< Image *, 12 > SBPageSSpellsTextureList
Definition: Spellbook.cpp:48
GUIFont.h
UIMSG_SpellBook_PressTab
@ UIMSG_SpellBook_PressTab
Definition: GUIWindow.h:37
spellbook_texture_filename_suffices
std::array< char *, 9 > spellbook_texture_filename_suffices
Definition: Spellbook.cpp:26
AssetsManager.h
Player::pActiveSkills
std::array< unsigned __int16, 37 > pActiveSkills
Definition: Player.h:711
pPlayers
NZIArray< struct Player *, 5 > pPlayers
Definition: Player.cpp:46
PLAYER_SKILL_FIRE
@ PLAYER_SKILL_FIRE
Definition: Player.h:183
Engine.h
current_screen_type
enum CURRENT_SCREEN current_screen_type
Definition: GUIWindow.cpp:83
GUIWindow_Spellbook::OpenSpellbook
void OpenSpellbook()
Definition: Spellbook.cpp:72
GUIWindow::_41D08F_set_keyboard_control_group
void _41D08F_set_keyboard_control_group(int num_buttons, int a3, int a4, int a5)
Definition: GUIWindow.cpp:273
PLAYER_SKILL_LIGHT
@ PLAYER_SKILL_LIGHT
Definition: Player.h:190
UIMSG_SelectSpell
@ UIMSG_SelectSpell
Definition: GUIWindow.h:71
Localization.h
GUIWindow_Spellbook::OpenSpellbookPage
void OpenSpellbookPage(int page)
Definition: Spellbook.cpp:65
Image::GetWidth
unsigned int GetWidth()
Definition: Image.cpp:217
ui_spellbook_school_backgrounds
std::array< Image *, 9 > ui_spellbook_school_backgrounds
Definition: Spellbook.cpp:50
GUIButton.h
PlayerSpellbookChapter::bIsSpellAvailable
std::array< char, 11 > bIsSpellAvailable
Definition: Player.h:284
pParty
Party * pParty
Definition: Party.cpp:30
Image
Definition: Image.h:19
GUIWindow::DeleteButtons
void DeleteButtons()
Definition: GUIWindow.cpp:305
IRender.h
PLAYER_SKILL_SPIRIT
@ PLAYER_SKILL_SPIRIT
Definition: Player.h:187
byte_506550
char byte_506550
Definition: mm7_data.cpp:531
viewparams
struct ViewingParams * viewparams
Definition: mm7_data.cpp:22
quick_spell_at_page
int quick_spell_at_page
Definition: mm7_data.cpp:530
PlayerSpells::pChapters
std::array< PlayerSpellbookChapter, 9 > pChapters
Definition: Player.h:304
ui_spellbook_school_tabs
std::array< std::array< Image *, 2 >, 9 > ui_spellbook_school_tabs
Definition: Spellbook.cpp:51
AssetsManager::GetImage_ColorKey
Texture * GetImage_ColorKey(const String &name, uint16_t colorkey)
Definition: AssetsManager.cpp:34
Localization::GetSpellSchoolName
const char * GetSpellSchoolName(unsigned int index) const
Definition: Localization.h:27
PLAYER_SKILL_AIR
@ PLAYER_SKILL_AIR
Definition: Player.h:184
AudioPlayer::StopChannels
void StopChannels(int uStartChannel, int uEndChannel)
Definition: AudioPlayer.cpp:331
Party.h
LoadSpellbook
void LoadSpellbook(unsigned int spell_school)
Definition: Spellbook.cpp:279
GUIWindow_Spellbook::Release
virtual void Release()
Definition: Spellbook.cpp:272
window
EGLSurface EGLNativeWindowType * window
Definition: SDL_egl.h:1580
f
GLfloat f
Definition: SDL_opengl_glext.h:1873
PLAYER_SKILL_WATER
@ PLAYER_SKILL_WATER
Definition: Player.h:185
GUIWindow_Spellbook::GUIWindow_Spellbook
GUIWindow_Spellbook()
Definition: Spellbook.cpp:53
Timer::Pause
void Pause()
Definition: Time.cpp:19
pBtn_InstallRemoveSpell
GUIButton * pBtn_InstallRemoveSpell
Definition: GUIButton.cpp:15
PlayerSpellbookChapter
Definition: Player.h:283
pSpellbookSpellIndices
std::array< std::array< unsigned char, 12 >, 9 > pSpellbookSpellIndices
Definition: Spellbook.cpp:30
UIMSG_ClickInstallRemoveQuickSpellBtn
@ UIMSG_ClickInstallRemoveQuickSpellBtn
Definition: GUIWindow.h:73
AudioPlayer.h
pViewport
struct Viewport * pViewport
Definition: mm7_data.cpp:21
InitializeSpellBookTextures
void InitializeSpellBookTextures()
Definition: Spellbook.cpp:321
Point::y
unsigned int y
Definition: Point.h:8
SBPageCSpellsTextureList
std::array< Image *, 12 > SBPageCSpellsTextureList
Definition: Spellbook.cpp:47
GUIWindow::mouse
Mouse * mouse
Definition: GUIWindow.h:491
assets
AssetsManager * assets
Definition: AssetsManager.cpp:12
uint
unsigned int uint
Definition: MM7.h:4
BookUI_Spellbook_DrawCurrentSchoolBackground
static void BookUI_Spellbook_DrawCurrentSchoolBackground()
Definition: Spellbook.cpp:307
uActiveCharacter
unsigned int uActiveCharacter
Definition: mm7_data.cpp:555
GUIWindow_Spellbook::Update
virtual void Update()
Definition: Spellbook.cpp:154
ui_spellbook_btn_close
Image * ui_spellbook_btn_close
Definition: Spellbook.cpp:44
Spellbook.h
AssetsManager::GetImage_Alpha
Texture * GetImage_Alpha(const String &name)
Definition: AssetsManager.cpp:66
SoundID
SoundID
Definition: AudioPlayer.h:10
OnCloseSpellBook
void OnCloseSpellBook()
Definition: Spellbook.cpp:344
PLAYER_SKILL_DARK
@ PLAYER_SKILL_DARK
Definition: Player.h:191
PLAYER_SKILL_BODY
@ PLAYER_SKILL_BODY
Definition: Player.h:189
SOUND_openbook
@ SOUND_openbook
Definition: AudioPlayer.h:93
pAudioPlayer
AudioPlayer * pAudioPlayer
Definition: AudioPlayer.cpp:20
Point
Definition: Point.h:3
WINDOW_SpellBook
@ WINDOW_SpellBook
Definition: GUIWindow.h:303
ui_spellbook_btn_close_click
Image * ui_spellbook_btn_close_click
Definition: Spellbook.cpp:45
ui_spellbook_btn_quckspell_click
Image * ui_spellbook_btn_quckspell_click
Definition: Spellbook.cpp:43
StringPrintf
String StringPrintf(const char *fmt,...)
Definition: Strings.cpp:9
Viewport::uViewportTL_X
int uViewportTL_X
Definition: Viewport.h:22
pEventTimer
Timer * pEventTimer
Definition: Time.cpp:8
SOUND_48
@ SOUND_48
Definition: AudioPlayer.h:21
UIMSG_OpenSpellbookPage
@ UIMSG_OpenSpellbookPage
Definition: GUIWindow.h:72
Image::Release
bool Release()
Definition: Image.cpp:335
Mouse.h
Time.h
Player::spellbook
PlayerSpells spellbook
Definition: Player.h:716
render
std::shared_ptr< IRender > render
Definition: RenderOpenGL.cpp:52