From 2bd4d4da36c32bf2dd8d31e55d587c5584cc0cbc Mon Sep 17 00:00:00 2001 From: MysterD Date: Sat, 2 Apr 2022 15:55:06 -0700 Subject: [PATCH] Recursively parse DynOS level folders --- data/dynos_bin_lvl.cpp | 46 ++++++++++++++++++++++++++++++++++------- data/dynos_bin_read.cpp | 7 +++++++ 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/data/dynos_bin_lvl.cpp b/data/dynos_bin_lvl.cpp index 8f403c0b2..60a0c86df 100644 --- a/data/dynos_bin_lvl.cpp +++ b/data/dynos_bin_lvl.cpp @@ -1669,6 +1669,37 @@ static bool DynOS_Lvl_GeneratePack_Internal(const SysPath &aPackFolder, Arrayd_name) == ".") continue; + if (SysPath(_PackEnt->d_name) == "..") continue; + + SysPath path = fstring("%s/%s", directory.c_str(), _PackEnt->d_name); + + // Recurse through subfolders + if (fs_sys_dir_exists(path.c_str())) { + DynOS_Lvl_GeneratePack_Recursive(path, _GfxData); + continue; + } + + // skip files that don't end in '.c' + size_t nameLen = strlen(_PackEnt->d_name); + if (_PackEnt->d_name[nameLen - 2] != '.' || _PackEnt->d_name[nameLen - 1] != 'c') { + continue; + } + + // read the file + DynOS_Read_Source(_GfxData, path.c_str()); + } + closedir(aPackDir); + } +} + void DynOS_Lvl_GeneratePack(const SysPath &aPackFolder) { Print("---------- Level pack folder: \"%s\" ----------", aPackFolder.c_str()); Array> _ActorsFolders; @@ -1685,14 +1716,13 @@ void DynOS_Lvl_GeneratePack(const SysPath &aPackFolder) { // For each subfolder, read tokens from script.c SysPath _Folder = fstring("%s/%s", aPackFolder.c_str(), _PackEnt->d_name); - if (fs_sys_dir_exists(_Folder.c_str())) { - _GfxData->mModelIdentifier = 0; - DynOS_Read_Source(_GfxData, fstring("%s/model.inc.c", _Folder.c_str())); - DynOS_Read_Source(_GfxData, fstring("%s/area_1/collision.inc.c", _Folder.c_str())); - DynOS_Read_Source(_GfxData, fstring("%s/area_1/geo.inc.c", _Folder.c_str())); - DynOS_Read_Source(_GfxData, fstring("%s/script.c", _Folder.c_str())); - DynOS_Read_Source(_GfxData, fstring("%s/area_1/macro.inc.c", _Folder.c_str())); - } + if (!fs_sys_dir_exists(_Folder.c_str())) continue; + + // Only parse folders with a 'script.c' + if (!fs_sys_file_exists(fstring("%s/script.c", _Folder.c_str()).c_str())) continue; + + _GfxData->mModelIdentifier = 0; + DynOS_Lvl_GeneratePack_Recursive(_Folder, _GfxData); } closedir(aPackDir); } diff --git a/data/dynos_bin_read.cpp b/data/dynos_bin_read.cpp index 1317e7f4b..65a90cadf 100644 --- a/data/dynos_bin_read.cpp +++ b/data/dynos_bin_read.cpp @@ -139,6 +139,13 @@ void DynOS_Read_Source(GfxData *aGfxData, const SysPath &aFilename) { // Scanning data type if (_DataType == DATA_TYPE_NONE) { + // skip includes + if (!strncmp(c, "#include", 8)) { + while (*c != '\n' && *c != '\0') { + c++; + } + } + // Reading data type name if ((*c >= 'A' && *c <= 'Z') || (*c >= 'a' && *c <= 'z') || (*c >= '0' && *c <= '9') || (*c == '_') || (*c == '\"')) { if (*c == '\"') {