Source: session/GameSpeedControl.js

/**
 * This class controls the game speed.
 * The control is only available in single-player and replay mode.
 * Fast forwarding is enabled if and only if there is no human player assigned.
 */
class GameSpeedControl
{
	constructor(playerViewControl)
	{
		this.gameSpeed = Engine.GetGUIObjectByName("gameSpeed");
		this.gameSpeed.onSelectionChange = this.onSelectionChange.bind(this);

		registerPlayersInitHandler(this.rebuild.bind(this));
		registerPlayersFinishedHandler(this.rebuild.bind(this));
		playerViewControl.registerPlayerIDChangeHandler(this.rebuild.bind(this));
	}

	rebuild()
	{
		let player = g_Players[Engine.GetPlayerID()];

		let gameSpeeds = prepareForDropdown(g_Settings.GameSpeeds.filter(speed =>
			!speed.FastForward || !player || player.state != "active"));

		this.gameSpeed.list = gameSpeeds.Title;
		this.gameSpeed.list_data = gameSpeeds.Speed;

		let simRate = Engine.GetSimRate();

		// If the game speed is something like 0.100001 from the game setup, set it to 0.1
		let gameSpeedIdx = gameSpeeds.Speed.indexOf(+simRate.toFixed(2));
		this.gameSpeed.selected = gameSpeedIdx != -1 ? gameSpeedIdx : gameSpeeds.Default;
	}

	toggle()
	{
		this.gameSpeed.hidden = !this.gameSpeed.hidden;
	}

	onSelectionChange()
	{
		if (!g_IsNetworked)
			Engine.SetSimRate(+this.gameSpeed.list_data[this.gameSpeed.selected]);
	}
}