150 lines
4.3 KiB
Python
Executable File
150 lines
4.3 KiB
Python
Executable File
#!/usr/bin/python3
|
|
import os
|
|
import sys
|
|
|
|
#
|
|
# Constants
|
|
#
|
|
ASSETS_DIR="assets"
|
|
RESOURCES_FILE="src/resources/Resources.g.h"
|
|
|
|
RESOURCES_FILE_HEADER=("// WARNING: This file is auto generated by the build/prepareAssets.py script.\n"
|
|
"#ifndef STORAGE_RESOURCES_G_H_\n"
|
|
"#define STORAGE_RESOURCES_G_H_\n"
|
|
"\n"
|
|
"#include <resources/ResourceInfo.h>\n"
|
|
"\n"
|
|
"namespace farmlands {\n"
|
|
"namespace resources {\n"
|
|
"\n")
|
|
|
|
RESOURCES_FILE_FOOTER=("\n"
|
|
"}\n"
|
|
"}\n"
|
|
"#endif /* STORAGE_RESOURCES_G_H_ */\n")
|
|
|
|
R_HEADER=(" /**\n"
|
|
" * This namespace contains all the resource IDs, used by the resource manager.\n"
|
|
" * The IDs are generated at build time by the 'prepareAssets.py' script.\n"
|
|
" */\n"
|
|
" namespace R {\n")
|
|
|
|
R_FOOTER=" }\n"
|
|
|
|
RINFO_HEADER=(" /**\n"
|
|
" * This array contains the names of all the files, and the corresponding file type.\n"
|
|
" */\n"
|
|
" const ResourceInfo RInfo[] = {\n")
|
|
|
|
RINFO_FOOTER=" };\n"
|
|
|
|
|
|
#
|
|
# File types
|
|
#
|
|
FILE_TYPES = [
|
|
([".png", ".bmp"], "Texture"),
|
|
([".ttf"], "Font"),
|
|
([".sprite"], "Sprite"),
|
|
([".config"], "Configuration"),
|
|
([".scene"], "Scene"),
|
|
([".back"], "Map"),
|
|
([".csv"], "MapLayer"),
|
|
([".item"], "Item"),
|
|
([".items"], "ItemCollection"),
|
|
]
|
|
|
|
|
|
#
|
|
# Capitalizes the given string by converting the first character to uppercase.
|
|
# It does not convert the other characters to lowercase.
|
|
#
|
|
def capitalize(s):
|
|
if len(s) == 0:
|
|
return s
|
|
|
|
return s[0].upper() + s[1:]
|
|
|
|
#
|
|
# Obtains the file type using FILE_TYPES constant
|
|
#
|
|
def getFileType(fileName):
|
|
ext = os.path.splitext(fileName)[1]
|
|
|
|
for (extensions, type) in FILE_TYPES:
|
|
if ext in extensions:
|
|
return type
|
|
|
|
return "None"
|
|
|
|
|
|
#
|
|
# Main routine
|
|
#
|
|
if __name__ == '__main__':
|
|
r = ""
|
|
rInfo = ""
|
|
rInfoBegin = ""
|
|
|
|
assetId = 0
|
|
|
|
print ("Preparing assets...")
|
|
|
|
# Build R and RInfo
|
|
for assetDir in os.listdir(ASSETS_DIR):
|
|
assetDirPath=os.path.join(ASSETS_DIR, assetDir)
|
|
|
|
# Warning for non-directories
|
|
if not os.path.isdir(assetDirPath):
|
|
sys.stderr.writeline("Warning: file {0} is in the root 'assets' folder, and it will not be imported.".format(assetDir))
|
|
continue
|
|
|
|
# Create R enum
|
|
assetIdBegin = assetId
|
|
rInfoBegin += " const int RInfo_{0}_Begin = {1};\n".format(capitalize(assetDir), assetIdBegin)
|
|
r += (" enum " + capitalize(assetDir) + "\n"
|
|
" {\n")
|
|
|
|
# Get items in directory
|
|
for (dir, dirs, files) in os.walk(assetDirPath):
|
|
|
|
# R prefix - remove assetDirPath from path, replace path separators with _
|
|
RdirPrefix = os.path.relpath(dir, assetDirPath)
|
|
RdirPrefix = RdirPrefix.replace("/", "_").replace("\\", "_")
|
|
if (RdirPrefix == "."):
|
|
RdirPrefix = ""
|
|
else:
|
|
RdirPrefix += "_"
|
|
|
|
for f in files:
|
|
if (f[0] == '.'):
|
|
continue
|
|
|
|
# Append to R
|
|
fResName = RdirPrefix + capitalize(os.path.splitext(f)[0])
|
|
r += " {0} = {1},\n".format(fResName, assetId)
|
|
assetId += 1
|
|
|
|
# RInfo path should be relative to assets directory
|
|
fPath = os.path.join(dir, f)
|
|
fPath = os.path.relpath(fPath, ASSETS_DIR)
|
|
fType = getFileType(f)
|
|
|
|
rInfo += " {{ \"{0}\", ResourceType::{1} }},\n".format(fPath, fType) # TODO: obtain resource type
|
|
|
|
# Finish R enum
|
|
r += " };\n"
|
|
|
|
# Build resource header file
|
|
resFile = RESOURCES_FILE_HEADER
|
|
resFile += R_HEADER + r + R_FOOTER
|
|
resFile += "\n" + rInfoBegin + "\n"
|
|
resFile += RINFO_HEADER + rInfo + RINFO_FOOTER
|
|
resFile += RESOURCES_FILE_FOOTER
|
|
|
|
# Write resource file
|
|
f = open(RESOURCES_FILE, "w")
|
|
f.write(resFile)
|
|
f.close()
|
|
|