Source

loaders/KitLoader.js

/**
* @class KitDefinition
* @category Definitions
* @hideconstructor
*/
export class KitDefinition {
	/** 
	* The ID of this Kit
	* @type {number} 
	*/
	id;

	/**
	 * Color values to find to be replaced for this Spot Anim 
	 * @type {Array} 
	*/
	recolorToFind = [];

	/**
	 * What the color values will be replaced with 
	 * @type {Array} 
	 */
	recolorToReplace = [];

	/**
	 * Textures to find to be replaced for this Object 
	 * @type {Array} 
	*/
	retextureToFind = [];

	/**
	 * What the texture will be replaced with 
	 * @type {Array} 
	 */
	retextureToReplace = [];

	/**
	 * What body part this kit represents
	 * @type {number} 
	 */
	bodyPartId = -1;	
	
	/**
	* Models that compose this kit
	* @type {Array<number>} 
	*/
	models = [];	
	
	/** @type {Array<number>} */
	chatheadModels = [-1, -1, -1, -1, -1];

	/** @type {boolean} */
	nonSelectable = false;
}

export default class KitLoader {

	load(bytes, id) {
		let def = new KitDefinition();
		def.id = id;
		let dataview = new DataView(bytes.buffer);
		do {
			var opcode = dataview.readUint8();
			this.handleOpcode(def, opcode, dataview);
		} while (opcode != 0);

		return def;
	}

	handleOpcode(def, opcode, dataview) {
		switch (opcode) {
			case 0:
				break;

			case 1:
				def.bodyPartId = dataview.readUint8();
				break;

			case 2:
				var length = dataview.readUint8();
				def.models = [];

				for (var index = 0; index < length; ++index)
					def.models[index] = dataview.readUint16();
				break;

			case 3:
				def.nonSelectable = true;
				break;

			case 40:
				var length = dataview.readUint8();
				def.recolorToFind = [];
				def.recolorToReplace = [];

				for (var index = 0; index < length; ++index) {
					def.recolorToFind[index] = dataview.readInt16();
					def.recolorToReplace[index] = dataview.readInt16();
				}
				break;

			case 41:
				var length = dataview.readUint16();
				def.retextureToFind = new short[length];
				def.retextureToReplace = new short[length];

				for (var index = 0; index < length; ++index) {
					def.retextureToFind[index] = dataview.readInt16();
					def.retextureToReplace[index] = dataview.readInt16();
				}
				break;

			default:
				if (opcode >= 60 && opcode < 70) {
					if (def.chatheadModels == undefined) def.chatheadModels = [];
					def.chatheadModels[opcode - 60] = dataview.readUint16();
				} else {
					throw 'Unknown opcode found: ' + opcode;
				}
		}
	}
}