Source: gamesettings/attributes/StartingCamera.js

/**
 * For compatibility reasons, this loads the per-player StartingCamera from the map data
 * In general, this is probably better handled by map triggers or the default camera placement.
 * This doesn't have a GUI setting.
 */
GameSettings.prototype.Attributes.StartingCamera = class StartingCamera extends GameSetting
{
	init()
	{
		this.values = [];
		this.settings.map.watch(() => this.onMapChange(), ["map"]);
	}

	toInitAttributes(attribs)
	{
		if (!attribs.settings.PlayerData)
			attribs.settings.PlayerData = [];
		while (attribs.settings.PlayerData.length < this.values.length)
			attribs.settings.PlayerData.push({});
		for (let i in this.values)
			if (this.values[i])
				attribs.settings.PlayerData[i].StartingCamera = this.values[i];
	}

	/**
	 * Exceptionally, this setting has no Deserialize: it's entirely determined by the map
	 */

	_resize(nb)
	{
		while (this.values.length > nb)
			this.values.pop();
		while (this.values.length < nb)
			this.values.push(undefined);
	}

	onMapChange()
	{
		let pData = this.getMapSetting("PlayerData");
		this._resize(pData?.length || 0);
		for (let i in pData)
			this.values[i] = pData?.[i]?.StartingCamera;
	}
};