Page MenuHomeWildfire Games

Gamesetup class rewrite
ClosedPublic

Authored by elexis on Dec 18 2019, 5:49 PM.
Tags
None
Subscribers
Restricted Owners Package, Restricted Owners Package, Freagarach and 5 others
Tokens
"Love" token, awarded by asterix."Yellow Medal" token, awarded by Imarok."Hungry Hippo" token, awarded by ffffffff."Like" token, awarded by nani."Love" token, awarded by Krinkle."Pterodactyl" token, awarded by Stan."Love" token, awarded by Angen."100" token, awarded by Freagarach.

Details

Summary

This patch rewrites the gamesetup to use object orientation semantics using class notation, fixing #5322.

Resolves the persist-match-settings problem, fixing #3883.
Protects g_GameAttributes from receiving incompatible, invalid or outdated values, refs #3049.
Paves the way for map-specific setting types refs #4838, chat notifications announcing which settings changed refs D1195, multi-controller gamesetup refs #3806, dedicated server refs #3556, multiplayer-savegame refs #1088, refs https://wildfiregames.com/forum/index.php?/topic/20787-paid-development-2016/
Removes setting coupling that could not be removed with D322.

Also:
Empower map authors to fix a playerslot to an AI, refs #3013, #3049.
Persist all settings when selecting Skirmish maps except where the map determines a value, fixes #3120, #4661, #5372.
Rated games are now only available for 2-player lobby matches, fixes D2117, part of #3950.
Rated games are now indicated by a conspicuous bright red warning message.

Player color palette now read from Skirmish maps.
Values of disabled checkboxes are now indicated by Yes/No labels, fixes D2349, reviewed by nani.
Gamesetup page is kept open after disconnect, so that unread chat messages can still be read, fixes #4114.
Support autostart of matches that aren't the starting_economy_walkthrough, refs rP19599, D11.
Move initSPtips, fixes D1651.
LockedTeams is now enabled by default in multiplayer and persist rated game setting.

Table of Contents

Chapter 1: Analysis of the current gamesetup, refs D322
Chapter 2: Objectives of this gamesetup class rewrite, fixes #5322, refs #5387
Chapter 3: New code design highlight 1: g_GameAttributes Cleanse, refs #3049
Chapter 4: New code design highlight 2: Setting decoupling
Chapter 5: New code design highlight 3: Persist match settings solution, fixes #3883.
Chapter 6: New feature highlight 1: More setting persistence
Chapter 7: New feature highlight 2: More map-determined values
Chapter 8: New feature highlight 3: Gamesetup Usability improvements
Chapter 9: Upcoming features with now solved requirements
Chapter 10: Implementation Highlight 1: Class hierarchy
Chapter 11: Implementation Highlight 2: Deduplication using abstract classes
Chapter 12: Implementation Highlight 3: Recursive updateGameAttributes approach
Chapter 13: Transported problem 1: user-setting preservance and map determination of gamesettings
Chapter 14: Transported Problem 2: Broken "Skirmish" maptype
Chapter 15: Transported Problem 3: PopulationCapacity, StartingResources
Chapter 16: Performance evaluation
Chapter 17: Correctness evaluation considering planned Multi-controller gamesetup, refs #3806

Chapter 1: Analysis of the current gamesetup, refs D322

Objectives of the last gamesetup rewrite in D322:

Achieved:

  • Deduplication: almost no line written twice

Partially achieved:

  • Decoupling: have only 1 hunk per setting type
  • Flexibility: Allow insertion of gamesettings by only specifying one new object

Problems with the D322 approach:

  • One object per setting, but there is no "this" instance, thus having to resort to global variables when requiring a state per setting. For example g_MapFilterList, g_MapSelectionList, g_BiomeList.
  • Some assumptions were made to further deduplication that are problematic for settings that only exist on one map

Chapter 2: Objectives of this gamesetup class rewrite, fixes #5322, refs #5387

  • Transition to object semantics using class syntax. This gains the ability to implement unique setting logic utilizing object local state.
  • Remove remaining coupling of settings logic. This gains the ability to implement new settings without having to modify existing settings.
  • Remove global variables and procedures.
  • Keep duplication minimal.
  • Facilitate integration of planned features.

Chapter 3: New code design highlight 1: g_GameAttributes Cleanse, refs #3049

There are many values written to g_GameAttributes that are invalid or irrelevant.
This was reported in #3049 for instance:

The code could also use some improvement such that the persistent game settings can work with just storing the minimum of information needed to recreate the settings instead of saving everything and then hoping that it doesn't cause conflicts/issues later

The list of values that are conditionally invalid or entirely irrelevant:

  • g_GameAttributes.settings.VictoryScripts had been useless and is deleted, introduced by rP15427
  • WonderDuration, RelicDuration, RelicCount not defined anymore if the victory condition isn't met
  • g_GameAttributes.mapType == g_GameAttributes.settings.mapType from rP12756 requiring simulation changes
  • Nomad is not stored anymore if it is irrelevant (i.e. not a random map)
  • Rating is not stored anymore if the match is not setup in the lobby or if it has more than 2 players.
  • LastManStanding is not be stored anymore if LockedTeams is enabled
  • SupportedTriggerDifficulties is never copied to g_GameAttributes anymore
  • SupportedBiomes is never copied to g_GameAttributes anymore
  • Biome is not stored anymore if the map doesn't support Biomes
  • TriggerDifficulty is not stored anymore if the map has no trigger difficulties
  • mapPath never stored anymore
  • PlayerData not copying everything anymore, only whitelisted properties, and only on mapchange, thus not being needed to be deleted explicitly anymore between mapchanges (e.g. DisabledTechs, StartingResources, ...)
  • Map Description never copied anymore
  • MapName copied for now since it means the replay menu doesnt have to load all maps when opening the page and since various GUI pages (savegame, gamedescription.js), and rmgen (rmgenlogger) consume it currently.

The following diff illustrates the values that had been written before to g_GameAttributes and are removed in this patch:

--- before	2019-12-17 14:33:55.600037886 +0100
+++ after	2019-12-17 14:33:38.086704002 +0100
@@ -1,68 +1,54 @@
 {
 	"settings": {
 		"PlayerData": [{
 			"Name": "elexis",
-			"AI": "",
-			"AIDiff": 3,
-			"AIBehavior": "random",
+			"AI": false
 			"Civ": "maur",
 			"Color": {
 				"r": 21,
 				"g": 55,
 				"b": 149
 			},
 			"Team": -1
 		}, {
 			"Name": "Marcus Vipsanius Agrippa",
 			"AI": "petra",
 			"AIDiff": 3,
 			"AIBehavior": "random",
 			"Civ": "rome",
 			"Color": {
 				"r": 150,
 				"g": 20,
 				"b": 20
 			},
 			"Team": -1
 		}],
 		"AISeed": 2207312901,
 		"Ceasefire": 0,
 		"CheatsEnabled": true,
 		"CircularMap": true,
-		"Description": "Each player starts the match atop a large flat plateau.\n\nTo the East lies a large bay with fishing opportunities. To the West is a rugged hinterland with an unclaimed plateau commanding the valley below.",
 		"DisableSpies": false,
 		"DisableTreasures": false,
 		"ExploreMap": false,
-		"Keywords": [],
 		"LastManStanding": false,
 		"LockTeams": false,
 		"Name": "Acropolis Bay (2)",
-		"Nomad": false,
 		"PopulationCap": 300,
-		"Preview": "acropolis_bay.png",
-		"RegicideGarrison": false,
-		"RelicCount": 2,
-		"RelicDuration": 20,
 		"RevealMap": false,
 		"Seed": 813227136,
-		"Size": 256,
 		"StartingResources": 300,
 		"TriggerScripts": ["scripts/TriggerHelper.js", "scripts/ConquestCommon.js", "scripts/Conquest.js"],
 		"VictoryConditions": ["conquest"],
-		"VictoryScripts": ["scripts/TriggerHelper.js", "scripts/ConquestCommon.js", "scripts/Conquest.js"],
-		"WonderDuration": 20,
-		"mapType": "skirmish"
 	},
 	"engine_version": "0.0.24",
 	"gameSpeed": 1,
 	"map": "maps/skirmishes/Acropolis Bay (2)",
-	"mapFilter": "default",
-	"mapPath": "maps/skirmishes/",
 	"mapType": "skirmish",
 	"matchID": "CCA3D3B3ABCDA335",
 	"mods": [
 		["public", "0.0.24"]
 	],
 	"timestamp": 1576589047
 }

The gamesetup rewrite facilitates erasure of these irrelevant or invalid values by having one class per setting type, thus providing more room for code to detect whether a setting is invalid or not.
The new gamesetup avoids copying all settings of a selected map to g_GameAttributes, thus avoiding to write a value that has to be conditionally deleted later on, and avoiding to copy values that no consumer or handler exists for.
At last, some map specific values are only copied when the match starts, so that the values don't have to be deleted or reset between map selections.

Chapter 4: New code design highlight 2: Setting decoupling

While decoupling settings (1 setting = 1 hunk of code) was an objective of D322, it failed to achieve it completely due to the lack of a "this" reference (class semantics).

The functions reloadMapFilterList, reloadMapList, selectMap, sanitizePlayerData, swapPlayers, ensureUniquePlayerColors, nitDefaults, reloadMapSpecific, reloadTriggerDifficulties, reloadBiomeList, reloadGameSpeedChoices
were either called from setting functions that should be agnostic of these settings types or wrote setting values that they should be agnostic of (see https://en.wikipedia.org/wiki/Information_hiding).

This is not only ugly code, but it actually prevents gamesetup developers from introducing new settings without having to modify other settings,
which again prevents mod developers from inserting new gamesetup code without copying and modifying existing gamesetup code,
which again makes it more likely that two gamesetup mods inserting a feature become incompatible,
this ultimately makes it impossible for every map to introduce a map specific setting, as each of them would have to be hardcoded in the gamesetup.js code.

Consider these examples:

-function selectMap(name)
-{
-	// Reset some map specific properties which are not necessarily redefined on each map
-	for (let prop of ["TriggerScripts", "CircularMap", "Garrison", "DisabledTemplates", "Biome", "SupportedBiomes", "SupportedTriggerDifficulties", "TriggerDifficulty"])
-		g_GameAttributes.settings[prop] = undefined;
-
-	let mapData = loadMapData(name);
-	let mapSettings = mapData && mapData.settings ? clone(mapData.settings) : {};
-
-	if (g_GameAttributes.mapType != "random")
-		delete g_GameAttributes.settings.Nomad;
-
-	if (g_GameAttributes.mapType == "scenario")
-	{
-		delete g_GameAttributes.settings.RelicDuration;
-		delete g_GameAttributes.settings.WonderDuration;
-		delete g_GameAttributes.settings.LastManStanding;
-		delete g_GameAttributes.settings.RegicideGarrison;
-	}
-function loadPersistMatchSettings()
-{
-	...
-	if (!g_IsNetworked)
-		mapSettings.CheatsEnabled = true;
-
-	// Replace unselectable civs with random civ
-	let playerData = mapSettings.PlayerData;
-	if (playerData && g_GameAttributes.mapType != "scenario")
-		for (let i in playerData)
-			if (!g_CivData[playerData[i].Civ] || !g_CivData[playerData[i].Civ].SelectableInGameSetup)
-				playerData[i].Civ = "random";
-
-	if (mapSettings.PlayerData)
-		sanitizePlayerData(mapSettings.PlayerData);
-
-	reloadMapFilterList();
-	reloadMapSpecific();
-
-	g_GameAttributes.settings.RatingEnabled = Engine.HasXmppClient();
-	Engine.SetRankedGame(g_GameAttributes.settings.RatingEnabled);
-
-	supplementDefaults();
-
-	...
-}
-function launchGame()
-{
-	...
-
-	// Select random map
-	if (g_GameAttributes.map == "random")
-		selectMap(pickRandom(g_Dropdowns.mapSelection.ids().slice(1)));
-
-	if (g_GameAttributes.settings.Biome == "random")
-		g_GameAttributes.settings.Biome = pickRandom(
-			typeof g_GameAttributes.settings.SupportedBiomes == "string" ?
-				g_BiomeList.Id.slice(1).filter(biomeID => biomeID.startsWith(g_GameAttributes.settings.SupportedBiomes)) :
-				g_GameAttributes.settings.SupportedBiomes);
-
-	g_GameAttributes.settings.VictoryScripts = g_GameAttributes.settings.VictoryConditions.reduce(
-		(scripts, victoryConditionName) => scripts.concat(g_VictoryConditions[g_VictoryConditions.map(data =>
-			data.Name).indexOf(victoryConditionName)].Scripts.filter(script => scripts.indexOf(script) == -1)),
-		[]);
-
-	g_GameAttributes.settings.TriggerScripts = g_GameAttributes.settings.VictoryScripts.concat(g_GameAttributes.settings.TriggerScripts || []);
-
-	g_GameAttributes.settings.mapType = g_GameAttributes.mapType;
-
-
-	// Determine random civs and botnames
-	for (let i in g_GameAttributes.settings.PlayerData)
-	{
-		// Pick a random civ of a random culture
-		if (chosenCiv == "random")
-		....
-		g_GameAttributes.settings.PlayerData[i].Civ = chosenCiv;
-
-		// Pick one of the available botnames for the chosen civ
-		...
-	}
-	...
-}
-		"enableRating": {
-			...
-			"set": checked => {
-				...
-				if (checked)
-				{
-					g_Checkboxes.lockTeams.set(true);
-					g_Checkboxes.enableCheats.set(false);
-				}
-			},
-function launchTutorial()
-{
-	g_GameAttributes.mapType = "scenario";
-	selectMap("maps/tutorials/starting_economy_walkthrough");
-	launchGame();
-}
-function sanitizePlayerData(playerData)
-{
-	// Remove gaia
-	if (playerData.length && !playerData[0])
-		playerData.shift();
-
-	playerData.forEach((pData, index) => {
-
-		// Use defaults if the map doesn't specify a value
-		for (let prop in g_DefaultPlayerData[index])
-			if (!(prop in pData))
-				pData[prop] = clone(g_DefaultPlayerData[index][prop]);
-
-		// Replace colors with the best matching color of PlayerDefaults
-		if (g_GameAttributes.mapType != "scenario")
-		{
-			let colorDistances = g_PlayerColorPickerList.map(color => colorDistance(color, pData.Color));
-			let smallestDistance = colorDistances.find(distance => colorDistances.every(distance2 => (distance2 >= distance)));
-			pData.Color = g_PlayerColorPickerList.find(color => colorDistance(color, pData.Color) == smallestDistance);
-		}
-
-		// If there is a player in that slot, then there can't be an AI
-		if (Object.keys(g_PlayerAssignments).some(guid => g_PlayerAssignments[guid].player == index + 1))
-			pData.AI = "";
-	});
-
-	ensureUniquePlayerColors(playerData);
-}
-

This antipattern is called https://en.wikipedia.org/wiki/Shotgun_surgery because introducing one new setting requires changing many places of the code, when it should only be necessary to insert one new class.

The gamesetup class rewrite introduces the event-subscription system known from the lobby rP23172, savegame rP22985 and session dialogs rP23076 class implementation to remove the remaining coupling of settings.

Hence without the gamesetup class rewrite it was unfeasible if not impossible for map makers to introduce map specific setting types, refs #4838,
thus also eases implementation of new features (as one doesnt have to learn all the other code) and completes the objective of D322 to decouple setting types.

Chapter 5: New code design highlight 3: Persist match settings solution, fixes #3883.

GameSettingsFile.js is the successor of the "persistmatchsettings" implementation from .
The persistent persist-match-settings problem is solved by the new updateGameAttributes approach and the concept change that every setting now only hardcodes its dependencies and self-corrects its own value.
The new gamesetup classes do not assume g_GameAttributes to have been formed correctly by the other gamesetting classes.
This way, if a broken gamesettings file is loaded (or received from a map, from a formerly selected map or from a malicious netclient in the future),
invalid values for that handlers exist will be deleted or defaulted instead of throwing errors.

The new persist-match-settings code only consists of writing g_GameAttributes to a JSON file, and loading that file and calling updateGameAttributes.
So the solution to fix persist-match-settings was to rewrite all code except the persist-match-settings code in fact.

There are only two exceptions where properties are copied without examination and whitelisting:

  • Loading the settings file from disk assigns the entire object. It still yields a correct state after loading because it was saved as a correct state (following the mod check). Invalid files should not result in errors, in the worst case in dead properties in g_GameAttribute as before.
  • Receiving the settings object from the server copies the entire object. When other clients become able to send g_GameAttribute settings (see #3806), then they might be able to insert dead properties to g_GameAttributes, unless that patch introduces a function that copies the properties individually in every setting class instance.

So these two remaining known cases of storing non-whitelisted property values can be addressed in the multi-controller patch by adding a new function to every class that copies whitelisted properties.

Other than that the problem is considered fixed by the setting decoupling and class semantics provided in this patch.

Chapter 6: New feature highlight 1: More setting persistence

  • Fixes #3120 persist civ when switching skirmish map
  • Fixes #4661 persist civctory condition when switching skirmish map
  • Fixes #5372 persist settings when switching maptype to random
  • ColorPicker now preserves the color setting between mapchanges

Chapter 7: New feature highlight 2: More map-determined values

  • Map specified AI now means the playerslot cannot be assigned to a human player, fixes part of #3013, #3049.
  • Map specified Civ now means the Civ is fixed for that slot.
  • ColorPicker now supports the color palette of skirmish maps. ColorPicker preserves the user color choice on skirmish maps by selecting the most similar color that the map provides

Chapter 8: New feature highlight 3: Gamesetup Usability improvements

  • Default change: LockedTeams is now enabled by default in multiplayer, instead of only in lobby matches by default
  • Default change: Rated game setting is now persisted too instead of defaulting to true when starting a new lobby match
  • Rated games are now only available for 2-player lobby matches, fixes D2117, part of #3950
  • Rated games are now indicated by a conspicuous bright red warning message.
  • Values of disabled checkboxes are now indicated by Yes/No labels, fixes D2349, reviewed by nani.
  • Gamesetup page is kept open after disconnect, so that unread chat messages can still be read, fixes #4114.

Also Fixes D1651, move initSPtips, and support autostart of matches that aren't the starting_economy_walkthrough, refs rP19599, D11.

Chapter 9: Upcoming features with now solved requirements

The gamesetup class implementation rectifies conceptual gamesetup flaws that blocked implementation of these features:

  • Chat notifications that announce which settings changed D1195
  • Easier introduction of new generic types of setting controls (for example slider, refs #4381)
  • Easier introduction of map specific gamesettings #4838 #3049
  • Remote clients being selectively permitted to change gamesettings #3806 D431
  • This in turn would allow to solve the rated-game 1v1 fakery problem by implementing a lobby bot hosting rated games
  • refs #4838 map specific settings

refs #4379 Arbitrary starting resources in the gamesetup
refs #3049 Rewrite/restructure gamesetup
refs #3013 Gamesetup - Improve match setup support for special (trigger) map
refs #3806 Gamesetup - Optionally allow players to setup the game
refs #3556 Dedicated server
refs #1088 multiplayer-savegame loading (since individual gamesetting handlers are now more able to react to a savegame-loading matchsetup constraint than they were with the D322 approach)

Chapter 10: Implementation Highlight 1: Class hierarchy

As familiar from the previous GUI class rewrites (see #5387), there is now one handler class per logical setting.
This is one class per game setting value, a class per unique UI element that has some code.
As before, the only network synchronized state is g_GameAttributes and g_PlayerAssignments, the other states are local to the classes and are determined by these two global states.
Few classes like the GameSettingsControl, PlayerAssignmentsControl, StartGameControl are introduced that are interfaces to these data models and events and are accessed by all the individual UI and gamesetting handler classes.

gamesetup/ folder changes:

  • Previously 67 global functions declarations were stored in one JS file, and all GUI objects in one XML file. Now it's stored in 75 js files, 21 xml files, 1 json file in 14 folders:
Controls/
GameSettings/
GameSettings/PerPlayer/
GameSettings/PerPlayer/Dropdowns/
GameSettings/PerPlayer/Buttons/
GameSettings/Single/
GameSettings/Single/Checkboxes/
GameSettings/Single/Dropdowns/
Panels/
Panels/Chat/
Panels/Chat/ChatMessages/
Panels/Buttons/
NetMessages/

This was the most intuitive approach with the greatest amount of decoupling.
The code was obtained by moving each logic brick into an own class.
If two different purposes of a class were identified, usually the class was split into two more simple classes.
This furthers understanding, modifying and extending individual components of the gamesetup implementation without having to understand or modify or extend the surrounding code and files.
For mods this has the advantage that they dont have to overwrite an entire GUI page implementation to copy & modify a part of it.

  • gamesetup.js There were 59 global variable declarations using the var keyword in gamesetup.js. These were entirely removed in this patch for the introduction of one GamesetupPage class global that owns the individual handlers. There were 200 inline functions for gamesetting controls, 67 function declarations and 20 function expressions for netmessage event handlers. Now there 80 these classes:
ChatMessageEvents.ClientChat = class
ChatMessageEvents.ClientConnection = class
ChatMessageEvents.ClientKicked = class
ChatMessageEvents.ClientReady = class
ChatMessageEvents.GameSettingsChanged = class
class CancelButton
class ChatInputAutocomplete
class ChatInputPanel
class ChatMessageEvents
class ChatMessagesPanel
class ChatPanel
class CivInfoButton
class GameDescription
class GameRegisterStanza
class GameSettingControl
class GameSettingControlCheckbox extends GameSettingControl
class GameSettingControlDropdown extends GameSettingControl
class GameSettingControlManager
class GameSettingControls
class GameSettingsControl
class GameSettingsFile
class GameSettingsPanel
class GameSettingTabs
class GameSettingWarning
class GamesetupPage
class LoadingWindow
class LobbyButton
class MapCache
class MapPreview
class NetMessages
class PlayerAssignmentItem
PlayerAssignmentItem.AI = class
PlayerAssignmentItem.Client = class
PlayerAssignmentItem.Unassigned = class
class PlayerAssignmentsControl
class PlayerConfigButton
class PlayerFrame
class PlayerName
class PlayerSettingControlManager
class PlayerSettingControls
class ReadyButton
class ReadyControl
class ResetCivsButton
class ResetTeamsButton
class SoundNotification
class StartGameButton
class StartGameControl
class StatusMessageFormat
class TimestampWrapper
class TipsPanel
class Tooltip
class VictoryConditionCheckbox extends GameSettingControlCheckbox
GameSettingControls.Biome = class extends GameSettingControlDropdown
GameSettingControls.Ceasefire = class extends GameSettingControlDropdown
GameSettingControls.Cheats = class extends GameSettingControlCheckbox
GameSettingControls.ExploredMap = class extends GameSettingControlCheckbox
GameSettingControls.GameSpeed = class extends GameSettingControlDropdown
GameSettingControls.LastManStanding = class extends GameSettingControlCheckbox
GameSettingControls.LockedTeams = class extends GameSettingControlCheckbox
GameSettingControls.MapFilter = class extends GameSettingControlDropdown
GameSettingControls.MapSelection = class extends GameSettingControlDropdown
GameSettingControls.MapSize = class extends GameSettingControlDropdown
GameSettingControls.MapType = class extends GameSettingControlDropdown
GameSettingControls.Nomad = class extends GameSettingControlCheckbox
GameSettingControls.PlayerCount = class extends GameSettingControlDropdown
GameSettingControls.PopulationCap = class extends GameSettingControlDropdown
GameSettingControls.Rating = class extends GameSettingControlCheckbox
GameSettingControls.RegicideGarrison = class extends GameSettingControlCheckbox
GameSettingControls.RelicCount = class extends GameSettingControlDropdown
GameSettingControls.RelicDuration = class extends GameSettingControlDropdown
GameSettingControls.RevealedMap = class extends GameSettingControlCheckbox
GameSettingControls.Spies = class extends GameSettingControlCheckbox
GameSettingControls.StartingResources = class extends GameSettingControlDropdown
GameSettingControls.Treasures = class extends GameSettingControlCheckbox
GameSettingControls.TriggerDifficulty = class extends GameSettingControlDropdown
GameSettingControls.WonderDuration = class extends GameSettingControlDropdown
PlayerSettingControls.PlayerAssignment = class extends GameSettingControlDropdown
PlayerSettingControls.PlayerCiv = class extends GameSettingControlDropdown
PlayerSettingControls.PlayerColor = class extends GameSettingControlDropdown
PlayerSettingControls.PlayerTeam = class extends GameSettingControlDropdown

Chapter 11: Implementation Highlight 2: Deduplication using abstract classes

Deduplication is an important milestone reached in D322.
It was reached using the g_Dropdowns, g_PlayerDropdowns and g_Checkboxes approach.
The deduplication is transported to classes using using GameSettingControl, GameSettingControlCheckbox, GameSettingControlDropdown abstract base classes.

The only de-deduplication that is introduced in this patch is that these classes now again check whether a g_GameAttributes property should exist and be defaulted or whether it should be deleted,
whereas the previous code just always defined it.
Notice that the code is so different per gamesetting in almost all cases that the few reintroduced lines of code (setting defaulting logic) is arguably not qualifying as duplication.
Aside from that having been necessary to achieve more setting control freedom / practical expressivity.

Chapter 12: Implementation Highlight 3: Recursive updateGameAttributes approach

In the previous chapters it was explained how the gamesetup class rewrite leverages decoupling by using class semantics and an event-subscription system.
This chapter explains how decoupling and setting sanitization is furthered beyond these two factors.

  1. updateGameAttributes:
  2. In the previous code, each time g_GameAttributes was changed, updateGUIObjects was called. updateGUIObjects has checked that every setting value is defined (regardless whether that makes sense or not) and updated the dropdown, checkbox and label objects. It did that in a hardcoded (see "initOrder" property), so it did O(n) function calls where n is the number of settings.
-var g_Dropdowns = {
-	"mapType": {
-		"initOrder": 1
-	},
-	"mapFilter": {
-		"initOrder": 2
-	},
-	"mapSelection": {
-		"initOrder": 3
-	},
-	"mapSize": {
-		"initOrder": 1000
-	},
-	"biome": {
-		"initOrder": 1000
-	},
-	...

It means:
The mapfilter values depend on the maptype.
The mapselection values depend on the maptype and mapfilter.
The biomelist values depend on the selected map.
Some gamesettings are only available if a specific victory condition is enabled.
This ordering is required by an initOrder approach to correspond to that, whereas in the new code there is no init order to take care of.

This approach is incompatible with introducing mod-specific, map-specific (#4838) and other setting types that may depend on each others values while remaining necessary to be unaware of each other code-wise (Shotgun surgery), because the initOrder number of a new setting cannot be determined if there is no knowledge of all settings and their initOrder numbers.
Especially if some settings only exist on some selected maps, then an initOrder number may in theory even be valid for one set of selected matchsettings and invalid for another set of selected settings.

  • The successor of updateGUIObjects is the GameSettingsControl.updateGameAttributes function. The hardcoding of the initOrder is removed by calling updateGameAttributes every time g_GameAttributes is changed, i.e. it becomes something like O(n²) function calls in the worst case, when every gamesetting changes its value in reaction to a changed value once. This should not be a performance issue, since typically only one setting value changes at a type except upon mapchange and page load. The work that is performed if settings are changed (creating and passing many dropdown list arrays for instance) by far outweighs the cost of empty function calls (function calls that end with an immediate early return). The gain of removing the hardcoded order is that gamesettings become more unaware of each other, which enables developers to implement more gamesettings without having to modify the existing code to account for the changes.
  1. launchGame approach: When starting the match, random civs, random map, random biome selection etc. were resolved by picking a random item. This was hardcoded in the launchGame function, so it required authors of new gamesetting types to modify the gamesetup code instead of just adding new code. This is removed by splitting that function into handlers and letting each gamesetting apply its changes itself when the game is launched (i.e. its only one new class to add when adding a new gamesetting).

Chapter 13: Transported problem 1: user-setting preservance and map determination of gamesettings

Problem: There is a gaping contradiction between the persisting userchosen settings feature and the feature that maps may overwrite the userchosen settings.
As a result people want two features that break each other, thus not being able to have either of the features, thus having broken code for years and many trac tickets.

The two concepts that contradict:
A) User settings persist - Match settings defacto persist between gamesetup page access, random map selections. So settings never change when players change the random map, therefore they also expect the settings to not change. Therefore if one of the maps suddenly changes a setting behind their back, noone notices, the game is started with the wrong settings, needs to be abandoned and the matchsetup has to start from the beginning.
B) User settings do not persist - Map authors wish to be able to set map settings (on skirmish and random maps).

Most multiplayer matches take place on random maps because they adapt to any user setting, allowing players to shape the match according to their wishes, rather than the map shaping the match the players will experience.
When players join the match, they start negotiating the gamesettings, the teams, the map, the victory condition, dozens of settings.
When players change any setting, including the random map, all their settings will be persisted.
Since there are many gamesettings (30+?) and since there is no notice which setting changed upon mapselection(see D1195), players most often do not notice when one of the settings is changed 'behind their back'.

This expressed itself in many tickets:

Pro map-determined settings:

  • In #1834 it is proposed to random maps should be able to restrict the mapsize (i.e. change user setting instead of adapting to it)
  • In a rP19449 comment it is proposed that the wall demo map should change the RevealMap (instead of revealing that from a triggerscript)
  • In #3049 it is proposed that some settings should be fixed while others can be changed (e.g. allowing the player to assign himself to slots 1 and 3 on a 4 player map"
  • In #3013 it is proposed that the user should not be able to change Player Placement ("You" and "AI" type should not be changeable)

Pro user-setting-persistence:

  • In #2963: Preserve game settings after launching/canceling a game
  • In #2982: The "preserve match settings" should also save player-assignments
  • In #3120: persist civ when switching skirmish map
  • In #4587 someone is surprised that the map modifies RevealedMap but not ExploredMap
  • In #4661: persist civctory condition when switching skirmish map
  • In #5372: persist settings when switching maptype to random
  • The random map type has a "Random map" item, i.e. a random map is chosen when the game starts. This can ONLY happen if the random map adapts to the user settings. If the player choses a tiny map size but the randomly chosen map doesnt support tiny maps (#1834) then the game cannot start or the game is started with settings that the users didnt agree on (surprise match, contradicting the ready button feature).
  • refs #3165 persist rating bug
  • Refs #3209 each mapselection all victory conditions were reset to default (including random maps, while all other settings persisted there)

This is only an excerpt of the manifestations of the contradiction.
So as a matter of fact one can't have both features completely at the same time and one can't tell either of the parties that their feature will be removed because it's perceived already halfway implemented, just defective.

So it seems one can only mitigate the consequences of the contradiction, which is that players should be better notified if the map changes the value.
In D1195 a feature is proposed that informs players which gamesetting changed.
This would at least increase the likelihood that players notice that a map has changed a value 'behind their back'.
But even ideally informed players will still have the advantage that the settings that they negotiated before are lost and have to be renegotiated.
So this is only diluting the problem, not fixing it.

How the contradicting features are handled in this patch:
As of this rewrite, settings are only reset when changing a scenario map.
This means all settings are persisted when one changes the maptype from Skirmish to Random or vice versa, and also preserved when selecting a different Skirmish map (fixing mentioned tickets).

Secondly, if the map specifies an AI player, it will now be considered a fixed assignment.
This will be a nuisance to players who browse through maps and have their assignments peristed now more often, but completely reset when they browsed one of the maps.

As you can see the conceptual flaw is continued in this patch, it cannot be fixed in this patch, but the patch can help to reduce the impact of the problem by easing implementation of the notification which gamesettings changed in D1195.

Chapter 14: Transported Problem 2: Broken "Skirmish" maptype

As mentioned in Chapter 4, there are for example #3049 and #3013 mandating that maps can determine some settings.
This must mean Skirmish and Random maps, because for Scenario maps every setting is fixed.
It seems reasonable, because it allows for the use case that two players are AI players that are tailorsuited to this map (for example Jebel Barkal or Danubius).

So it is asked that a Skirmish map can specify which values are free and which values are fixed.
But then Scenario maps are nothing but a special case of a Skirmish map, i.e. a Skirmish map that fixes many settings.

In D1246 it is proposed that Scenario maps don't fix the LockedTeams setting and allow players to change it.
In D1704 it is proposed that Scenario maps don't fix the PopulationCap setting and allow players to change it.

If these wishes are all followed, then there is no difference between a Scenario map and a Skirmish map anymore.

Conclusion: Allowing maps to selectively fix gamesettings obsoletes the "Skirmish" maptype.

How it relates to this patch:
This patch cannot fix the "gamesetup rewrite" ticket that is asking for maps to fix some gamesettings completely.

This would involve more changes:

  • The g_GameAttributes format used by the map JSON data, gamesetup (and later used by rmgen and simulation) would be changed to not only store values but also whether the values are hidden or enabled on this specific map). For example { "RevealMap": { "hidden": false, "enabled": true, "value": true } }.
  • Atlas should be able to determine which settings are fixed.
  • Skirmish maptype may be deleted.

Chapter 15: Fixed Problem: Per-Player PopulationCapacity, StartingResources

The PopulationCapacity and StartingResources can be both specified per-player as well as global, but only the global limits end up in the game.

  • The Atlas editor allows specifying starting resources and population per player for Skirmish and Scenario maps.
  • Per-player population field is overwritten by the gamesetup following rP12756, #812.

This had been reported at #4504, #4379, #5371, D1704, rP12756 and more places.

This patch changes the simulation code to consume the per-player value if specified, otherwise consume the global value.

In the future, the AIConfig dialog may become extended to allow players to specify per-player StartingResources and PopulationLimit (and picking a Hero for Regicide).

Inline Comments

refs #4463 Prevent the server from breaking client approval

  • MapCache.js: Previously maps were cached too, but only of the selected maptype, whereas now maps of all maptypes are cached (because why not). The old problem that some maps specify gaia and others dont is not addressed here to avoid having to change many maps to become consistent.
  • Split ReadyButton and StartButton

default.cfg:

  • dropdown menus, the GameSettingsPanel and the main menu background are animated, so 30 FPS in the menu are visibly noticeably less favorable than 60 FPS

sprite:

  • Gamesettings panel sprite Z hack workaround is still weird and ugly. It looks now differently since GameSetup.xml was restructured to be hierarchical, but the workaround was inserted with a size greater than the new parent (100% of the screen).

gamedescription.js:

  • filter is a gamesetup GUI setting only, hence not shown in the gamedescription (since the purpose of that is to inform about the game that is to come)

StartGameControl.js

  • Documented the cheat-prevention principle of gamesetup and a related TODO, see #4463

Chapter 16: Performance evaluation

Gamesetting changes consume 30-60ms (Update: 10ms) depending on what changed.
While there is some new overhead introduced with the recursion, most calls should perform little to no work, and in particular not more than they did before (enabled/hidden/dropdown list value changes).

There is a performance benefit with this iteration of the gamesetup rewrites in comparison to the previous code (D322), because many of the dropdown list items are not rebuilt anymore (for example player civ or mapsize selection) and the ones that are rebuilt conditionally are not rebuilt everytime anymore, but only when their dependent condition changed (for example biomes only on mapchange, not every setting change).

For scenario and skirmish map selection changes the performance seems to be slower (Update: are much faster) than before (still in the range of 50ms (Update: 10ms) per selected map , so still negligible in comparison to the gained bugfixes).

A low hanging fruit for performance improvements would be to make IGUIObject.cpp properties ignore changes if the value didn't actually change. For example setting hidden=false or enabled=false when it already is false.

Without patch there are consecutive updateGUIObject calls on init:

With the (edit: first verison of the) patch we have a better chance to see that the order of magnitude of the updateGameAttributes performance depends primarily on the setting values themselves that changed:

Update 2017-01-07:
With the performance update from 2017-01-07, the GUI objects are only updated on onGameAttributesBatchChange instead of the recursive onGameAttributesChange.
This means GUI objects are updated only once when a new gamesettings message arrives or when the controler changed a setting (including implicit consecutive setting changes).


This means the code in this revision proposal will make the code more performant in any case.
If we take the numbers 50-60ms previously and 10ms now, it's a factor of 5-6 more performance (numbers can vary by a factor of 2 or something depending on settings).

Chapter 17: Correctness evaluation considering planned Multi-controller gamesetup, refs #3806

To determine the correctness of the gamesetup class rewrite, one has to consider what greater features are/were to come.
The dedicated server feature #3556 requires remote clients to be able to setup the game, see #3806.
This was proposed to be implemented by implementing a way other than sending g_GameAttributes over the networked, in https://github.com/0ad/0ad/compare/master...Imarok:just_another_gamesetup_rewrite
In the scope of that ticket it was also considered to change g_GameAttributes to become an array of settings, not a nested object.

It seems this second way to change g_GameAttributes is not necessary following the gamesetup class rewrite anymore,
as every setting handler may determine safely whether to accept or reject a clients g_GameAttributes selectively,
without having to restructure g_GameAttributes,
without having to add a new network message to change an individual setting.
Notice that the D1195 feature equally needs to examine the setting changes and can now perfectly do so without this restructuring.

Implementing a new interface (new gamesetup function and a new network message type) to only change one GameAttribute without restructuring g_GameAttributes to remove its nesting would mean that
the NetServer still has to broadcast g_GameAttributes occasioanlly (when first joining a match for instance).
This again means that the NetServer needs to receive full g_GameAttributes from a trusted NetClient.
This seems to indicate that nothing is gained in terms of security (as a malicious client could still change more settings) and
nothing gained in terms of code complexity since there are now 2 ways to test the data for changes.

So it seems the gamesetup class rewrite may facilitate implementing those new features (multi-controller match setup, dedicated server, multiplayer savegames).
The work on that will show.
In the worst case, when some g_GameAttributes handling has to be restructured, it would probably still be easier to following the gamesetup class rewrite due to the performed decoupling.

Addendum:

315 adjectives for the opposite of entertaining from https://www.wordhippo.com/what-is/the-opposite-of/entertaining.html

boring
uninteresting
drab
dreary
dull
flat
heavy
humdrum
jading
leaden
monotonous
pedestrian
pleasureless
ponderous
stodgy
stuffy
tedious
tiresome
tiring
wearisome
weary
wearying
bad
depressing
disagreeable
dramatic
laborious
repellent
repulsive
sad
serious
tragic
unaffecting
unamusing
unenjoyable
unexciting
unfunny
unhappy
unpleasant
unstimulating
plodding
wearing
exhausting
trying
mundane
fatiguing
unimaginative
commonplace
ordinary
mind-numbing
routine
uneventful
mediocre
ho-hum
uninspired
prosaic
unvaried
soulless
mindless
run-of-the-mill
burdensome
unvarying
soul-destroying
banal
dry
unremarkable
grinding
enervating
sapping
draining
jejune
slow
stressful
uncreative
crushing
repetitious
tough
arid
lifeless
strenuous
vapid
long-drawn-out
everyday
monochrome
soporific
uninspiring
colorlessUS
colourlessUK
exacting
dreich
lacking variety
average
gruelingUS
gruellingUK
stale
punishing
taxing
rigorous
demanding
challenging
arduous
irksome
workaday
repetitive
back-breaking
difficult
onerous
common
vanilla
quotidian
day-to-day
bland
overlong
lacklusterUS
lacklustreUK
deadly dull
hard
crippling
matter-of-fact
unoriginal
derivative
turgid
annoying
exasperating
troublesome
oppressive
uphill
normal
stupid
banausic
stringent
typical
customary
usual
hackneyed
dusty
trite
regular
insipid
OK
draggy
drudging
prolix
interminable
so-so
prosy
mechanical
long-winded
deadly
endless
bog-standard
half-pie
as dry as dust
pestilential
samey
dullsville
hacky
murderous
bothersome
hellish
vexatious
enervative
exigent
strict
killing
garden variety
plain vanilla
not so hot
common or garden
no great shakes
not up to much
nothing to write home about
unpalatable
unwelcome
clean
unsavouryUK
displeasing
unsavoryUS
moral
offensive
horrible
dead
foul
distasteful
nasty
unsatisfying
hateful
spiritless
unentertaining
ugly
lazy
unfriendly
solemn
decent
horrid
upright
modest
idle
rude
obnoxious
gloomy
lethargic
depressed
realistic
unacceptable
discordant
sour
mean
bitter
awful
filthy
tired
characterless
disgusting
sterile
unsociable
nowhere
languid
ho hum
lackadaisical
languorous
listless
inactive
languishing
inanimate
limp
unsocial
insociable
prim
nongregarious
reclusive
introverted
antisocial
unattractive
unlikable
loathsome
despicable
repugnant
apathetic
staid
blah
unreadable
flavourlessUK
chaste
displeasng
flavorlessUS
homely
unsuitable
unlikeable
disappointing
unimpressive
pretentious
badly-written
predictable
lousy
humourlessUK
witless
unintelligible
rotten
objectionable
woeful
discouraging
upsetting
relaxing
unkind
too much
irritating
abhorrent
undesirable
unrelieved
heavy going
humorlessUS
icky
severe
uncool
yucky
troubling
unfun
a bit much
harsh
hostile
grody
worrisome
agitated
spiteful
nondescript
incompatible
boresome
straight
poisonous
tame
bromidic
operose
well-worn
weariful
unalluring
lame
dragging
gross
worried
upset
unpleasing
troubled
nothing
miserable
melancholic
dissatisfying
wretched
yukky
dismal
joyless
deplorable
detestable
lacking excitement
lacking interest
Test Plan

Without preknowledge about the historic gamesetup traffic accidents, it will be hard to judge the correctness of the implementation, let alone the correctness of the code design at all.
Without having spent several months there and D322 in particular, I would have lacked the knowledge to even write the patch.

Testing that would be useful and doesn't require knowledge about the gamesetup code is:

  • blackbox testing every possible gamesetting -

As one of the goals of the gamesetup class rewrite is to not error out but sanitize / reset / delete values if invalid ones were received,
one could read the code and see if there are assumptions on g_GameAttributes that may be violated by a malicious client or broken matchsettings file.

StartingResources, PopulationCap, StartingTechnologies, DisabledTechnologies, DisabledTemplates:

  • Belgian Uplands can be tested for DisabledTemplates
  • Carthaginian Sandbox map can be tested for StartingTechs.
  • Death Canyon Invasion force can be tested to see if StartingRes / PopCap per player and DisabledTemplates works. Pay additional notice to the gamedscription / objectives dialog not misinforming anymore.
  • Polar Sea can be tested for DisabledTechs.
  • Jebel Barkal can be tested for Difficulty
  • Mainland for biomes
  • Notice that these attributes are not persisted between mapchanges.
  • Garrison property can be tested on Sicilia Nomad, refs D2562.

Diff Detail

Repository
rP 0 A.D. Public Repository
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.

Event Timeline

There are a very large number of changes, so older changes are hidden. Show Older Changes

One thing I am not sure about. How does it work if there are 2 players and second is ai ?

There is a whack-a-mole bug (fixed N times but reappears differently under a different circumstance) where a netclient and an AI ended up in the same slot.
In theory it should be possible to do that (as it equally should be possible to have 2 clients control the same player slot if modders/devs want to), just not now as it's not well fleshed out.

So the concept chosen for this situation is that the client who wants to assign a player or AI to a slot should first unassign the existing one before assigning the new one (rather than an onGameAttributes change routine performing the unassign. This approach would/did not work out as it couldn't decide whether the AI or client was the rightful owner of that playerslot).
Or what was the question exactly?

Other than that, could you please keep folder names with non capital letters ?

(s/please/arguments, as we should not write code to please each other but for objective reasons)
You mean for consistency with the other folders?
But then the filenames should also be lowercase.
To me it looks more consistent if the foldernames and the filenames match.
The coding conventions document also says that firstly a folder should be self-consistent and then match the other folders.

When modifying a piece of code, try to follow its existing style. In particular:
    Primarily, try to match the style of the functions that you're editing (assuming it's at least self-consistent and not too bizarre), in order to avoid making it less self-consistent.
    Secondly, try to match the style of the files that you're editing.
    Then, try to match the style of the other code in the subdirectory you're editing.
    Finally, try to match the global guidelines discussed on this page.

Compare this:

./panels/buttons/ResetCivsButton.js
./panels/buttons/StartGameButton.xml
./panels/buttons/ReadyButton.xml
./panels/buttons/CancelButton.xml
./panels/buttons/CancelButton.js
./panels/buttons/ResetTeamsButton.js
./panels/buttons/LobbyButton.js

to

./Panels/Buttons/LobbyButton.xml
./Panels/Buttons/CivInfoButton.js
./Panels/Buttons/StartGameButton.js
./Panels/Buttons/ReadyButton.js
./Panels/Buttons/ResetCivsButton.js
./Panels/Buttons/StartGameButton.xml
./Panels/Buttons/ReadyButton.xml
./Panels/Buttons/CancelButton.xml
./Panels/Buttons/CancelButton.js
./Panels/Buttons/ResetTeamsButton.js
./Panels/Buttons/LobbyButton.js

More importantly than consistency is logical correctness to me.

lowercase names are typically used for procedural code and capital first letter for classnames.

Simulation components for example also start with uppercase despite most other filenames starting with lowercase, because theyre classes (even the function names start with uppercase).
If we put global consistency above local consistency and above the class = title case format, then components/GarrisonHolder.js would become components/garrison_holder.js or components/garrisonholder.js as well (as lowercase is the predominant file case in a23b).

The discussion arose already in r23028.

Compare it also with the atlas folder:

./GameInterface
./GameInterface/DeltaArray.h
./GameInterface/MessagePasserImpl.cpp
./GameInterface/SimState.h
./GameInterface/CommandProc.cpp
./GameInterface/SimState.cpp
./GameInterface/Brushes.cpp
./GameInterface/Handlers
./GameInterface/Handlers/PlayerHandlers.cpp
./GameInterface/Handlers/CameraCtrlHandlers.cpp
./GameInterface/Handlers/MessageHandler.h
./GameInterface/Handlers/MiscHandlers.cpp
./GameInterface/Handlers/TerrainHandlers.cpp
./GameInterface/Handlers/GraphicsSetupHandlers.cpp
./GameInterface/Handlers/MapHandlers.cpp
./GameInterface/Handlers/ObjectHandlers.cpp
./GameInterface/Handlers/ElevationHandlers.cpp
./GameInterface/Handlers/BrushHandlers.cpp
./GameInterface/Handlers/CommandHandlers.cpp
./GameInterface/Handlers/CinemaHandler.cpp
./GameInterface/Handlers/EnvironmentHandlers.cpp
./GameInterface/Handlers/MessageHandler.cpp
./GameInterface/MessagePasserImpl.h
./GameInterface/Register.cpp
./GameInterface/MessagePasser.h
./GameInterface/View.h
./GameInterface/CommandProc.h
./GameInterface/ActorViewer.cpp
./GameInterface/GameLoop.cpp
./GameInterface/Misc.cpp
./GameInterface/Messages.h
./GameInterface/View.cpp
./GameInterface/SharedMemory.h
./GameInterface/MessagesSetup.h
./GameInterface/SharedTypes.h
./GameInterface/InputProcessor.h
./GameInterface/InputProcessor.cpp
./GameInterface/Brushes.h
./GameInterface/GameLoop.h
./GameInterface/Shareable.h
./GameInterface/ActorViewer.h
./AtlasUI
./AtlasUI/Misc
./AtlasUI/Misc/KeyMap.cpp
./AtlasUI/Misc/Graphics
./AtlasUI/Misc/Graphics/ArchiveViewer.ico
./AtlasUI/Misc/Graphics/FileConverter.ico
./AtlasUI/Misc/Graphics/ScenarioEditor.ico
./AtlasUI/Misc/Graphics/ActorEditor.ico
./AtlasUI/Misc/precompiled.cpp
./AtlasUI/Misc/KeyMap.h
./AtlasUI/Misc/precompiled.h
./AtlasUI/Misc/actored.h
./AtlasUI/Misc/DLLInterface.cpp
./AtlasUI/Misc/atlas.rc
./AtlasUI/Misc/DLLInterface.h
./AtlasUI/CustomControls
./AtlasUI/CustomControls/Windows
./AtlasUI/CustomControls/Windows/AtlasWindow.cpp
./AtlasUI/CustomControls/Windows/AtlasWindow.h
./AtlasUI/CustomControls/Windows/AtlasDialog.h
./AtlasUI/CustomControls/Windows/AtlasDialog.cpp
./AtlasUI/CustomControls/SnapSplitterWindow
./AtlasUI/CustomControls/SnapSplitterWindow/SnapSplitterWindow.cpp
./AtlasUI/CustomControls/SnapSplitterWindow/SnapSplitterWindow.h
./AtlasUI/CustomControls/EditableListCtrl
./AtlasUI/CustomControls/EditableListCtrl/QuickComboBox.h
./AtlasUI/CustomControls/EditableListCtrl/QuickFileCtrl.h
./AtlasUI/CustomControls/EditableListCtrl/QuickComboBox.cpp
./AtlasUI/CustomControls/EditableListCtrl/QuickFileCtrl.cpp
./AtlasUI/CustomControls/EditableListCtrl/QuickTextCtrl.h
./AtlasUI/CustomControls/EditableListCtrl/EditableListCtrl.h
./AtlasUI/CustomControls/EditableListCtrl/EditableListCtrl.cpp
./AtlasUI/CustomControls/EditableListCtrl/EditableListCtrlCommands.h
./AtlasUI/CustomControls/EditableListCtrl/FieldEditCtrl.cpp
./AtlasUI/CustomControls/EditableListCtrl/EditableListCtrlCommands.cpp
./AtlasUI/CustomControls/EditableListCtrl/FieldEditCtrl.h
./AtlasUI/CustomControls/EditableListCtrl/ListCtrlValidator.cpp
./AtlasUI/CustomControls/EditableListCtrl/QuickTextCtrl.cpp
./AtlasUI/CustomControls/EditableListCtrl/ListCtrlValidator.h
./AtlasUI/CustomControls/Canvas
./AtlasUI/CustomControls/Canvas/Canvas.cpp
./AtlasUI/CustomControls/Canvas/Canvas.h
./AtlasUI/CustomControls/DraggableListCtrl
./AtlasUI/CustomControls/DraggableListCtrl/DraggableListCtrlCommands.cpp
./AtlasUI/CustomControls/DraggableListCtrl/DraggableListCtrl.h
./AtlasUI/CustomControls/DraggableListCtrl/DraggableListCtrlCommands.h
./AtlasUI/CustomControls/DraggableListCtrl/DraggableListCtrl.cpp
./AtlasUI/CustomControls/MapDialog
./AtlasUI/CustomControls/MapDialog/MapDialog.h
./AtlasUI/CustomControls/MapDialog/MapDialog.cpp
./AtlasUI/CustomControls/ColorDialog
./AtlasUI/CustomControls/ColorDialog/ColorDialog.h
./AtlasUI/CustomControls/ColorDialog/ColorDialog.cpp
./AtlasUI/CustomControls/VirtualDirTreeCtrl
./AtlasUI/CustomControls/VirtualDirTreeCtrl/folder.xpm
./AtlasUI/CustomControls/VirtualDirTreeCtrl/virtualdirtreectrl.cpp
./AtlasUI/CustomControls/VirtualDirTreeCtrl/file.xpm
./AtlasUI/CustomControls/VirtualDirTreeCtrl/README.txt
./AtlasUI/CustomControls/VirtualDirTreeCtrl/virtualdirtreectrl.h
./AtlasUI/CustomControls/VirtualDirTreeCtrl/root.xpm
./AtlasUI/CustomControls/Buttons
./AtlasUI/CustomControls/Buttons/ActionButton.cpp
./AtlasUI/CustomControls/Buttons/ToolButton.h
./AtlasUI/CustomControls/Buttons/ToolButton.cpp
./AtlasUI/CustomControls/Buttons/ActionButton.h
./AtlasUI/CustomControls/FileHistory
./AtlasUI/CustomControls/FileHistory/FileHistory.h
./AtlasUI/CustomControls/FileHistory/FileHistory.cpp
./AtlasUI/CustomControls/HighResTimer
./AtlasUI/CustomControls/HighResTimer/HighResTimer.cpp
./AtlasUI/CustomControls/HighResTimer/HighResTimer.h
./AtlasUI/ActorEditor
./AtlasUI/ActorEditor/ActorEditor.cpp
./AtlasUI/ActorEditor/PropListEditor.h
./AtlasUI/ActorEditor/AnimListEditor.h
./AtlasUI/ActorEditor/ActorEditor.h
./AtlasUI/ActorEditor/TexListEditor.h
./AtlasUI/ActorEditor/ActorEditorListCtrl.cpp
./AtlasUI/ActorEditor/PropListEditor.cpp
./AtlasUI/ActorEditor/TexListEditor.cpp
./AtlasUI/ActorEditor/ActorEditorListCtrl.h
./AtlasUI/ActorEditor/AnimListEditor.cpp
./AtlasUI/ErrorReporter
./AtlasUI/General
./AtlasUI/General/AtlasWindowCommand.cpp
./AtlasUI/General/AtlasWindowCommandProc.cpp
./AtlasUI/General/AtlasEventLoop.h
./AtlasUI/General/AtlasWindowCommandProc.h
./AtlasUI/General/Observable.cpp
./AtlasUI/General/Datafile.cpp
./AtlasUI/General/IAtlasSerialiser.h
./AtlasUI/General/AtlasClipboard.h
./AtlasUI/General/AtlasEventLoop.cpp
./AtlasUI/General/Datafile.h
./AtlasUI/General/AtlasWindowCommand.h
./AtlasUI/General/AtlasClipboard.cpp
./AtlasUI/General/Observable.h
./AtlasUI/TODO.txt
./AtlasUI/ScenarioEditor
./AtlasUI/ScenarioEditor/Sections
./AtlasUI/ScenarioEditor/Sections/Common
./AtlasUI/ScenarioEditor/Sections/Common/Sidebar.cpp
./AtlasUI/ScenarioEditor/Sections/Common/Sidebar.h
./AtlasUI/ScenarioEditor/Sections/Map
./AtlasUI/ScenarioEditor/Sections/Map/Map.cpp.rej
./AtlasUI/ScenarioEditor/Sections/Map/Map.h
./AtlasUI/ScenarioEditor/Sections/Map/Map.cpp
./AtlasUI/ScenarioEditor/Sections/Object
./AtlasUI/ScenarioEditor/Sections/Object/Object.cpp
./AtlasUI/ScenarioEditor/Sections/Object/Object.h
./AtlasUI/ScenarioEditor/Sections/Object/VariationControl.cpp
./AtlasUI/ScenarioEditor/Sections/Object/VariationControl.h
./AtlasUI/ScenarioEditor/Sections/Terrain
./AtlasUI/ScenarioEditor/Sections/Terrain/Terrain.h
./AtlasUI/ScenarioEditor/Sections/Terrain/Terrain.cpp
./AtlasUI/ScenarioEditor/Sections/Environment
./AtlasUI/ScenarioEditor/Sections/Environment/Environment.cpp
./AtlasUI/ScenarioEditor/Sections/Environment/LightControl.cpp
./AtlasUI/ScenarioEditor/Sections/Environment/LightControl.h
./AtlasUI/ScenarioEditor/Sections/Environment/Environment.h
./AtlasUI/ScenarioEditor/Sections/Player
./AtlasUI/ScenarioEditor/Sections/Player/Player.h
./AtlasUI/ScenarioEditor/Sections/Player/Player.cpp
./AtlasUI/ScenarioEditor/Sections/Cinema
./AtlasUI/ScenarioEditor/Sections/Cinema/Cinema.h
./AtlasUI/ScenarioEditor/Sections/Cinema/Cinema.cpp
./AtlasUI/ScenarioEditor/Tools
./AtlasUI/ScenarioEditor/Tools/Common
./AtlasUI/ScenarioEditor/Tools/Common/MiscState.h
./AtlasUI/ScenarioEditor/Tools/Common/Tools.h
./AtlasUI/ScenarioEditor/Tools/Common/Brushes.cpp
./AtlasUI/ScenarioEditor/Tools/Common/Tools.cpp
./AtlasUI/ScenarioEditor/Tools/Common/ObjectSettings.h
./AtlasUI/ScenarioEditor/Tools/Common/MiscState.cpp
./AtlasUI/ScenarioEditor/Tools/Common/ObjectSettings.cpp
./AtlasUI/ScenarioEditor/Tools/Common/Brushes.h
./AtlasUI/ScenarioEditor/Tools/TransformObject.cpp
./AtlasUI/ScenarioEditor/Tools/PickWaterHeight.cpp
./AtlasUI/ScenarioEditor/Tools/SmoothElevation.cpp
./AtlasUI/ScenarioEditor/Tools/TransformPath.cpp
./AtlasUI/ScenarioEditor/Tools/PaintTerrain.cpp
./AtlasUI/ScenarioEditor/Tools/ActorViewerTool.cpp
./AtlasUI/ScenarioEditor/Tools/AlterElevation.cpp
./AtlasUI/ScenarioEditor/Tools/FillTerrain.cpp
./AtlasUI/ScenarioEditor/Tools/ReplaceTerrain.cpp
./AtlasUI/ScenarioEditor/Tools/PikeElevation.cpp
./AtlasUI/ScenarioEditor/Tools/FlattenElevation.cpp
./AtlasUI/ScenarioEditor/Tools/PlaceObject.cpp
./AtlasUI/ScenarioEditor/ScenarioEditor.cpp.rej
./AtlasUI/ScenarioEditor/SectionLayout.cpp
./AtlasUI/ScenarioEditor/ScenarioEditor.cpp
./AtlasUI/ScenarioEditor/SectionLayout.h
./AtlasUI/ScenarioEditor/ScenarioEditor.h
./AtlasObject
./AtlasObject/AtlasObjectText.h
./AtlasObject/JSONSpiritInclude.h
./AtlasObject/AtlasObject.h
./AtlasObject/AtlasObjectXML.cpp
./AtlasObject/AtlasObjectImpl.h
./AtlasObject/AtlasObjectImpl.cpp
./AtlasObject/AtlasObjectJS.cpp
./AtlasObject/tests
./AtlasObject/tests/test_AtlasObjectXML.h
./AtlasObject/tests/test_AtlasObjectXML.cpp
./AtlasObject/AtlasObjectText.cpp
./AtlasFrontends
./AtlasFrontends/ActorEditor.cpp
./AtlasFrontends/generate.pl
./AtlasFrontends/_template.cpp
./AtlasFrontends/ActorEditor.rc
./AtlasFrontends/_template.rc

Is that bad? To me it looks much better this way.

I did it for the lobby class rewrite too:

./LeaderboardPage
./LeaderboardPage/LeaderboardList.js
./LeaderboardPage/LeaderboardPage.js
./LeaderboardPage/LeaderboardPage.xml
./LobbyHandler.js
./lobby.js
./LobbyPage
./LobbyPage/AnnouncementHandler.js
./LobbyPage/Buttons
./LobbyPage/Buttons/BuddyButton.js
./LobbyPage/Buttons/HostButton.js
./LobbyPage/Buttons/JoinButton.js
./LobbyPage/Buttons/LeaderboardButton.js
./LobbyPage/Buttons/ProfileButton.js
./LobbyPage/Buttons/QuitButton.js
./LobbyPage/Chat
./LobbyPage/Chat/ChatCommandHandler.js
./LobbyPage/Chat/ChatInputPanel.js
./LobbyPage/Chat/ChatMessages
./LobbyPage/Chat/ChatMessages/ChatMessageEvents.js
./LobbyPage/Chat/ChatMessages/ChatMessageFormat.js
./LobbyPage/Chat/ChatMessages/ChatMessageFormatMe.js
./LobbyPage/Chat/ChatMessages/ChatMessageFormatSay.js
./LobbyPage/Chat/ChatMessages/ChatMessagePrivateWrapper.js
./LobbyPage/Chat/ChatMessagesPanel.js
./LobbyPage/Chat/ChatPanel.js
./LobbyPage/Chat/ChatPanel.xml
./LobbyPage/Chat/StatusMessages
./LobbyPage/Chat/StatusMessages/StatusMessageEvents.js
./LobbyPage/Chat/StatusMessages/StatusMessageFormat.js
./LobbyPage/Chat/SystemMessages
./LobbyPage/Chat/SystemMessages/SystemMessageEvents.js
./LobbyPage/Chat/SystemMessages/SystemMessageFormat.js
./LobbyPage/Chat/TimestampWrapper.js
./LobbyPage/ConnectionHandler.js
./LobbyPage/GameDetails.js
./LobbyPage/GameDetails.xml
./LobbyPage/Game.js
./LobbyPage/GameListFilters
./LobbyPage/GameListFilters/MapSize.js
./LobbyPage/GameListFilters/MapType.js
./LobbyPage/GameListFilters/OpenGame.js
./LobbyPage/GameListFilters/PlayerCount.js
./LobbyPage/GameListFilters/Rating.js
./LobbyPage/GameListFilters.xml
./LobbyPage/GameList.js
./LobbyPage/GameList.xml
./LobbyPage/KickStrings.js
./LobbyPage/LobbyPage.js
./LobbyPage/LobbyPage.xml
./LobbyPage/PlayerColor.js
./LobbyPage/PlayerList.js
./LobbyPage/PlayerList.xml
./LobbyPage/ProfilePanel.js
./LobbyPage/ProfilePanel.xml
./LobbyPage/Subject.js
./LobbyPage/Subject.xml
./lobby.xml
./ProfilePage
./ProfilePage/ProfilePage.js
./ProfilePage/ProfilePage.xml
./XmppMessages.js

When I started with #5387 bb also has or had an apparently strong opinion to not use classes because it would be inconsistent, but soon it will be consistent with the IMO more logical pattern.
I don't mind creating global consistency too afterwards either (i.e. not making folders self-inconsistent to create global consistency, it could be done when everything uses uppercase filenames).

(In the worst case someone will propose to make things more things consistently buggy, I've seen this in various revision proposals already, so it's important to visualize the goal where one should head and then make a plan how to get there. Consistency is one property of the goal but it should be consistent *and* most readable)

I tested rated game option and it hides/shows, enables/disables itself as it should triggered by map change or player number change.
It also enables/disables and locks other options as is supposed to.

Thanks

There are 2 bugs I discovered but I can take care of that.

Stan added a comment.Dec 24 2019, 12:40 AM

Capitalization of folders is not bad, however it must be done carefully to avoid the Menu.js/menu.js incident. While all work fine on GNU/Linux / BSD it creates bugs on windows where sometimes the easiest solution is to clone the whole repository again... Basically the SVN or GIT copy will tell you the file/folder has changed, because it is trying to apply the other file/folder settings/contents on the same folder.

I haven't tried to apply the patch, but I assume arc doesn't like that either...

elexis edited the summary of this revision. (Show Details)Dec 24 2019, 5:51 AM
elexis updated this revision to Diff 10778.Dec 24 2019, 5:59 AM
  • New features:
    • Map-specified Civ for skirmish maps will be interpretted as fixed-Civ instead of preselecting the civ (consistency with fixed AI). Used for Egypt 3v3.
    • Implement per-player Starting-Resources and PopulationLimit correctly following rP12756, fixes that part of #4504.
  • Fix two bug in the previously uploaded patch:
    • random-map then random-biome didn't work out, superseded by a new GameAttributes.pickRandomItems function that calls updateGameAttributes and is performed just prior to onGameAttributesFinalize)
    • changing maptype to scenario also must delete g_GameAttributes (it illegally persisted nr of players and StartingResources when changing the maptype to scenario)
    • Fix map-specified AIDiff and AIBehavior: PlayerConfigButton.onMapChange was dead code. Disable AIconfig page if map specified (fixed) the AI, avoid assigning joining clients to fixedAI slots.

Cleanup:

  • Delete g_GameAttributes.settings.mapType = g_GameAttributes.mapType alias following rP12756.
  • Move Seed to own GameSettingControl file.

Successful build - Chance fights ever on the side of the prudent.

Link to build: https://jenkins.wildfiregames.com/job/vs2015-differential/883/display/redirect

elexis edited the summary of this revision. (Show Details)Dec 24 2019, 6:06 AM

Successful build - Chance fights ever on the side of the prudent.

Linter detected issues:
Executing section Source...
Executing section JS...
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/Buttons/CancelButton.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/Buttons/CancelButton.js
|  14|  14| 		this.cancelButton = Engine.GetGUIObjectByName("cancelButton");
|  15|  15| 		this.cancelButton.caption = this.Caption;
|  16|  16| 		this.cancelButton.tooltip = Engine.HasXmppClient() ? this.TooltipLobby : this.TooltipMenu;
|  17|    |-		this.cancelButton.onPress = gamesetupPage.closePage.bind(gamesetupPage)
|    |  17|+		this.cancelButton.onPress = gamesetupPage.closePage.bind(gamesetupPage);
|  18|  18| 
|  19|  19| 		readyButton.registerButtonHiddenChangeHandler(this.onNeighborButtonHiddenChange.bind(this));
|  20|  20| 		startGameButton.registerButtonHiddenChangeHandler(this.onNeighborButtonHiddenChange.bind(this));

binaries/data/mods/public/gui/gamesetup/Panels/Buttons/CancelButton.js
|  17| »   »   this.cancelButton.onPress·=·gamesetupPage.closePage.bind(gamesetupPage)
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.

binaries/data/mods/public/gui/gamesetup/Panels/Chat/TimestampWrapper.js
|  17| »   »   this.timestampArgs.time·=·sprintf(this.TimestampFormat,·this.timeArgs),
|    | [NORMAL] ESLintBear (no-unused-expressions):
|    | Expected an assignment or function call and instead saw an expression.

binaries/data/mods/public/gui/gamesetup/Panels/Chat/TimestampWrapper.js
|  18| »   »   this.timestampArgs.message·=·text;
|    | [NORMAL] JSHintBear:
|    | Expected an assignment or function call and instead saw an expression.
|    | [NORMAL] ESLintBear (key-spacing):
|    | Missing space before value for key 'path'.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Controls/MapCache.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Controls/MapCache.js
| 136| 136|  */
| 137| 137| MapCache.prototype.MapTypes = {
| 138| 138| 	"scenario": {
| 139|    |-		"path":"maps/scenarios/",
|    | 139|+		"path": "maps/scenarios/",
| 140| 140| 		"suffix": ".xml",
| 141| 141| 	},
| 142| 142| 	"skirmish": {

binaries/data/mods/public/gui/gamesetup/Panels/Chat/ChatMessages/ClientChat.js
|  18| »   »   this.messageArgs.username·=·setStringTags(sprintf(this.SenderFormat,·this.usernameArgs),·this.SenderTags),
|    | [NORMAL] ESLintBear (no-unused-expressions):
|    | Expected an assignment or function call and instead saw an expression.

binaries/data/mods/public/gui/gamesetup/Panels/Chat/ChatMessages/ClientChat.js
|  19| »   »   this.messageArgs.message·=·escapeText(message.text);
|    | [NORMAL] JSHintBear:
|    | Expected an assignment or function call and instead saw an expression.
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/VictoryConditionCheckbox.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/VictoryConditionCheckbox.js
|  64|  64| 			g_GameAttributes.mapType != "scenario" &&
|  65|  65| 			(!this.victoryCondition.DisabledWhenChecked ||
|  66|  66| 			this.victoryCondition.DisabledWhenChecked.every(name =>
|  67|    |-				g_GameAttributes.settings.VictoryConditions.indexOf(name) == -1))
|    |  67|+				g_GameAttributes.settings.VictoryConditions.indexOf(name) == -1));
|  68|  68| 
|  69|  69| 		this.setChecked(g_GameAttributes.settings.VictoryConditions.indexOf(this.victoryCondition.Name) != -1);
|  70|  70| 	}
|    | [NORMAL] ESLintBear (no-extra-semi):
|    | Unnecessary semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/VictoryConditionCheckbox.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/VictoryConditionCheckbox.js
| 102| 102| 				if (g_GameAttributes.settings.TriggerScripts.indexOf(script) == -1)
| 103| 103| 					g_GameAttributes.settings.TriggerScripts.push(script);
| 104| 104| 	}
| 105|    |-};
|    | 105|+}

binaries/data/mods/public/gui/gamesetup/GameSettings/VictoryConditionCheckbox.js
|  67| »   »   »   »   g_GameAttributes.settings.VictoryConditions.indexOf(name)·==·-1))
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.

binaries/data/mods/public/gui/gamesetup/GameSettings/VictoryConditionCheckbox.js
| 105| };
|    | [NORMAL] JSHintBear:
|    | Unnecessary semicolon.
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/GameSettingControl.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/GameSettingControl.js
|  53|  53| 			this.setTitle(this.TitleCaption);
|  54|  54| 
|  55|  55| 		if (this.Tooltip)
|  56|    |-			this.setTooltip(this.Tooltip)
|    |  56|+			this.setTooltip(this.Tooltip);
|  57|  57| 
|  58|  58| 		this.setHidden(false);
|  59|  59| 
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/GameSettingControl.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/GameSettingControl.js
| 105| 105| 	setEnabled(enabled)
| 106| 106| 	{
| 107| 107| 		this.enabled = enabled;
| 108|    |-		this.updateVisibility()
|    | 108|+		this.updateVisibility();
| 109| 109| 	}
| 110| 110| 
| 111| 111| 	setHidden(hidden)
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/GameSettingControl.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/GameSettingControl.js
| 111| 111| 	setHidden(hidden)
| 112| 112| 	{
| 113| 113| 		this.hidden = hidden;
| 114|    |-		this.updateVisibility()
|    | 114|+		this.updateVisibility();
| 115| 115| 	}
| 116| 116| 
| 117| 117| 	updateVisibility()
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/GameSettingControl.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/GameSettingControl.js
| 131| 131| 
| 132| 132| 		let enabled = g_IsController && this.enabled;
| 133| 133| 
| 134|    |-		this.setControlHidden(!enabled)
|    | 134|+		this.setControlHidden(!enabled);
| 135| 135| 
| 136| 136| 		if (this.label)
| 137| 137| 			this.label.hidden = !!enabled;

binaries/data/mods/public/gui/gamesetup/GameSettings/GameSettingControl.js
|  56| »   »   »   this.setTooltip(this.Tooltip)
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.

binaries/data/mods/public/gui/gamesetup/GameSettings/GameSettingControl.js
| 108| »   »   this.updateVisibility()
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.

binaries/data/mods/public/gui/gamesetup/GameSettings/GameSettingControl.js
| 114| »   »   this.updateVisibility()
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.

binaries/data/mods/public/gui/gamesetup/GameSettings/GameSettingControl.js
| 134| »   »   this.setControlHidden(!enabled)
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (spaced-comment):
|    | Expected space or tab after '//' in comment.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/LoadingWindow.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/LoadingWindow.js
|   4|   4| 	{
|   5|   5| 	//	if (g_IsNetworked)
|   6|   6| 		//	netMessages.registerNetMessageHandler("gamesetup", this.hideLoadingWindow.bind(this));
|   7|    |-		//else
|    |   7|+		// else
|   8|   8| 			this.hideLoadingWindow();
|   9|   9| 	}
|  10|  10| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/LoadingWindow.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/LoadingWindow.js
|   5|   5| 	//	if (g_IsNetworked)
|   6|   6| 		//	netMessages.registerNetMessageHandler("gamesetup", this.hideLoadingWindow.bind(this));
|   7|   7| 		//else
|   8|    |-			this.hideLoadingWindow();
|    |   8|+		this.hideLoadingWindow();
|   9|   9| 	}
|  10|  10| 
|  11|  11| 	hideLoadingWindow()
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Buttons/PlayerConfigButton.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Buttons/PlayerConfigButton.js
| 181| 181| 		pData.AIDiff = data.difficulty;
| 182| 182| 		pData.AIBehavior = data.behavior;
| 183| 183| 
| 184|    |-		this.gameSettingsControl.updateGameAttributes()
|    | 184|+		this.gameSettingsControl.updateGameAttributes();
| 185| 185| 		this.gameSettingsControl.setNetworkGameAttributes();
| 186| 186| 	}
| 187| 187| }

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Buttons/PlayerConfigButton.js
| 184| »   »   this.gameSettingsControl.updateGameAttributes()
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/pregame/MainMenuItems.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/pregame/MainMenuItems.js
| 194| 194| 		"tooltip": translate("Exits the game."),
| 195| 195| 		"onPress": () => {
| 196| 196| 			messageBox(
| 197|    |-					400, 200,
|    | 197|+				400, 200,
| 198| 198| 					translate("Are you sure you want to quit 0 A.D.?"),
| 199| 199| 					translate("Confirmation"),
| 200| 200| 					[translate("No"), translate("Yes")],
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/pregame/MainMenuItems.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/pregame/MainMenuItems.js
| 195| 195| 		"onPress": () => {
| 196| 196| 			messageBox(
| 197| 197| 					400, 200,
| 198|    |-					translate("Are you sure you want to quit 0 A.D.?"),
|    | 198|+				translate("Are you sure you want to quit 0 A.D.?"),
| 199| 199| 					translate("Confirmation"),
| 200| 200| 					[translate("No"), translate("Yes")],
| 201| 201| 					[null, Engine.Exit]);
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/pregame/MainMenuItems.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/pregame/MainMenuItems.js
| 196| 196| 			messageBox(
| 197| 197| 					400, 200,
| 198| 198| 					translate("Are you sure you want to quit 0 A.D.?"),
| 199|    |-					translate("Confirmation"),
|    | 199|+				translate("Confirmation"),
| 200| 200| 					[translate("No"), translate("Yes")],
| 201| 201| 					[null, Engine.Exit]);
| 202| 202| 		}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/pregame/MainMenuItems.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/pregame/MainMenuItems.js
| 197| 197| 					400, 200,
| 198| 198| 					translate("Are you sure you want to quit 0 A.D.?"),
| 199| 199| 					translate("Confirmation"),
| 200|    |-					[translate("No"), translate("Yes")],
|    | 200|+				[translate("No"), translate("Yes")],
| 201| 201| 					[null, Engine.Exit]);
| 202| 202| 		}
| 203| 203| 	}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/pregame/MainMenuItems.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/pregame/MainMenuItems.js
| 198| 198| 					translate("Are you sure you want to quit 0 A.D.?"),
| 199| 199| 					translate("Confirmation"),
| 200| 200| 					[translate("No"), translate("Yes")],
| 201|    |-					[null, Engine.Exit]);
|    | 201|+				[null, Engine.Exit]);
| 202| 202| 		}
| 203| 203| 	}
| 204| 204| ];
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  19|  19| 		let caption =
|  20|  20| 			g_GameAttributes.settings.CheatsEnabled ?
|  21|  21| 				this.CheatsEnabled :
|  22|    |-			g_GameAttributes.settings.RatingEnabled ?
|    |  22|+				g_GameAttributes.settings.RatingEnabled ?
|  23|  23| 				this.RatingEnabled :
|  24|  24| 				"";
|  25|  25| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  20|  20| 			g_GameAttributes.settings.CheatsEnabled ?
|  21|  21| 				this.CheatsEnabled :
|  22|  22| 			g_GameAttributes.settings.RatingEnabled ?
|  23|    |-				this.RatingEnabled :
|    |  23|+					this.RatingEnabled :
|  24|  24| 				"";
|  25|  25| 
|  26|  26| 		this.gameSettingWarning.caption = caption;
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  21|  21| 				this.CheatsEnabled :
|  22|  22| 			g_GameAttributes.settings.RatingEnabled ?
|  23|  23| 				this.RatingEnabled :
|  24|    |-				"";
|    |  24|+					"";
|  25|  25| 
|  26|  26| 		this.gameSettingWarning.caption = caption;
|  27|  27| 		this.gameSettingWarning.hidden = !caption;
|    | [NORMAL] ESLintBear (key-spacing):
|    | Extra space before value for key 'map'.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Controls/GameSettingsControl.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Controls/GameSettingsControl.js
| 108| 108| 			// settings from the server or the local file.
| 109| 109| 			g_GameAttributes = {
| 110| 110| 				"mapType": initData.mapType,
| 111|    |-				"map":  initData.map
|    | 111|+				"map": initData.map
| 112| 112| 			};
| 113| 113| 
| 114| 114| 			this.updateGameAttributes();
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 333| 333| 	return IsOwnedByHelper(player, target, "IsMutualAlly");
| 334| 334| }
| 335| 335| 
| 336|    |-function IsOwnedByNeutralOfPlayer(player,target)
|    | 336|+function IsOwnedByNeutralOfPlayer(player, target)
| 337| 337| {
| 338| 338| 	return IsOwnedByHelper(player, target, "IsNeutral");
| 339| 339| }

binaries/data/mods/public/simulation/helpers/Player.js
|  78| »   »   let·cmpPlayer·=·QueryPlayerIDInterface(i);
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'cmpPlayer' is already declared in the upper scope.

binaries/data/mods/public/simulation/helpers/Player.js
| 165| »   »   for·(let·i·=·0;·i·<·numPlayers;·++i)
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.

binaries/data/mods/public/simulation/helpers/Player.js
|  67| »   »   var·entID·=·cmpPlayerManager.GetPlayerByID(i);
|    | [NORMAL] JSHintBear:
|    | 'entID' is already defined.

binaries/data/mods/public/simulation/helpers/Player.js
|  76| »   for·(var·i·=·0;·i·<·numPlayers;·++i)
|    | [NORMAL] JSHintBear:
|    | 'i' is already defined.

binaries/data/mods/public/simulation/helpers/Player.js
| 143| »   »   »   for·(var·j·=·0;·j·<·numPlayers;·++j)
|    | [NORMAL] JSHintBear:
|    | 'j' is already defined.
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/SoundNotification.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/SoundNotification.js
|  16|  16| 	{
|  17|  17| 		if (message.guid != Engine.GetPlayerGUID() &&
|  18|  18| 			message.text.toLowerCase().indexOf(
|  19|    |-			splitRatingFromNick(g_PlayerAssignments[Engine.GetPlayerGUID()].name).nick.toLowerCase()) != -1)
|    |  19|+				splitRatingFromNick(g_PlayerAssignments[Engine.GetPlayerGUID()].name).nick.toLowerCase()) != -1)
|  20|  20| 			soundNotification(this.ConfigNickNotification);
|  21|  21| 	}
|  22|  22| }
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerColor.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerColor.js
|  63|  63| 
|  64|  64| 		if (playerData && mapPlayerData && mapPlayerData.Color &&
|  65|  65| 			(!playerData.Color || !sameColor(playerData.Color, mapPlayerData.Color)))
|  66|    |-			{
|    |  66|+		{
|  67|  67| 				playerData.Color = mapPlayerData.Color;
|  68|  68| 				this.gameSettingsControl.updateGameAttributes();
|  69|  69| 			}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerColor.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerColor.js
|  64|  64| 		if (playerData && mapPlayerData && mapPlayerData.Color &&
|  65|  65| 			(!playerData.Color || !sameColor(playerData.Color, mapPlayerData.Color)))
|  66|  66| 			{
|  67|    |-				playerData.Color = mapPlayerData.Color;
|    |  67|+			playerData.Color = mapPlayerData.Color;
|  68|  68| 				this.gameSettingsControl.updateGameAttributes();
|  69|  69| 			}
|  70|  70| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerColor.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerColor.js
|  65|  65| 			(!playerData.Color || !sameColor(playerData.Color, mapPlayerData.Color)))
|  66|  66| 			{
|  67|  67| 				playerData.Color = mapPlayerData.Color;
|  68|    |-				this.gameSettingsControl.updateGameAttributes();
|    |  68|+			this.gameSettingsControl.updateGameAttributes();
|  69|  69| 			}
|  70|  70| 
|  71|  71| 		Engine.ProfileStop();
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerColor.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerColor.js
|  66|  66| 			{
|  67|  67| 				playerData.Color = mapPlayerData.Color;
|  68|  68| 				this.gameSettingsControl.updateGameAttributes();
|  69|    |-			}
|    |  69|+		}
|  70|  70| 
|  71|  71| 		Engine.ProfileStop();
|  72|  72| 	}
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingsPanel.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingsPanel.js
|  81|  81| 		else
|  82|  82| 		{
|  83|  83| 			delete this.settingsPanelFrame.onTick;
|  84|    |-			this.lastTickTime = undefined
|    |  84|+			this.lastTickTime = undefined;
|  85|  85| 		}
|  86|  86| 	}
|  87|  87| 

binaries/data/mods/public/gui/gamesetup/Panels/GameSettingsPanel.js
|  84| »   »   »   this.lastTickTime·=·undefined
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/Single/Seed.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/Single/Seed.js
|   9|   9| 		g_GameAttributes.settings.Seed = randIntExclusive(0, Math.pow(2, 32));
|  10|  10| 		g_GameAttributes.settings.AISeed = randIntExclusive(0, Math.pow(2, 32));
|  11|  11| 	}
|  12|    |-}
|    |  12|+};

binaries/data/mods/public/gui/gamesetup/GameSettings/Single/Seed.js
|  12| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 152| 152| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 153| 153| 						playerDescription = translate("%(playerName)s (%(civ)s, %(state)s)");
| 154| 154| 				else
| 155|    |-					if (isActive)
|    | 155|+				if (isActive)
| 156| 156| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 157| 157| 						playerDescription = translate("%(playerName)s");
| 158| 158| 					else
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 153| 153| 						playerDescription = translate("%(playerName)s (%(civ)s, %(state)s)");
| 154| 154| 				else
| 155| 155| 					if (isActive)
| 156|    |-						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | 156|+				// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 157| 157| 						playerDescription = translate("%(playerName)s");
| 158| 158| 					else
| 159| 159| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 154| 154| 				else
| 155| 155| 					if (isActive)
| 156| 156| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 157|    |-						playerDescription = translate("%(playerName)s");
|    | 157|+					playerDescription = translate("%(playerName)s");
| 158| 158| 					else
| 159| 159| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 160| 160| 						playerDescription = translate("%(playerName)s (%(state)s)");
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 155| 155| 					if (isActive)
| 156| 156| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 157| 157| 						playerDescription = translate("%(playerName)s");
| 158|    |-					else
|    | 158|+				else
| 159| 159| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 160| 160| 						playerDescription = translate("%(playerName)s (%(state)s)");
| 161| 161| 			}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 156| 156| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 157| 157| 						playerDescription = translate("%(playerName)s");
| 158| 158| 					else
| 159|    |-						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | 159|+				// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 160| 160| 						playerDescription = translate("%(playerName)s (%(state)s)");
| 161| 161| 			}
| 162| 162| 		}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 157| 157| 						playerDescription = translate("%(playerName)s");
| 158| 158| 					else
| 159| 159| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 160|    |-						playerDescription = translate("%(playerName)s (%(state)s)");
|    | 160|+					playerDescription = translate("%(playerName)s (%(state)s)");
| 161| 161| 			}
| 162| 162| 		}
| 163| 163| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 244| 244| 		});
| 245| 245| 
| 246| 246| 	if (g_GameAttributes.settings.VictoryConditions)
| 247|    |-	for (let victoryCondition of g_VictoryConditions)
|    | 247|+		for (let victoryCondition of g_VictoryConditions)
| 248| 248| 	{
| 249| 249| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 250| 250| 			continue;
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 245| 245| 
| 246| 246| 	if (g_GameAttributes.settings.VictoryConditions)
| 247| 247| 	for (let victoryCondition of g_VictoryConditions)
| 248|    |-	{
|    | 248|+		{
| 249| 249| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 250| 250| 			continue;
| 251| 251| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 246| 246| 	if (g_GameAttributes.settings.VictoryConditions)
| 247| 247| 	for (let victoryCondition of g_VictoryConditions)
| 248| 248| 	{
| 249|    |-		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
|    | 249|+			if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 250| 250| 			continue;
| 251| 251| 
| 252| 252| 		let title = translateVictoryCondition(victoryCondition.Name);
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 247| 247| 	for (let victoryCondition of g_VictoryConditions)
| 248| 248| 	{
| 249| 249| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 250|    |-			continue;
|    | 250|+				continue;
| 251| 251| 
| 252| 252| 		let title = translateVictoryCondition(victoryCondition.Name);
| 253| 253| 		if (victoryCondition.Name == "wonder")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 249| 249| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 250| 250| 			continue;
| 251| 251| 
| 252|    |-		let title = translateVictoryCondition(victoryCondition.Name);
|    | 252|+			let title = translateVictoryCondition(victoryCondition.Name);
| 253| 253| 		if (victoryCondition.Name == "wonder")
| 254| 254| 			title = sprintf(
| 255| 255| 				translatePluralWithContext(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 250| 250| 			continue;
| 251| 251| 
| 252| 252| 		let title = translateVictoryCondition(victoryCondition.Name);
| 253|    |-		if (victoryCondition.Name == "wonder")
|    | 253|+			if (victoryCondition.Name == "wonder")
| 254| 254| 			title = sprintf(
| 255| 255| 				translatePluralWithContext(
| 256| 256| 					"victory condition",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 251| 251| 
| 252| 252| 		let title = translateVictoryCondition(victoryCondition.Name);
| 253| 253| 		if (victoryCondition.Name == "wonder")
| 254|    |-			title = sprintf(
|    | 254|+				title = sprintf(
| 255| 255| 				translatePluralWithContext(
| 256| 256| 					"victory condition",
| 257| 257| 					"Wonder (%(min)s minute)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 252| 252| 		let title = translateVictoryCondition(victoryCondition.Name);
| 253| 253| 		if (victoryCondition.Name == "wonder")
| 254| 254| 			title = sprintf(
| 255|    |-				translatePluralWithContext(
|    | 255|+					translatePluralWithContext(
| 256| 256| 					"victory condition",
| 257| 257| 					"Wonder (%(min)s minute)",
| 258| 258| 					"Wonder (%(min)s minutes)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 253| 253| 		if (victoryCondition.Name == "wonder")
| 254| 254| 			title = sprintf(
| 255| 255| 				translatePluralWithContext(
| 256|    |-					"victory condition",
|    | 256|+						"victory condition",
| 257| 257| 					"Wonder (%(min)s minute)",
| 258| 258| 					"Wonder (%(min)s minutes)",
| 259| 259| 					g_GameAttributes.settings.WonderDuration
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 254| 254| 			title = sprintf(
| 255| 255| 				translatePluralWithContext(
| 256| 256| 					"victory condition",
| 257|    |-					"Wonder (%(min)s minute)",
|    | 257|+						"Wonder (%(min)s minute)",
| 258| 258| 					"Wonder (%(min)s minutes)",
| 259| 259| 					g_GameAttributes.settings.WonderDuration
| 260| 260| 				),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 255| 255| 				translatePluralWithContext(
| 256| 256| 					"victory condition",
| 257| 257| 					"Wonder (%(min)s minute)",
| 258|    |-					"Wonder (%(min)s minutes)",
|    | 258|+						"Wonder (%(min)s minutes)",
| 259| 259| 					g_GameAttributes.settings.WonderDuration
| 260| 260| 				),
| 261| 261| 				{ "min": g_GameAttributes.settings.WonderDuration }
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 256| 256| 					"victory condition",
| 257| 257| 					"Wonder (%(min)s minute)",
| 258| 258| 					"Wonder (%(min)s minutes)",
| 259|    |-					g_GameAttributes.settings.WonderDuration
|    | 259|+						g_GameAttributes.settings.WonderDuration
| 260| 260| 				),
| 261| 261| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 262| 262| 			);
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 257| 257| 					"Wonder (%(min)s minute)",
| 258| 258| 					"Wonder (%(min)s minutes)",
| 259| 259| 					g_GameAttributes.settings.WonderDuration
| 260|    |-				),
|    | 260|+					),
| 261| 261| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 262| 262| 			);
| 263| 263| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 258| 258| 					"Wonder (%(min)s minutes)",
| 259| 259| 					g_GameAttributes.settings.WonderDuration
| 260| 260| 				),
| 261|    |-				{ "min": g_GameAttributes.settings.WonderDuration }
|    | 261|+					{ "min": g_GameAttributes.settings.WonderDuration }
| 262| 262| 			);
| 263| 263| 
| 264| 264| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 259| 259| 					g_GameAttributes.settings.WonderDuration
| 260| 260| 				),
| 261| 261| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 262|    |-			);
|    | 262|+				);
| 263| 263| 
| 264| 264| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 265| 265| 		if (isCaptureTheRelic)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 261| 261| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 262| 262| 			);
| 263| 263| 
| 264|    |-		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
|    | 264|+			let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 265| 265| 		if (isCaptureTheRelic)
| 266| 266| 			title = sprintf(
| 267| 267| 				translatePluralWithContext(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 262| 262| 			);
| 263| 263| 
| 264| 264| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 265|    |-		if (isCaptureTheRelic)
|    | 265|+			if (isCaptureTheRelic)
| 266| 266| 			title = sprintf(
| 267| 267| 				translatePluralWithContext(
| 268| 268| 					"victory condition",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 263| 263| 
| 264| 264| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 265| 265| 		if (isCaptureTheRelic)
| 266|    |-			title = sprintf(
|    | 266|+				title = sprintf(
| 267| 267| 				translatePluralWithContext(
| 268| 268| 					"victory condition",
| 269| 269| 					"Capture the Relic (%(min)s minute)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 264| 264| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 265| 265| 		if (isCaptureTheRelic)
| 266| 266| 			title = sprintf(
| 267|    |-				translatePluralWithContext(
|    | 267|+					translatePluralWithContext(
| 268| 268| 					"victory condition",
| 269| 269| 					"Capture the Relic (%(min)s minute)",
| 270| 270| 					"Capture the Relic (%(min)s minutes)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 265| 265| 		if (isCaptureTheRelic)
| 266| 266| 			title = sprintf(
| 267| 267| 				translatePluralWithContext(
| 268|    |-					"victory condition",
|    | 268|+						"victory condition",
| 269| 269| 					"Capture the Relic (%(min)s minute)",
| 270| 270| 					"Capture the Relic (%(min)s minutes)",
| 271| 271| 					g_GameAttributes.settings.RelicDuration
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 266| 266| 			title = sprintf(
| 267| 267| 				translatePluralWithContext(
| 268| 268| 					"victory condition",
| 269|    |-					"Capture the Relic (%(min)s minute)",
|    | 269|+						"Capture the Relic (%(min)s minute)",
| 270| 270| 					"Capture the Relic (%(min)s minutes)",
| 271| 271| 					g_GameAttributes.settings.RelicDuration
| 272| 272| 				),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 267| 267| 				translatePluralWithContext(
| 268| 268| 					"victory condition",
| 269| 269| 					"Capture the Relic (%(min)s minute)",
| 270|    |-					"Capture the Relic (%(min)s minutes)",
|    | 270|+						"Capture the Relic (%(min)s minutes)",
| 271| 271| 					g_GameAttributes.settings.RelicDuration
| 272| 272| 				),
| 273| 273| 				{ "min": g_GameAttributes.settings.RelicDuration }
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 268| 268| 					"victory condition",
| 269| 269| 					"Capture the Relic (%(min)s minute)",
| 270| 270| 					"Capture the Relic (%(min)s minutes)",
| 271|    |-					g_GameAttributes.settings.RelicDuration
|    | 271|+						g_GameAttributes.settings.RelicDuration
| 272| 272| 				),
| 273| 273| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 274| 274| 			);
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 269| 269| 					"Capture the Relic (%(min)s minute)",
| 270| 270| 					"Capture the Relic (%(min)s minutes)",
| 271| 271| 					g_GameAttributes.settings.RelicDuration
| 272|    |-				),
|    | 272|+					),
| 273| 273| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 274| 274| 			);
| 275| 275| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 270| 270| 					"Capture the Relic (%(min)s minutes)",
| 271| 271| 					g_GameAttributes.settings.RelicDuration
| 272| 272| 				),
| 273|    |-				{ "min": g_GameAttributes.settings.RelicDuration }
|    | 273|+					{ "min": g_GameAttributes.settings.RelicDuration }
| 274| 274| 			);
| 275| 275| 
| 276| 276| 		titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 271| 271| 					g_GameAttributes.settings.RelicDuration
| 272| 272| 				),
| 273| 273| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 274|    |-			);
|    | 274|+				);
| 275| 275| 
| 276| 276| 		titles.push({
| 277| 277| 			"label": title,
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 273| 273| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 274| 274| 			);
| 275| 275| 
| 276|    |-		titles.push({
|    | 276|+			titles.push({
| 277| 277| 			"label": title,
| 278| 278| 			"value": victoryCondition.Description
| 279| 279| 		});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 274| 274| 			);
| 275| 275| 
| 276| 276| 		titles.push({
| 277|    |-			"label": title,
|    | 277|+				"label": title,
| 278| 278| 			"value": victoryCondition.Description
| 279| 279| 		});
| 280| 280| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 275| 275| 
| 276| 276| 		titles.push({
| 277| 277| 			"label": title,
| 278|    |-			"value": victoryCondition.Description
|    | 278|+				"value": victoryCondition.Description
| 279| 279| 		});
| 280| 280| 
| 281| 281| 		if (isCaptureTheRelic)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 276| 276| 		titles.push({
| 277| 277| 			"label": title,
| 278| 278| 			"value": victoryCondition.Description
| 279|    |-		});
|    | 279|+			});
| 280| 280| 
| 281| 281| 		if (isCaptureTheRelic)
| 282| 282| 			titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 278| 278| 			"value": victoryCondition.Description
| 279| 279| 		});
| 280| 280| 
| 281|    |-		if (isCaptureTheRelic)
|    | 281|+			if (isCaptureTheRelic)
| 282| 282| 			titles.push({
| 283| 283| 				"label": translate("Relic Count"),
| 284| 284| 				"value": g_GameAttributes.settings.RelicCount
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 279| 279| 		});
| 280| 280| 
| 281| 281| 		if (isCaptureTheRelic)
| 282|    |-			titles.push({
|    | 282|+				titles.push({
| 283| 283| 				"label": translate("Relic Count"),
| 284| 284| 				"value": g_GameAttributes.settings.RelicCount
| 285| 285| 			});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 280| 280| 
| 281| 281| 		if (isCaptureTheRelic)
| 282| 282| 			titles.push({
| 283|    |-				"label": translate("Relic Count"),
|    | 283|+					"label": translate("Relic Count"),
| 284| 284| 				"value": g_GameAttributes.settings.RelicCount
| 285| 285| 			});
| 286| 286| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 281| 281| 		if (isCaptureTheRelic)
| 282| 282| 			titles.push({
| 283| 283| 				"label": translate("Relic Count"),
| 284|    |-				"value": g_GameAttributes.settings.RelicCount
|    | 284|+					"value": g_GameAttributes.settings.RelicCount
| 285| 285| 			});
| 286| 286| 
| 287| 287| 		if (victoryCondition.Name == "regicide")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 282| 282| 			titles.push({
| 283| 283| 				"label": translate("Relic Count"),
| 284| 284| 				"value": g_GameAttributes.settings.RelicCount
| 285|    |-			});
|    | 285|+				});
| 286| 286| 
| 287| 287| 		if (victoryCondition.Name == "regicide")
| 288| 288| 			if (g_GameAttributes.settings.RegicideGarrison)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 284| 284| 				"value": g_GameAttributes.settings.RelicCount
| 285| 285| 			});
| 286| 286| 
| 287|    |-		if (victoryCondition.Name == "regicide")
|    | 287|+			if (victoryCondition.Name == "regicide")
| 288| 288| 			if (g_GameAttributes.settings.RegicideGarrison)
| 289| 289| 				titles.push({
| 290| 290| 					"label": translate("Hero Garrison"),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 285| 285| 			});
| 286| 286| 
| 287| 287| 		if (victoryCondition.Name == "regicide")
| 288|    |-			if (g_GameAttributes.settings.RegicideGarrison)
|    | 288|+				if (g_GameAttributes.settings.RegicideGarrison)
| 289| 289| 				titles.push({
| 290| 290| 					"label": translate("Hero Garrison"),
| 291| 291| 					"value": translate("Heroes can be garrisoned.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 286| 286| 
| 287| 287| 		if (victoryCondition.Name == "regicide")
| 288| 288| 			if (g_GameAttributes.settings.RegicideGarrison)
| 289|    |-				titles.push({
|    | 289|+					titles.push({
| 290| 290| 					"label": translate("Hero Garrison"),
| 291| 291| 					"value": translate("Heroes can be garrisoned.")
| 292| 292| 				});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 287| 287| 		if (victoryCondition.Name == "regicide")
| 288| 288| 			if (g_GameAttributes.settings.RegicideGarrison)
| 289| 289| 				titles.push({
| 290|    |-					"label": translate("Hero Garrison"),
|    | 290|+						"label": translate("Hero Garrison"),
| 291| 291| 					"value": translate("Heroes can be garrisoned.")
| 292| 292| 				});
| 293| 293| 			else
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 288| 288| 			if (g_GameAttributes.settings.RegicideGarrison)
| 289| 289| 				titles.push({
| 290| 290| 					"label": translate("Hero Garrison"),
| 291|    |-					"value": translate("Heroes can be garrisoned.")
|    | 291|+						"value": translate("Heroes can be garrisoned.")
| 292| 292| 				});
| 293| 293| 			else
| 294| 294| 				titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 289| 289| 				titles.push({
| 290| 290| 					"label": translate("Hero Garrison"),
| 291| 291| 					"value": translate("Heroes can be garrisoned.")
| 292|    |-				});
|    | 292|+					});
| 293| 293| 			else
| 294| 294| 				titles.push({
| 295| 295| 					"label": translate("Exposed Heroes"),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 290| 290| 					"label": translate("Hero Garrison"),
| 291| 291| 					"value": translate("Heroes can be garrisoned.")
| 292| 292| 				});
| 293|    |-			else
|    | 293|+				else
| 294| 294| 				titles.push({
| 295| 295| 					"label": translate("Exposed Heroes"),
| 296| 296| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 291| 291| 					"value": translate("Heroes can be garrisoned.")
| 292| 292| 				});
| 293| 293| 			else
| 294|    |-				titles.push({
|    | 294|+					titles.push({
| 295| 295| 					"label": translate("Exposed Heroes"),
| 296| 296| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 297| 297| 				});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 292| 292| 				});
| 293| 293| 			else
| 294| 294| 				titles.push({
| 295|    |-					"label": translate("Exposed Heroes"),
|    | 295|+						"label": translate("Exposed Heroes"),
| 296| 296| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 297| 297| 				});
| 298| 298| 	}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 293| 293| 			else
| 294| 294| 				titles.push({
| 295| 295| 					"label": translate("Exposed Heroes"),
| 296|    |-					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
|    | 296|+						"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 297| 297| 				});
| 298| 298| 	}
| 299| 299| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 294| 294| 				titles.push({
| 295| 295| 					"label": translate("Exposed Heroes"),
| 296| 296| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 297|    |-				});
|    | 297|+					});
| 298| 298| 	}
| 299| 299| 
| 300| 300| 	if (g_GameAttributes.settings.RatingEnabled &&
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 295| 295| 					"label": translate("Exposed Heroes"),
| 296| 296| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 297| 297| 				});
| 298|    |-	}
|    | 298|+		}
| 299| 299| 
| 300| 300| 	if (g_GameAttributes.settings.RatingEnabled &&
| 301| 301| 	    g_GameAttributes.settings.PlayerData.length == 2)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 327| 327| 		});
| 328| 328| 
| 329| 329| 	if (g_GameAttributes.settings.Ceasefire !== undefined)
| 330|    |-	titles.push({
|    | 330|+		titles.push({
| 331| 331| 		"label": translate("Ceasefire"),
| 332| 332| 		"value":
| 333| 333| 			g_GameAttributes.settings.Ceasefire == 0 ?
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 328| 328| 
| 329| 329| 	if (g_GameAttributes.settings.Ceasefire !== undefined)
| 330| 330| 	titles.push({
| 331|    |-		"label": translate("Ceasefire"),
|    | 331|+			"label": translate("Ceasefire"),
| 332| 332| 		"value":
| 333| 333| 			g_GameAttributes.settings.Ceasefire == 0 ?
| 334| 334| 				translate("disabled") :
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 329| 329| 	if (g_GameAttributes.settings.Ceasefire !== undefined)
| 330| 330| 	titles.push({
| 331| 331| 		"label": translate("Ceasefire"),
| 332|    |-		"value":
|    | 332|+			"value":
| 333| 333| 			g_GameAttributes.settings.Ceasefire == 0 ?
| 334| 334| 				translate("disabled") :
| 335| 335| 				sprintf(translatePlural(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 337| 337| 					"For the first %(min)s minutes, other players will stay neutral.",
| 338| 338| 					g_GameAttributes.settings.Ceasefire),
| 339| 339| 				{ "min": g_GameAttributes.settings.Ceasefire })
| 340|    |-	});
|    | 340|+		});
| 341| 341| 
| 342| 342| 	if (g_GameAttributes.map !== undefined && g_GameAttributes.map == "random")
| 343| 343| 		titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 349| 349| 		let mapData = getMapDescriptionAndPreview(g_GameAttributes.mapType, g_GameAttributes.map, g_GameAttributes);
| 350| 350| 
| 351| 351| 		if (mapData.name)
| 352|    |-		titles.push({
|    | 352|+			titles.push({
| 353| 353| 			"label": translate("Map Name"),
| 354| 354| 			"value": translate(mapData.name)
| 355| 355| 		});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 350| 350| 
| 351| 351| 		if (mapData.name)
| 352| 352| 		titles.push({
| 353|    |-			"label": translate("Map Name"),
|    | 353|+				"label": translate("Map Name"),
| 354| 354| 			"value": translate(mapData.name)
| 355| 355| 		});
| 356| 356| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 351| 351| 		if (mapData.name)
| 352| 352| 		titles.push({
| 353| 353| 			"label": translate("Map Name"),
| 354|    |-			"value": translate(mapData.name)
|    | 354|+				"value": translate(mapData.name)
| 355| 355| 		});
| 356| 356| 
| 357| 357| 		titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 352| 352| 		titles.push({
| 353| 353| 			"label": translate("Map Name"),
| 354| 354| 			"value": translate(mapData.name)
| 355|    |-		});
|    | 355|+			});
| 356| 356| 
| 357| 357| 		titles.push({
| 358| 358| 			"label": translate("Map Description"),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 361| 361| 	}
| 362| 362| 
| 363| 363| 	if (g_GameAttributes.mapType)
| 364|    |-	titles.push({
|    | 364|+		titles.push({
| 365| 365| 		"label": translate("Map Type"),
| 366| 366| 		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 367| 367| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 362| 362| 
| 363| 363| 	if (g_GameAttributes.mapType)
| 364| 364| 	titles.push({
| 365|    |-		"label": translate("Map Type"),
|    | 365|+			"label": translate("Map Type"),
| 366| 366| 		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 367| 367| 	});
| 368| 368| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 363| 363| 	if (g_GameAttributes.mapType)
| 364| 364| 	titles.push({
| 365| 365| 		"label": translate("Map Type"),
| 366|    |-		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
|    | 366|+			"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 367| 367| 	});
| 368| 368| 
| 369| 369| 	if (g_GameAttributes.mapType == "random" && g_GameAttributes.settings.Size)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 364| 364| 	titles.push({
| 365| 365| 		"label": translate("Map Type"),
| 366| 366| 		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 367|    |-	});
|    | 367|+		});
| 368| 368| 
| 369| 369| 	if (g_GameAttributes.mapType == "random" && g_GameAttributes.settings.Size)
| 370| 370| 	{
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 395| 395| 	}
| 396| 396| 
| 397| 397| 	if (g_GameAttributes.settings.Nomad !== undefined)
| 398|    |-	titles.push({
|    | 398|+		titles.push({
| 399| 399| 		"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
| 400| 400| 		"value":
| 401| 401| 			g_GameAttributes.settings.Nomad ?
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 396| 396| 
| 397| 397| 	if (g_GameAttributes.settings.Nomad !== undefined)
| 398| 398| 	titles.push({
| 399|    |-		"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
|    | 399|+			"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
| 400| 400| 		"value":
| 401| 401| 			g_GameAttributes.settings.Nomad ?
| 402| 402| 				translate("Players start with only few units and have to find a suitable place to build their city.") :
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 397| 397| 	if (g_GameAttributes.settings.Nomad !== undefined)
| 398| 398| 	titles.push({
| 399| 399| 		"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
| 400|    |-		"value":
|    | 400|+			"value":
| 401| 401| 			g_GameAttributes.settings.Nomad ?
| 402| 402| 				translate("Players start with only few units and have to find a suitable place to build their city.") :
| 403| 403| 				translate("Players start with a Civic Center.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 401| 401| 			g_GameAttributes.settings.Nomad ?
| 402| 402| 				translate("Players start with only few units and have to find a suitable place to build their city.") :
| 403| 403| 				translate("Players start with a Civic Center.")
| 404|    |-	});
|    | 404|+		});
| 405| 405| 
| 406| 406| 	if (g_GameAttributes.settings.StartingResources !== undefined)
| 407| 407| 		titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 432| 432| 		});
| 433| 433| 
| 434| 434| 	if (g_GameAttributes.settings.DisableTreasures !== undefined)
| 435|    |-	titles.push({
|    | 435|+		titles.push({
| 436| 436| 		"label": translate("Treasures"),
| 437| 437| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 438| 438| 			translateWithContext("treasures", "Disabled") :
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 433| 433| 
| 434| 434| 	if (g_GameAttributes.settings.DisableTreasures !== undefined)
| 435| 435| 	titles.push({
| 436|    |-		"label": translate("Treasures"),
|    | 436|+			"label": translate("Treasures"),
| 437| 437| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 438| 438| 			translateWithContext("treasures", "Disabled") :
| 439| 439| 			translateWithContext("treasures", "As defined by the map.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 434| 434| 	if (g_GameAttributes.settings.DisableTreasures !== undefined)
| 435| 435| 	titles.push({
| 436| 436| 		"label": translate("Treasures"),
| 437|    |-		"value": g_GameAttributes.settings.DisableTreasures ?
|    | 437|+			"value": g_GameAttributes.settings.DisableTreasures ?
| 438| 438| 			translateWithContext("treasures", "Disabled") :
| 439| 439| 			translateWithContext("treasures", "As defined by the map.")
| 440| 440| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 435| 435| 	titles.push({
| 436| 436| 		"label": translate("Treasures"),
| 437| 437| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 438|    |-			translateWithContext("treasures", "Disabled") :
|    | 438|+				translateWithContext("treasures", "Disabled") :
| 439| 439| 			translateWithContext("treasures", "As defined by the map.")
| 440| 440| 	});
| 441| 441| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 436| 436| 		"label": translate("Treasures"),
| 437| 437| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 438| 438| 			translateWithContext("treasures", "Disabled") :
| 439|    |-			translateWithContext("treasures", "As defined by the map.")
|    | 439|+				translateWithContext("treasures", "As defined by the map.")
| 440| 440| 	});
| 441| 441| 
| 442| 442| 	if (g_GameAttributes.settings.RevealMap !== undefined)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 437| 437| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 438| 438| 			translateWithContext("treasures", "Disabled") :
| 439| 439| 			translateWithContext("treasures", "As defined by the map.")
| 440|    |-	});
|    | 440|+		});
| 441| 441| 
| 442| 442| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 443| 443| 	titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 440| 440| 	});
| 441| 441| 
| 442| 442| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 443|    |-	titles.push({
|    | 443|+		titles.push({
| 444| 444| 		"label": translate("Revealed Map"),
| 445| 445| 		"value": g_GameAttributes.settings.RevealMap
| 446| 446| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 441| 441| 
| 442| 442| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 443| 443| 	titles.push({
| 444|    |-		"label": translate("Revealed Map"),
|    | 444|+			"label": translate("Revealed Map"),
| 445| 445| 		"value": g_GameAttributes.settings.RevealMap
| 446| 446| 	});
| 447| 447| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 442| 442| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 443| 443| 	titles.push({
| 444| 444| 		"label": translate("Revealed Map"),
| 445|    |-		"value": g_GameAttributes.settings.RevealMap
|    | 445|+			"value": g_GameAttributes.settings.RevealMap
| 446| 446| 	});
| 447| 447| 
| 448| 448| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 443| 443| 	titles.push({
| 444| 444| 		"label": translate("Revealed Map"),
| 445| 445| 		"value": g_GameAttributes.settings.RevealMap
| 446|    |-	});
|    | 446|+		});
| 447| 447| 
| 448| 448| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 449| 449| 	titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 446| 446| 	});
| 447| 447| 
| 448| 448| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 449|    |-	titles.push({
|    | 449|+		titles.push({
| 450| 450| 		"label": translate("Explored Map"),
| 451| 451| 		"value": g_GameAttributes.settings.ExploreMap
| 452| 452| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 447| 447| 
| 448| 448| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 449| 449| 	titles.push({
| 450|    |-		"label": translate("Explored Map"),
|    | 450|+			"label": translate("Explored Map"),
| 451| 451| 		"value": g_GameAttributes.settings.ExploreMap
| 452| 452| 	});
| 453| 453| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 448| 448| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 449| 449| 	titles.push({
| 450| 450| 		"label": translate("Explored Map"),
| 451|    |-		"value": g_GameAttributes.settings.ExploreMap
|    | 451|+			"value": g_GameAttributes.settings.ExploreMap
| 452| 452| 	});
| 453| 453| 
| 454| 454| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 449| 449| 	titles.push({
| 450| 450| 		"label": translate("Explored Map"),
| 451| 451| 		"value": g_GameAttributes.settings.ExploreMap
| 452|    |-	});
|    | 452|+		});
| 453| 453| 
| 454| 454| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 455| 455| 	titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 452| 452| 	});
| 453| 453| 
| 454| 454| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 455|    |-	titles.push({
|    | 455|+		titles.push({
| 456| 456| 		"label": translate("Cheats"),
| 457| 457| 		"value": g_GameAttributes.settings.CheatsEnabled
| 458| 458| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 453| 453| 
| 454| 454| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 455| 455| 	titles.push({
| 456|    |-		"label": translate("Cheats"),
|    | 456|+			"label": translate("Cheats"),
| 457| 457| 		"value": g_GameAttributes.settings.CheatsEnabled
| 458| 458| 	});
| 459| 459| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 454| 454| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 455| 455| 	titles.push({
| 456| 456| 		"label": translate("Cheats"),
| 457|    |-		"value": g_GameAttributes.settings.CheatsEnabled
|    | 457|+			"value": g_GameAttributes.settings.CheatsEnabled
| 458| 458| 	});
| 459| 459| 
| 460| 460| 	return titles.map(title => sprintf(translate("%(label)s %(details)s"), {
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 455| 455| 	titles.push({
| 456| 456| 		"label": translate("Cheats"),
| 457| 457| 		"value": g_GameAttributes.settings.CheatsEnabled
| 458|    |-	});
|    | 458|+		});
| 459| 459| 
| 460| 460| 	return titles.map(title => sprintf(translate("%(label)s %(details)s"), {
| 461| 461| 		"label": coloredText(title.label, g_DescriptionHighlight),

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   7| »   »   this.clientItemFactory·=·new·PlayerAssignmentItem.Client();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   8| »   »   this.aiItemFactory·=·new·PlayerAssignmentItem.AI();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   9| »   »   this.unassignedItem·=·new·PlayerAssignmentItem.Unassigned().createItem();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
| 153| class·PlayerAssignmentItem
|    | [NORMAL] JSHintBear:
|    | 'PlayerAssignmentItem' was used before it was defined.
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/Buttons/ReadyButton.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/Buttons/ReadyButton.js
|  22|  22| 
|  23|  23| 	registerButtonHiddenChangeHandler(handler)
|  24|  24| 	{
|  25|    |-		this.buttonHiddenChangeHandlers.add(handler)
|    |  25|+		this.buttonHiddenChangeHandlers.add(handler);
|  26|  26| 	}
|  27|  27| 
|  28|  28| 	onNetStatusMessage(message)

binaries/data/mods/public/gui/gamesetup/Panels/Buttons/ReadyButton.js
|  25| »   »   this.buttonHiddenChangeHandlers.add(handler)
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerName.js
|  91| »   »   »   let·usedName·=·g_GameAttributes.settings.PlayerData.filter(pData·=>
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'pData' is already declared in the upper scope.
Executing section cli...

Link to build: https://jenkins.wildfiregames.com/job/docker-differential/1399/display/redirect

elexis updated this revision to Diff 10823.Dec 30 2019, 4:01 AM
  • Develop gameplan for the MapBrowser D1703 and D1777:

In the course of that rework MapCache/MapFilters:

  • Move MapCache.js to gui/common/ and use it for the other GUI pages (avoids load JSON file calls every replay/savegame/lobby game selection!).
  • Remove getMapPreviewImage, getMapDescriptionAndPreview, getBiomePreview, translateMapTitle from gui/common/, supersede with MapCache.
  • Split MapFilters from MapCache, move MapFilters.json to MapFilters class (to have only one file for that and since mods can extend it without having to overwrite the file)
  • Keep MapFilters in gui/gamesetup/ (instead of moving to gui/common/) (since it's the only GUI page using it currently and since the MapBrowser page seems to benefit more from not running in a separate GUI page)
  • Move MapType data to gui/common/settings.js

Also:

  • Display "Per Player" for StartingResources/PopulationCapacity for maps that use that (that was never implemented since defect introduction)
  • Don't put players and AI into the same slot on scenario maps (yet again)
  • Remove some unneeded checks in onGameAttributesChange.
  • Please linter: missing semicolons, whitespace (except gamedescription.js), comma instead of semicolon.
  • Describe the purpose of the LoadingPage, since it's technically unnecessary, inclining someone to remove it until discovering the reason why it was added.

Committed map changes (removal of invalid and default settings from Skirmish maps) in rP23279 and rP23310.

Successful build - Chance fights ever on the side of the prudent.

Link to build: https://jenkins.wildfiregames.com/job/vs2015-differential/911/display/redirect

Successful build - Chance fights ever on the side of the prudent.

Linter detected issues:
Executing section Source...
Executing section JS...
|    | [NORMAL] ESLintBear (key-spacing):
|    | Extra space before value for key 'map'.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Controls/GameSettingsControl.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Controls/GameSettingsControl.js
| 108| 108| 			// settings from the server or the local file.
| 109| 109| 			g_GameAttributes = {
| 110| 110| 				"mapType": initData.mapType,
| 111|    |-				"map":  initData.map
|    | 111|+				"map": initData.map
| 112| 112| 			};
| 113| 113| 
| 114| 114| 			this.updateGameAttributes();
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  16|  16| 		let caption =
|  17|  17| 			g_GameAttributes.settings.CheatsEnabled ?
|  18|  18| 				this.CheatsEnabled :
|  19|    |-			g_GameAttributes.settings.RatingEnabled ?
|    |  19|+				g_GameAttributes.settings.RatingEnabled ?
|  20|  20| 				this.RatingEnabled :
|  21|  21| 				"";
|  22|  22| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  17|  17| 			g_GameAttributes.settings.CheatsEnabled ?
|  18|  18| 				this.CheatsEnabled :
|  19|  19| 			g_GameAttributes.settings.RatingEnabled ?
|  20|    |-				this.RatingEnabled :
|    |  20|+					this.RatingEnabled :
|  21|  21| 				"";
|  22|  22| 
|  23|  23| 		this.gameSettingWarning.caption = caption;
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  18|  18| 				this.CheatsEnabled :
|  19|  19| 			g_GameAttributes.settings.RatingEnabled ?
|  20|  20| 				this.RatingEnabled :
|  21|    |-				"";
|    |  21|+					"";
|  22|  22| 
|  23|  23| 		this.gameSettingWarning.caption = caption;
|  24|  24| 		this.gameSettingWarning.hidden = !caption;

binaries/data/mods/public/simulation/helpers/Player.js
|  78| »   »   let·cmpPlayer·=·QueryPlayerIDInterface(i);
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'cmpPlayer' is already declared in the upper scope.

binaries/data/mods/public/simulation/helpers/Player.js
| 165| »   »   for·(let·i·=·0;·i·<·numPlayers;·++i)
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.

binaries/data/mods/public/simulation/helpers/Player.js
|  67| »   »   var·entID·=·cmpPlayerManager.GetPlayerByID(i);
|    | [NORMAL] JSHintBear:
|    | 'entID' is already defined.

binaries/data/mods/public/simulation/helpers/Player.js
|  76| »   for·(var·i·=·0;·i·<·numPlayers;·++i)
|    | [NORMAL] JSHintBear:
|    | 'i' is already defined.

binaries/data/mods/public/simulation/helpers/Player.js
| 143| »   »   »   for·(var·j·=·0;·j·<·numPlayers;·++j)
|    | [NORMAL] JSHintBear:
|    | 'j' is already defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   7| »   »   this.clientItemFactory·=·new·PlayerAssignmentItem.Client();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   8| »   »   this.aiItemFactory·=·new·PlayerAssignmentItem.AI();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   9| »   »   this.unassignedItem·=·new·PlayerAssignmentItem.Unassigned().createItem();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
| 153| class·PlayerAssignmentItem
|    | [NORMAL] JSHintBear:
|    | 'PlayerAssignmentItem' was used before it was defined.
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 102| 102| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 103| 103| 						playerDescription = translate("%(playerName)s (%(civ)s, %(state)s)");
| 104| 104| 				else
| 105|    |-					if (isActive)
|    | 105|+				if (isActive)
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 103| 103| 						playerDescription = translate("%(playerName)s (%(civ)s, %(state)s)");
| 104| 104| 				else
| 105| 105| 					if (isActive)
| 106|    |-						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | 106|+				// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 104| 104| 				else
| 105| 105| 					if (isActive)
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107|    |-						playerDescription = translate("%(playerName)s");
|    | 107|+					playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110| 110| 						playerDescription = translate("%(playerName)s (%(state)s)");
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 105| 105| 					if (isActive)
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108|    |-					else
|    | 108|+				else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110| 110| 						playerDescription = translate("%(playerName)s (%(state)s)");
| 111| 111| 			}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109|    |-						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | 109|+				// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110| 110| 						playerDescription = translate("%(playerName)s (%(state)s)");
| 111| 111| 			}
| 112| 112| 		}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110|    |-						playerDescription = translate("%(playerName)s (%(state)s)");
|    | 110|+					playerDescription = translate("%(playerName)s (%(state)s)");
| 111| 111| 			}
| 112| 112| 		}
| 113| 113| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 194| 194| 		});
| 195| 195| 
| 196| 196| 	if (g_GameAttributes.settings.VictoryConditions)
| 197|    |-	for (let victoryCondition of g_VictoryConditions)
|    | 197|+		for (let victoryCondition of g_VictoryConditions)
| 198| 198| 	{
| 199| 199| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 200| 200| 			continue;
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 195| 195| 
| 196| 196| 	if (g_GameAttributes.settings.VictoryConditions)
| 197| 197| 	for (let victoryCondition of g_VictoryConditions)
| 198|    |-	{
|    | 198|+		{
| 199| 199| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 200| 200| 			continue;
| 201| 201| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 196| 196| 	if (g_GameAttributes.settings.VictoryConditions)
| 197| 197| 	for (let victoryCondition of g_VictoryConditions)
| 198| 198| 	{
| 199|    |-		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
|    | 199|+			if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 200| 200| 			continue;
| 201| 201| 
| 202| 202| 		let title = translateVictoryCondition(victoryCondition.Name);
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 197| 197| 	for (let victoryCondition of g_VictoryConditions)
| 198| 198| 	{
| 199| 199| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 200|    |-			continue;
|    | 200|+				continue;
| 201| 201| 
| 202| 202| 		let title = translateVictoryCondition(victoryCondition.Name);
| 203| 203| 		if (victoryCondition.Name == "wonder")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 199| 199| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 200| 200| 			continue;
| 201| 201| 
| 202|    |-		let title = translateVictoryCondition(victoryCondition.Name);
|    | 202|+			let title = translateVictoryCondition(victoryCondition.Name);
| 203| 203| 		if (victoryCondition.Name == "wonder")
| 204| 204| 			title = sprintf(
| 205| 205| 				translatePluralWithContext(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 200| 200| 			continue;
| 201| 201| 
| 202| 202| 		let title = translateVictoryCondition(victoryCondition.Name);
| 203|    |-		if (victoryCondition.Name == "wonder")
|    | 203|+			if (victoryCondition.Name == "wonder")
| 204| 204| 			title = sprintf(
| 205| 205| 				translatePluralWithContext(
| 206| 206| 					"victory condition",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 201| 201| 
| 202| 202| 		let title = translateVictoryCondition(victoryCondition.Name);
| 203| 203| 		if (victoryCondition.Name == "wonder")
| 204|    |-			title = sprintf(
|    | 204|+				title = sprintf(
| 205| 205| 				translatePluralWithContext(
| 206| 206| 					"victory condition",
| 207| 207| 					"Wonder (%(min)s minute)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 202| 202| 		let title = translateVictoryCondition(victoryCondition.Name);
| 203| 203| 		if (victoryCondition.Name == "wonder")
| 204| 204| 			title = sprintf(
| 205|    |-				translatePluralWithContext(
|    | 205|+					translatePluralWithContext(
| 206| 206| 					"victory condition",
| 207| 207| 					"Wonder (%(min)s minute)",
| 208| 208| 					"Wonder (%(min)s minutes)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 203| 203| 		if (victoryCondition.Name == "wonder")
| 204| 204| 			title = sprintf(
| 205| 205| 				translatePluralWithContext(
| 206|    |-					"victory condition",
|    | 206|+						"victory condition",
| 207| 207| 					"Wonder (%(min)s minute)",
| 208| 208| 					"Wonder (%(min)s minutes)",
| 209| 209| 					g_GameAttributes.settings.WonderDuration
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 204| 204| 			title = sprintf(
| 205| 205| 				translatePluralWithContext(
| 206| 206| 					"victory condition",
| 207|    |-					"Wonder (%(min)s minute)",
|    | 207|+						"Wonder (%(min)s minute)",
| 208| 208| 					"Wonder (%(min)s minutes)",
| 209| 209| 					g_GameAttributes.settings.WonderDuration
| 210| 210| 				),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 205| 205| 				translatePluralWithContext(
| 206| 206| 					"victory condition",
| 207| 207| 					"Wonder (%(min)s minute)",
| 208|    |-					"Wonder (%(min)s minutes)",
|    | 208|+						"Wonder (%(min)s minutes)",
| 209| 209| 					g_GameAttributes.settings.WonderDuration
| 210| 210| 				),
| 211| 211| 				{ "min": g_GameAttributes.settings.WonderDuration }
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 206| 206| 					"victory condition",
| 207| 207| 					"Wonder (%(min)s minute)",
| 208| 208| 					"Wonder (%(min)s minutes)",
| 209|    |-					g_GameAttributes.settings.WonderDuration
|    | 209|+						g_GameAttributes.settings.WonderDuration
| 210| 210| 				),
| 211| 211| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 212| 212| 			);
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 207| 207| 					"Wonder (%(min)s minute)",
| 208| 208| 					"Wonder (%(min)s minutes)",
| 209| 209| 					g_GameAttributes.settings.WonderDuration
| 210|    |-				),
|    | 210|+					),
| 211| 211| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 212| 212| 			);
| 213| 213| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 208| 208| 					"Wonder (%(min)s minutes)",
| 209| 209| 					g_GameAttributes.settings.WonderDuration
| 210| 210| 				),
| 211|    |-				{ "min": g_GameAttributes.settings.WonderDuration }
|    | 211|+					{ "min": g_GameAttributes.settings.WonderDuration }
| 212| 212| 			);
| 213| 213| 
| 214| 214| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 209| 209| 					g_GameAttributes.settings.WonderDuration
| 210| 210| 				),
| 211| 211| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 212|    |-			);
|    | 212|+				);
| 213| 213| 
| 214| 214| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 215| 215| 		if (isCaptureTheRelic)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 211| 211| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 212| 212| 			);
| 213| 213| 
| 214|    |-		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
|    | 214|+			let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 215| 215| 		if (isCaptureTheRelic)
| 216| 216| 			title = sprintf(
| 217| 217| 				translatePluralWithContext(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 212| 212| 			);
| 213| 213| 
| 214| 214| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 215|    |-		if (isCaptureTheRelic)
|    | 215|+			if (isCaptureTheRelic)
| 216| 216| 			title = sprintf(
| 217| 217| 				translatePluralWithContext(
| 218| 218| 					"victory condition",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 213| 213| 
| 214| 214| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 215| 215| 		if (isCaptureTheRelic)
| 216|    |-			title = sprintf(
|    | 216|+				title = sprintf(
| 217| 217| 				translatePluralWithContext(
| 218| 218| 					"victory condition",
| 219| 219| 					"Capture the Relic (%(min)s minute)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 214| 214| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 215| 215| 		if (isCaptureTheRelic)
| 216| 216| 			title = sprintf(
| 217|    |-				translatePluralWithContext(
|    | 217|+					translatePluralWithContext(
| 218| 218| 					"victory condition",
| 219| 219| 					"Capture the Relic (%(min)s minute)",
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 215| 215| 		if (isCaptureTheRelic)
| 216| 216| 			title = sprintf(
| 217| 217| 				translatePluralWithContext(
| 218|    |-					"victory condition",
|    | 218|+						"victory condition",
| 219| 219| 					"Capture the Relic (%(min)s minute)",
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
| 221| 221| 					g_GameAttributes.settings.RelicDuration
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 216| 216| 			title = sprintf(
| 217| 217| 				translatePluralWithContext(
| 218| 218| 					"victory condition",
| 219|    |-					"Capture the Relic (%(min)s minute)",
|    | 219|+						"Capture the Relic (%(min)s minute)",
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
| 221| 221| 					g_GameAttributes.settings.RelicDuration
| 222| 222| 				),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 217| 217| 				translatePluralWithContext(
| 218| 218| 					"victory condition",
| 219| 219| 					"Capture the Relic (%(min)s minute)",
| 220|    |-					"Capture the Relic (%(min)s minutes)",
|    | 220|+						"Capture the Relic (%(min)s minutes)",
| 221| 221| 					g_GameAttributes.settings.RelicDuration
| 222| 222| 				),
| 223| 223| 				{ "min": g_GameAttributes.settings.RelicDuration }
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 218| 218| 					"victory condition",
| 219| 219| 					"Capture the Relic (%(min)s minute)",
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
| 221|    |-					g_GameAttributes.settings.RelicDuration
|    | 221|+						g_GameAttributes.settings.RelicDuration
| 222| 222| 				),
| 223| 223| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 224| 224| 			);
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 219| 219| 					"Capture the Relic (%(min)s minute)",
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
| 221| 221| 					g_GameAttributes.settings.RelicDuration
| 222|    |-				),
|    | 222|+					),
| 223| 223| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 224| 224| 			);
| 225| 225| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
| 221| 221| 					g_GameAttributes.settings.RelicDuration
| 222| 222| 				),
| 223|    |-				{ "min": g_GameAttributes.settings.RelicDuration }
|    | 223|+					{ "min": g_GameAttributes.settings.RelicDuration }
| 224| 224| 			);
| 225| 225| 
| 226| 226| 		titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 221| 221| 					g_GameAttributes.settings.RelicDuration
| 222| 222| 				),
| 223| 223| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 224|    |-			);
|    | 224|+				);
| 225| 225| 
| 226| 226| 		titles.push({
| 227| 227| 			"label": title,
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 223| 223| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 224| 224| 			);
| 225| 225| 
| 226|    |-		titles.push({
|    | 226|+			titles.push({
| 227| 227| 			"label": title,
| 228| 228| 			"value": victoryCondition.Description
| 229| 229| 		});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 224| 224| 			);
| 225| 225| 
| 226| 226| 		titles.push({
| 227|    |-			"label": title,
|    | 227|+				"label": title,
| 228| 228| 			"value": victoryCondition.Description
| 229| 229| 		});
| 230| 230| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 225| 225| 
| 226| 226| 		titles.push({
| 227| 227| 			"label": title,
| 228|    |-			"value": victoryCondition.Description
|    | 228|+				"value": victoryCondition.Description
| 229| 229| 		});
| 230| 230| 
| 231| 231| 		if (isCaptureTheRelic)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 226| 226| 		titles.push({
| 227| 227| 			"label": title,
| 228| 228| 			"value": victoryCondition.Description
| 229|    |-		});
|    | 229|+			});
| 230| 230| 
| 231| 231| 		if (isCaptureTheRelic)
| 232| 232| 			titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 228| 228| 			"value": victoryCondition.Description
| 229| 229| 		});
| 230| 230| 
| 231|    |-		if (isCaptureTheRelic)
|    | 231|+			if (isCaptureTheRelic)
| 232| 232| 			titles.push({
| 233| 233| 				"label": translate("Relic Count"),
| 234| 234| 				"value": g_GameAttributes.settings.RelicCount
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 229| 229| 		});
| 230| 230| 
| 231| 231| 		if (isCaptureTheRelic)
| 232|    |-			titles.push({
|    | 232|+				titles.push({
| 233| 233| 				"label": translate("Relic Count"),
| 234| 234| 				"value": g_GameAttributes.settings.RelicCount
| 235| 235| 			});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 230| 230| 
| 231| 231| 		if (isCaptureTheRelic)
| 232| 232| 			titles.push({
| 233|    |-				"label": translate("Relic Count"),
|    | 233|+					"label": translate("Relic Count"),
| 234| 234| 				"value": g_GameAttributes.settings.RelicCount
| 235| 235| 			});
| 236| 236| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 231| 231| 		if (isCaptureTheRelic)
| 232| 232| 			titles.push({
| 233| 233| 				"label": translate("Relic Count"),
| 234|    |-				"value": g_GameAttributes.settings.RelicCount
|    | 234|+					"value": g_GameAttributes.settings.RelicCount
| 235| 235| 			});
| 236| 236| 
| 237| 237| 		if (victoryCondition.Name == "regicide")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 232| 232| 			titles.push({
| 233| 233| 				"label": translate("Relic Count"),
| 234| 234| 				"value": g_GameAttributes.settings.RelicCount
| 235|    |-			});
|    | 235|+				});
| 236| 236| 
| 237| 237| 		if (victoryCondition.Name == "regicide")
| 238| 238| 			if (g_GameAttributes.settings.RegicideGarrison)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 234| 234| 				"value": g_GameAttributes.settings.RelicCount
| 235| 235| 			});
| 236| 236| 
| 237|    |-		if (victoryCondition.Name == "regicide")
|    | 237|+			if (victoryCondition.Name == "regicide")
| 238| 238| 			if (g_GameAttributes.settings.RegicideGarrison)
| 239| 239| 				titles.push({
| 240| 240| 					"label": translate("Hero Garrison"),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 235| 235| 			});
| 236| 236| 
| 237| 237| 		if (victoryCondition.Name == "regicide")
| 238|    |-			if (g_GameAttributes.settings.RegicideGarrison)
|    | 238|+				if (g_GameAttributes.settings.RegicideGarrison)
| 239| 239| 				titles.push({
| 240| 240| 					"label": translate("Hero Garrison"),
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 236| 236| 
| 237| 237| 		if (victoryCondition.Name == "regicide")
| 238| 238| 			if (g_GameAttributes.settings.RegicideGarrison)
| 239|    |-				titles.push({
|    | 239|+					titles.push({
| 240| 240| 					"label": translate("Hero Garrison"),
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
| 242| 242| 				});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 237| 237| 		if (victoryCondition.Name == "regicide")
| 238| 238| 			if (g_GameAttributes.settings.RegicideGarrison)
| 239| 239| 				titles.push({
| 240|    |-					"label": translate("Hero Garrison"),
|    | 240|+						"label": translate("Hero Garrison"),
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
| 242| 242| 				});
| 243| 243| 			else
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 238| 238| 			if (g_GameAttributes.settings.RegicideGarrison)
| 239| 239| 				titles.push({
| 240| 240| 					"label": translate("Hero Garrison"),
| 241|    |-					"value": translate("Heroes can be garrisoned.")
|    | 241|+						"value": translate("Heroes can be garrisoned.")
| 242| 242| 				});
| 243| 243| 			else
| 244| 244| 				titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 239| 239| 				titles.push({
| 240| 240| 					"label": translate("Hero Garrison"),
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
| 242|    |-				});
|    | 242|+					});
| 243| 243| 			else
| 244| 244| 				titles.push({
| 245| 245| 					"label": translate("Exposed Heroes"),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 240| 240| 					"label": translate("Hero Garrison"),
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
| 242| 242| 				});
| 243|    |-			else
|    | 243|+				else
| 244| 244| 				titles.push({
| 245| 245| 					"label": translate("Exposed Heroes"),
| 246| 246| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
| 242| 242| 				});
| 243| 243| 			else
| 244|    |-				titles.push({
|    | 244|+					titles.push({
| 245| 245| 					"label": translate("Exposed Heroes"),
| 246| 246| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 247| 247| 				});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 242| 242| 				});
| 243| 243| 			else
| 244| 244| 				titles.push({
| 245|    |-					"label": translate("Exposed Heroes"),
|    | 245|+						"label": translate("Exposed Heroes"),
| 246| 246| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 247| 247| 				});
| 248| 248| 	}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 243| 243| 			else
| 244| 244| 				titles.push({
| 245| 245| 					"label": translate("Exposed Heroes"),
| 246|    |-					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
|    | 246|+						"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 247| 247| 				});
| 248| 248| 	}
| 249| 249| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 244| 244| 				titles.push({
| 245| 245| 					"label": translate("Exposed Heroes"),
| 246| 246| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 247|    |-				});
|    | 247|+					});
| 248| 248| 	}
| 249| 249| 
| 250| 250| 	if (g_GameAttributes.settings.RatingEnabled &&
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 245| 245| 					"label": translate("Exposed Heroes"),
| 246| 246| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 247| 247| 				});
| 248|    |-	}
|    | 248|+		}
| 249| 249| 
| 250| 250| 	if (g_GameAttributes.settings.RatingEnabled &&
| 251| 251| 	    g_GameAttributes.settings.PlayerData.length == 2)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 277| 277| 		});
| 278| 278| 
| 279| 279| 	if (g_GameAttributes.settings.Ceasefire !== undefined)
| 280|    |-	titles.push({
|    | 280|+		titles.push({
| 281| 281| 		"label": translate("Ceasefire"),
| 282| 282| 		"value":
| 283| 283| 			g_GameAttributes.settings.Ceasefire == 0 ?
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 278| 278| 
| 279| 279| 	if (g_GameAttributes.settings.Ceasefire !== undefined)
| 280| 280| 	titles.push({
| 281|    |-		"label": translate("Ceasefire"),
|    | 281|+			"label": translate("Ceasefire"),
| 282| 282| 		"value":
| 283| 283| 			g_GameAttributes.settings.Ceasefire == 0 ?
| 284| 284| 				translate("disabled") :
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 279| 279| 	if (g_GameAttributes.settings.Ceasefire !== undefined)
| 280| 280| 	titles.push({
| 281| 281| 		"label": translate("Ceasefire"),
| 282|    |-		"value":
|    | 282|+			"value":
| 283| 283| 			g_GameAttributes.settings.Ceasefire == 0 ?
| 284| 284| 				translate("disabled") :
| 285| 285| 				sprintf(translatePlural(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 287| 287| 					"For the first %(min)s minutes, other players will stay neutral.",
| 288| 288| 					g_GameAttributes.settings.Ceasefire),
| 289| 289| 				{ "min": g_GameAttributes.settings.Ceasefire })
| 290|    |-	});
|    | 290|+		});
| 291| 291| 
| 292| 292| 	if (g_GameAttributes.map !== undefined && g_GameAttributes.map == "random")
| 293| 293| 		titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 309| 309| 	}
| 310| 310| 
| 311| 311| 	if (g_GameAttributes.mapType)
| 312|    |-	titles.push({
|    | 312|+		titles.push({
| 313| 313| 		"label": translate("Map Type"),
| 314| 314| 		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 315| 315| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 310| 310| 
| 311| 311| 	if (g_GameAttributes.mapType)
| 312| 312| 	titles.push({
| 313|    |-		"label": translate("Map Type"),
|    | 313|+			"label": translate("Map Type"),
| 314| 314| 		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 315| 315| 	});
| 316| 316| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 311| 311| 	if (g_GameAttributes.mapType)
| 312| 312| 	titles.push({
| 313| 313| 		"label": translate("Map Type"),
| 314|    |-		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
|    | 314|+			"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 315| 315| 	});
| 316| 316| 
| 317| 317| 	if (g_GameAttributes.mapType == "random" && g_GameAttributes.settings.Size)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 312| 312| 	titles.push({
| 313| 313| 		"label": translate("Map Type"),
| 314| 314| 		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 315|    |-	});
|    | 315|+		});
| 316| 316| 
| 317| 317| 	if (g_GameAttributes.mapType == "random" && g_GameAttributes.settings.Size)
| 318| 318| 	{
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 343| 343| 	}
| 344| 344| 
| 345| 345| 	if (g_GameAttributes.settings.Nomad !== undefined)
| 346|    |-	titles.push({
|    | 346|+		titles.push({
| 347| 347| 		"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
| 348| 348| 		"value":
| 349| 349| 			g_GameAttributes.settings.Nomad ?
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 344| 344| 
| 345| 345| 	if (g_GameAttributes.settings.Nomad !== undefined)
| 346| 346| 	titles.push({
| 347|    |-		"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
|    | 347|+			"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
| 348| 348| 		"value":
| 349| 349| 			g_GameAttributes.settings.Nomad ?
| 350| 350| 				translate("Players start with only few units and have to find a suitable place to build their city.") :
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 345| 345| 	if (g_GameAttributes.settings.Nomad !== undefined)
| 346| 346| 	titles.push({
| 347| 347| 		"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
| 348|    |-		"value":
|    | 348|+			"value":
| 349| 349| 			g_GameAttributes.settings.Nomad ?
| 350| 350| 				translate("Players start with only few units and have to find a suitable place to build their city.") :
| 351| 351| 				translate("Players start with a Civic Center.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 349| 349| 			g_GameAttributes.settings.Nomad ?
| 350| 350| 				translate("Players start with only few units and have to find a suitable place to build their city.") :
| 351| 351| 				translate("Players start with a Civic Center.")
| 352|    |-	});
|    | 352|+		});
| 353| 353| 
| 354| 354| 	if (g_GameAttributes.settings.StartingResources !== undefined)
| 355| 355| 		titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 380| 380| 		});
| 381| 381| 
| 382| 382| 	if (g_GameAttributes.settings.DisableTreasures !== undefined)
| 383|    |-	titles.push({
|    | 383|+		titles.push({
| 384| 384| 		"label": translate("Treasures"),
| 385| 385| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 386| 386| 			translateWithContext("treasures", "Disabled") :
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 381| 381| 
| 382| 382| 	if (g_GameAttributes.settings.DisableTreasures !== undefined)
| 383| 383| 	titles.push({
| 384|    |-		"label": translate("Treasures"),
|    | 384|+			"label": translate("Treasures"),
| 385| 385| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 386| 386| 			translateWithContext("treasures", "Disabled") :
| 387| 387| 			translateWithContext("treasures", "As defined by the map.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 382| 382| 	if (g_GameAttributes.settings.DisableTreasures !== undefined)
| 383| 383| 	titles.push({
| 384| 384| 		"label": translate("Treasures"),
| 385|    |-		"value": g_GameAttributes.settings.DisableTreasures ?
|    | 385|+			"value": g_GameAttributes.settings.DisableTreasures ?
| 386| 386| 			translateWithContext("treasures", "Disabled") :
| 387| 387| 			translateWithContext("treasures", "As defined by the map.")
| 388| 388| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 383| 383| 	titles.push({
| 384| 384| 		"label": translate("Treasures"),
| 385| 385| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 386|    |-			translateWithContext("treasures", "Disabled") :
|    | 386|+				translateWithContext("treasures", "Disabled") :
| 387| 387| 			translateWithContext("treasures", "As defined by the map.")
| 388| 388| 	});
| 389| 389| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 384| 384| 		"label": translate("Treasures"),
| 385| 385| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 386| 386| 			translateWithContext("treasures", "Disabled") :
| 387|    |-			translateWithContext("treasures", "As defined by the map.")
|    | 387|+				translateWithContext("treasures", "As defined by the map.")
| 388| 388| 	});
| 389| 389| 
| 390| 390| 	if (g_GameAttributes.settings.RevealMap !== undefined)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 385| 385| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 386| 386| 			translateWithContext("treasures", "Disabled") :
| 387| 387| 			translateWithContext("treasures", "As defined by the map.")
| 388|    |-	});
|    | 388|+		});
| 389| 389| 
| 390| 390| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 391| 391| 	titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 388| 388| 	});
| 389| 389| 
| 390| 390| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 391|    |-	titles.push({
|    | 391|+		titles.push({
| 392| 392| 		"label": translate("Revealed Map"),
| 393| 393| 		"value": g_GameAttributes.settings.RevealMap
| 394| 394| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 389| 389| 
| 390| 390| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 391| 391| 	titles.push({
| 392|    |-		"label": translate("Revealed Map"),
|    | 392|+			"label": translate("Revealed Map"),
| 393| 393| 		"value": g_GameAttributes.settings.RevealMap
| 394| 394| 	});
| 395| 395| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 390| 390| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 391| 391| 	titles.push({
| 392| 392| 		"label": translate("Revealed Map"),
| 393|    |-		"value": g_GameAttributes.settings.RevealMap
|    | 393|+			"value": g_GameAttributes.settings.RevealMap
| 394| 394| 	});
| 395| 395| 
| 396| 396| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 391| 391| 	titles.push({
| 392| 392| 		"label": translate("Revealed Map"),
| 393| 393| 		"value": g_GameAttributes.settings.RevealMap
| 394|    |-	});
|    | 394|+		});
| 395| 395| 
| 396| 396| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 397| 397| 	titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 394| 394| 	});
| 395| 395| 
| 396| 396| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 397|    |-	titles.push({
|    | 397|+		titles.push({
| 398| 398| 		"label": translate("Explored Map"),
| 399| 399| 		"value": g_GameAttributes.settings.ExploreMap
| 400| 400| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 395| 395| 
| 396| 396| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 397| 397| 	titles.push({
| 398|    |-		"label": translate("Explored Map"),
|    | 398|+			"label": translate("Explored Map"),
| 399| 399| 		"value": g_GameAttributes.settings.ExploreMap
| 400| 400| 	});
| 401| 401| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 396| 396| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 397| 397| 	titles.push({
| 398| 398| 		"label": translate("Explored Map"),
| 399|    |-		"value": g_GameAttributes.settings.ExploreMap
|    | 399|+			"value": g_GameAttributes.settings.ExploreMap
| 400| 400| 	});
| 401| 401| 
| 402| 402| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 397| 397| 	titles.push({
| 398| 398| 		"label": translate("Explored Map"),
| 399| 399| 		"value": g_GameAttributes.settings.ExploreMap
| 400|    |-	});
|    | 400|+		});
| 401| 401| 
| 402| 402| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 403| 403| 	titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 400| 400| 	});
| 401| 401| 
| 402| 402| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 403|    |-	titles.push({
|    | 403|+		titles.push({
| 404| 404| 		"label": translate("Cheats"),
| 405| 405| 		"value": g_GameAttributes.settings.CheatsEnabled
| 406| 406| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 401| 401| 
| 402| 402| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 403| 403| 	titles.push({
| 404|    |-		"label": translate("Cheats"),
|    | 404|+			"label": translate("Cheats"),
| 405| 405| 		"value": g_GameAttributes.settings.CheatsEnabled
| 406| 406| 	});
| 407| 407| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 402| 402| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 403| 403| 	titles.push({
| 404| 404| 		"label": translate("Cheats"),
| 405|    |-		"value": g_GameAttributes.settings.CheatsEnabled
|    | 405|+			"value": g_GameAttributes.settings.CheatsEnabled
| 406| 406| 	});
| 407| 407| 
| 408| 408| 	return titles.map(title => sprintf(translate("%(label)s %(details)s"), {
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 403| 403| 	titles.push({
| 404| 404| 		"label": translate("Cheats"),
| 405| 405| 		"value": g_GameAttributes.settings.CheatsEnabled
| 406|    |-	});
|    | 406|+		});
| 407| 407| 
| 408| 408| 	return titles.map(title => sprintf(translate("%(label)s %(details)s"), {
| 409| 409| 		"label": coloredText(title.label, g_DescriptionHighlight),
Executing section cli...

Link to build: https://jenkins.wildfiregames.com/job/docker-differential/1427/display/redirect

Thank you so much that you working on this, as I understand, it is an insane undertaking but well documented one. In Chapter 13 I agree with your A approach and in Chapter 14 I agree that skirmish map type will likely be obsoleted. Moreover, since you deal with game setup rewrite here could you also include civ select. screen during match setup originally from @Angen https://github.com/JustusAvramenko/delenda_est/commit/bd1e73bf133674e790aa9f686f4b41e2ccba0a43 as it is used in not yet released Delenda Est mod, released Battalion mod and recently released Hyrule Conquest mod. Btw will you be also rewriting the GUI code that is present during playing game (match)?

Thats not me it is refactor of original version done by @s0600204

In D2483#105386, @Angen wrote:

Thats not me it is refactor of original version done by @s0600204

Thank you for correcting me, yes that is indeed the case, it seems I was looking at wrong places.

since you deal with game setup rewrite here could you also include civ select. screen during match setup

I am very aware of the Hero selection dialog that is wanted since years and the fact that Delenda Est and the fact that it was necessarily integrated by copying and modifying gamesetup.xml instead of inserting a new file without modifying existing files, which makes it impossible for the mod author who is unfamiliar with coding to maintain his mod, and secondly making it impossible for two mods modifying the gamesetup to be launched simultaneously.

This patch was written to allow insertion of new XML files and setting specific XML and JS code (merit of the setting decoupling).
Where the previous code forced one to only either add a dropdown or a checkbox, it is one of the objectives of this iteration of the code to enable adding arbitrary control elements (for instance buttons opening pages) and multiple objects per setting by only inserting new files.

The patch cannot be extended any further unless it is strictly necessary to achieve the purposes of this patch (that's why the MapCache and MapFilters part was reworked, since the inclusion of the MapBrowser code would have meant that parts of the code introduced here would have had to have been changed again prior to that introduction).

Btw will you be also rewriting the GUI code that is present during playing game (match)?

Already done several commits for session/, see #5387, having another uncommitted one and only worked on loading screen and gamesetup as I lost interest in the session.
It was mostly blocked on the fact that it's many thousands lines of code remaining, some parts coming out better with C++ patches in advance and me never knowing when it's my last day here.

elexis edited the summary of this revision. (Show Details)Dec 30 2019, 5:22 PM
elexis updated this revision to Diff 10834.Dec 31 2019, 11:06 PM
  • Add missing MapFilters.json
  • Fix four bugs: SP -> scenario maptype -> assign player to slot 2 -> assing AI to slot 1 -> change map -> slot 1 unassigned (Fixed by setting player_defaults for player1 to AI equal to the other slots) SP -> assign player to slot 3 -> select map with 2 players -> local player still assigned to slot 3 (FIX in unassignInvalidClients) scenario map -> fixed civs and teams -> random map -> icnrease playercount -> civs and teams still fixed (FIX by calling setEnabled in onUpdateGameAttributes instead of onMapChange) select scenario maptype twice -> 0 players (fixed by early return if maptype didnt change)

Successful build - Chance fights ever on the side of the prudent.

Link to build: https://jenkins.wildfiregames.com/job/vs2015-differential/918/display/redirect

Successful build - Chance fights ever on the side of the prudent.

Link to build: https://jenkins.wildfiregames.com/job/macos-differential/13/display/redirect

Successful build - Chance fights ever on the side of the prudent.

Linter detected issues:
Executing section Source...
Executing section JS...
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 102| 102| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 103| 103| 						playerDescription = translate("%(playerName)s (%(civ)s, %(state)s)");
| 104| 104| 				else
| 105|    |-					if (isActive)
|    | 105|+				if (isActive)
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 103| 103| 						playerDescription = translate("%(playerName)s (%(civ)s, %(state)s)");
| 104| 104| 				else
| 105| 105| 					if (isActive)
| 106|    |-						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | 106|+				// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 104| 104| 				else
| 105| 105| 					if (isActive)
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107|    |-						playerDescription = translate("%(playerName)s");
|    | 107|+					playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110| 110| 						playerDescription = translate("%(playerName)s (%(state)s)");
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 105| 105| 					if (isActive)
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108|    |-					else
|    | 108|+				else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110| 110| 						playerDescription = translate("%(playerName)s (%(state)s)");
| 111| 111| 			}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109|    |-						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | 109|+				// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110| 110| 						playerDescription = translate("%(playerName)s (%(state)s)");
| 111| 111| 			}
| 112| 112| 		}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110|    |-						playerDescription = translate("%(playerName)s (%(state)s)");
|    | 110|+					playerDescription = translate("%(playerName)s (%(state)s)");
| 111| 111| 			}
| 112| 112| 		}
| 113| 113| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 194| 194| 		});
| 195| 195| 
| 196| 196| 	if (g_GameAttributes.settings.VictoryConditions)
| 197|    |-	for (let victoryCondition of g_VictoryConditions)
|    | 197|+		for (let victoryCondition of g_VictoryConditions)
| 198| 198| 	{
| 199| 199| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 200| 200| 			continue;
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 195| 195| 
| 196| 196| 	if (g_GameAttributes.settings.VictoryConditions)
| 197| 197| 	for (let victoryCondition of g_VictoryConditions)
| 198|    |-	{
|    | 198|+		{
| 199| 199| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 200| 200| 			continue;
| 201| 201| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 196| 196| 	if (g_GameAttributes.settings.VictoryConditions)
| 197| 197| 	for (let victoryCondition of g_VictoryConditions)
| 198| 198| 	{
| 199|    |-		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
|    | 199|+			if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 200| 200| 			continue;
| 201| 201| 
| 202| 202| 		let title = translateVictoryCondition(victoryCondition.Name);
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 197| 197| 	for (let victoryCondition of g_VictoryConditions)
| 198| 198| 	{
| 199| 199| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 200|    |-			continue;
|    | 200|+				continue;
| 201| 201| 
| 202| 202| 		let title = translateVictoryCondition(victoryCondition.Name);
| 203| 203| 		if (victoryCondition.Name == "wonder")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 199| 199| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 200| 200| 			continue;
| 201| 201| 
| 202|    |-		let title = translateVictoryCondition(victoryCondition.Name);
|    | 202|+			let title = translateVictoryCondition(victoryCondition.Name);
| 203| 203| 		if (victoryCondition.Name == "wonder")
| 204| 204| 			title = sprintf(
| 205| 205| 				translatePluralWithContext(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 200| 200| 			continue;
| 201| 201| 
| 202| 202| 		let title = translateVictoryCondition(victoryCondition.Name);
| 203|    |-		if (victoryCondition.Name == "wonder")
|    | 203|+			if (victoryCondition.Name == "wonder")
| 204| 204| 			title = sprintf(
| 205| 205| 				translatePluralWithContext(
| 206| 206| 					"victory condition",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 201| 201| 
| 202| 202| 		let title = translateVictoryCondition(victoryCondition.Name);
| 203| 203| 		if (victoryCondition.Name == "wonder")
| 204|    |-			title = sprintf(
|    | 204|+				title = sprintf(
| 205| 205| 				translatePluralWithContext(
| 206| 206| 					"victory condition",
| 207| 207| 					"Wonder (%(min)s minute)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 202| 202| 		let title = translateVictoryCondition(victoryCondition.Name);
| 203| 203| 		if (victoryCondition.Name == "wonder")
| 204| 204| 			title = sprintf(
| 205|    |-				translatePluralWithContext(
|    | 205|+					translatePluralWithContext(
| 206| 206| 					"victory condition",
| 207| 207| 					"Wonder (%(min)s minute)",
| 208| 208| 					"Wonder (%(min)s minutes)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 203| 203| 		if (victoryCondition.Name == "wonder")
| 204| 204| 			title = sprintf(
| 205| 205| 				translatePluralWithContext(
| 206|    |-					"victory condition",
|    | 206|+						"victory condition",
| 207| 207| 					"Wonder (%(min)s minute)",
| 208| 208| 					"Wonder (%(min)s minutes)",
| 209| 209| 					g_GameAttributes.settings.WonderDuration
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 204| 204| 			title = sprintf(
| 205| 205| 				translatePluralWithContext(
| 206| 206| 					"victory condition",
| 207|    |-					"Wonder (%(min)s minute)",
|    | 207|+						"Wonder (%(min)s minute)",
| 208| 208| 					"Wonder (%(min)s minutes)",
| 209| 209| 					g_GameAttributes.settings.WonderDuration
| 210| 210| 				),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 205| 205| 				translatePluralWithContext(
| 206| 206| 					"victory condition",
| 207| 207| 					"Wonder (%(min)s minute)",
| 208|    |-					"Wonder (%(min)s minutes)",
|    | 208|+						"Wonder (%(min)s minutes)",
| 209| 209| 					g_GameAttributes.settings.WonderDuration
| 210| 210| 				),
| 211| 211| 				{ "min": g_GameAttributes.settings.WonderDuration }
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 206| 206| 					"victory condition",
| 207| 207| 					"Wonder (%(min)s minute)",
| 208| 208| 					"Wonder (%(min)s minutes)",
| 209|    |-					g_GameAttributes.settings.WonderDuration
|    | 209|+						g_GameAttributes.settings.WonderDuration
| 210| 210| 				),
| 211| 211| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 212| 212| 			);
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 207| 207| 					"Wonder (%(min)s minute)",
| 208| 208| 					"Wonder (%(min)s minutes)",
| 209| 209| 					g_GameAttributes.settings.WonderDuration
| 210|    |-				),
|    | 210|+					),
| 211| 211| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 212| 212| 			);
| 213| 213| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 208| 208| 					"Wonder (%(min)s minutes)",
| 209| 209| 					g_GameAttributes.settings.WonderDuration
| 210| 210| 				),
| 211|    |-				{ "min": g_GameAttributes.settings.WonderDuration }
|    | 211|+					{ "min": g_GameAttributes.settings.WonderDuration }
| 212| 212| 			);
| 213| 213| 
| 214| 214| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 209| 209| 					g_GameAttributes.settings.WonderDuration
| 210| 210| 				),
| 211| 211| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 212|    |-			);
|    | 212|+				);
| 213| 213| 
| 214| 214| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 215| 215| 		if (isCaptureTheRelic)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 211| 211| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 212| 212| 			);
| 213| 213| 
| 214|    |-		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
|    | 214|+			let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 215| 215| 		if (isCaptureTheRelic)
| 216| 216| 			title = sprintf(
| 217| 217| 				translatePluralWithContext(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 212| 212| 			);
| 213| 213| 
| 214| 214| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 215|    |-		if (isCaptureTheRelic)
|    | 215|+			if (isCaptureTheRelic)
| 216| 216| 			title = sprintf(
| 217| 217| 				translatePluralWithContext(
| 218| 218| 					"victory condition",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 213| 213| 
| 214| 214| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 215| 215| 		if (isCaptureTheRelic)
| 216|    |-			title = sprintf(
|    | 216|+				title = sprintf(
| 217| 217| 				translatePluralWithContext(
| 218| 218| 					"victory condition",
| 219| 219| 					"Capture the Relic (%(min)s minute)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 214| 214| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 215| 215| 		if (isCaptureTheRelic)
| 216| 216| 			title = sprintf(
| 217|    |-				translatePluralWithContext(
|    | 217|+					translatePluralWithContext(
| 218| 218| 					"victory condition",
| 219| 219| 					"Capture the Relic (%(min)s minute)",
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 215| 215| 		if (isCaptureTheRelic)
| 216| 216| 			title = sprintf(
| 217| 217| 				translatePluralWithContext(
| 218|    |-					"victory condition",
|    | 218|+						"victory condition",
| 219| 219| 					"Capture the Relic (%(min)s minute)",
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
| 221| 221| 					g_GameAttributes.settings.RelicDuration
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 216| 216| 			title = sprintf(
| 217| 217| 				translatePluralWithContext(
| 218| 218| 					"victory condition",
| 219|    |-					"Capture the Relic (%(min)s minute)",
|    | 219|+						"Capture the Relic (%(min)s minute)",
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
| 221| 221| 					g_GameAttributes.settings.RelicDuration
| 222| 222| 				),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 217| 217| 				translatePluralWithContext(
| 218| 218| 					"victory condition",
| 219| 219| 					"Capture the Relic (%(min)s minute)",
| 220|    |-					"Capture the Relic (%(min)s minutes)",
|    | 220|+						"Capture the Relic (%(min)s minutes)",
| 221| 221| 					g_GameAttributes.settings.RelicDuration
| 222| 222| 				),
| 223| 223| 				{ "min": g_GameAttributes.settings.RelicDuration }
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 218| 218| 					"victory condition",
| 219| 219| 					"Capture the Relic (%(min)s minute)",
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
| 221|    |-					g_GameAttributes.settings.RelicDuration
|    | 221|+						g_GameAttributes.settings.RelicDuration
| 222| 222| 				),
| 223| 223| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 224| 224| 			);
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 219| 219| 					"Capture the Relic (%(min)s minute)",
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
| 221| 221| 					g_GameAttributes.settings.RelicDuration
| 222|    |-				),
|    | 222|+					),
| 223| 223| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 224| 224| 			);
| 225| 225| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
| 221| 221| 					g_GameAttributes.settings.RelicDuration
| 222| 222| 				),
| 223|    |-				{ "min": g_GameAttributes.settings.RelicDuration }
|    | 223|+					{ "min": g_GameAttributes.settings.RelicDuration }
| 224| 224| 			);
| 225| 225| 
| 226| 226| 		titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 221| 221| 					g_GameAttributes.settings.RelicDuration
| 222| 222| 				),
| 223| 223| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 224|    |-			);
|    | 224|+				);
| 225| 225| 
| 226| 226| 		titles.push({
| 227| 227| 			"label": title,
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 223| 223| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 224| 224| 			);
| 225| 225| 
| 226|    |-		titles.push({
|    | 226|+			titles.push({
| 227| 227| 			"label": title,
| 228| 228| 			"value": victoryCondition.Description
| 229| 229| 		});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 224| 224| 			);
| 225| 225| 
| 226| 226| 		titles.push({
| 227|    |-			"label": title,
|    | 227|+				"label": title,
| 228| 228| 			"value": victoryCondition.Description
| 229| 229| 		});
| 230| 230| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 225| 225| 
| 226| 226| 		titles.push({
| 227| 227| 			"label": title,
| 228|    |-			"value": victoryCondition.Description
|    | 228|+				"value": victoryCondition.Description
| 229| 229| 		});
| 230| 230| 
| 231| 231| 		if (isCaptureTheRelic)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 226| 226| 		titles.push({
| 227| 227| 			"label": title,
| 228| 228| 			"value": victoryCondition.Description
| 229|    |-		});
|    | 229|+			});
| 230| 230| 
| 231| 231| 		if (isCaptureTheRelic)
| 232| 232| 			titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 228| 228| 			"value": victoryCondition.Description
| 229| 229| 		});
| 230| 230| 
| 231|    |-		if (isCaptureTheRelic)
|    | 231|+			if (isCaptureTheRelic)
| 232| 232| 			titles.push({
| 233| 233| 				"label": translate("Relic Count"),
| 234| 234| 				"value": g_GameAttributes.settings.RelicCount
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 229| 229| 		});
| 230| 230| 
| 231| 231| 		if (isCaptureTheRelic)
| 232|    |-			titles.push({
|    | 232|+				titles.push({
| 233| 233| 				"label": translate("Relic Count"),
| 234| 234| 				"value": g_GameAttributes.settings.RelicCount
| 235| 235| 			});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 230| 230| 
| 231| 231| 		if (isCaptureTheRelic)
| 232| 232| 			titles.push({
| 233|    |-				"label": translate("Relic Count"),
|    | 233|+					"label": translate("Relic Count"),
| 234| 234| 				"value": g_GameAttributes.settings.RelicCount
| 235| 235| 			});
| 236| 236| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 231| 231| 		if (isCaptureTheRelic)
| 232| 232| 			titles.push({
| 233| 233| 				"label": translate("Relic Count"),
| 234|    |-				"value": g_GameAttributes.settings.RelicCount
|    | 234|+					"value": g_GameAttributes.settings.RelicCount
| 235| 235| 			});
| 236| 236| 
| 237| 237| 		if (victoryCondition.Name == "regicide")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 232| 232| 			titles.push({
| 233| 233| 				"label": translate("Relic Count"),
| 234| 234| 				"value": g_GameAttributes.settings.RelicCount
| 235|    |-			});
|    | 235|+				});
| 236| 236| 
| 237| 237| 		if (victoryCondition.Name == "regicide")
| 238| 238| 			if (g_GameAttributes.settings.RegicideGarrison)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 234| 234| 				"value": g_GameAttributes.settings.RelicCount
| 235| 235| 			});
| 236| 236| 
| 237|    |-		if (victoryCondition.Name == "regicide")
|    | 237|+			if (victoryCondition.Name == "regicide")
| 238| 238| 			if (g_GameAttributes.settings.RegicideGarrison)
| 239| 239| 				titles.push({
| 240| 240| 					"label": translate("Hero Garrison"),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 235| 235| 			});
| 236| 236| 
| 237| 237| 		if (victoryCondition.Name == "regicide")
| 238|    |-			if (g_GameAttributes.settings.RegicideGarrison)
|    | 238|+				if (g_GameAttributes.settings.RegicideGarrison)
| 239| 239| 				titles.push({
| 240| 240| 					"label": translate("Hero Garrison"),
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 236| 236| 
| 237| 237| 		if (victoryCondition.Name == "regicide")
| 238| 238| 			if (g_GameAttributes.settings.RegicideGarrison)
| 239|    |-				titles.push({
|    | 239|+					titles.push({
| 240| 240| 					"label": translate("Hero Garrison"),
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
| 242| 242| 				});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 237| 237| 		if (victoryCondition.Name == "regicide")
| 238| 238| 			if (g_GameAttributes.settings.RegicideGarrison)
| 239| 239| 				titles.push({
| 240|    |-					"label": translate("Hero Garrison"),
|    | 240|+						"label": translate("Hero Garrison"),
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
| 242| 242| 				});
| 243| 243| 			else
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 238| 238| 			if (g_GameAttributes.settings.RegicideGarrison)
| 239| 239| 				titles.push({
| 240| 240| 					"label": translate("Hero Garrison"),
| 241|    |-					"value": translate("Heroes can be garrisoned.")
|    | 241|+						"value": translate("Heroes can be garrisoned.")
| 242| 242| 				});
| 243| 243| 			else
| 244| 244| 				titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 239| 239| 				titles.push({
| 240| 240| 					"label": translate("Hero Garrison"),
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
| 242|    |-				});
|    | 242|+					});
| 243| 243| 			else
| 244| 244| 				titles.push({
| 245| 245| 					"label": translate("Exposed Heroes"),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 240| 240| 					"label": translate("Hero Garrison"),
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
| 242| 242| 				});
| 243|    |-			else
|    | 243|+				else
| 244| 244| 				titles.push({
| 245| 245| 					"label": translate("Exposed Heroes"),
| 246| 246| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
| 242| 242| 				});
| 243| 243| 			else
| 244|    |-				titles.push({
|    | 244|+					titles.push({
| 245| 245| 					"label": translate("Exposed Heroes"),
| 246| 246| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 247| 247| 				});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 242| 242| 				});
| 243| 243| 			else
| 244| 244| 				titles.push({
| 245|    |-					"label": translate("Exposed Heroes"),
|    | 245|+						"label": translate("Exposed Heroes"),
| 246| 246| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 247| 247| 				});
| 248| 248| 	}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 243| 243| 			else
| 244| 244| 				titles.push({
| 245| 245| 					"label": translate("Exposed Heroes"),
| 246|    |-					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
|    | 246|+						"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 247| 247| 				});
| 248| 248| 	}
| 249| 249| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 244| 244| 				titles.push({
| 245| 245| 					"label": translate("Exposed Heroes"),
| 246| 246| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 247|    |-				});
|    | 247|+					});
| 248| 248| 	}
| 249| 249| 
| 250| 250| 	if (g_GameAttributes.settings.RatingEnabled &&
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 245| 245| 					"label": translate("Exposed Heroes"),
| 246| 246| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 247| 247| 				});
| 248|    |-	}
|    | 248|+		}
| 249| 249| 
| 250| 250| 	if (g_GameAttributes.settings.RatingEnabled &&
| 251| 251| 	    g_GameAttributes.settings.PlayerData.length == 2)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 277| 277| 		});
| 278| 278| 
| 279| 279| 	if (g_GameAttributes.settings.Ceasefire !== undefined)
| 280|    |-	titles.push({
|    | 280|+		titles.push({
| 281| 281| 		"label": translate("Ceasefire"),
| 282| 282| 		"value":
| 283| 283| 			g_GameAttributes.settings.Ceasefire == 0 ?
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 278| 278| 
| 279| 279| 	if (g_GameAttributes.settings.Ceasefire !== undefined)
| 280| 280| 	titles.push({
| 281|    |-		"label": translate("Ceasefire"),
|    | 281|+			"label": translate("Ceasefire"),
| 282| 282| 		"value":
| 283| 283| 			g_GameAttributes.settings.Ceasefire == 0 ?
| 284| 284| 				translate("disabled") :
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 279| 279| 	if (g_GameAttributes.settings.Ceasefire !== undefined)
| 280| 280| 	titles.push({
| 281| 281| 		"label": translate("Ceasefire"),
| 282|    |-		"value":
|    | 282|+			"value":
| 283| 283| 			g_GameAttributes.settings.Ceasefire == 0 ?
| 284| 284| 				translate("disabled") :
| 285| 285| 				sprintf(translatePlural(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 287| 287| 					"For the first %(min)s minutes, other players will stay neutral.",
| 288| 288| 					g_GameAttributes.settings.Ceasefire),
| 289| 289| 				{ "min": g_GameAttributes.settings.Ceasefire })
| 290|    |-	});
|    | 290|+		});
| 291| 291| 
| 292| 292| 	if (g_GameAttributes.map !== undefined && g_GameAttributes.map == "random")
| 293| 293| 		titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 309| 309| 	}
| 310| 310| 
| 311| 311| 	if (g_GameAttributes.mapType)
| 312|    |-	titles.push({
|    | 312|+		titles.push({
| 313| 313| 		"label": translate("Map Type"),
| 314| 314| 		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 315| 315| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 310| 310| 
| 311| 311| 	if (g_GameAttributes.mapType)
| 312| 312| 	titles.push({
| 313|    |-		"label": translate("Map Type"),
|    | 313|+			"label": translate("Map Type"),
| 314| 314| 		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 315| 315| 	});
| 316| 316| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 311| 311| 	if (g_GameAttributes.mapType)
| 312| 312| 	titles.push({
| 313| 313| 		"label": translate("Map Type"),
| 314|    |-		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
|    | 314|+			"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 315| 315| 	});
| 316| 316| 
| 317| 317| 	if (g_GameAttributes.mapType == "random" && g_GameAttributes.settings.Size)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 312| 312| 	titles.push({
| 313| 313| 		"label": translate("Map Type"),
| 314| 314| 		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 315|    |-	});
|    | 315|+		});
| 316| 316| 
| 317| 317| 	if (g_GameAttributes.mapType == "random" && g_GameAttributes.settings.Size)
| 318| 318| 	{
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 343| 343| 	}
| 344| 344| 
| 345| 345| 	if (g_GameAttributes.settings.Nomad !== undefined)
| 346|    |-	titles.push({
|    | 346|+		titles.push({
| 347| 347| 		"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
| 348| 348| 		"value":
| 349| 349| 			g_GameAttributes.settings.Nomad ?
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 344| 344| 
| 345| 345| 	if (g_GameAttributes.settings.Nomad !== undefined)
| 346| 346| 	titles.push({
| 347|    |-		"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
|    | 347|+			"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
| 348| 348| 		"value":
| 349| 349| 			g_GameAttributes.settings.Nomad ?
| 350| 350| 				translate("Players start with only few units and have to find a suitable place to build their city.") :
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 345| 345| 	if (g_GameAttributes.settings.Nomad !== undefined)
| 346| 346| 	titles.push({
| 347| 347| 		"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
| 348|    |-		"value":
|    | 348|+			"value":
| 349| 349| 			g_GameAttributes.settings.Nomad ?
| 350| 350| 				translate("Players start with only few units and have to find a suitable place to build their city.") :
| 351| 351| 				translate("Players start with a Civic Center.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 349| 349| 			g_GameAttributes.settings.Nomad ?
| 350| 350| 				translate("Players start with only few units and have to find a suitable place to build their city.") :
| 351| 351| 				translate("Players start with a Civic Center.")
| 352|    |-	});
|    | 352|+		});
| 353| 353| 
| 354| 354| 	if (g_GameAttributes.settings.StartingResources !== undefined)
| 355| 355| 		titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 380| 380| 		});
| 381| 381| 
| 382| 382| 	if (g_GameAttributes.settings.DisableTreasures !== undefined)
| 383|    |-	titles.push({
|    | 383|+		titles.push({
| 384| 384| 		"label": translate("Treasures"),
| 385| 385| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 386| 386| 			translateWithContext("treasures", "Disabled") :
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 381| 381| 
| 382| 382| 	if (g_GameAttributes.settings.DisableTreasures !== undefined)
| 383| 383| 	titles.push({
| 384|    |-		"label": translate("Treasures"),
|    | 384|+			"label": translate("Treasures"),
| 385| 385| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 386| 386| 			translateWithContext("treasures", "Disabled") :
| 387| 387| 			translateWithContext("treasures", "As defined by the map.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 382| 382| 	if (g_GameAttributes.settings.DisableTreasures !== undefined)
| 383| 383| 	titles.push({
| 384| 384| 		"label": translate("Treasures"),
| 385|    |-		"value": g_GameAttributes.settings.DisableTreasures ?
|    | 385|+			"value": g_GameAttributes.settings.DisableTreasures ?
| 386| 386| 			translateWithContext("treasures", "Disabled") :
| 387| 387| 			translateWithContext("treasures", "As defined by the map.")
| 388| 388| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 383| 383| 	titles.push({
| 384| 384| 		"label": translate("Treasures"),
| 385| 385| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 386|    |-			translateWithContext("treasures", "Disabled") :
|    | 386|+				translateWithContext("treasures", "Disabled") :
| 387| 387| 			translateWithContext("treasures", "As defined by the map.")
| 388| 388| 	});
| 389| 389| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 384| 384| 		"label": translate("Treasures"),
| 385| 385| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 386| 386| 			translateWithContext("treasures", "Disabled") :
| 387|    |-			translateWithContext("treasures", "As defined by the map.")
|    | 387|+				translateWithContext("treasures", "As defined by the map.")
| 388| 388| 	});
| 389| 389| 
| 390| 390| 	if (g_GameAttributes.settings.RevealMap !== undefined)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 385| 385| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 386| 386| 			translateWithContext("treasures", "Disabled") :
| 387| 387| 			translateWithContext("treasures", "As defined by the map.")
| 388|    |-	});
|    | 388|+		});
| 389| 389| 
| 390| 390| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 391| 391| 	titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 388| 388| 	});
| 389| 389| 
| 390| 390| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 391|    |-	titles.push({
|    | 391|+		titles.push({
| 392| 392| 		"label": translate("Revealed Map"),
| 393| 393| 		"value": g_GameAttributes.settings.RevealMap
| 394| 394| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 389| 389| 
| 390| 390| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 391| 391| 	titles.push({
| 392|    |-		"label": translate("Revealed Map"),
|    | 392|+			"label": translate("Revealed Map"),
| 393| 393| 		"value": g_GameAttributes.settings.RevealMap
| 394| 394| 	});
| 395| 395| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 390| 390| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 391| 391| 	titles.push({
| 392| 392| 		"label": translate("Revealed Map"),
| 393|    |-		"value": g_GameAttributes.settings.RevealMap
|    | 393|+			"value": g_GameAttributes.settings.RevealMap
| 394| 394| 	});
| 395| 395| 
| 396| 396| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 391| 391| 	titles.push({
| 392| 392| 		"label": translate("Revealed Map"),
| 393| 393| 		"value": g_GameAttributes.settings.RevealMap
| 394|    |-	});
|    | 394|+		});
| 395| 395| 
| 396| 396| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 397| 397| 	titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 394| 394| 	});
| 395| 395| 
| 396| 396| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 397|    |-	titles.push({
|    | 397|+		titles.push({
| 398| 398| 		"label": translate("Explored Map"),
| 399| 399| 		"value": g_GameAttributes.settings.ExploreMap
| 400| 400| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 395| 395| 
| 396| 396| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 397| 397| 	titles.push({
| 398|    |-		"label": translate("Explored Map"),
|    | 398|+			"label": translate("Explored Map"),
| 399| 399| 		"value": g_GameAttributes.settings.ExploreMap
| 400| 400| 	});
| 401| 401| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 396| 396| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 397| 397| 	titles.push({
| 398| 398| 		"label": translate("Explored Map"),
| 399|    |-		"value": g_GameAttributes.settings.ExploreMap
|    | 399|+			"value": g_GameAttributes.settings.ExploreMap
| 400| 400| 	});
| 401| 401| 
| 402| 402| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 397| 397| 	titles.push({
| 398| 398| 		"label": translate("Explored Map"),
| 399| 399| 		"value": g_GameAttributes.settings.ExploreMap
| 400|    |-	});
|    | 400|+		});
| 401| 401| 
| 402| 402| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 403| 403| 	titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 400| 400| 	});
| 401| 401| 
| 402| 402| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 403|    |-	titles.push({
|    | 403|+		titles.push({
| 404| 404| 		"label": translate("Cheats"),
| 405| 405| 		"value": g_GameAttributes.settings.CheatsEnabled
| 406| 406| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 401| 401| 
| 402| 402| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 403| 403| 	titles.push({
| 404|    |-		"label": translate("Cheats"),
|    | 404|+			"label": translate("Cheats"),
| 405| 405| 		"value": g_GameAttributes.settings.CheatsEnabled
| 406| 406| 	});
| 407| 407| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 402| 402| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 403| 403| 	titles.push({
| 404| 404| 		"label": translate("Cheats"),
| 405|    |-		"value": g_GameAttributes.settings.CheatsEnabled
|    | 405|+			"value": g_GameAttributes.settings.CheatsEnabled
| 406| 406| 	});
| 407| 407| 
| 408| 408| 	return titles.map(title => sprintf(translate("%(label)s %(details)s"), {
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 403| 403| 	titles.push({
| 404| 404| 		"label": translate("Cheats"),
| 405| 405| 		"value": g_GameAttributes.settings.CheatsEnabled
| 406|    |-	});
|    | 406|+		});
| 407| 407| 
| 408| 408| 	return titles.map(title => sprintf(translate("%(label)s %(details)s"), {
| 409| 409| 		"label": coloredText(title.label, g_DescriptionHighlight),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  16|  16| 		let caption =
|  17|  17| 			g_GameAttributes.settings.CheatsEnabled ?
|  18|  18| 				this.CheatsEnabled :
|  19|    |-			g_GameAttributes.settings.RatingEnabled ?
|    |  19|+				g_GameAttributes.settings.RatingEnabled ?
|  20|  20| 				this.RatingEnabled :
|  21|  21| 				"";
|  22|  22| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  17|  17| 			g_GameAttributes.settings.CheatsEnabled ?
|  18|  18| 				this.CheatsEnabled :
|  19|  19| 			g_GameAttributes.settings.RatingEnabled ?
|  20|    |-				this.RatingEnabled :
|    |  20|+					this.RatingEnabled :
|  21|  21| 				"";
|  22|  22| 
|  23|  23| 		this.gameSettingWarning.caption = caption;
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  18|  18| 				this.CheatsEnabled :
|  19|  19| 			g_GameAttributes.settings.RatingEnabled ?
|  20|  20| 				this.RatingEnabled :
|  21|    |-				"";
|    |  21|+					"";
|  22|  22| 
|  23|  23| 		this.gameSettingWarning.caption = caption;
|  24|  24| 		this.gameSettingWarning.hidden = !caption;

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   7| »   »   this.clientItemFactory·=·new·PlayerAssignmentItem.Client();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   8| »   »   this.aiItemFactory·=·new·PlayerAssignmentItem.AI();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   9| »   »   this.unassignedItem·=·new·PlayerAssignmentItem.Unassigned().createItem();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
| 153| class·PlayerAssignmentItem
|    | [NORMAL] JSHintBear:
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/simulation/helpers/Player.js
|  78| »   »   let·cmpPlayer·=·QueryPlayerIDInterface(i);
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'cmpPlayer' is already declared in the upper scope.

binaries/data/mods/public/simulation/helpers/Player.js
| 165| »   »   for·(let·i·=·0;·i·<·numPlayers;·++i)
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.

binaries/data/mods/public/simulation/helpers/Player.js
|  67| »   »   var·entID·=·cmpPlayerManager.GetPlayerByID(i);
|    | [NORMAL] JSHintBear:
|    | 'entID' is already defined.

binaries/data/mods/public/simulation/helpers/Player.js
|  76| »   for·(var·i·=·0;·i·<·numPlayers;·++i)
|    | [NORMAL] JSHintBear:
|    | 'i' is already defined.

binaries/data/mods/public/simulation/helpers/Player.js
| 143| »   »   »   for·(var·j·=·0;·j·<·numPlayers;·++j)
|    | [NORMAL] JSHintBear:
|    | 'j' is already defined.
Executing section cli...

Link to build: https://jenkins.wildfiregames.com/job/docker-differential/1436/display/redirect

elexis edited the summary of this revision. (Show Details)Dec 31 2019, 11:38 PM

I'm not sure whether it is intended or not, but when switching from a Random map to a Skirmish map, the win settings change back to Conquest. (Also when changing the map in Skirmish.)

elexis added a comment.EditedJan 2 2020, 9:22 PM

I'm not sure whether it is intended or not, but when switching from a Random map to a Skirmish map, the win settings change back to Conquest. (Also when changing the map in Skirmish.)

Thanks for the test.
The described effect is due to Atlas writing VictoryConditions to the skirmish/scenario map XML file and map settings are copied over.
For that reason I have committed rP23279, rP23310.
Deleting the VictoryConditions array results in Atlas errors when opening the map, for that reason I couldn't delete those yet.

If one argues that Skirmish maps use player settings and are not to consume map XML settings, then Atlas should not offer storing of these settings.
Other than that there are referenced tickets where people want that maps are allowed to overwrite settings.
See the chapter about the conceptually broken Skirmish maptype and the unresolvable contradiction of the two intended features / user expectance of persisting user settings where settings are free to chose and map overwriting user settings.

(Edit: I might add that this is already the case with the committed code, also for reference rP19449)

elexis edited the summary of this revision. (Show Details)Jan 7 2020, 1:20 PM
elexis added a comment.Jan 7 2020, 1:34 PM

Big performance improvement update:

nani did some partial review on 2019-12-30 and 2019-12-31, that includes grasping the approach of the patch and bughunting by blackbox testing.
He noticed that scrolling through scenario maps was slower than before.

On 2020-01-06 I figured that the updating of GUI objects can be done in onGameAttributesBatchChange instead of onGameAttributesChange.

For example, before:

	onGameAttributesChange()
	{
		if (!g_GameAttributes.settings.VictoryConditions)
			return;

		let available = g_GameAttributes.settings.VictoryConditions.indexOf(this.NameWonderVictory) != -1;
		this.setHidden(!available);

		if (available)
		{
			if (g_GameAttributes.settings.WonderDuration === undefined)
			{
				g_GameAttributes.settings.WonderDuration = g_VictoryDurations.Duration[g_VictoryDurations.Default];
				this.gameSettingsControl.updateGameAttributes();
			}
			this.setSelectedValue(g_GameAttributes.settings.WonderDuration);
		}
		else if (g_GameAttributes.settings.WonderDuration !== undefined)
		{
			delete g_GameAttributes.settings.WonderDuration;
			this.gameSettingsControl.updateGameAttributes();
		}
	}

After:

	onGameAttributesChange()
	{
		if (!g_GameAttributes.settings.VictoryConditions)
			return;

		this.available = g_GameAttributes.settings.VictoryConditions.indexOf(this.NameWonderVictory) != -1;

		if (this.available)
		{
			if (g_GameAttributes.settings.WonderDuration === undefined)
			{
				g_GameAttributes.settings.WonderDuration = this.values.Duration[this.values.Default];
				this.gameSettingsControl.updateGameAttributes();
			}
		}
		else if (g_GameAttributes.settings.WonderDuration !== undefined)
		{
			delete g_GameAttributes.settings.WonderDuration;
			this.gameSettingsControl.updateGameAttributes();
		}
	}

	onGameAttributesBatchChange()
	{
		this.setHidden(!this.available);

		if (this.available)
			this.setSelectedValue(g_GameAttributes.settings.WonderDuration);
	}

The difference is that onGameAttributesChange is called recursively, whereas the batch variant is only called once after onGameAttributesChange recursion is finished.
So for example if one changes the map and this results in 30 settings being changed, it previously resulted in all GUI objects being updated 30 times, whereas now they are updated only once.

This increased performance drastically, from 20-50ms to 10ms or something (perhaps a factor of 3 to 6, performance varies by a factor of 2 or something depending on chosen settings. Perhaps even a factor of 30 in the worst case, depending on recursion depth).
According to nanis blackbox test comparison of a23 and this patch, this improves the performance further than it was in a23.

From knowing the code, this is very plausible because the slow part of the gameAttributesChange handlers is the updating of GUI objects (set enabled, set checked, set selected dropdown index, set caption), since this resets the DrawCache, rebuilds the texts, whereas changing of a variable g_GameAttributes and O(100) recursive function calls that only read from and write to a variable yield orders of magnitude less instructions.

elexis added a comment.Jan 7 2020, 1:42 PM

Code updates:

1. Performance update, see above

2. XmppClient diff:
The XmppClient.cpp diff was committed separately in rP23329 and in #3550 I reported how this is still broken and that g_rankedGame could either be deleted if we don't care about JS mods that allow change perspective, or how it could be used to make JS mods impossible that allow rated game participants to reveal the map, use the wireframe hotkey or use other debug features that would give them an unfair advantage.

3. simulation init diff:

The simulation/helpers/Player.js change was discussed with Angen on http://irclogs.wildfiregames.com/2020-01/2020-01-03-QuakeNet-%230ad-dev.log

The currently committed code (see referenced tickets) is unreasonable, because if player_defaults.json contains StartingResources/PopulationLimit/..., it would take that value instead of the map setting / gamesetting value.
But it should use the per-player value if the map/gamesettings specify that,

4. dropdown setting globals that are not used by the objectives dialog like g_Ceasefire are removed in the next upload of the patch as they could be localized to their respective GameSettingControl.

elexis updated the Trac tickets for this revision.Jan 7 2020, 4:47 PM
elexis updated this revision to Diff 10912.Jan 7 2020, 6:53 PM
  • Include rP23341, exclude rP23342, rP23329
  • Big performance improvement, see comment above.
  • Rework StartingTech/StartingResources/DisabledTech/DisabledTemplates again.
  • Use that for polar sea.
  • Make PlayerName, PlayerFrame, PlayerConfigButton a GameSettingControl to remove some duplication and to remove class reference hardcoding of PlayerSettingControlManager
  • Rename PlayerConfigButton to AIConfigButton, Split StartingTechs code from AIConfig button, since I assume the per-player settings dialog will be different from the per-player AI config dialog
  • Localize some dropdown globals like g_Ceasefire
Vulcan added a comment.Jan 7 2020, 6:56 PM

Successful build - Chance fights ever on the side of the prudent.

Link to build: https://jenkins.wildfiregames.com/job/vs2015-differential/972/display/redirect

Vulcan added a comment.Jan 7 2020, 6:59 PM

Successful build - Chance fights ever on the side of the prudent.

Linter detected issues:
Executing section Source...
Executing section JS...
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 102| 102| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 103| 103| 						playerDescription = translate("%(playerName)s (%(civ)s, %(state)s)");
| 104| 104| 				else
| 105|    |-					if (isActive)
|    | 105|+				if (isActive)
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 103| 103| 						playerDescription = translate("%(playerName)s (%(civ)s, %(state)s)");
| 104| 104| 				else
| 105| 105| 					if (isActive)
| 106|    |-						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | 106|+				// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 104| 104| 				else
| 105| 105| 					if (isActive)
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107|    |-						playerDescription = translate("%(playerName)s");
|    | 107|+					playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110| 110| 						playerDescription = translate("%(playerName)s (%(state)s)");
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 105| 105| 					if (isActive)
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108|    |-					else
|    | 108|+				else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110| 110| 						playerDescription = translate("%(playerName)s (%(state)s)");
| 111| 111| 			}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109|    |-						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | 109|+				// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110| 110| 						playerDescription = translate("%(playerName)s (%(state)s)");
| 111| 111| 			}
| 112| 112| 		}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110|    |-						playerDescription = translate("%(playerName)s (%(state)s)");
|    | 110|+					playerDescription = translate("%(playerName)s (%(state)s)");
| 111| 111| 			}
| 112| 112| 		}
| 113| 113| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 194| 194| 		});
| 195| 195| 
| 196| 196| 	if (g_GameAttributes.settings.VictoryConditions)
| 197|    |-	for (let victoryCondition of g_VictoryConditions)
|    | 197|+		for (let victoryCondition of g_VictoryConditions)
| 198| 198| 	{
| 199| 199| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 200| 200| 			continue;
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 195| 195| 
| 196| 196| 	if (g_GameAttributes.settings.VictoryConditions)
| 197| 197| 	for (let victoryCondition of g_VictoryConditions)
| 198|    |-	{
|    | 198|+		{
| 199| 199| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 200| 200| 			continue;
| 201| 201| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 196| 196| 	if (g_GameAttributes.settings.VictoryConditions)
| 197| 197| 	for (let victoryCondition of g_VictoryConditions)
| 198| 198| 	{
| 199|    |-		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
|    | 199|+			if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 200| 200| 			continue;
| 201| 201| 
| 202| 202| 		let title = translateVictoryCondition(victoryCondition.Name);
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 197| 197| 	for (let victoryCondition of g_VictoryConditions)
| 198| 198| 	{
| 199| 199| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 200|    |-			continue;
|    | 200|+				continue;
| 201| 201| 
| 202| 202| 		let title = translateVictoryCondition(victoryCondition.Name);
| 203| 203| 		if (victoryCondition.Name == "wonder")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 199| 199| 		if (g_GameAttributes.settings.VictoryConditions.indexOf(victoryCondition.Name) == -1)
| 200| 200| 			continue;
| 201| 201| 
| 202|    |-		let title = translateVictoryCondition(victoryCondition.Name);
|    | 202|+			let title = translateVictoryCondition(victoryCondition.Name);
| 203| 203| 		if (victoryCondition.Name == "wonder")
| 204| 204| 			title = sprintf(
| 205| 205| 				translatePluralWithContext(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 200| 200| 			continue;
| 201| 201| 
| 202| 202| 		let title = translateVictoryCondition(victoryCondition.Name);
| 203|    |-		if (victoryCondition.Name == "wonder")
|    | 203|+			if (victoryCondition.Name == "wonder")
| 204| 204| 			title = sprintf(
| 205| 205| 				translatePluralWithContext(
| 206| 206| 					"victory condition",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 201| 201| 
| 202| 202| 		let title = translateVictoryCondition(victoryCondition.Name);
| 203| 203| 		if (victoryCondition.Name == "wonder")
| 204|    |-			title = sprintf(
|    | 204|+				title = sprintf(
| 205| 205| 				translatePluralWithContext(
| 206| 206| 					"victory condition",
| 207| 207| 					"Wonder (%(min)s minute)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 202| 202| 		let title = translateVictoryCondition(victoryCondition.Name);
| 203| 203| 		if (victoryCondition.Name == "wonder")
| 204| 204| 			title = sprintf(
| 205|    |-				translatePluralWithContext(
|    | 205|+					translatePluralWithContext(
| 206| 206| 					"victory condition",
| 207| 207| 					"Wonder (%(min)s minute)",
| 208| 208| 					"Wonder (%(min)s minutes)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 203| 203| 		if (victoryCondition.Name == "wonder")
| 204| 204| 			title = sprintf(
| 205| 205| 				translatePluralWithContext(
| 206|    |-					"victory condition",
|    | 206|+						"victory condition",
| 207| 207| 					"Wonder (%(min)s minute)",
| 208| 208| 					"Wonder (%(min)s minutes)",
| 209| 209| 					g_GameAttributes.settings.WonderDuration
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 204| 204| 			title = sprintf(
| 205| 205| 				translatePluralWithContext(
| 206| 206| 					"victory condition",
| 207|    |-					"Wonder (%(min)s minute)",
|    | 207|+						"Wonder (%(min)s minute)",
| 208| 208| 					"Wonder (%(min)s minutes)",
| 209| 209| 					g_GameAttributes.settings.WonderDuration
| 210| 210| 				),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 205| 205| 				translatePluralWithContext(
| 206| 206| 					"victory condition",
| 207| 207| 					"Wonder (%(min)s minute)",
| 208|    |-					"Wonder (%(min)s minutes)",
|    | 208|+						"Wonder (%(min)s minutes)",
| 209| 209| 					g_GameAttributes.settings.WonderDuration
| 210| 210| 				),
| 211| 211| 				{ "min": g_GameAttributes.settings.WonderDuration }
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 206| 206| 					"victory condition",
| 207| 207| 					"Wonder (%(min)s minute)",
| 208| 208| 					"Wonder (%(min)s minutes)",
| 209|    |-					g_GameAttributes.settings.WonderDuration
|    | 209|+						g_GameAttributes.settings.WonderDuration
| 210| 210| 				),
| 211| 211| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 212| 212| 			);
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 207| 207| 					"Wonder (%(min)s minute)",
| 208| 208| 					"Wonder (%(min)s minutes)",
| 209| 209| 					g_GameAttributes.settings.WonderDuration
| 210|    |-				),
|    | 210|+					),
| 211| 211| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 212| 212| 			);
| 213| 213| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 208| 208| 					"Wonder (%(min)s minutes)",
| 209| 209| 					g_GameAttributes.settings.WonderDuration
| 210| 210| 				),
| 211|    |-				{ "min": g_GameAttributes.settings.WonderDuration }
|    | 211|+					{ "min": g_GameAttributes.settings.WonderDuration }
| 212| 212| 			);
| 213| 213| 
| 214| 214| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 209| 209| 					g_GameAttributes.settings.WonderDuration
| 210| 210| 				),
| 211| 211| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 212|    |-			);
|    | 212|+				);
| 213| 213| 
| 214| 214| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 215| 215| 		if (isCaptureTheRelic)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 211| 211| 				{ "min": g_GameAttributes.settings.WonderDuration }
| 212| 212| 			);
| 213| 213| 
| 214|    |-		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
|    | 214|+			let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 215| 215| 		if (isCaptureTheRelic)
| 216| 216| 			title = sprintf(
| 217| 217| 				translatePluralWithContext(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 212| 212| 			);
| 213| 213| 
| 214| 214| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 215|    |-		if (isCaptureTheRelic)
|    | 215|+			if (isCaptureTheRelic)
| 216| 216| 			title = sprintf(
| 217| 217| 				translatePluralWithContext(
| 218| 218| 					"victory condition",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 213| 213| 
| 214| 214| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 215| 215| 		if (isCaptureTheRelic)
| 216|    |-			title = sprintf(
|    | 216|+				title = sprintf(
| 217| 217| 				translatePluralWithContext(
| 218| 218| 					"victory condition",
| 219| 219| 					"Capture the Relic (%(min)s minute)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 214| 214| 		let isCaptureTheRelic = victoryCondition.Name == "capture_the_relic";
| 215| 215| 		if (isCaptureTheRelic)
| 216| 216| 			title = sprintf(
| 217|    |-				translatePluralWithContext(
|    | 217|+					translatePluralWithContext(
| 218| 218| 					"victory condition",
| 219| 219| 					"Capture the Relic (%(min)s minute)",
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 215| 215| 		if (isCaptureTheRelic)
| 216| 216| 			title = sprintf(
| 217| 217| 				translatePluralWithContext(
| 218|    |-					"victory condition",
|    | 218|+						"victory condition",
| 219| 219| 					"Capture the Relic (%(min)s minute)",
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
| 221| 221| 					g_GameAttributes.settings.RelicDuration
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 216| 216| 			title = sprintf(
| 217| 217| 				translatePluralWithContext(
| 218| 218| 					"victory condition",
| 219|    |-					"Capture the Relic (%(min)s minute)",
|    | 219|+						"Capture the Relic (%(min)s minute)",
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
| 221| 221| 					g_GameAttributes.settings.RelicDuration
| 222| 222| 				),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 217| 217| 				translatePluralWithContext(
| 218| 218| 					"victory condition",
| 219| 219| 					"Capture the Relic (%(min)s minute)",
| 220|    |-					"Capture the Relic (%(min)s minutes)",
|    | 220|+						"Capture the Relic (%(min)s minutes)",
| 221| 221| 					g_GameAttributes.settings.RelicDuration
| 222| 222| 				),
| 223| 223| 				{ "min": g_GameAttributes.settings.RelicDuration }
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 218| 218| 					"victory condition",
| 219| 219| 					"Capture the Relic (%(min)s minute)",
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
| 221|    |-					g_GameAttributes.settings.RelicDuration
|    | 221|+						g_GameAttributes.settings.RelicDuration
| 222| 222| 				),
| 223| 223| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 224| 224| 			);
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 219| 219| 					"Capture the Relic (%(min)s minute)",
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
| 221| 221| 					g_GameAttributes.settings.RelicDuration
| 222|    |-				),
|    | 222|+					),
| 223| 223| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 224| 224| 			);
| 225| 225| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 220| 220| 					"Capture the Relic (%(min)s minutes)",
| 221| 221| 					g_GameAttributes.settings.RelicDuration
| 222| 222| 				),
| 223|    |-				{ "min": g_GameAttributes.settings.RelicDuration }
|    | 223|+					{ "min": g_GameAttributes.settings.RelicDuration }
| 224| 224| 			);
| 225| 225| 
| 226| 226| 		titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 221| 221| 					g_GameAttributes.settings.RelicDuration
| 222| 222| 				),
| 223| 223| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 224|    |-			);
|    | 224|+				);
| 225| 225| 
| 226| 226| 		titles.push({
| 227| 227| 			"label": title,
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 223| 223| 				{ "min": g_GameAttributes.settings.RelicDuration }
| 224| 224| 			);
| 225| 225| 
| 226|    |-		titles.push({
|    | 226|+			titles.push({
| 227| 227| 			"label": title,
| 228| 228| 			"value": victoryCondition.Description
| 229| 229| 		});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 224| 224| 			);
| 225| 225| 
| 226| 226| 		titles.push({
| 227|    |-			"label": title,
|    | 227|+				"label": title,
| 228| 228| 			"value": victoryCondition.Description
| 229| 229| 		});
| 230| 230| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 225| 225| 
| 226| 226| 		titles.push({
| 227| 227| 			"label": title,
| 228|    |-			"value": victoryCondition.Description
|    | 228|+				"value": victoryCondition.Description
| 229| 229| 		});
| 230| 230| 
| 231| 231| 		if (isCaptureTheRelic)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 226| 226| 		titles.push({
| 227| 227| 			"label": title,
| 228| 228| 			"value": victoryCondition.Description
| 229|    |-		});
|    | 229|+			});
| 230| 230| 
| 231| 231| 		if (isCaptureTheRelic)
| 232| 232| 			titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 228| 228| 			"value": victoryCondition.Description
| 229| 229| 		});
| 230| 230| 
| 231|    |-		if (isCaptureTheRelic)
|    | 231|+			if (isCaptureTheRelic)
| 232| 232| 			titles.push({
| 233| 233| 				"label": translate("Relic Count"),
| 234| 234| 				"value": g_GameAttributes.settings.RelicCount
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 229| 229| 		});
| 230| 230| 
| 231| 231| 		if (isCaptureTheRelic)
| 232|    |-			titles.push({
|    | 232|+				titles.push({
| 233| 233| 				"label": translate("Relic Count"),
| 234| 234| 				"value": g_GameAttributes.settings.RelicCount
| 235| 235| 			});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 230| 230| 
| 231| 231| 		if (isCaptureTheRelic)
| 232| 232| 			titles.push({
| 233|    |-				"label": translate("Relic Count"),
|    | 233|+					"label": translate("Relic Count"),
| 234| 234| 				"value": g_GameAttributes.settings.RelicCount
| 235| 235| 			});
| 236| 236| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 231| 231| 		if (isCaptureTheRelic)
| 232| 232| 			titles.push({
| 233| 233| 				"label": translate("Relic Count"),
| 234|    |-				"value": g_GameAttributes.settings.RelicCount
|    | 234|+					"value": g_GameAttributes.settings.RelicCount
| 235| 235| 			});
| 236| 236| 
| 237| 237| 		if (victoryCondition.Name == "regicide")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 232| 232| 			titles.push({
| 233| 233| 				"label": translate("Relic Count"),
| 234| 234| 				"value": g_GameAttributes.settings.RelicCount
| 235|    |-			});
|    | 235|+				});
| 236| 236| 
| 237| 237| 		if (victoryCondition.Name == "regicide")
| 238| 238| 			if (g_GameAttributes.settings.RegicideGarrison)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 234| 234| 				"value": g_GameAttributes.settings.RelicCount
| 235| 235| 			});
| 236| 236| 
| 237|    |-		if (victoryCondition.Name == "regicide")
|    | 237|+			if (victoryCondition.Name == "regicide")
| 238| 238| 			if (g_GameAttributes.settings.RegicideGarrison)
| 239| 239| 				titles.push({
| 240| 240| 					"label": translate("Hero Garrison"),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 235| 235| 			});
| 236| 236| 
| 237| 237| 		if (victoryCondition.Name == "regicide")
| 238|    |-			if (g_GameAttributes.settings.RegicideGarrison)
|    | 238|+				if (g_GameAttributes.settings.RegicideGarrison)
| 239| 239| 				titles.push({
| 240| 240| 					"label": translate("Hero Garrison"),
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 236| 236| 
| 237| 237| 		if (victoryCondition.Name == "regicide")
| 238| 238| 			if (g_GameAttributes.settings.RegicideGarrison)
| 239|    |-				titles.push({
|    | 239|+					titles.push({
| 240| 240| 					"label": translate("Hero Garrison"),
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
| 242| 242| 				});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 237| 237| 		if (victoryCondition.Name == "regicide")
| 238| 238| 			if (g_GameAttributes.settings.RegicideGarrison)
| 239| 239| 				titles.push({
| 240|    |-					"label": translate("Hero Garrison"),
|    | 240|+						"label": translate("Hero Garrison"),
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
| 242| 242| 				});
| 243| 243| 			else
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 238| 238| 			if (g_GameAttributes.settings.RegicideGarrison)
| 239| 239| 				titles.push({
| 240| 240| 					"label": translate("Hero Garrison"),
| 241|    |-					"value": translate("Heroes can be garrisoned.")
|    | 241|+						"value": translate("Heroes can be garrisoned.")
| 242| 242| 				});
| 243| 243| 			else
| 244| 244| 				titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 239| 239| 				titles.push({
| 240| 240| 					"label": translate("Hero Garrison"),
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
| 242|    |-				});
|    | 242|+					});
| 243| 243| 			else
| 244| 244| 				titles.push({
| 245| 245| 					"label": translate("Exposed Heroes"),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 240| 240| 					"label": translate("Hero Garrison"),
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
| 242| 242| 				});
| 243|    |-			else
|    | 243|+				else
| 244| 244| 				titles.push({
| 245| 245| 					"label": translate("Exposed Heroes"),
| 246| 246| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 241| 241| 					"value": translate("Heroes can be garrisoned.")
| 242| 242| 				});
| 243| 243| 			else
| 244|    |-				titles.push({
|    | 244|+					titles.push({
| 245| 245| 					"label": translate("Exposed Heroes"),
| 246| 246| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 247| 247| 				});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 242| 242| 				});
| 243| 243| 			else
| 244| 244| 				titles.push({
| 245|    |-					"label": translate("Exposed Heroes"),
|    | 245|+						"label": translate("Exposed Heroes"),
| 246| 246| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 247| 247| 				});
| 248| 248| 	}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 243| 243| 			else
| 244| 244| 				titles.push({
| 245| 245| 					"label": translate("Exposed Heroes"),
| 246|    |-					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
|    | 246|+						"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 247| 247| 				});
| 248| 248| 	}
| 249| 249| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 244| 244| 				titles.push({
| 245| 245| 					"label": translate("Exposed Heroes"),
| 246| 246| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 247|    |-				});
|    | 247|+					});
| 248| 248| 	}
| 249| 249| 
| 250| 250| 	if (g_GameAttributes.settings.RatingEnabled &&
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 245| 245| 					"label": translate("Exposed Heroes"),
| 246| 246| 					"value": translate("Heroes cannot be garrisoned and they are vulnerable to raids.")
| 247| 247| 				});
| 248|    |-	}
|    | 248|+		}
| 249| 249| 
| 250| 250| 	if (g_GameAttributes.settings.RatingEnabled &&
| 251| 251| 	    g_GameAttributes.settings.PlayerData.length == 2)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 277| 277| 		});
| 278| 278| 
| 279| 279| 	if (g_GameAttributes.settings.Ceasefire !== undefined)
| 280|    |-	titles.push({
|    | 280|+		titles.push({
| 281| 281| 		"label": translate("Ceasefire"),
| 282| 282| 		"value":
| 283| 283| 			g_GameAttributes.settings.Ceasefire == 0 ?
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 278| 278| 
| 279| 279| 	if (g_GameAttributes.settings.Ceasefire !== undefined)
| 280| 280| 	titles.push({
| 281|    |-		"label": translate("Ceasefire"),
|    | 281|+			"label": translate("Ceasefire"),
| 282| 282| 		"value":
| 283| 283| 			g_GameAttributes.settings.Ceasefire == 0 ?
| 284| 284| 				translate("disabled") :
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 279| 279| 	if (g_GameAttributes.settings.Ceasefire !== undefined)
| 280| 280| 	titles.push({
| 281| 281| 		"label": translate("Ceasefire"),
| 282|    |-		"value":
|    | 282|+			"value":
| 283| 283| 			g_GameAttributes.settings.Ceasefire == 0 ?
| 284| 284| 				translate("disabled") :
| 285| 285| 				sprintf(translatePlural(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 287| 287| 					"For the first %(min)s minutes, other players will stay neutral.",
| 288| 288| 					g_GameAttributes.settings.Ceasefire),
| 289| 289| 				{ "min": g_GameAttributes.settings.Ceasefire })
| 290|    |-	});
|    | 290|+		});
| 291| 291| 
| 292| 292| 	if (g_GameAttributes.map !== undefined && g_GameAttributes.map == "random")
| 293| 293| 		titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 309| 309| 	}
| 310| 310| 
| 311| 311| 	if (g_GameAttributes.mapType)
| 312|    |-	titles.push({
|    | 312|+		titles.push({
| 313| 313| 		"label": translate("Map Type"),
| 314| 314| 		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 315| 315| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 310| 310| 
| 311| 311| 	if (g_GameAttributes.mapType)
| 312| 312| 	titles.push({
| 313|    |-		"label": translate("Map Type"),
|    | 313|+			"label": translate("Map Type"),
| 314| 314| 		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 315| 315| 	});
| 316| 316| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 311| 311| 	if (g_GameAttributes.mapType)
| 312| 312| 	titles.push({
| 313| 313| 		"label": translate("Map Type"),
| 314|    |-		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
|    | 314|+			"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 315| 315| 	});
| 316| 316| 
| 317| 317| 	if (g_GameAttributes.mapType == "random" && g_GameAttributes.settings.Size)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 312| 312| 	titles.push({
| 313| 313| 		"label": translate("Map Type"),
| 314| 314| 		"value": g_MapTypes.Title[g_MapTypes.Name.indexOf(g_GameAttributes.mapType)]
| 315|    |-	});
|    | 315|+		});
| 316| 316| 
| 317| 317| 	if (g_GameAttributes.mapType == "random" && g_GameAttributes.settings.Size)
| 318| 318| 	{
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 343| 343| 	}
| 344| 344| 
| 345| 345| 	if (g_GameAttributes.settings.Nomad !== undefined)
| 346|    |-	titles.push({
|    | 346|+		titles.push({
| 347| 347| 		"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
| 348| 348| 		"value":
| 349| 349| 			g_GameAttributes.settings.Nomad ?
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 344| 344| 
| 345| 345| 	if (g_GameAttributes.settings.Nomad !== undefined)
| 346| 346| 	titles.push({
| 347|    |-		"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
|    | 347|+			"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
| 348| 348| 		"value":
| 349| 349| 			g_GameAttributes.settings.Nomad ?
| 350| 350| 				translate("Players start with only few units and have to find a suitable place to build their city.") :
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 345| 345| 	if (g_GameAttributes.settings.Nomad !== undefined)
| 346| 346| 	titles.push({
| 347| 347| 		"label": g_GameAttributes.settings.Nomad ? translate("Nomad Mode") : translate("Civic Centers"),
| 348|    |-		"value":
|    | 348|+			"value":
| 349| 349| 			g_GameAttributes.settings.Nomad ?
| 350| 350| 				translate("Players start with only few units and have to find a suitable place to build their city.") :
| 351| 351| 				translate("Players start with a Civic Center.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 349| 349| 			g_GameAttributes.settings.Nomad ?
| 350| 350| 				translate("Players start with only few units and have to find a suitable place to build their city.") :
| 351| 351| 				translate("Players start with a Civic Center.")
| 352|    |-	});
|    | 352|+		});
| 353| 353| 
| 354| 354| 	if (g_GameAttributes.settings.StartingResources !== undefined)
| 355| 355| 		titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 380| 380| 		});
| 381| 381| 
| 382| 382| 	if (g_GameAttributes.settings.DisableTreasures !== undefined)
| 383|    |-	titles.push({
|    | 383|+		titles.push({
| 384| 384| 		"label": translate("Treasures"),
| 385| 385| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 386| 386| 			translateWithContext("treasures", "Disabled") :
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 381| 381| 
| 382| 382| 	if (g_GameAttributes.settings.DisableTreasures !== undefined)
| 383| 383| 	titles.push({
| 384|    |-		"label": translate("Treasures"),
|    | 384|+			"label": translate("Treasures"),
| 385| 385| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 386| 386| 			translateWithContext("treasures", "Disabled") :
| 387| 387| 			translateWithContext("treasures", "As defined by the map.")
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 382| 382| 	if (g_GameAttributes.settings.DisableTreasures !== undefined)
| 383| 383| 	titles.push({
| 384| 384| 		"label": translate("Treasures"),
| 385|    |-		"value": g_GameAttributes.settings.DisableTreasures ?
|    | 385|+			"value": g_GameAttributes.settings.DisableTreasures ?
| 386| 386| 			translateWithContext("treasures", "Disabled") :
| 387| 387| 			translateWithContext("treasures", "As defined by the map.")
| 388| 388| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 383| 383| 	titles.push({
| 384| 384| 		"label": translate("Treasures"),
| 385| 385| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 386|    |-			translateWithContext("treasures", "Disabled") :
|    | 386|+				translateWithContext("treasures", "Disabled") :
| 387| 387| 			translateWithContext("treasures", "As defined by the map.")
| 388| 388| 	});
| 389| 389| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 384| 384| 		"label": translate("Treasures"),
| 385| 385| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 386| 386| 			translateWithContext("treasures", "Disabled") :
| 387|    |-			translateWithContext("treasures", "As defined by the map.")
|    | 387|+				translateWithContext("treasures", "As defined by the map.")
| 388| 388| 	});
| 389| 389| 
| 390| 390| 	if (g_GameAttributes.settings.RevealMap !== undefined)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 385| 385| 		"value": g_GameAttributes.settings.DisableTreasures ?
| 386| 386| 			translateWithContext("treasures", "Disabled") :
| 387| 387| 			translateWithContext("treasures", "As defined by the map.")
| 388|    |-	});
|    | 388|+		});
| 389| 389| 
| 390| 390| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 391| 391| 	titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 388| 388| 	});
| 389| 389| 
| 390| 390| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 391|    |-	titles.push({
|    | 391|+		titles.push({
| 392| 392| 		"label": translate("Revealed Map"),
| 393| 393| 		"value": g_GameAttributes.settings.RevealMap
| 394| 394| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 389| 389| 
| 390| 390| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 391| 391| 	titles.push({
| 392|    |-		"label": translate("Revealed Map"),
|    | 392|+			"label": translate("Revealed Map"),
| 393| 393| 		"value": g_GameAttributes.settings.RevealMap
| 394| 394| 	});
| 395| 395| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 390| 390| 	if (g_GameAttributes.settings.RevealMap !== undefined)
| 391| 391| 	titles.push({
| 392| 392| 		"label": translate("Revealed Map"),
| 393|    |-		"value": g_GameAttributes.settings.RevealMap
|    | 393|+			"value": g_GameAttributes.settings.RevealMap
| 394| 394| 	});
| 395| 395| 
| 396| 396| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 391| 391| 	titles.push({
| 392| 392| 		"label": translate("Revealed Map"),
| 393| 393| 		"value": g_GameAttributes.settings.RevealMap
| 394|    |-	});
|    | 394|+		});
| 395| 395| 
| 396| 396| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 397| 397| 	titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 394| 394| 	});
| 395| 395| 
| 396| 396| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 397|    |-	titles.push({
|    | 397|+		titles.push({
| 398| 398| 		"label": translate("Explored Map"),
| 399| 399| 		"value": g_GameAttributes.settings.ExploreMap
| 400| 400| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 395| 395| 
| 396| 396| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 397| 397| 	titles.push({
| 398|    |-		"label": translate("Explored Map"),
|    | 398|+			"label": translate("Explored Map"),
| 399| 399| 		"value": g_GameAttributes.settings.ExploreMap
| 400| 400| 	});
| 401| 401| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 396| 396| 	if (g_GameAttributes.settings.ExploreMap !== undefined)
| 397| 397| 	titles.push({
| 398| 398| 		"label": translate("Explored Map"),
| 399|    |-		"value": g_GameAttributes.settings.ExploreMap
|    | 399|+			"value": g_GameAttributes.settings.ExploreMap
| 400| 400| 	});
| 401| 401| 
| 402| 402| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 397| 397| 	titles.push({
| 398| 398| 		"label": translate("Explored Map"),
| 399| 399| 		"value": g_GameAttributes.settings.ExploreMap
| 400|    |-	});
|    | 400|+		});
| 401| 401| 
| 402| 402| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 403| 403| 	titles.push({
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 400| 400| 	});
| 401| 401| 
| 402| 402| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 403|    |-	titles.push({
|    | 403|+		titles.push({
| 404| 404| 		"label": translate("Cheats"),
| 405| 405| 		"value": g_GameAttributes.settings.CheatsEnabled
| 406| 406| 	});
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 401| 401| 
| 402| 402| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 403| 403| 	titles.push({
| 404|    |-		"label": translate("Cheats"),
|    | 404|+			"label": translate("Cheats"),
| 405| 405| 		"value": g_GameAttributes.settings.CheatsEnabled
| 406| 406| 	});
| 407| 407| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 2.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 402| 402| 	if (g_GameAttributes.settings.CheatsEnabled !== undefined)
| 403| 403| 	titles.push({
| 404| 404| 		"label": translate("Cheats"),
| 405|    |-		"value": g_GameAttributes.settings.CheatsEnabled
|    | 405|+			"value": g_GameAttributes.settings.CheatsEnabled
| 406| 406| 	});
| 407| 407| 
| 408| 408| 	return titles.map(title => sprintf(translate("%(label)s %(details)s"), {
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 1.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 403| 403| 	titles.push({
| 404| 404| 		"label": translate("Cheats"),
| 405| 405| 		"value": g_GameAttributes.settings.CheatsEnabled
| 406|    |-	});
|    | 406|+		});
| 407| 407| 
| 408| 408| 	return titles.map(title => sprintf(translate("%(label)s %(details)s"), {
| 409| 409| 		"label": coloredText(title.label, g_DescriptionHighlight),
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 100| 100| 			let maxPopulation =
| 101| 101| 				settings.PlayerData[i].PopulationLimit !== undefined ?
| 102| 102| 					settings.PlayerData[i].PopulationLimit :
| 103|    |-				settings.PopulationCap !== undefined ?
|    | 103|+					settings.PopulationCap !== undefined ?
| 104| 104| 					settings.PopulationCap :
| 105| 105| 				playerDefaults[i].PopulationLimit !== undefined ?
| 106| 106| 					playerDefaults[i].PopulationLimit :
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 101| 101| 				settings.PlayerData[i].PopulationLimit !== undefined ?
| 102| 102| 					settings.PlayerData[i].PopulationLimit :
| 103| 103| 				settings.PopulationCap !== undefined ?
| 104|    |-					settings.PopulationCap :
|    | 104|+						settings.PopulationCap :
| 105| 105| 				playerDefaults[i].PopulationLimit !== undefined ?
| 106| 106| 					playerDefaults[i].PopulationLimit :
| 107| 107| 					undefined;
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 102| 102| 					settings.PlayerData[i].PopulationLimit :
| 103| 103| 				settings.PopulationCap !== undefined ?
| 104| 104| 					settings.PopulationCap :
| 105|    |-				playerDefaults[i].PopulationLimit !== undefined ?
|    | 105|+						playerDefaults[i].PopulationLimit !== undefined ?
| 106| 106| 					playerDefaults[i].PopulationLimit :
| 107| 107| 					undefined;
| 108| 108| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 7 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 103| 103| 				settings.PopulationCap !== undefined ?
| 104| 104| 					settings.PopulationCap :
| 105| 105| 				playerDefaults[i].PopulationLimit !== undefined ?
| 106|    |-					playerDefaults[i].PopulationLimit :
|    | 106|+							playerDefaults[i].PopulationLimit :
| 107| 107| 					undefined;
| 108| 108| 
| 109| 109| 			if (maxPopulation !== undefined)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 7 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 104| 104| 					settings.PopulationCap :
| 105| 105| 				playerDefaults[i].PopulationLimit !== undefined ?
| 106| 106| 					playerDefaults[i].PopulationLimit :
| 107|    |-					undefined;
|    | 107|+							undefined;
| 108| 108| 
| 109| 109| 			if (maxPopulation !== undefined)
| 110| 110| 				cmpPlayer.SetMaxPopulation(maxPopulation);

binaries/data/mods/public/simulation/helpers/Player.js
|  78| »   »   let·cmpPlayer·=·QueryPlayerIDInterface(i);
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'cmpPlayer' is already declared in the upper scope.

binaries/data/mods/public/simulation/helpers/Player.js
| 201| »   »   for·(let·i·=·0;·i·<·numPlayers;·++i)
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.

binaries/data/mods/public/simulation/helpers/Player.js
|  67| »   »   var·entID·=·cmpPlayerManager.GetPlayerByID(i);
|    | [NORMAL] JSHintBear:
|    | 'entID' is already defined.

binaries/data/mods/public/simulation/helpers/Player.js
|  76| »   for·(var·i·=·0;·i·<·numPlayers;·++i)
|    | [NORMAL] JSHintBear:
|    | 'i' is already defined.

binaries/data/mods/public/simulation/helpers/Player.js
| 179| »   »   »   for·(var·j·=·0;·j·<·numPlayers;·++j)
|    | [NORMAL] JSHintBear:
|    | 'j' is already defined.
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  16|  16| 		let caption =
|  17|  17| 			g_GameAttributes.settings.CheatsEnabled ?
|  18|  18| 				this.CheatsEnabled :
|  19|    |-			g_GameAttributes.settings.RatingEnabled ?
|    |  19|+				g_GameAttributes.settings.RatingEnabled ?
|  20|  20| 				this.RatingEnabled :
|  21|  21| 				"";
|  22|  22| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  17|  17| 			g_GameAttributes.settings.CheatsEnabled ?
|  18|  18| 				this.CheatsEnabled :
|  19|  19| 			g_GameAttributes.settings.RatingEnabled ?
|  20|    |-				this.RatingEnabled :
|    |  20|+					this.RatingEnabled :
|  21|  21| 				"";
|  22|  22| 
|  23|  23| 		this.gameSettingWarning.caption = caption;
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  18|  18| 				this.CheatsEnabled :
|  19|  19| 			g_GameAttributes.settings.RatingEnabled ?
|  20|  20| 				this.RatingEnabled :
|  21|    |-				"";
|    |  21|+					"";
|  22|  22| 
|  23|  23| 		this.gameSettingWarning.caption = caption;
|  24|  24| 		this.gameSettingWarning.hidden = !caption;
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerSettings.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerSettings.js
|  35|  35| 			if (mapPData[property] !== undefined)
|  36|  36| 				pData[property] = mapPData[property];
|  37|  37| 	}
|  38|    |-}
|    |  38|+};
|  39|  39| 
|  40|  40| PlayerSettingControls.PlayerSettings.prototype.MapSettings = [
|  41|  41| 	"StartingTechnologies",

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerSettings.js
|  38| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/AIConfigButton.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/AIConfigButton.js
| 176| 176| 		this.gameSettingsControl.updateGameAttributes();
| 177| 177| 		this.gameSettingsControl.setNetworkGameAttributes();
| 178| 178| 	}
| 179|    |-}
|    | 179|+};
| 180| 180| 
| 181| 181| PlayerSettingControls.AIConfigButton.prototype.Tooltip =
| 182| 182| 	translate("Configure AI: %(description)s.");

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/AIConfigButton.js
| 179| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   7| »   »   this.clientItemFactory·=·new·PlayerAssignmentItem.Client();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   8| »   »   this.aiItemFactory·=·new·PlayerAssignmentItem.AI();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   9| »   »   this.unassignedItem·=·new·PlayerAssignmentItem.Unassigned().createItem();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
| 160| class·PlayerAssignmentItem
|    | [NORMAL] JSHintBear:
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/session/session.js
| 690| »   »   button.onpress·=·(function(i)·{·return·function()·{·performGroup((Engine.HotkeyIsPressed("selection.add")·?·"add"·:·"select"),·i);·};·})(i);
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.

binaries/data/mods/public/gui/session/session.js
| 691| »   »   button.ondoublepress·=·(function(i)·{·return·function()·{·performGroup("snap",·i);·};·})(i);
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.

binaries/data/mods/public/gui/session/session.js
| 692| »   »   button.onpressright·=·(function(i)·{·return·function()·{·performGroup("breakUp",·i);·};·})(i);
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerFrame.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerFrame.js
|  18|  18| 	{
|  19|  19| 		this.playerFrame.hidden = !this.gameSettingsControl.getPlayerData(g_GameAttributes, this.playerIndex);
|  20|  20| 	}
|  21|    |-}
|    |  21|+};
|  22|  22| 
|  23|  23| PlayerSettingControls.PlayerFrame.prototype.Height = 32;

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerFrame.js
|  21| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerName.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerName.js
| 108| 108| 				if (g_PlayerAssignments[guid].player == this.playerIndex + 1)
| 109| 109| 					pData.Name = g_PlayerAssignments[guid].name;
| 110| 110| 	}
| 111|    |-}
|    | 111|+};
| 112| 112| 
| 113| 113| PlayerSettingControls.PlayerName.prototype.RomanLabel =
| 114| 114| 	translate("%(playerName)s %(romanNumber)s");

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerName.js
| 111| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
Executing section cli...

Link to build: https://jenkins.wildfiregames.com/job/docker-differential/1490/display/redirect

Vulcan added a comment.Jan 7 2020, 7:11 PM

Successful build - Chance fights ever on the side of the prudent.

Link to build: https://jenkins.wildfiregames.com/job/macos-differential/68/display/redirect

elexis updated this revision to Diff 10919.Jan 8 2020, 4:24 PM
  • Revert gamedescription.js addition of if-statements, as they are unnecessary following that function only being called on onGameAttributesBatchChange instead of onGameAttributesChange, this way also solving the JSlint Stan complaint about indentation that I wasn't going to fix (since if I was changing those lines, Id make it OOP at the same time).
  • Move MapData loading function depending on MapType to the settings.js MapType function.
  • DefaultPlayerCount became unused, use it appropriately in GameSettingsControl. It's only relevant if the default MapType was Random, that's why it went unnoticed. refs D744
  • Delete an unused obsolete hunk PlayerData = []... from MapSelection.onGameAttributesChange.
Vulcan added a comment.Jan 8 2020, 4:25 PM

Successful build - Chance fights ever on the side of the prudent.

Link to build: https://jenkins.wildfiregames.com/job/vs2015-differential/977/display/redirect

Vulcan added a comment.Jan 8 2020, 4:27 PM

Successful build - Chance fights ever on the side of the prudent.

Link to build: https://jenkins.wildfiregames.com/job/macos-differential/73/display/redirect

Vulcan added a comment.Jan 8 2020, 4:29 PM

Successful build - Chance fights ever on the side of the prudent.

Linter detected issues:
Executing section Source...
Executing section JS...

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   7| »   »   this.clientItemFactory·=·new·PlayerAssignmentItem.Client();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   8| »   »   this.aiItemFactory·=·new·PlayerAssignmentItem.AI();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   9| »   »   this.unassignedItem·=·new·PlayerAssignmentItem.Unassigned().createItem();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
| 160| class·PlayerAssignmentItem
|    | [NORMAL] JSHintBear:
|    | 'PlayerAssignmentItem' was used before it was defined.
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 102| 102| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 103| 103| 						playerDescription = translate("%(playerName)s (%(civ)s, %(state)s)");
| 104| 104| 				else
| 105|    |-					if (isActive)
|    | 105|+				if (isActive)
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 103| 103| 						playerDescription = translate("%(playerName)s (%(civ)s, %(state)s)");
| 104| 104| 				else
| 105| 105| 					if (isActive)
| 106|    |-						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | 106|+				// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 104| 104| 				else
| 105| 105| 					if (isActive)
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107|    |-						playerDescription = translate("%(playerName)s");
|    | 107|+					playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110| 110| 						playerDescription = translate("%(playerName)s (%(state)s)");
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 105| 105| 					if (isActive)
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108|    |-					else
|    | 108|+				else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110| 110| 						playerDescription = translate("%(playerName)s (%(state)s)");
| 111| 111| 			}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109|    |-						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | 109|+				// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110| 110| 						playerDescription = translate("%(playerName)s (%(state)s)");
| 111| 111| 			}
| 112| 112| 		}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110|    |-						playerDescription = translate("%(playerName)s (%(state)s)");
|    | 110|+					playerDescription = translate("%(playerName)s (%(state)s)");
| 111| 111| 			}
| 112| 112| 		}
| 113| 113| 
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerName.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerName.js
| 108| 108| 				if (g_PlayerAssignments[guid].player == this.playerIndex + 1)
| 109| 109| 					pData.Name = g_PlayerAssignments[guid].name;
| 110| 110| 	}
| 111|    |-}
|    | 111|+};
| 112| 112| 
| 113| 113| PlayerSettingControls.PlayerName.prototype.RomanLabel =
| 114| 114| 	translate("%(playerName)s %(romanNumber)s");

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerName.js
| 111| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerFrame.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerFrame.js
|  18|  18| 	{
|  19|  19| 		this.playerFrame.hidden = !this.gameSettingsControl.getPlayerData(g_GameAttributes, this.playerIndex);
|  20|  20| 	}
|  21|    |-}
|    |  21|+};
|  22|  22| 
|  23|  23| PlayerSettingControls.PlayerFrame.prototype.Height = 32;

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerFrame.js
|  21| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.

binaries/data/mods/public/gui/session/session.js
| 690| »   »   button.onpress·=·(function(i)·{·return·function()·{·performGroup((Engine.HotkeyIsPressed("selection.add")·?·"add"·:·"select"),·i);·};·})(i);
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.

binaries/data/mods/public/gui/session/session.js
| 691| »   »   button.ondoublepress·=·(function(i)·{·return·function()·{·performGroup("snap",·i);·};·})(i);
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.

binaries/data/mods/public/gui/session/session.js
| 692| »   »   button.onpressright·=·(function(i)·{·return·function()·{·performGroup("breakUp",·i);·};·})(i);
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerSettings.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerSettings.js
|  35|  35| 			if (mapPData[property] !== undefined)
|  36|  36| 				pData[property] = mapPData[property];
|  37|  37| 	}
|  38|    |-}
|    |  38|+};
|  39|  39| 
|  40|  40| PlayerSettingControls.PlayerSettings.prototype.MapSettings = [
|  41|  41| 	"StartingTechnologies",

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerSettings.js
|  38| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  16|  16| 		let caption =
|  17|  17| 			g_GameAttributes.settings.CheatsEnabled ?
|  18|  18| 				this.CheatsEnabled :
|  19|    |-			g_GameAttributes.settings.RatingEnabled ?
|    |  19|+				g_GameAttributes.settings.RatingEnabled ?
|  20|  20| 				this.RatingEnabled :
|  21|  21| 				"";
|  22|  22| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  17|  17| 			g_GameAttributes.settings.CheatsEnabled ?
|  18|  18| 				this.CheatsEnabled :
|  19|  19| 			g_GameAttributes.settings.RatingEnabled ?
|  20|    |-				this.RatingEnabled :
|    |  20|+					this.RatingEnabled :
|  21|  21| 				"";
|  22|  22| 
|  23|  23| 		this.gameSettingWarning.caption = caption;
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  18|  18| 				this.CheatsEnabled :
|  19|  19| 			g_GameAttributes.settings.RatingEnabled ?
|  20|  20| 				this.RatingEnabled :
|  21|    |-				"";
|    |  21|+					"";
|  22|  22| 
|  23|  23| 		this.gameSettingWarning.caption = caption;
|  24|  24| 		this.gameSettingWarning.hidden = !caption;
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 100| 100| 			let maxPopulation =
| 101| 101| 				settings.PlayerData[i].PopulationLimit !== undefined ?
| 102| 102| 					settings.PlayerData[i].PopulationLimit :
| 103|    |-				settings.PopulationCap !== undefined ?
|    | 103|+					settings.PopulationCap !== undefined ?
| 104| 104| 					settings.PopulationCap :
| 105| 105| 				playerDefaults[i].PopulationLimit !== undefined ?
| 106| 106| 					playerDefaults[i].PopulationLimit :
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 101| 101| 				settings.PlayerData[i].PopulationLimit !== undefined ?
| 102| 102| 					settings.PlayerData[i].PopulationLimit :
| 103| 103| 				settings.PopulationCap !== undefined ?
| 104|    |-					settings.PopulationCap :
|    | 104|+						settings.PopulationCap :
| 105| 105| 				playerDefaults[i].PopulationLimit !== undefined ?
| 106| 106| 					playerDefaults[i].PopulationLimit :
| 107| 107| 					undefined;
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 102| 102| 					settings.PlayerData[i].PopulationLimit :
| 103| 103| 				settings.PopulationCap !== undefined ?
| 104| 104| 					settings.PopulationCap :
| 105|    |-				playerDefaults[i].PopulationLimit !== undefined ?
|    | 105|+						playerDefaults[i].PopulationLimit !== undefined ?
| 106| 106| 					playerDefaults[i].PopulationLimit :
| 107| 107| 					undefined;
| 108| 108| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 7 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 103| 103| 				settings.PopulationCap !== undefined ?
| 104| 104| 					settings.PopulationCap :
| 105| 105| 				playerDefaults[i].PopulationLimit !== undefined ?
| 106|    |-					playerDefaults[i].PopulationLimit :
|    | 106|+							playerDefaults[i].PopulationLimit :
| 107| 107| 					undefined;
| 108| 108| 
| 109| 109| 			if (maxPopulation !== undefined)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 7 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 104| 104| 					settings.PopulationCap :
| 105| 105| 				playerDefaults[i].PopulationLimit !== undefined ?
| 106| 106| 					playerDefaults[i].PopulationLimit :
| 107|    |-					undefined;
|    | 107|+							undefined;
| 108| 108| 
| 109| 109| 			if (maxPopulation !== undefined)
| 110| 110| 				cmpPlayer.SetMaxPopulation(maxPopulation);

binaries/data/mods/public/simulation/helpers/Player.js
|  78| »   »   let·cmpPlayer·=·QueryPlayerIDInterface(i);
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'cmpPlayer' is already declared in the upper scope.

binaries/data/mods/public/simulation/helpers/Player.js
| 201| »   »   for·(let·i·=·0;·i·<·numPlayers;·++i)
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.

binaries/data/mods/public/simulation/helpers/Player.js
|  67| »   »   var·entID·=·cmpPlayerManager.GetPlayerByID(i);
|    | [NORMAL] JSHintBear:
|    | 'entID' is already defined.

binaries/data/mods/public/simulation/helpers/Player.js
|  76| »   for·(var·i·=·0;·i·<·numPlayers;·++i)
|    | [NORMAL] JSHintBear:
|    | 'i' is already defined.

binaries/data/mods/public/simulation/helpers/Player.js
| 179| »   »   »   for·(var·j·=·0;·j·<·numPlayers;·++j)
|    | [NORMAL] JSHintBear:
|    | 'j' is already defined.
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/AIConfigButton.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/AIConfigButton.js
| 176| 176| 		this.gameSettingsControl.updateGameAttributes();
| 177| 177| 		this.gameSettingsControl.setNetworkGameAttributes();
| 178| 178| 	}
| 179|    |-}
|    | 179|+};
| 180| 180| 
| 181| 181| PlayerSettingControls.AIConfigButton.prototype.Tooltip =
| 182| 182| 	translate("Configure AI: %(description)s.");

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/AIConfigButton.js
| 179| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
Executing section cli...

Link to build: https://jenkins.wildfiregames.com/job/docker-differential/1495/display/redirect

Stan added a comment.Jan 8 2020, 5:51 PM

I was wondering, does the inclusion of OOP here would allow one to create special panels during a match using the console? Like creating a MapPreview panel or reuse any component? (Sorry if this is a dumb question)

elexis edited the summary of this revision. (Show Details)Jan 11 2020, 2:44 AM
elexis edited the summary of this revision. (Show Details)Jan 11 2020, 5:07 PM
  • gamedescription.js indentation issue is also fixed by calling getGameDescription only on onGameAttributesBatchChange instead of onGameAttributesChange (because it allows for removal of the safety checks previously inserted without adapting the indentation).
  • Talked to bb about the ModernWindowCornerBottomRight change on http://irclogs.wildfiregames.com/2020-01/2020-01-05-QuakeNet-%230ad-dev.log
  • Yes, I used tabs for multi-line if condition alignment.
In D2483#106465, @Stan wrote:

Answered on IRC http://irclogs.wildfiregames.com/2020-01/2020-01-11-QuakeNet-%230ad-dev.log

Discussed #3883, #3806, https://github.com/0ad/0ad/compare/master...Imarok:just_another_gamesetup_rewrite with Imarok on http://irclogs.wildfiregames.com/2020-01/2020-01-07-QuakeNet-%230ad-dev.log

With the exception of missing semicolons, I disagree with the proposals made by the linting bot.

binaries/data/mods/public/gui/common/MapCache.js
22 ↗(On Diff #10912)
binaries/data/mods/public/gui/common/gamedescription.js
363 ↗(On Diff #10912)

While MapFilters are very slightly useful to be informed about in the gamesetup stage for clients, they aren't a setting that determines simulation state nor has it other relevance for the played game, so it does not match the objectives of the objectives dialog / gamedescription function.

binaries/data/mods/public/gui/gamesetup/Controls/StartGameControl.js
6 ↗(On Diff #10919)

refs #4463

binaries/data/mods/public/gui/gamesetup/Panels/Buttons/StartGameButton.js
24 ↗(On Diff #10912)

This function is written this way because (1) g_IsController is planned to change dynamically in the future and (2) for symmetry with readyButton.

binaries/data/mods/public/gui/gamesetup/Panels/Chat/ChatInputAutocomplete.js
25 ↗(On Diff #10912)

The precedence sorting didn't work, since it sorted strings by characters, not numeric values.

binaries/data/mods/public/maps/random/jebel_barkal.json
21 ↗(On Diff #10912)

The jebel_barkal.json default trigger difficulty removal is performed because the Default may be very well set in trigger_difficulties.json that specifies the difficulty levels.

Then a map should only specify a different default if it wants a different default.

binaries/data/mods/public/simulation/data/settings/player_defaults.json
16 ↗(On Diff #10919)

Empty AI string removed, because this file should not hardcode which slot the gamesetup will assign players to.

binaries/data/mods/public/simulation/data/settings/trigger_difficulties.json
23 ↗(On Diff #10919)

The map can still specify a different default.

elexis edited the test plan for this revision. (Show Details)Jan 11 2020, 8:25 PM
elexis updated this revision to Diff 10979.Jan 11 2020, 9:04 PM
elexis edited the test plan for this revision. (Show Details)

Fix readyState reset when launching game with random dropdown items.
Don't revert english string change rP23176, exclude fix to rP22854, committed in rP23360.
Missing semicolons to eternity.

Successful build - Chance fights ever on the side of the prudent.

Link to build: https://jenkins.wildfiregames.com/job/vs2015-differential/1011/display/redirect

Successful build - Chance fights ever on the side of the prudent.

Link to build: https://jenkins.wildfiregames.com/job/macos-differential/107/display/redirect

Successful build - Chance fights ever on the side of the prudent.

Linter detected issues:
Executing section Source...
Executing section JS...

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   7| »   »   this.clientItemFactory·=·new·PlayerAssignmentItem.Client();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   8| »   »   this.aiItemFactory·=·new·PlayerAssignmentItem.AI();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
|   9| »   »   this.unassignedItem·=·new·PlayerAssignmentItem.Unassigned().createItem();
|    | [MAJOR] ESLintBear (no-use-before-define):
|    | 'PlayerAssignmentItem' was used before it was defined.

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/Dropdowns/PlayerAssignment.js
| 160| class·PlayerAssignmentItem
|    | [NORMAL] JSHintBear:
|    | 'PlayerAssignmentItem' was used before it was defined.
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 3.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  16|  16| 		let caption =
|  17|  17| 			g_GameAttributes.settings.CheatsEnabled ?
|  18|  18| 				this.CheatsEnabled :
|  19|    |-			g_GameAttributes.settings.RatingEnabled ?
|    |  19|+				g_GameAttributes.settings.RatingEnabled ?
|  20|  20| 				this.RatingEnabled :
|  21|  21| 				"";
|  22|  22| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  17|  17| 			g_GameAttributes.settings.CheatsEnabled ?
|  18|  18| 				this.CheatsEnabled :
|  19|  19| 			g_GameAttributes.settings.RatingEnabled ?
|  20|    |-				this.RatingEnabled :
|    |  20|+					this.RatingEnabled :
|  21|  21| 				"";
|  22|  22| 
|  23|  23| 		this.gameSettingWarning.caption = caption;
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/Panels/GameSettingWarning.js
|  18|  18| 				this.CheatsEnabled :
|  19|  19| 			g_GameAttributes.settings.RatingEnabled ?
|  20|  20| 				this.RatingEnabled :
|  21|    |-				"";
|    |  21|+					"";
|  22|  22| 
|  23|  23| 		this.gameSettingWarning.caption = caption;
|  24|  24| 		this.gameSettingWarning.hidden = !caption;
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 102| 102| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 103| 103| 						playerDescription = translate("%(playerName)s (%(civ)s, %(state)s)");
| 104| 104| 				else
| 105|    |-					if (isActive)
|    | 105|+				if (isActive)
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 103| 103| 						playerDescription = translate("%(playerName)s (%(civ)s, %(state)s)");
| 104| 104| 				else
| 105| 105| 					if (isActive)
| 106|    |-						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | 106|+				// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 104| 104| 				else
| 105| 105| 					if (isActive)
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107|    |-						playerDescription = translate("%(playerName)s");
|    | 107|+					playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110| 110| 						playerDescription = translate("%(playerName)s (%(state)s)");
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 105| 105| 					if (isActive)
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108|    |-					else
|    | 108|+				else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110| 110| 						playerDescription = translate("%(playerName)s (%(state)s)");
| 111| 111| 			}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 106| 106| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109|    |-						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
|    | 109|+				// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110| 110| 						playerDescription = translate("%(playerName)s (%(state)s)");
| 111| 111| 			}
| 112| 112| 		}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/common/gamedescription.js
| 107| 107| 						playerDescription = translate("%(playerName)s");
| 108| 108| 					else
| 109| 109| 						// Translation: Describe a player in a selected game, f.e. in the replay- or savegame menu
| 110|    |-						playerDescription = translate("%(playerName)s (%(state)s)");
|    | 110|+					playerDescription = translate("%(playerName)s (%(state)s)");
| 111| 111| 			}
| 112| 112| 		}
| 113| 113| 
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerFrame.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerFrame.js
|  18|  18| 	{
|  19|  19| 		this.playerFrame.hidden = !this.gameSettingsControl.getPlayerData(g_GameAttributes, this.playerIndex);
|  20|  20| 	}
|  21|    |-}
|    |  21|+};
|  22|  22| 
|  23|  23| PlayerSettingControls.PlayerFrame.prototype.Height = 32;

binaries/data/mods/public/gui/gamesetup/GameSettings/PerPlayer/PlayerFrame.js
|  21| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 100| 100| 			let maxPopulation =
| 101| 101| 				settings.PlayerData[i].PopulationLimit !== undefined ?
| 102| 102| 					settings.PlayerData[i].PopulationLimit :
| 103|    |-				settings.PopulationCap !== undefined ?
|    | 103|+					settings.PopulationCap !== undefined ?
| 104| 104| 					settings.PopulationCap :
| 105| 105| 				playerDefaults[i].PopulationLimit !== undefined ?
| 106| 106| 					playerDefaults[i].PopulationLimit :
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 101| 101| 				settings.PlayerData[i].PopulationLimit !== undefined ?
| 102| 102| 					settings.PlayerData[i].PopulationLimit :
| 103| 103| 				settings.PopulationCap !== undefined ?
| 104|    |-					settings.PopulationCap :
|    | 104|+						settings.PopulationCap :
| 105| 105| 				playerDefaults[i].PopulationLimit !== undefined ?
| 106| 106| 					playerDefaults[i].PopulationLimit :
| 107| 107| 					undefined;
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 6 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 102| 102| 					settings.PlayerData[i].PopulationLimit :
| 103| 103| 				settings.PopulationCap !== undefined ?
| 104| 104| 					settings.PopulationCap :
| 105|    |-				playerDefaults[i].PopulationLimit !== undefined ?
|    | 105|+						playerDefaults[i].PopulationLimit !== undefined ?
| 106| 106| 					playerDefaults[i].PopulationLimit :
| 107| 107| 					undefined;
| 108| 108| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 7 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 103| 103| 				settings.PopulationCap !== undefined ?
| 104| 104| 					settings.PopulationCap :
| 105| 105| 				playerDefaults[i].PopulationLimit !== undefined ?
| 106|    |-					playerDefaults[i].PopulationLimit :
|    | 106|+							playerDefaults[i].PopulationLimit :
| 107| 107| 					undefined;
| 108| 108| 
| 109| 109| 			if (maxPopulation !== undefined)
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 7 tabs but found 5.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/helpers/Player.js
| 104| 104| 					settings.PopulationCap :
| 105| 105| 				playerDefaults[i].PopulationLimit !== undefined ?
| 106| 106| 					playerDefaults[i].PopulationLimit :
| 107|    |-					undefined;
|    | 107|+							undefined;
| 108| 108| 
| 109| 109| 			if (maxPopulation !== undefined)
| 110| 110| 				cmpPlayer.SetMaxPopulation(maxPopulation);

binaries/data/mods/public/simulation/helpers/Player.js
|  78| »   »   let·cmpPlayer·=·QueryPlayerIDInterface(i);
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'cmpPlayer' is already declared in the upper scope.

binaries/data/mods/public/simulation/helpers/Player.js
| 201| »   »   for·(let·i·=·0;·i·<·numPlayers;·++i)
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.

binaries/data/mods/public/simulation/helpers/Player.js
|  67| »   »   var·entID·=·cmpPlayerManager.GetPlayerByID(i);
|    | [NORMAL] JSHintBear:
|    | 'entID' is already defined.

binaries/data/mods/public/simulation/helpers/Player.js
|  76| »   for·(var·i·=·0;·i·<·numPlayers;·++i)
|    | [NORMAL] JSHintBear:
|    | 'i' is already defined.

binaries/data/mods/public/simulation/helpers/Player.js
| 179| »   »   »   for·(var·j·=·0;·j·<·numPlayers;·++j)
|    | [NORMAL] JSHintBear:
|    | 'j' is already defined.

binaries/data/mods/public/gui/session/session.js
| 691| »   »   button.onpress·=·(function(i)·{·return·function()·{·performGroup((Engine.HotkeyIsPressed("selection.add")·?·"add"·:·"select"),·i);·};·})(i);
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.

binaries/data/mods/public/gui/session/session.js
| 692| »   »   button.ondoublepress·=·(function(i)·{·return·function()·{·performGroup("snap",·i);·};·})(i);
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.

binaries/data/mods/public/gui/session/session.js
| 693| »   »   button.onpressright·=·(function(i)·{·return·function()·{·performGroup("breakUp",·i);·};·})(i);
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.
Executing section cli...

Link to build: https://jenkins.wildfiregames.com/job/docker-differential/1529/display/redirect

This revision was not accepted when it landed; it landed in state Needs Review.Jan 11 2020, 9:14 PM
This revision was automatically updated to reflect the committed changes.
Owners added subscribers: Restricted Owners Package, Restricted Owners Package.Jan 11 2020, 9:14 PM