Skip to content

Tag Formats#

Tags are in the very early stages of implementation. Currently, all focus is on tag formats and being able to read/write from the data cleanly. Actual implementation of cache files will come at a later date.

Tags - what are they?#

Tags refer to the different kinds of content used within Blamite. Each type of content has its own tag class, which has both a short and long name. More information on tag classes can be found at the Tag classes wiki page. A single cache file can contain many tags.

Our approach to tag classes#

When it comes to using them in a cache file, our approach will be very similiar to how tags exist in official Halo titles. These types of tags will be referred to as "compressed tags". Alternatively, before a tag is compressed, we will have a system in place that isn't compressed, and stores all values in an XML format. This will be for easier editing and updating - these kinds of tags are "uncompressed tags".

Compressed Tags#

Compressed tags store raw data as hex values in a file at specific offsets with specific lengths. These are all determined by the tag class plugin .XML file. This type of tag is what ships with the game and is directly used within .map files.

Uncompressed Tags#

Uncompressed tags are a more flexible type of tag. It stores the same data, but stores it in a plain text XML file. Each property in the tag file has a unique ID that is also present in the plugin .XML file. This type of format is more flexible and is designed to be easily expanded. The placement of properties in an uncompressed tag is unrestricted (although they will still need to be in the same parent XML tag), and any lengths, offsets, and so on is defined by the plugin - NOT the tag. This allows for easy compatibility, so that tags created today could still be recompiled and, in theory, work perfectly under future engine versions. The ID gets matched to the proper location and length in the plugin. If a property is not found in the tag but exists in the plugin, it gets set to 0 or a null equivalent (00 in hex). If a property is found in the tag but doesn't exist in the plugin, then the value gets ignored and does not get placed into the compressed tag.

The main benefit to this system is easy extensibility. New properties can be added without outright breaking old tags, although they must be recompiled. Recompiling tags, however, can be automated to be performed relatively quickly.