World of Might and Magic  0.2.0
Open reimplementation of Might and Magic 6 7 8 game engine
Класс LOD::File

#include <LOD.h>

+ Граф наследования:LOD::File:
+ Граф связей класса LOD::File:

Открытые члены

 File ()
 
virtual ~File ()
 
bool Open (const String &pFilename)
 
void Close ()
 
voidLoadRaw (const String &pContainer, size_t *data_size=nullptr)
 
voidLoadCompressedTexture (const String &pContainer, size_t *data_size=nullptr)
 
voidLoadCompressed (const String &pContainer, size_t *data_size=nullptr)
 
bool DoesContainerExist (const String &filename)
 
String GetSubNodeName (size_t index) const
 
size_t GetSubNodesCount () const
 
int GetSubNodeIndex (const String &name) const
 

Защищенные члены

FILE * FindContainer (const String &filename, size_t *data_size=nullptr)
 
virtual bool OpenFile (const String &sFilename)
 
bool LoadHeader ()
 
bool LoadSubIndices (const String &sFolder)
 
virtual void ResetSubIndices ()
 

Защищенные данные

FILE * pFile
 
String pLODName
 
bool isFileOpened
 
struct FileHeader header
 
std::vector< DirectorypRoot
 
String pContainerName
 
unsigned int uOffsetToSubIndex
 
unsigned int uNumSubDirs
 
struct DirectorypSubIndices
 

Подробное описание

См. определение в файле LOD.h строка 58

Конструктор(ы)

◆ File()

LOD::File::File ( )

См. определение в файле LOD.cpp строка 739

739  : isFileOpened(false) {
740  pFile = nullptr;
741  pSubIndices = nullptr;
742  Close();
743 }

Перекрестные ссылки Close(), pFile и pSubIndices.

Используется в LODFile_Sprites::LoadSpriteFromFile().

+ Граф вызовов:
+ Граф вызова функции:

◆ ~File()

LOD::File::~File ( )
virtual

См. определение в файле LOD.cpp строка 745

745  {
746  if (isFileOpened) {
747  fclose(pFile);
748  }
749 }

Методы

◆ Open()

bool LOD::File::Open ( const String pFilename)

См. определение в файле LOD.cpp строка 751

751  {
752  if (!OpenFile(sFilename)) {
753  return false;
754  }
755 
756  if (!LoadHeader()) {
757  return false;
758  }
759 
760  return LoadSubIndices(pRoot.front().pFilename);
761 }

Используется в GUIWindow_Load::GUIWindow_Load(), GUIWindow_Save::GUIWindow_Save(), Initialize_GamesLOD_NewLOD() и LODFile_Sprites::LoadSprites().

+ Граф вызова функции:

◆ Close()

void LOD::File::Close ( )

См. определение в файле LOD.cpp строка 243

243  {
244  if (!isFileOpened) {
245  return;
246  }
247 
248  pContainerName.clear();
249  pRoot.clear();
250  free(pSubIndices);
251  pSubIndices = nullptr;
252  fclose(pFile);
253  isFileOpened = false;
254  _6A0CA8_lod_unused = 0;
255 }

Перекрестные ссылки _6A0CA8_lod_unused, isFileOpened, pContainerName, pFile, pRoot и pSubIndices.

Используется в File().

+ Граф вызова функции:

◆ LoadRaw()

void * LOD::File::LoadRaw ( const String pContainer,
size_t data_size = nullptr 
)

См. определение в файле LOD.cpp строка 895

895  {
896  if (data_size != nullptr) {
897  *data_size = 0;
898  }
899 
900  size_t size = 0;
901  FILE *File = FindContainer(pContainer, &size);
902  if (!File) {
903  Error("Unable to load %s", pContainer.c_str());
904  return nullptr;
905  }
906 
907  void *result = malloc(size);
908  if (fread(result, size, 1, File) != 1) {
909  free(result);
910  result = 0;
911  size = 0;
912  }
913 
914  if (data_size != nullptr) {
915  *data_size = size;
916  }
917 
918  return result;
919 }

Используется в GUIWindow_Load::GUIWindow_Load(), GUIWindow_Save::GUIWindow_Save(), LoadGame() и SaveNewGame().

+ Граф вызова функции:

◆ LoadCompressedTexture()

void * LOD::File::LoadCompressedTexture ( const String pContainer,
size_t data_size = nullptr 
)

См. определение в файле LOD.cpp строка 921

921  {
922  void *result = nullptr;
923  if (data_size != nullptr) {
924  *data_size = 0;
925  }
926 
927  FILE *File = FindContainer(pContainer, 0);
928  if (!File) {
929  Error("Unable to load %s", pContainer.c_str());
930  return nullptr;
931  }
932 
933  TextureHeader DstBuf;
934  fread(&DstBuf, 1, sizeof(TextureHeader), File);
935 
936  if (DstBuf.uDecompressedSize) {
937  result = malloc(DstBuf.uDecompressedSize);
938  void *tmp_buf = malloc(DstBuf.uTextureSize);
939  fread(tmp_buf, 1, DstBuf.uTextureSize, File);
940  zlib::Uncompress(result, &DstBuf.uDecompressedSize, tmp_buf,
941  DstBuf.uTextureSize);
942  DstBuf.uTextureSize = DstBuf.uDecompressedSize;
943  free(tmp_buf);
944  } else {
945  result = malloc(DstBuf.uTextureSize);
946  fread(result, 1, DstBuf.uTextureSize, File);
947  }
948 
949  if (data_size != nullptr) {
950  *data_size = DstBuf.uTextureSize;
951  }
952 
953  return result;
954 }

Перекрестные ссылки TextureHeader::uDecompressedSize, zlib::Uncompress() и TextureHeader::uTextureSize.

Используется в GUICredits::GUICredits(), FactionTable::Initialize(), Localization::Initialize(), StorylineText::Initialize(), MapStats::Initialize(), NPCStats::Initialize(), MonsterStats::Initialize(), SpellStats::Initialize(), ItemsTable::Initialize(), Localization::InitializeAttributeNames(), InitializeAutonotes(), InitializeAwards(), InitializeBuildingResidents(), Localization::InitializeClassNames(), InitializeMerchants(), NPCStats::InitializeNPCData(), NPCStats::InitializeNPCText(), MonsterStats::InitializePlacements(), InitializeQuests(), InitializeScrolls(), Localization::InitializeSkillNames(), InitializeTransitions(), LoadEventsToBuffer(), GUIFont::LoadFont(), ItemsTable::LoadPotionNotes(), ItemsTable::LoadPotions() и Engine::MM7_Initialize().

+ Граф вызовов:
+ Граф вызова функции:

◆ LoadCompressed()

void * LOD::File::LoadCompressed ( const String pContainer,
size_t data_size = nullptr 
)

См. определение в файле LOD.cpp строка 965

965  {
966  static_assert(sizeof(CompressedHeader) == 16, "Wrong type size");
967 
968  void *result = nullptr;
969  if (data_size != nullptr) {
970  *data_size = 0;
971  }
972 
973  FILE *File = FindContainer(pContainer, 0);
974  if (!File) {
975  Error("Unable to load %s", pContainer.c_str());
976  return nullptr;
977  }
978 
980  fread(&header, 1, sizeof(CompressedHeader), File);
981  if (header.uVersion != 91969 || (memcmp(&header.pMagic, "mvii", 4) != 0)) {
982  Error("Unable to load %s", pContainer.c_str());
983  return nullptr;
984  }
985 
986  if (header.uDecompressedSize) {
987  result = malloc(header.uDecompressedSize);
988  void *tmp_buf = malloc(header.uCompressedSize);
989  fread(tmp_buf, 1, header.uCompressedSize, File);
990  zlib::Uncompress(result, &header.uDecompressedSize, tmp_buf, header.uCompressedSize);
991  header.uCompressedSize = header.uDecompressedSize;
992  free(tmp_buf);
993  } else {
994  result = malloc(header.uCompressedSize);
995  fread(result, 1, header.uCompressedSize, File);
996  }
997 
998  if (data_size != nullptr) {
999  *data_size = header.uCompressedSize;
1000  }
1001 
1002  return result;
1003 }

Перекрестные ссылки CompressedHeader::pMagic, CompressedHeader::uCompressedSize, CompressedHeader::uDecompressedSize, zlib::Uncompress() и CompressedHeader::uVersion.

Используется в OutdoorLocation::Load() и IndoorLocation::Load().

+ Граф вызовов:
+ Граф вызова функции:

◆ DoesContainerExist()

bool LOD::File::DoesContainerExist ( const String filename)

См. определение в файле LOD.cpp строка 833

833  {
834  for (size_t i = 0; i < uNumSubDirs; ++i) {
835  if (!_stricmp(pContainer.c_str(), pSubIndices[i].pFilename)) {
836  return true;
837  }
838  }
839 
840  return false;
841 }

Используется в OutdoorLocation::Load(), IndoorLocation::Load() и LoadGame().

+ Граф вызова функции:

◆ GetSubNodeName()

String LOD::File::GetSubNodeName ( size_t  index) const
inline

См. определение в файле LOD.h строка 71

71 { return pSubIndices[index].pFilename; }

Перекрестные ссылки LOD::Directory::pFilename и pSubIndices.

Используется в Application::Game::EventLoop(), SaveNewGame() и MapStats::sub_410D99_get_map_index().

+ Граф вызова функции:

◆ GetSubNodesCount()

size_t LOD::File::GetSubNodesCount ( ) const
inline

См. определение в файле LOD.h строка 72

72 { return uNumSubDirs; }

Перекрестные ссылки uNumSubDirs.

Используется в Application::Game::EventLoop() и SaveNewGame().

+ Граф вызова функции:

◆ GetSubNodeIndex()

int LOD::File::GetSubNodeIndex ( const String name) const

См. определение в файле LOD.cpp строка 1005

1005  {
1006  for (size_t index = 0; index < uNumSubDirs; index++) {
1007  if (name == pSubIndices[index].pFilename) {
1008  return index;
1009  }
1010  }
1011 
1012  return -1;
1013 }

Используется в Application::Game::EventLoop() и Player::SetBeacon().

+ Граф вызова функции:

◆ FindContainer()

FILE * LOD::File::FindContainer ( const String filename,
size_t data_size = nullptr 
)
protected

См. определение в файле LOD.cpp строка 851

851  {
852  if (!isFileOpened) {
853  return nullptr;
854  }
855  if (data_size != nullptr) {
856  *data_size = 0;
857  }
858 
859  for (uint i = 0; i < uNumSubDirs; ++i) {
860  if (!_stricmp(pContainer_Name.c_str(), pSubIndices[i].pFilename)) {
861  fseek(pFile, uOffsetToSubIndex + pSubIndices[i].uOfsetFromSubindicesStart, SEEK_SET);
862  if (data_size != nullptr) {
863  *data_size = pSubIndices[i].uDataSize;
864  }
865  return pFile;
866  }
867  }
868 
869  return nullptr;
870 }

Используется в LODFile_Sprites::LoadSprite() и LODFile_Sprites::LoadSpriteFromFile().

+ Граф вызова функции:

◆ OpenFile()

bool LOD::File::OpenFile ( const String sFilename)
protectedvirtual

См. определение в файле LOD.cpp строка 763

763  {
764  if (isFileOpened) {
765  Close();
766  }
767 
768  pFile = fopen(sFilename.c_str(), "rb");
769  if (pFile == nullptr) {
770  return false;
771  }
772 
773  pLODName = sFilename;
774 
775  return true;
776 }

◆ LoadHeader()

bool LOD::File::LoadHeader ( )
protected

См. определение в файле LOD.cpp строка 778

778  {
779  if (pFile == nullptr) {
780  return false;
781  }
782 
783  fseek(pFile, 0, SEEK_SET);
784 
785  if (fread(&header, sizeof(LOD::FileHeader), 1, pFile) != 1) {
786  return false;
787  }
788  for (unsigned int i = 0; i < header.uNumIndices; i++) {
789  LOD::Directory dir;
790  if (fread(&dir, sizeof(LOD::Directory), 1, pFile) != 1) {
791  pRoot.clear();
792  return false;
793  }
794  pRoot.push_back(dir);
795  }
796 
797  fseek(pFile, 0, SEEK_SET);
798 
799  isFileOpened = true;
800 
801  return true;
802 }

◆ LoadSubIndices()

bool LOD::File::LoadSubIndices ( const String sFolder)
protected

См. определение в файле LOD.cpp строка 804

804  {
805  ResetSubIndices();
806 
807  for (LOD::Directory &dir : pRoot) {
808  if (!_stricmp(pContainer.c_str(), dir.pFilename)) {
809  pContainerName = pContainer;
810  uOffsetToSubIndex = dir.uOfsetFromSubindicesStart;
811  uNumSubDirs = dir.uNumSubIndices;
812  fseek(pFile, uOffsetToSubIndex, SEEK_SET);
813  pSubIndices = (LOD::Directory *)malloc(sizeof(LOD::Directory) * uNumSubDirs);
814 
815  if (pSubIndices) {
816  fread(pSubIndices, sizeof(LOD::Directory), uNumSubDirs, pFile);
817  }
818  return true;
819  }
820  }
821  return false;
822 }

Используется в LODFile_Sprites::LoadSprites().

+ Граф вызова функции:

◆ ResetSubIndices()

void LOD::File::ResetSubIndices ( )
protectedvirtual

Переопределяется в LOD::WriteableFile.

См. определение в файле LOD.cpp строка 283

283  {
284  if (!isFileOpened) {
285  return;
286  }
287 
288  pContainerName.clear();
289  uOffsetToSubIndex = 0;
290  free(pSubIndices);
291  pSubIndices = nullptr;
292 }

Используется в LOD::WriteableFile::ResetSubIndices().

+ Граф вызова функции:

Данные класса

◆ pFile

FILE* LOD::File::pFile
protected

См. определение в файле LOD.h строка 83

Используется в Close() и File().

◆ pLODName

String LOD::File::pLODName
protected

См. определение в файле LOD.h строка 84

Используется в LOD::WriteableFile::_4621A7().

◆ isFileOpened

bool LOD::File::isFileOpened
protected

См. определение в файле LOD.h строка 85

Используется в Close().

◆ header

struct FileHeader LOD::File::header
protected

См. определение в файле LOD.h строка 87

Используется в LODFile_IconsBitmaps::LoadDummyTexture() и LODFile_Sprites::LoadSprite().

◆ pRoot

std::vector<Directory> LOD::File::pRoot
protected

См. определение в файле LOD.h строка 89

Используется в Close().

◆ pContainerName

String LOD::File::pContainerName
protected

См. определение в файле LOD.h строка 90

Используется в Close() и LODFile_Sprites::LoadSprite().

◆ uOffsetToSubIndex

unsigned int LOD::File::uOffsetToSubIndex
protected

См. определение в файле LOD.h строка 91

◆ uNumSubDirs

unsigned int LOD::File::uNumSubDirs
protected

См. определение в файле LOD.h строка 93

Используется в LOD::WriteableFile::ClearSubNodes() и GetSubNodesCount().

◆ pSubIndices

struct Directory* LOD::File::pSubIndices
protected

См. определение в файле LOD.h строка 94

Используется в Close(), File() и GetSubNodeName().


Объявления и описания членов классов находятся в файлах:
LOD::Directory::uDataSize
uint32_t uDataSize
Definition: LOD.h:51
LOD::FileHeader::uNumIndices
uint32_t uNumIndices
Definition: LOD.h:39
LOD::File::ResetSubIndices
virtual void ResetSubIndices()
Definition: LOD.cpp:283
LOD::Directory::pFilename
char pFilename[15]
Definition: LOD.h:48
LOD::File::header
struct FileHeader header
Definition: LOD.h:87
LOD::File::pRoot
std::vector< Directory > pRoot
Definition: LOD.h:89
LOD::File::Close
void Close()
Definition: LOD.cpp:243
CompressedHeader
Definition: LOD.cpp:957
index
GLuint index
Definition: SDL_opengl_glext.h:663
result
GLuint64EXT * result
Definition: SDL_opengl_glext.h:9435
LOD::File::pFile
FILE * pFile
Definition: LOD.h:83
LOD::Directory
Definition: LOD.h:45
LOD::File::uOffsetToSubIndex
unsigned int uOffsetToSubIndex
Definition: LOD.h:91
LOD::File::isFileOpened
bool isFileOpened
Definition: LOD.h:85
LOD::File::FindContainer
FILE * FindContainer(const String &filename, size_t *data_size=nullptr)
Definition: LOD.cpp:851
_6A0CA8_lod_unused
int _6A0CA8_lod_unused
Definition: LOD.cpp:28
LOD::File::File
File()
Definition: LOD.cpp:739
LOD::File::LoadSubIndices
bool LoadSubIndices(const String &sFolder)
Definition: LOD.cpp:804
LOD::File::pSubIndices
struct Directory * pSubIndices
Definition: LOD.h:94
TextureHeader::uDecompressedSize
uint32_t uDecompressedSize
Definition: Image.h:90
LOD::File::uNumSubDirs
unsigned int uNumSubDirs
Definition: LOD.h:93
TextureHeader::uTextureSize
uint32_t uTextureSize
Definition: Image.h:81
zlib::Uncompress
int Uncompress(void *dest, unsigned int *destLen, const void *source, unsigned int sourceLen)
Definition: ZlibWrapper.cpp:7
name
EGLImageKHR EGLint * name
Definition: SDL_egl.h:1497
LOD::File::pContainerName
String pContainerName
Definition: LOD.h:90
uint
unsigned int uint
Definition: MM7.h:4
LOD::File::LoadHeader
bool LoadHeader()
Definition: LOD.cpp:778
LOD::File::OpenFile
virtual bool OpenFile(const String &sFilename)
Definition: LOD.cpp:763
TextureHeader
Definition: Image.h:78
size
GLsizeiptr size
Definition: SDL_opengl_glext.h:540
LOD::FileHeader
Definition: LOD.h:22
LOD::File::pLODName
String pLODName
Definition: LOD.h:84