Source: session/lobby/LobbyRatingReport/Score.js

/**
 * This class computes the economic and military score points of each player.
 */
LobbyRatingReport.prototype.Score = class
{
	insertValues(report, playerStates)
	{
		Object.assign(report, {
			"economyScore": playerStates.map(this.economyScore.bind(this)).join(",") + ",",
			"militaryScore": playerStates.map(this.militaryScore.bind(this)).join(",") + ",",
			"totalScore": playerStates.map(this.totalScore.bind(this)).join(",") + ",",
		});
	}

	/**
	 * Keep this in sync with summary screen score computation!
	 */
	economyScore(playerState)
	{
		let total = 0;
		let time = playerState.sequences.time.length - 1;

		// Notice that this avoids the vegetarianFood property of resourcesGathered
		for (let resCode of g_ResourceData.GetCodes())
			total += playerState.sequences.resourcesGathered[resCode][time];

		total += playerState.sequences.tradeIncome[time];

		return Math.round(total / 10);
	}

	militaryScore(playerState)
	{
		let time = playerState.sequences.time.length - 1;

		let totalDestruction =
			playerState.sequences.enemyUnitsKilledValue[time] +
			playerState.sequences.enemyBuildingsDestroyedValue[time] +
			playerState.sequences.unitsCapturedValue[time] +
			playerState.sequences.buildingsCapturedValue[time];

		return Math.round(totalDestruction / 10);
	}

	explorationScore(playerState)
	{
		let time = playerState.sequences.time.length - 1;
		return playerState.sequences.percentMapExplored[time] * 10;
	}

	totalScore(playerState)
	{
		return this.economyScore(playerState) +
		       this.militaryScore(playerState) +
		       this.explorationScore(playerState);
	}
};