Mercurial > mm7
view Engine/Graphics/Overlays.cpp @ 2541:a902abdfc7f2
1. Renamed class Game to class Engine.
2. Separated game logic as state of FSM from game logic as engine.
3. Found out that many UI screen initializers were optimized away, intially
they all returned newly created window as separate object like it is done
in CharacterUI_Initialize.
author | a.parshin |
---|---|
date | Sun, 10 May 2015 01:29:11 +0200 |
parents | c7264ab7132f |
children | 0c67be4ec900 |
line wrap: on
line source
#define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include "Engine/Engine.h" #include "Overlays.h" #include "Sprites.h" #include "../Tables/FrameTableInc.h" #include "../Tables/IconFrameTable.h" #include "../Timer.h" #include "../Party.h" #include "../TurnEngine/TurnEngine.h" #include "../LOD.h" #include "Render.h" #include "GUI/GUIWindow.h" struct OtherOverlayList *pOtherOverlayList = new OtherOverlayList; // idb struct OverlayList *pOverlayList = new OverlayList; // inlined //----- (mm6c::0045BD50) -------------------------------------------------- void OtherOverlayList::Reset() { for (uint i = 0; i < 50; ++i) pOverlays[i].Reset(); } //----- (004418B1) -------------------------------------------------------- int OtherOverlayList::_4418B1(int a2, int a3, int a4, int a5) { return 0; } //----- (004418B6) -------------------------------------------------------- int OtherOverlayList::_4418B6(int uOverlayID, __int16 a3, int a4, int a5, __int16 a6) { signed int v9; // esi@6 __int16 v11; // dx@11 for ( uint i = 0; i < 50; ++i ) { if ( this->pOverlays[i].field_6 <= 0 ) { this->pOverlays[i].field_0 = 0; this->pOverlays[i].field_A = 0; this->pOverlays[i].field_8 = 0; this->pOverlays[i].field_C = a3; v9 = 0; for ( v9; v9 < (signed int)pOverlayList->uNumOverlays; ++v9 ) { if ( uOverlayID == pOverlayList->pOverlays[v9].uOverlayID ) break; } this->pOverlays[i].field_2 = v9; this->pOverlays[i].field_4 = 0; if ( a4 ) v11 = a4; else v11 = 8 * pSpriteFrameTable->pSpriteSFrames[pOverlayList->pOverlays[v9].uSpriteFramesetID].uAnimLength; this->pOverlays[i].field_6 = v11; this->pOverlays[i].field_10 = a5; this->pOverlays[i].field_E = a6; bRedraw = true; return true; } } return 0; } //----- (00441964) -------------------------------------------------------- void OtherOverlayList::DrawTurnBasedIcon(int a2) { IconFrame *frame; // eax@12 unsigned int v5; // [sp-8h] [bp-Ch]@4 if ( current_screen_type != SCREEN_GAME || !pParty->bTurnBasedModeOn) return; if ( pTurnEngine->turn_stage == TE_MOVEMENT )//все персы отстрелялись(сжатый кулак) frame = pIconsFrameTable->GetFrame(pIconIDs_Turn[5 - pTurnEngine->uActionPointsLeft / 26], pEventTimer->uStartTime); else if ( pTurnEngine->turn_stage == TE_WAIT ) { if ( dword_50C998_turnbased_icon_1A ) v5 = uIconID_TurnStart;//анимация руки(запуск пошагового режима) else v5 = uIconID_TurnHour; //группа ожидает(часы) frame = pIconsFrameTable->GetFrame(v5, dword_50C994); } else if ( pTurnEngine->turn_stage == TE_ATTACK )//группа атакует(ладонь) frame = pIconsFrameTable->GetFrame(uIconID_TurnStop, pEventTimer->uStartTime); //if ( pRenderer->pRenderD3D ) pRenderer->DrawTextureIndexed(394, 288, &pIcons_LOD->pTextures[frame->uTextureID]); /*else pRenderer->DrawTextureIndexedAlpha(0x18Au, 0x120u, v7);*/ if ( dword_50C994 < dword_50C998_turnbased_icon_1A ) { dword_50C994 += pEventTimer->uTimeElapsed; if ( (signed int)dword_50C994 >= dword_50C998_turnbased_icon_1A ) dword_50C998_turnbased_icon_1A = 0; } } // 4E28F8: using guessed type int current_screen_type; // 50C994: using guessed type int dword_50C994; // 50C998: using guessed type int dword_50C998_turnbased_icon_1A; //----- (00458D97) -------------------------------------------------------- void OverlayList::InitializeSprites() { for (uint i = 0; i < uNumOverlays; ++i) pSpriteFrameTable->InitializeSprite(pOverlays[i].uSpriteFramesetID); } //----- (00458DBC) -------------------------------------------------------- void OverlayList::ToFile() { FILE *v2; // eax@1 //FILE *v3; // edi@1 v2 = fopen("data\\doverlay.bin", "wb"); //v3 = v2; if ( !v2 ) Error("Unable to save doverlay.bin!"); fwrite(this, 4, 1, v2); fwrite(this->pOverlays, 8, this->uNumOverlays, v2); fclose(v2); } //----- (00458E08) -------------------------------------------------------- void OverlayList::FromFile(void *data_mm6, void *data_mm7, void *data_mm8) { uint num_mm6_overlays = data_mm6 ? *(int *)data_mm6 : 0, num_mm7_overlays = data_mm7 ? *(int *)data_mm7 : 0, num_mm8_overlays = data_mm8 ? *(int *)data_mm8 : 0; uNumOverlays = num_mm6_overlays + num_mm7_overlays + num_mm8_overlays; Assert(uNumOverlays); Assert(!num_mm8_overlays); pOverlays = (OverlayDesc *)malloc(uNumOverlays * sizeof(OverlayDesc)); memcpy(pOverlays, (char *)data_mm7 + 4, num_mm7_overlays * sizeof(OverlayDesc)); memcpy(pOverlays + num_mm7_overlays, (char *)data_mm6 + 4, num_mm6_overlays * sizeof(OverlayDesc)); memcpy(pOverlays + num_mm6_overlays + num_mm7_overlays, (char *)data_mm8 + 4, num_mm8_overlays * sizeof(OverlayDesc)); } //----- (00458E4F) -------------------------------------------------------- bool OverlayList::FromFileTxt(const char *Args) { __int32 v3; // edi@1 FILE *v4; // eax@1 unsigned int v5; // esi@3 void *v7; // eax@9 //FILE *v8; // ST0C_4@11 char *i; // eax@11 char Buf; // [sp+10h] [bp-2F0h]@3 FrameTableTxtLine v18; // [sp+204h] [bp-FCh]@4 FrameTableTxtLine v19; // [sp+280h] [bp-80h]@4 FILE *File; // [sp+2FCh] [bp-4h]@1 unsigned int Argsa; // [sp+308h] [bp+8h]@3 free(this->pOverlays); v3 = 0; this->pOverlays = nullptr; this->uNumOverlays = 0; v4 = fopen(Args, "r"); File = v4; if ( !v4 ) Error("ObjectDescriptionList::load - Unable to open file: %s."); v5 = 0; Argsa = 0; if ( fgets(&Buf, 490, v4) ) { do { *strchr(&Buf, 10) = 0; memcpy(&v19, txt_file_frametable_parser(&Buf, &v18), sizeof(v19)); if ( v19.uPropCount && *v19.pProperties[0] != 47 ) ++Argsa; } while ( fgets(&Buf, 490, File) ); v5 = Argsa; v3 = 0; } this->uNumOverlays = v5; v7 = malloc(8 * v5); this->pOverlays = (OverlayDesc *)v7; if ( v7 == (void *)v3 ) Error("OverlayDescriptionList::load - Out of Memory!"); memset(v7, v3, 8 * this->uNumOverlays); //v8 = File; this->uNumOverlays = v3; fseek(File, v3, v3); for ( i = fgets(&Buf, 490, File); i; i = fgets(&Buf, 490, File) ) { *strchr(&Buf, 10) = 0; memcpy(&v19, txt_file_frametable_parser(&Buf, &v18), sizeof(v19)); if ( v19.uPropCount && *v19.pProperties[0] != 47 ) { this->pOverlays[this->uNumOverlays].uOverlayID = atoi(v19.pProperties[0]); if ( _stricmp(v19.pProperties[1], "center") ) { if ( !_stricmp(v19.pProperties[1], "transparent") ) this->pOverlays[this->uNumOverlays].uOverlayType = 2; else this->pOverlays[this->uNumOverlays].uOverlayType = 1; } else this->pOverlays[this->uNumOverlays].uOverlayType = 0; this->pOverlays[this->uNumOverlays++].uSpriteFramesetID = pSpriteFrameTable->FastFindSprite((char *)v19.pProperties[2]); } } fclose(File); return 1; } //----- (0045855F) -------------------------------------------------------- void OtherOverlay::Reset() { this->field_0 = 0; this->field_2 = 0; this->field_4 = 0; this->field_6 = 0; this->field_8 = 0; this->field_A = 0; this->field_C = 0; this->field_E = 0; this->field_10 = 65536; } //----- (004584B8) -------------------------------------------------------- OtherOverlay::OtherOverlay() { this->field_0 = 0; this->field_2 = 0; this->field_4 = 0; this->field_6 = 0; this->field_8 = 0; this->field_A = 0; this->field_C = 0; this->field_E = 0; this->field_10 = 65536; }