The C2 manual references the project file folder which contains other files other than its default.
Even though files and subfolders can be created in this folder, it doesn’t automatically become part of the caproj unless it is actually specified/registered inside the caproj. Inside C2, it is possible to ‘auto-import’ files, but this only works at the root level of /Files; directories aren’t traversed, making this mechanism suitable for single files, like configuration files.
However, when using the Files folder in other ways, such as replacing animation using Rex’s Animation Loader, it would be a monumental task to get all these files in. So I’ve written a Python function that traverses any given folder and writes out a block that can be copied and pasted into the caproj, which is near the end of the caproj. Perhaps in future, I will make the procedure more seamless; right now, the manual copy-paste is for security reasons.
The code below is very unpolished, but gets the idea across.
def make_xml_c2_file_folder(): ''' Create a folder structure in caproj/xml format with a given directory The intention is to create a sprite animation folder in the /Files project folder, and have that referenced as imported files in the caproj. The output of this function is to be copied and pasted into the caproj. ''' gb = glob_buffer() ext = '.png' filesdir = 'X:/GAME_PROJECTS/c2/Files/' unitdir = 'hero_w' rootdir_name = '%s%s' % (filesdir, unitdir) rootfolder = CaprojFileFolder(rootdir_name, ext, filesdir) gb.buffer += '\n%s' %rootfolder.xml process_folder(rootfolder,gb) fn = 'c:/outputcaproj.txt' f = open(fn,'w') for b in gb.buffer: f.write(b) def process_folder(folder,gb): for c in folder.content: # print(c) if isinstance(c,CaprojFileFolder) == True: # print('hi') gb.buffer += '\n%s' %c.xml process_folder(c,gb) else: gb.buffer += '\n\t%s' %c gb.buffer += '\n</file-folder>' class CaprojFileFolder: ''' The folder class contains info about the folder, eg content, name ''' def __init__(self, path, ext, rootdir): # code below considers trailing / separator like c:/test/folder/ # where the last -1 index will contain ''. code below doesn't allow that '' self.rootdir = rootdir # root for relative path self.ext = ext # allowed file extension self.name = [x for x in path.split('/') if x != ''][-1] self.xml = '<file-folder name="%s">' % self.name self.path = path self.content =  self.get_folder_content() def get_folder_content(self): mf = matchfiles_full(self.path,'*') for m in mf: if os.path.isfile(m) == False: # folder newfolder = self.__class__(m,self.ext, self.rootdir) self.content.append(newfolder) else: fl = [x for x in m.split('/') if x != ''][-1] # check if extension is allowed relpath = self.path[len(self.rootdir):] if fl.endswith(self.ext) == True: fls = '<file name="%s/%s" />' % (relpath,fl) self.content.append(fls)
The class CaprojFolder represents a folder and the contents of the folder (stored in the
content list). An element in
content may either be another CaprojFolder object, or may be a path to a file. The caproj code snippet is written in a text file in the C: drive (!).
Once this snippet is pasted over to the caproj new folders and subfolders would be created in the /Files folder the matches the one found in the file system. The only major difference is the name of the actual files, which I explain below.
Referencing the files
Though the script mimicks the file system folder structure, C2 does not use these folders as a path to the file. In other words, C2’s folders structure is purely for visual organisation within the C2 editor. The files themselves are treated as though they were in the root directory. Therefore, I opted to name the files to represent their full relative path.
For example, say the script references a file:
This file is put under
/Files/hero_w/run. But it is also named, literally:
hero_w/run/000.png, and not just
000.png as you would normally expect. If I had named the file
000.png, there would be no way to distinguish this
000.png with other files in other C2 File subfolders. So a unique name was necessary.