Page MenuHomeWildfire Games

Allow to use multiple technologies as requirements for unit training and construction
AbandonedPublic

Authored by Silier on Jan 4 2019, 9:23 PM.

Details

Reviewers
wraitii
lyv
Group Reviewers
Restricted Owners Package(Owns No Changed Paths)
Restricted Owners Package(Owns No Changed Paths)
Summary

Allow to use multiple technologies as requirements for unit training and construction.

Track of important files:
globalscripts/Templates.js
gui/common/tooltips.js
gui/session/selection_panels.js

components/GuiInterface.js
components/Identity.js
components/TechnologyManager.js

ai/common-api/entity.js
ai/common-api/gamestate.js
ai/petra/queueplanBuilding.js

Test Plan

Test, that any building, unit has just correct technology requirements. For example there is not town_phase and village_phase. (best way through playing)

Diff Detail

Repository
rP 0 A.D. Public Repository
Branch
/ps/trunk
Lint
Lint OK
Unit
No Unit Test Coverage
Build Status
Buildable 6786
Build 11160: Vulcan BuildJenkins
Build 11159: arc lint + arc unit

Event Timeline

Silier created this revision.Jan 4 2019, 9:23 PM
Owners added subscribers: Restricted Owners Package, Restricted Owners Package.Jan 4 2019, 9:23 PM
Silier updated this revision to Diff 7251.Jan 4 2019, 9:49 PM

Make getRequiredTechnologyTooltip nicer and update AI.

Silier updated this revision to Diff 7253.Jan 4 2019, 10:00 PM

missing renaming

Vulcan added a subscriber: Vulcan.Jan 4 2019, 10:55 PM

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

Linter detected issues:
Executing section Source...
Executing section JS...
|    | [NORMAL] ESLintBear (space-before-function-paren):
|    | Unexpected space before function parentheses.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/Identity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/Identity.js
| 100| 100| 	this.visibleClassesList = GetVisibleIdentityClasses(this.template);
| 101| 101| };
| 102| 102| 
| 103|    |-Identity.prototype.Deserialize = function ()
|    | 103|+Identity.prototype.Deserialize = function()
| 104| 104| {
| 105| 105| 	this.Init();
| 106| 106| };
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-in'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  10|  10| 
|  11|  11| 	var ret = {};
|  12|  12| 	for (var i in this)
|  13|    |-	{
|    |  13|+	
|  14|  14| 		if (this.hasOwnProperty(i))
|  15|  15| 			ret[i] = this[i];
|  16|    |-	}
|    |  16|+	
|  17|  17| 	ret.modificationCache = {};
|  18|  18| 	return ret;
|  19|  19| };
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '||' should be placed at the end of the line.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  64|  64| 	for (let key of this.unresearchedAutoResearchTechs)
|  65|  65| 	{
|  66|  66| 		let tech = TechnologyTemplates.Get(key);
|  67|    |-		if ((tech.autoResearch && this.CanResearch(key))
|  68|    |-			|| (tech.top && (this.IsTechnologyResearched(tech.top) || this.IsTechnologyResearched(tech.bottom))))
|    |  67|+		if ((tech.autoResearch && this.CanResearch(key)) ||
|    |  68|+			(tech.top && (this.IsTechnologyResearched(tech.top) || this.IsTechnologyResearched(tech.bottom))))
|  69|  69| 		{
|  70|  70| 			this.unresearchedAutoResearchTechs.delete(key);
|  71|  71| 			this.ResearchTechnology(key);
|    | [NORMAL] ESLintBear (space-before-function-paren):
|    | Unexpected space before function parentheses.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  75|  75| };
|  76|  76| 
|  77|  77| // Checks an entity template to see if its technology requirements have been met
|  78|    |-TechnologyManager.prototype.CanProduce = function (templateName)
|    |  78|+TechnologyManager.prototype.CanProduce = function(templateName)
|  79|  79| {
|  80|  80| 	let cmpTempManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
|  81|  81| 	let template = cmpTempManager.GetTemplate(templateName);
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-of'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  98|  98| 
|  99|  99| TechnologyManager.prototype.AreTechnologiesResearched = function(techs)
| 100| 100| {
| 101|    |-	for (let tech of techs) {
|    | 101|+	for (let tech of techs) 
| 102| 102| 		if (!this.researchedTechs.has(tech))
| 103| 103| 			return false;
| 104|    |-	}
|    | 104|+	
| 105| 105| 	return true;
| 106| 106| }
| 107| 107| 
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 103| 103| 			return false;
| 104| 104| 	}
| 105| 105| 	return true;
| 106|    |-}
|    | 106|+};
| 107| 107| 
| 108| 108| TechnologyManager.prototype.IsTechnologyStarted = function(tech)
| 109| 109| {
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 202| 202| 		var classes = cmpIdentity.GetClassesList();
| 203| 203| 		// don't use foundations for the class counts but check if techs apply (e.g. health increase)
| 204| 204| 		if (!Engine.QueryInterface(msg.entity, IID_Foundation))
| 205|    |-		{
|    | 205|+		
| 206| 206| 			for (let cls of classes)
| 207| 207| 			{
| 208| 208| 				this.classCounts[cls] = this.classCounts[cls] || 0;
| 212| 212| 				this.typeCountsByClass[cls][template] = this.typeCountsByClass[cls][template] || 0;
| 213| 213| 				this.typeCountsByClass[cls][template] += 1;
| 214| 214| 			}
| 215|    |-		}
|    | 215|+		
| 216| 216| 
| 217| 217| 		// Newly created entity, check if any researched techs might apply
| 218| 218| 		// (only do this for new entities because even if an entity is converted or captured,
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 295| 295| 	}
| 296| 296| 
| 297| 297| 	if (template.replaces && template.replaces.length > 0)
| 298|    |-	{
|    | 298|+	
| 299| 299| 		for (var i of template.replaces)
| 300| 300| 		{
| 301| 301| 			if (!i || this.IsTechnologyResearched(i))
| 313| 313| 					cmpPlayerEntityLimits.UpdateLimitsFromTech(i);
| 314| 314| 			}
| 315| 315| 		}
| 316|    |-	}
|    | 316|+	
| 317| 317| 
| 318| 318| 	this.UpdateAutoResearch();
| 319| 319| 
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required after '{'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 331| 331| 		cmpPlayerEntityLimits.UpdateLimitsFromTech(tech);
| 332| 332| 
| 333| 333| 	// always send research finished message
| 334|    |-	Engine.PostMessage(this.entity, MT_ResearchFinished, {"player": playerID, "tech": tech});
|    | 334|+	Engine.PostMessage(this.entity, MT_ResearchFinished, { "player": playerID, "tech": tech});
| 335| 335| 
| 336| 336| 	for (var component in modifiedComponents)
| 337| 337| 	{
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 331| 331| 		cmpPlayerEntityLimits.UpdateLimitsFromTech(tech);
| 332| 332| 
| 333| 333| 	// always send research finished message
| 334|    |-	Engine.PostMessage(this.entity, MT_ResearchFinished, {"player": playerID, "tech": tech});
|    | 334|+	Engine.PostMessage(this.entity, MT_ResearchFinished, {"player": playerID, "tech": tech });
| 335| 335| 
| 336| 336| 	for (var component in modifiedComponents)
| 337| 337| 	{
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 335| 335| 
| 336| 336| 	for (var component in modifiedComponents)
| 337| 337| 	{
| 338|    |-		Engine.PostMessage(SYSTEM_ENTITY, MT_TemplateModification, { "player": playerID, "component": component, "valueNames": modifiedComponents[component]});
|    | 338|+		Engine.PostMessage(SYSTEM_ENTITY, MT_TemplateModification, { "player": playerID, "component": component, "valueNames": modifiedComponents[component] });
| 339| 339| 		Engine.BroadcastMessage(MT_ValueModification, { "entities": ents, "component": component, "valueNames": modifiedComponents[component]});
| 340| 340| 	}
| 341| 341| 
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 336| 336| 	for (var component in modifiedComponents)
| 337| 337| 	{
| 338| 338| 		Engine.PostMessage(SYSTEM_ENTITY, MT_TemplateModification, { "player": playerID, "component": component, "valueNames": modifiedComponents[component]});
| 339|    |-		Engine.BroadcastMessage(MT_ValueModification, { "entities": ents, "component": component, "valueNames": modifiedComponents[component]});
|    | 339|+		Engine.BroadcastMessage(MT_ValueModification, { "entities": ents, "component": component, "valueNames": modifiedComponents[component] });
| 340| 340| 	}
| 341| 341| 
| 342| 342| 	if (tech.startsWith("phase") && !template.autoResearch)
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 458| 458|  */
| 459| 459| TechnologyManager.prototype.GetResearcher = function(tech)
| 460| 460| {
| 461|    |-	return this.researchQueued.get(tech)
|    | 461|+	return this.researchQueued.get(tech);
| 462| 462| };
| 463| 463| 
| 464| 464| /**

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 101| »   for·(let·tech·of·techs)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 159| »   »   »   switch·(type)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 174| »   switch·(entity.check)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 229| ·»   »   »   »   »   if·(DoesModificationApply(modif,·classes))
|    | [NORMAL] ESLintBear (no-mixed-spaces-and-tabs):
|    | Mixed spaces and tabs.

binaries/data/mods/public/simulation/components/TechnologyManager.js
|  68| »   »   »   ||·(tech.top·&&·(this.IsTechnologyResearched(tech.top)·||·this.IsTechnologyResearched(tech.bottom))))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '||'; readers may interpret this as an expression boundary.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 106| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 238| »   »   »   for·(var·component·in·modifiedComponents)
|    | [NORMAL] JSHintBear:
|    | 'component' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 244| »   »   var·cmpTemplateManager·=·Engine.QueryInterface(SYSTEM_ENTITY,·IID_TemplateManager);
|    | [NORMAL] JSHintBear:
|    | 'cmpTemplateManager' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 245| »   »   var·template·=·cmpTemplateManager.GetCurrentTemplateName(msg.entity);
|    | [NORMAL] JSHintBear:
|    | 'template' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 250| »   »   »   var·cmpIdentity·=·Engine.QueryInterface(msg.entity,·IID_Identity);
|    | [NORMAL] JSHintBear:
|    | 'cmpIdentity' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 253| »   »   »   »   var·classes·=·cmpIdentity.GetClassesList();
|    | [NORMAL] JSHintBear:
|    | 'classes' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 461| »   return·this.researchQueued.get(tech)
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 393| 393| function getRepairTimeTooltip(entState)
| 394| 394| {
| 395| 395| 	return sprintf(translate("%(label)s %(details)s"), {
| 396|    |-			"label": headerFont(translate("Number of repairers:")),
|    | 396|+		"label": headerFont(translate("Number of repairers:")),
| 397| 397| 			"details": entState.repairable.numBuilders
| 398| 398| 		}) + "\n" + (entState.repairable.numBuilders ?
| 399| 399| 		sprintf(translatePlural(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 394| 394| {
| 395| 395| 	return sprintf(translate("%(label)s %(details)s"), {
| 396| 396| 			"label": headerFont(translate("Number of repairers:")),
| 397|    |-			"details": entState.repairable.numBuilders
|    | 397|+		"details": entState.repairable.numBuilders
| 398| 398| 		}) + "\n" + (entState.repairable.numBuilders ?
| 399| 399| 		sprintf(translatePlural(
| 400| 400| 			"Add another worker to speed up the repairs by %(second)s second.",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 1 tab but found 2.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 395| 395| 	return sprintf(translate("%(label)s %(details)s"), {
| 396| 396| 			"label": headerFont(translate("Number of repairers:")),
| 397| 397| 			"details": entState.repairable.numBuilders
| 398|    |-		}) + "\n" + (entState.repairable.numBuilders ?
|    | 398|+	}) + "\n" + (entState.repairable.numBuilders ?
| 399| 399| 		sprintf(translatePlural(
| 400| 400| 			"Add another worker to speed up the repairs by %(second)s second.",
| 401| 401| 			"Add another worker to speed up the repairs by %(second)s seconds.",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 415| 415| function getBuildTimeTooltip(entState)
| 416| 416| {
| 417| 417| 	return sprintf(translate("%(label)s %(details)s"), {
| 418|    |-			"label": headerFont(translate("Number of builders:")),
|    | 418|+		"label": headerFont(translate("Number of builders:")),
| 419| 419| 			"details": entState.foundation.numBuilders
| 420| 420| 		}) + "\n" + (entState.foundation.numBuilders ?
| 421| 421| 		sprintf(translatePlural(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 416| 416| {
| 417| 417| 	return sprintf(translate("%(label)s %(details)s"), {
| 418| 418| 			"label": headerFont(translate("Number of builders:")),
| 419|    |-			"details": entState.foundation.numBuilders
|    | 419|+		"details": entState.foundation.numBuilders
| 420| 420| 		}) + "\n" + (entState.foundation.numBuilders ?
| 421| 421| 		sprintf(translatePlural(
| 422| 422| 			"Add another worker to speed up the construction by %(second)s second.",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 1 tab but found 2.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 417| 417| 	return sprintf(translate("%(label)s %(details)s"), {
| 418| 418| 			"label": headerFont(translate("Number of builders:")),
| 419| 419| 			"details": entState.foundation.numBuilders
| 420|    |-		}) + "\n" + (entState.foundation.numBuilders ?
|    | 420|+	}) + "\n" + (entState.foundation.numBuilders ?
| 421| 421| 		sprintf(translatePlural(
| 422| 422| 			"Add another worker to speed up the construction by %(second)s second.",
| 423| 423| 			"Add another worker to speed up the construction by %(second)s seconds.",
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-of'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 626| 626| 		return "";
| 627| 627| 
| 628| 628| 	let names = "";
| 629|    |-	for (let requiredTechnology of requiredTechnologies) {
|    | 629|+	for (let requiredTechnology of requiredTechnologies) 
| 630| 630| 		if (names == "")
| 631| 631| 			names = getEntityNames(GetTechnologyData(requiredTechnology, civ));
| 632| 632| 		else
| 633| 633| 			names = names + ", "+ getEntityNames(GetTechnologyData(requiredTechnology, civ));
| 634|    |-	}
|    | 634|+	
| 635| 635| 	return sprintf(translate("Requires %(technologies)s"), {
| 636| 636| 		"technologies": names
| 637| 637| 	});

binaries/data/mods/public/gui/common/tooltips.js
| 629| »   for·(let·requiredTechnology·of·requiredTechnologies)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-of'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|  33|  33| 		{
|  34|  34| 			let args = string.split("/");
|  35|  35| 			for (let arg of args)
|  36|    |-			{
|    |  36|+			
|  37|  37| 				if (value[arg])
|  38|  38| 					value = value[arg];
|  39|  39| 				else
|  41|  41| 					value = undefined;
|  42|  42| 					break;
|  43|  43| 				}
|  44|    |-			}
|    |  44|+			
|  45|  45| 			this._tpCache.set(string, value);
|  46|  46| 		}
|  47|  47| 		return this._tpCache.get(string);
|    | [NORMAL] ESLintBear (no-trailing-spaces):
|    | Trailing spaces not allowed.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|  80|  80| 		return true;
|  81|  81| 	},
|  82|  82| 
|  83|    |-	"requiredTechs": function() { 
|    |  83|+	"requiredTechs": function() {
|  84|  84| 		let requiredTechnologies = this.get("Identity/RequiredTechnologies");
|  85|  85| 		if (requiredTechnologies && requiredTechnologies._string)
|  86|  86| 			return requiredTechnologies._string.split(/\s+/);
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
| 314| 314| 			return undefined;
| 315| 315| 
| 316| 316| 		if (this.get("Attack/" + type + "/Bonuses"))
| 317|    |-		{
|    | 317|+		
| 318| 318| 			for (let b in this.get("Attack/" + type + "/Bonuses"))
| 319| 319| 			{
| 320| 320| 				let bonusClasses = this.get("Attack/" + type + "/Bonuses/" + b + "/Classes");
| 324| 324| 					if (bcl == againstClass)
| 325| 325| 						return +this.get("Attack/" + type + "/Bonuses/" + b + "/Multiplier");
| 326| 326| 			}
| 327|    |-		}
|    | 327|+		
| 328| 328| 		return 1;
| 329| 329| 	},
| 330| 330| 

binaries/data/mods/public/simulation/ai/common-api/entity.js
| 101| »   »   for·(let·techRequired·of·techsRequired)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/simulation/ai/common-api/entity.js
| 804| »   »   if·(this.position()·!==·undefined)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/simulation/ai/common-api/entity.js
| 821| »   »   if·(this.position()·!==·undefined·&&·unitToFleeFrom.position()·!==·undefined)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '||' should be placed at the end of the line.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|  87|  87| 		// If the elements are still strings, split them by space or by '+'
|  88|  88| 		if (typeof sublist == "string")
|  89|  89| 			sublist = sublist.split(/[+\s]+/);
|  90|    |-		if (sublist.every(c => (c[0] == "!" && classes.indexOf(c.substr(1)) == -1)
|  91|    |-		                    || (c[0] != "!" && classes.indexOf(c) != -1)))
|    |  90|+		if (sublist.every(c => (c[0] == "!" && classes.indexOf(c.substr(1)) == -1) ||
|    |  91|+		                    (c[0] != "!" && classes.indexOf(c) != -1)))
|  92|  92| 			return true;
|  93|  93| 	}
|  94|  94| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 226| 226| 		{
| 227| 227| 			let aura = auraTemplates[auraID];
| 228| 228| 			ret.auras[auraID] = {
| 229|    |-					"name": aura.auraName,
|    | 229|+				"name": aura.auraName,
| 230| 230| 					"description": aura.auraDescription || null,
| 231| 231| 					"radius": aura.radius || null
| 232| 232| 				};
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 227| 227| 			let aura = auraTemplates[auraID];
| 228| 228| 			ret.auras[auraID] = {
| 229| 229| 					"name": aura.auraName,
| 230|    |-					"description": aura.auraDescription || null,
|    | 230|+				"description": aura.auraDescription || null,
| 231| 231| 					"radius": aura.radius || null
| 232| 232| 				};
| 233| 233| 		}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 228| 228| 			ret.auras[auraID] = {
| 229| 229| 					"name": aura.auraName,
| 230| 230| 					"description": aura.auraDescription || null,
| 231|    |-					"radius": aura.radius || null
|    | 231|+				"radius": aura.radius || null
| 232| 232| 				};
| 233| 233| 		}
| 234| 234| 	}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 4.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 229| 229| 					"name": aura.auraName,
| 230| 230| 					"description": aura.auraDescription || null,
| 231| 231| 					"radius": aura.radius || null
| 232|    |-				};
|    | 232|+			};
| 233| 233| 		}
| 234| 234| 	}
| 235| 235| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 389| 389| 		ret.icon = template.Identity.Icon;
| 390| 390| 		ret.tooltip = template.Identity.Tooltip;
| 391| 391| 		ret.requiredTechnologies = [];
| 392|    |-		if (template.Identity.RequiredTechnologies && template.Identity.RequiredTechnologies._string) {
|    | 392|+		if (template.Identity.RequiredTechnologies && template.Identity.RequiredTechnologies._string) 
| 393| 393| 			ret.requiredTechnologies = template.Identity.RequiredTechnologies._string.split(/\s+/);
| 394|    |-		}
|    | 394|+		
| 395| 395| 		ret.visibleIdentityClasses = GetVisibleIdentityClasses(template.Identity);
| 396| 396| 		ret.nativeCiv = template.Identity.Civ;
| 397| 397| 	}

binaries/data/mods/public/globalscripts/Templates.js
| 392| »   »   if·(template.Identity.RequiredTechnologies·&&·template.Identity.RequiredTechnologies._string)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/globalscripts/Templates.js
|  91| »   »   ····················||·(c[0]·!=·"!"·&&·classes.indexOf(c)·!=·-1)))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '||'; readers may interpret this as an expression boundary.
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
| 452| 452| 				continue;
| 453| 453| 
| 454| 454| 			if (state.pack.progress == 0)
| 455|    |-			{
|    | 455|+			
| 456| 456| 				if (state.pack.packed)
| 457| 457| 					checks.unpackButton = true;
| 458| 458| 				else
| 459| 459| 					checks.packButton = true;
| 460|    |-			}
|    | 460|+			
| 461| 461| 			else if (state.pack.packed)
| 462| 462| 				checks.unpackCancelButton = true;
| 463| 463| 			else
|    | [NORMAL] ESLintBear (space-before-function-paren):
|    | Unexpected space before function parentheses.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
| 763| 763| 				addResearchToQueue(data.item.researchFacilityId, t);
| 764| 764| 			})(tech);
| 765| 765| 
| 766|    |-			button.onPressRight = (t => function () {
|    | 766|+			button.onPressRight = (t => function() {
| 767| 767| 				showTemplateDetails(
| 768| 768| 					t,
| 769| 769| 					GetTemplateData(data.unitEntStates.find(state => state.id == data.item.researchFacilityId).template).nativeCiv);
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
| 941| 941| 			"player": data.player
| 942| 942| 		});
| 943| 943| 
| 944|    |-		let unitIds = data.unitEntStates.map(status => status.id)
|    | 944|+		let unitIds = data.unitEntStates.map(status => status.id);
| 945| 945| 		let [buildingsCountToTrainFullBatch, fullBatchSize, remainderBatch] =
| 946| 946| 			getTrainingStatus(unitIds, data.item, data.playerState);
| 947| 947| 

binaries/data/mods/public/gui/session/selection_panels.js
|  48| »   »   »   switch·(data.item)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/gui/session/selection_panels.js
|  59| »   »   switch·(data.item)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/gui/session/selection_panels.js
| 731| »   »   »   »   »   »   switch·(entity.check)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/gui/session/selection_panels.js
| 944| »   »   let·unitIds·=·data.unitEntStates.map(status·=>·status.id)
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|  97|  97| 	else if (pos.xx === undefined || pos.x == pos.xx && pos.z == pos.zz)
|  98|  98| 		builder.construct(this.type, pos.x, pos.z, pos.angle, this.metadata);
|  99|  99| 	else // try with the lowest, move towards us unless we're same
| 100|    |-	{
|    | 100|+	
| 101| 101| 		for (let step = 0; step <= 1; step += 0.2)
| 102| 102| 			builder.construct(this.type, step*pos.x + (1-step)*pos.xx, step*pos.z + (1-step)*pos.zz,
| 103| 103| 				pos.angle, this.metadata);
| 104|    |-	}
|    | 104|+	
| 105| 105| 	this.onStart(gameState);
| 106| 106| 	Engine.ProfileStop();
| 107| 107| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 131| 131| 	}
| 132| 132| 
| 133| 133| 	if (!this.position)
| 134|    |-	{
|    | 134|+	
| 135| 135| 		if (template.hasClass("CivCentre"))
| 136| 136| 		{
| 137| 137| 			let pos;
| 177| 177| 			else if (!pos)
| 178| 178| 				return false;
| 179| 179| 		}
| 180|    |-	}
|    | 180|+	
| 181| 181| 
| 182| 182| 	// Compute each tile's closeness to friendly structures:
| 183| 183| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 204| 204| 					placement.set(j, 45);
| 205| 205| 		}
| 206| 206| 		else
| 207|    |-		{
|    | 207|+		
| 208| 208| 			for (let j = 0; j < placement.map.length; ++j)
| 209| 209| 				if (HQ.basesMap.map[j] != 0)
| 210| 210| 					placement.set(j, 45);
| 211|    |-		}
|    | 211|+		
| 212| 212| 
| 213| 213| 		if (!HQ.requireHouses || !template.hasClass("House"))
| 214| 214| 		{
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 211| 211| 		}
| 212| 212| 
| 213| 213| 		if (!HQ.requireHouses || !template.hasClass("House"))
| 214|    |-		{
|    | 214|+		
| 215| 215| 			gameState.getOwnStructures().forEach(function(ent) {
| 216| 216| 				let pos = ent.position();
| 217| 217| 				let x = Math.round(pos[0] / cellSize);
| 245| 245| 				else if (template.genericName() == "Rotary Mill" && ent.hasClass("Field"))
| 246| 246| 					placement.addInfluence(x, z, 60/cellSize, 40);
| 247| 247| 			});
| 248|    |-		}
|    | 248|+		
| 249| 249| 		if (template.hasClass("Farmstead"))
| 250| 250| 		{
| 251| 251| 			for (let j = 0; j < placement.map.length; ++j)
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 219| 219| 
| 220| 220| 				let struct = m.getBuiltEntity(gameState, ent);
| 221| 221| 				if (struct.resourceDropsiteTypes() && struct.resourceDropsiteTypes().indexOf("food") != -1)
| 222|    |-				{
|    | 222|+				
| 223| 223| 					if (template.hasClass("Field") || template.hasClass("Corral"))
| 224| 224| 						placement.addInfluence(x, z, 80/cellSize, 50);
| 225| 225| 					else // If this is not a field add a negative influence because we want to leave this area for fields
| 226| 226| 						placement.addInfluence(x, z, 80/cellSize, -20);
| 227|    |-				}
|    | 227|+				
| 228| 228| 				else if (template.hasClass("House"))
| 229| 229| 				{
| 230| 230| 					if (ent.hasClass("House"))
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 247| 247| 			});
| 248| 248| 		}
| 249| 249| 		if (template.hasClass("Farmstead"))
| 250|    |-		{
|    | 250|+		
| 251| 251| 			for (let j = 0; j < placement.map.length; ++j)
| 252| 252| 			{
| 253| 253| 				let value = placement.map[j] - gameState.sharedScript.resourceMaps.wood.map[j]/3;
| 255| 255| 					value /= 2;	// we need space around farmstead, so disfavor map border
| 256| 256| 				placement.set(j, value);
| 257| 257| 			}
| 258|    |-		}
|    | 258|+		
| 259| 259| 	}
| 260| 260| 
| 261| 261| 	// Requires to be inside our territory, and inside our base territory if required
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 268| 268| 	{
| 269| 269| 		let base = this.metadata.base;
| 270| 270| 		for (let j = 0; j < placement.map.length; ++j)
| 271|    |-		{
|    | 271|+		
| 272| 272| 			if (HQ.basesMap.map[j] != base)
| 273| 273| 				placement.map[j] = 0;
| 274| 274| 			else if (placement.map[j] > 0)
| 283| 283| 				if (HQ.isNearInvadingArmy([x, z]))
| 284| 284| 					placement.map[j] = 0;
| 285| 285| 			}
| 286|    |-		}
|    | 286|+		
| 287| 287| 	}
| 288| 288| 	else
| 289| 289| 	{
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 286| 286| 		}
| 287| 287| 	}
| 288| 288| 	else
| 289|    |-	{
|    | 289|+	
| 290| 290| 		for (let j = 0; j < placement.map.length; ++j)
| 291| 291| 		{
| 292| 292| 			if (HQ.basesMap.map[j] == 0)
| 306| 306| 					placement.set(j, placement.map[j] + 100);
| 307| 307| 			}
| 308| 308| 		}
| 309|    |-	}
|    | 309|+	
| 310| 310| 
| 311| 311| 	// Find the best non-obstructed:
| 312| 312| 	// Find target building's approximate obstruction radius, and expand by a bit to make sure we're not too close,
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 288| 288| 	else
| 289| 289| 	{
| 290| 290| 		for (let j = 0; j < placement.map.length; ++j)
| 291|    |-		{
|    | 291|+		
| 292| 292| 			if (HQ.basesMap.map[j] == 0)
| 293| 293| 				placement.map[j] = 0;
| 294| 294| 			else if (placement.map[j] > 0)
| 305| 305| 				else if (favoredBase && HQ.basesMap.map[j] == favoredBase)
| 306| 306| 					placement.set(j, placement.map[j] + 100);
| 307| 307| 			}
| 308|    |-		}
|    | 308|+		
| 309| 309| 	}
| 310| 310| 
| 311| 311| 	// Find the best non-obstructed:
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 650| 650| 		{
| 651| 651| 			let count = 0;
| 652| 652| 			for (let j = 0; j < length-1; ++j)
| 653|    |-			{
|    | 653|+			
| 654| 654| 				if ((waterPoints[(i + j) % length]+1) % numPoints == waterPoints[(i + j + 1) % length])
| 655| 655| 					++count;
| 656| 656| 				else
| 657| 657| 					break;
| 658|    |-			}
|    | 658|+			
| 659| 659| 			consec[i] = count;
| 660| 660| 		}
| 661| 661| 		let start = 0;
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-in'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 661| 661| 		let start = 0;
| 662| 662| 		let count = 0;
| 663| 663| 		for (let c in consec)
| 664|    |-		{
|    | 664|+		
| 665| 665| 			if (consec[c] > count)
| 666| 666| 			{
| 667| 667| 				start = c;
| 668| 668| 				count = consec[c];
| 669| 669| 			}
| 670|    |-		}
|    | 670|+		
| 671| 671| 
| 672| 672| 		// If we've found a shoreline, stop searching
| 673| 673| 		if (count != numPoints-1)
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87, -0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50, -0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0, -1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50, -0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87, -0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 857| 857| 			let dxmax = size - dy;
| 858| 858| 			let ky = iy + dy;
| 859| 859| 			if (ky >= 0 && ky < w)
| 860|    |-			{
|    | 860|+			
| 861| 861| 				for (let dx = -dxmax; dx <= dxmax; ++dx)
| 862| 862| 				{
| 863| 863| 					let kx = ix + dx;
| 868| 868| 					total += weight * resourceMaps[k].map[kx + w * ky];
| 869| 869| 					nbcell += weight;
| 870| 870| 				}
| 871|    |-			}
|    | 871|+			
| 872| 872| 			if (dy == 0)
| 873| 873| 				continue;
| 874| 874| 			ky = iy - dy;
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 873| 873| 				continue;
| 874| 874| 			ky = iy - dy;
| 875| 875| 			if (ky >= 0 && ky < w)
| 876|    |-			{
|    | 876|+			
| 877| 877| 				for (let dx = -dxmax; dx <= dxmax; ++dx)
| 878| 878| 				{
| 879| 879| 					let kx = ix + dx;
| 884| 884| 					total += weight * resourceMaps[k].map[kx + w * ky];
| 885| 885| 					nbcell += weight;
| 886| 886| 				}
| 887|    |-			}
|    | 887|+			
| 888| 888| 		}
| 889| 889| 	}
| 890| 890| 	return nbcell ? total / nbcell : 0;
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|  66|  66| 		let phase = "";
|  67|  67| 		let cmpTechnologyManager = QueryPlayerIDInterface(i, IID_TechnologyManager);
|  68|  68| 		if (cmpTechnologyManager)
|  69|    |-		{
|    |  69|+		
|  70|  70| 			if (cmpTechnologyManager.IsTechnologyResearched("phase_city"))
|  71|  71| 				phase = "city";
|  72|  72| 			else if (cmpTechnologyManager.IsTechnologyResearched("phase_town"))
|  73|  73| 				phase = "town";
|  74|  74| 			else if (cmpTechnologyManager.IsTechnologyResearched("phase_village"))
|  75|  75| 				phase = "village";
|  76|    |-		}
|    |  76|+		
|  77|  77| 
|  78|  78| 		// store player ally/neutral/enemy data as arrays
|  79|  79| 		let allies = [];
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 410| 410| 			ret.attack[type].elevationBonus = range.elevationBonus;
| 411| 411| 
| 412| 412| 			if (cmpUnitAI && cmpPosition && cmpPosition.IsInWorld())
| 413|    |-			{
|    | 413|+			
| 414| 414| 				// For units, take the range in front of it, no spread. So angle = 0
| 415| 415| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 0);
| 416|    |-			}
|    | 416|+			
| 417| 417| 			else if(cmpPosition && cmpPosition.IsInWorld())
| 418| 418| 			{
| 419| 419| 				// For buildings, take the average elevation around it. So angle = 2*pi
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 415| 415| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 0);
| 416| 416| 			}
| 417| 417| 			else if(cmpPosition && cmpPosition.IsInWorld())
| 418|    |-			{
|    | 418|+			
| 419| 419| 				// For buildings, take the average elevation around it. So angle = 2*pi
| 420| 420| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 2*Math.PI);
| 421|    |-			}
|    | 421|+			
| 422| 422| 			else
| 423| 423| 			{
| 424| 424| 				// not in world, set a default?
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 420| 420| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 2*Math.PI);
| 421| 421| 			}
| 422| 422| 			else
| 423|    |-			{
|    | 423|+			
| 424| 424| 				// not in world, set a default?
| 425| 425| 				ret.attack[type].elevationAdaptedRange = ret.attack.maxRange;
| 426|    |-			}
|    | 426|+			
| 427| 427| 		}
| 428| 428| 	}
| 429| 429| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 804| 804| 		updateEntityColor(data.showAllStatusBars && (i == player || player == -1) ?
| 805| 805| 			[IID_Minimap, IID_RangeOverlayRenderer, IID_RallyPointRenderer, IID_StatusBars] :
| 806| 806| 			[IID_Minimap, IID_RangeOverlayRenderer, IID_RallyPointRenderer],
| 807|    |-			cmpRangeManager.GetEntitiesByPlayer(i));
|    | 807|+		cmpRangeManager.GetEntitiesByPlayer(i));
| 808| 808| 	}
| 809| 809| 	updateEntityColor([IID_Selectable, IID_StatusBars], data.selected);
| 810| 810| 	Engine.QueryInterface(SYSTEM_ENTITY, IID_TerritoryManager).UpdateColors();
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1323|1323| 		}
|1324|1324| 	}
|1325|1325| 	else
|1326|    |-	{
|    |1326|+	
|1327|1327| 		// Didn't snap to an existing entity, add the starting tower manually. To prevent odd-looking rotation jumps
|1328|1328| 		// when shift-clicking to build a wall, reuse the placement angle that was last seen on a validly positioned
|1329|1329| 		// wall piece.
|1344|1344| 			"pos": start.pos,
|1345|1345| 			"angle": previewEntities.length > 0 ? previewEntities[0].angle : this.placementWallLastAngle
|1346|1346| 		});
|1347|    |-	}
|    |1347|+	
|1348|1348| 
|1349|1349| 	if (end.pos)
|1350|1350| 	{
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1347|1347| 	}
|1348|1348| 
|1349|1349| 	if (end.pos)
|1350|    |-	{
|    |1350|+	
|1351|1351| 		// Analogous to the starting side case above
|1352|1352| 		if (end.snappedEnt && end.snappedEnt != INVALID_ENTITY)
|1353|1353| 		{
|1385|1385| 				"pos": end.pos,
|1386|1386| 				"angle": previewEntities.length > 0 ? previewEntities[previewEntities.length-1].angle : this.placementWallLastAngle
|1387|1387| 			});
|1388|    |-	}
|    |1388|+	
|1389|1389| 
|1390|1390| 	let cmpTerrain = Engine.QueryInterface(SYSTEM_ENTITY, IID_Terrain);
|1391|1391| 	if (!cmpTerrain)
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1563|1563| 
|1564|1564| 		let cmpVisual = Engine.QueryInterface(ent, IID_Visual);
|1565|1565| 		if (cmpVisual)
|1566|    |-		{
|    |1566|+		
|1567|1567| 			if (!allPiecesValid || !canAfford)
|1568|1568| 				cmpVisual.SetShadingColor(1.4, 0.4, 0.4, 1);
|1569|1569| 			else
|1570|1570| 				cmpVisual.SetShadingColor(1, 1, 1, 1);
|1571|    |-		}
|    |1571|+		
|1572|1572| 
|1573|1573| 		++entPool.numUsed;
|1574|1574| 	}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1637|1637| 			{
|1638|1638| 				minDist2 = dist2;
|1639|1639| 				minDistEntitySnapData = {
|1640|    |-						"x": pos.x,
|    |1640|+					"x": pos.x,
|1641|1641| 						"z": pos.z,
|1642|1642| 						"angle": cmpPosition.GetRotation().y,
|1643|1643| 						"ent": ent
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1638|1638| 				minDist2 = dist2;
|1639|1639| 				minDistEntitySnapData = {
|1640|1640| 						"x": pos.x,
|1641|    |-						"z": pos.z,
|    |1641|+					"z": pos.z,
|1642|1642| 						"angle": cmpPosition.GetRotation().y,
|1643|1643| 						"ent": ent
|1644|1644| 				};
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1639|1639| 				minDistEntitySnapData = {
|1640|1640| 						"x": pos.x,
|1641|1641| 						"z": pos.z,
|1642|    |-						"angle": cmpPosition.GetRotation().y,
|    |1642|+					"angle": cmpPosition.GetRotation().y,
|1643|1643| 						"ent": ent
|1644|1644| 				};
|1645|1645| 			}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1640|1640| 						"x": pos.x,
|1641|1641| 						"z": pos.z,
|1642|1642| 						"angle": cmpPosition.GetRotation().y,
|1643|    |-						"ent": ent
|    |1643|+					"ent": ent
|1644|1644| 				};
|1645|1645| 			}
|1646|1646| 		}
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1785|1785| 			result.gain = cmpEntityTrader.GetGoods().amount;
|1786|1786| 	}
|1787|1787| 	else if (data.target === secondMarket)
|1788|    |-	{
|    |1788|+	
|1789|1789| 		result = {
|1790|1790| 			"type": "is second",
|1791|1791| 			"gain": cmpEntityTrader.GetGoods().amount,
|1792|1792| 		};
|1793|    |-	}
|    |1793|+	
|1794|1794| 	else if (!firstMarket)
|1795|1795| 	{
|1796|1796| 		result = { "type": "set first" };
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1792|1792| 		};
|1793|1793| 	}
|1794|1794| 	else if (!firstMarket)
|1795|    |-	{
|    |1795|+	
|1796|1796| 		result = { "type": "set first" };
|1797|    |-	}
|    |1797|+	
|1798|1798| 	else if (!secondMarket)
|1799|1799| 	{
|1800|1800| 		result = {
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1796|1796| 		result = { "type": "set first" };
|1797|1797| 	}
|1798|1798| 	else if (!secondMarket)
|1799|    |-	{
|    |1799|+	
|1800|1800| 		result = {
|1801|1801| 			"type": "set second",
|1802|1802| 			"gain": cmpEntityTrader.CalculateGain(firstMarket, data.target),
|1803|1803| 		};
|1804|    |-	}
|    |1804|+	
|1805|1805| 	else
|1806|1806| 	{
|1807|1807| 		// Else both markets are not null and target is different from them
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1803|1803| 		};
|1804|1804| 	}
|1805|1805| 	else
|1806|    |-	{
|    |1806|+	
|1807|1807| 		// Else both markets are not null and target is different from them
|1808|1808| 		result = { "type": "set first" };
|1809|    |-	}
|    |1809|+	
|1810|1810| 	return result;
|1811|1811| };
|1812|1812| 
Executing section cli...

Link to build: https://jenkins.wildfiregames.com/job/differential/911/

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

Linter detected issues:
Executing section Source...
Executing section JS...
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-in'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  10|  10| 
|  11|  11| 	var ret = {};
|  12|  12| 	for (var i in this)
|  13|    |-	{
|    |  13|+	
|  14|  14| 		if (this.hasOwnProperty(i))
|  15|  15| 			ret[i] = this[i];
|  16|    |-	}
|    |  16|+	
|  17|  17| 	ret.modificationCache = {};
|  18|  18| 	return ret;
|  19|  19| };
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '||' should be placed at the end of the line.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  64|  64| 	for (let key of this.unresearchedAutoResearchTechs)
|  65|  65| 	{
|  66|  66| 		let tech = TechnologyTemplates.Get(key);
|  67|    |-		if ((tech.autoResearch && this.CanResearch(key))
|  68|    |-			|| (tech.top && (this.IsTechnologyResearched(tech.top) || this.IsTechnologyResearched(tech.bottom))))
|    |  67|+		if ((tech.autoResearch && this.CanResearch(key)) ||
|    |  68|+			(tech.top && (this.IsTechnologyResearched(tech.top) || this.IsTechnologyResearched(tech.bottom))))
|  69|  69| 		{
|  70|  70| 			this.unresearchedAutoResearchTechs.delete(key);
|  71|  71| 			this.ResearchTechnology(key);
|    | [NORMAL] ESLintBear (space-before-function-paren):
|    | Unexpected space before function parentheses.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  75|  75| };
|  76|  76| 
|  77|  77| // Checks an entity template to see if its technology requirements have been met
|  78|    |-TechnologyManager.prototype.CanProduce = function (templateName)
|    |  78|+TechnologyManager.prototype.CanProduce = function(templateName)
|  79|  79| {
|  80|  80| 	let cmpTempManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
|  81|  81| 	let template = cmpTempManager.GetTemplate(templateName);
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-of'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  98|  98| 
|  99|  99| TechnologyManager.prototype.AreTechnologiesResearched = function(techs)
| 100| 100| {
| 101|    |-	for (let tech of techs) {
|    | 101|+	for (let tech of techs) 
| 102| 102| 		if (!this.researchedTechs.has(tech))
| 103| 103| 			return false;
| 104|    |-	}
|    | 104|+	
| 105| 105| 	return true;
| 106| 106| }
| 107| 107| 
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 103| 103| 			return false;
| 104| 104| 	}
| 105| 105| 	return true;
| 106|    |-}
|    | 106|+};
| 107| 107| 
| 108| 108| TechnologyManager.prototype.IsTechnologyStarted = function(tech)
| 109| 109| {
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 202| 202| 		var classes = cmpIdentity.GetClassesList();
| 203| 203| 		// don't use foundations for the class counts but check if techs apply (e.g. health increase)
| 204| 204| 		if (!Engine.QueryInterface(msg.entity, IID_Foundation))
| 205|    |-		{
|    | 205|+		
| 206| 206| 			for (let cls of classes)
| 207| 207| 			{
| 208| 208| 				this.classCounts[cls] = this.classCounts[cls] || 0;
| 212| 212| 				this.typeCountsByClass[cls][template] = this.typeCountsByClass[cls][template] || 0;
| 213| 213| 				this.typeCountsByClass[cls][template] += 1;
| 214| 214| 			}
| 215|    |-		}
|    | 215|+		
| 216| 216| 
| 217| 217| 		// Newly created entity, check if any researched techs might apply
| 218| 218| 		// (only do this for new entities because even if an entity is converted or captured,
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 295| 295| 	}
| 296| 296| 
| 297| 297| 	if (template.replaces && template.replaces.length > 0)
| 298|    |-	{
|    | 298|+	
| 299| 299| 		for (var i of template.replaces)
| 300| 300| 		{
| 301| 301| 			if (!i || this.IsTechnologyResearched(i))
| 313| 313| 					cmpPlayerEntityLimits.UpdateLimitsFromTech(i);
| 314| 314| 			}
| 315| 315| 		}
| 316|    |-	}
|    | 316|+	
| 317| 317| 
| 318| 318| 	this.UpdateAutoResearch();
| 319| 319| 
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required after '{'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 331| 331| 		cmpPlayerEntityLimits.UpdateLimitsFromTech(tech);
| 332| 332| 
| 333| 333| 	// always send research finished message
| 334|    |-	Engine.PostMessage(this.entity, MT_ResearchFinished, {"player": playerID, "tech": tech});
|    | 334|+	Engine.PostMessage(this.entity, MT_ResearchFinished, { "player": playerID, "tech": tech});
| 335| 335| 
| 336| 336| 	for (var component in modifiedComponents)
| 337| 337| 	{
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 331| 331| 		cmpPlayerEntityLimits.UpdateLimitsFromTech(tech);
| 332| 332| 
| 333| 333| 	// always send research finished message
| 334|    |-	Engine.PostMessage(this.entity, MT_ResearchFinished, {"player": playerID, "tech": tech});
|    | 334|+	Engine.PostMessage(this.entity, MT_ResearchFinished, {"player": playerID, "tech": tech });
| 335| 335| 
| 336| 336| 	for (var component in modifiedComponents)
| 337| 337| 	{
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 335| 335| 
| 336| 336| 	for (var component in modifiedComponents)
| 337| 337| 	{
| 338|    |-		Engine.PostMessage(SYSTEM_ENTITY, MT_TemplateModification, { "player": playerID, "component": component, "valueNames": modifiedComponents[component]});
|    | 338|+		Engine.PostMessage(SYSTEM_ENTITY, MT_TemplateModification, { "player": playerID, "component": component, "valueNames": modifiedComponents[component] });
| 339| 339| 		Engine.BroadcastMessage(MT_ValueModification, { "entities": ents, "component": component, "valueNames": modifiedComponents[component]});
| 340| 340| 	}
| 341| 341| 
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 336| 336| 	for (var component in modifiedComponents)
| 337| 337| 	{
| 338| 338| 		Engine.PostMessage(SYSTEM_ENTITY, MT_TemplateModification, { "player": playerID, "component": component, "valueNames": modifiedComponents[component]});
| 339|    |-		Engine.BroadcastMessage(MT_ValueModification, { "entities": ents, "component": component, "valueNames": modifiedComponents[component]});
|    | 339|+		Engine.BroadcastMessage(MT_ValueModification, { "entities": ents, "component": component, "valueNames": modifiedComponents[component] });
| 340| 340| 	}
| 341| 341| 
| 342| 342| 	if (tech.startsWith("phase") && !template.autoResearch)
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 458| 458|  */
| 459| 459| TechnologyManager.prototype.GetResearcher = function(tech)
| 460| 460| {
| 461|    |-	return this.researchQueued.get(tech)
|    | 461|+	return this.researchQueued.get(tech);
| 462| 462| };
| 463| 463| 
| 464| 464| /**

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 101| »   for·(let·tech·of·techs)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 159| »   »   »   switch·(type)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 174| »   switch·(entity.check)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 229| ·»   »   »   »   »   if·(DoesModificationApply(modif,·classes))
|    | [NORMAL] ESLintBear (no-mixed-spaces-and-tabs):
|    | Mixed spaces and tabs.

binaries/data/mods/public/simulation/components/TechnologyManager.js
|  68| »   »   »   ||·(tech.top·&&·(this.IsTechnologyResearched(tech.top)·||·this.IsTechnologyResearched(tech.bottom))))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '||'; readers may interpret this as an expression boundary.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 106| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 238| »   »   »   for·(var·component·in·modifiedComponents)
|    | [NORMAL] JSHintBear:
|    | 'component' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 244| »   »   var·cmpTemplateManager·=·Engine.QueryInterface(SYSTEM_ENTITY,·IID_TemplateManager);
|    | [NORMAL] JSHintBear:
|    | 'cmpTemplateManager' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 245| »   »   var·template·=·cmpTemplateManager.GetCurrentTemplateName(msg.entity);
|    | [NORMAL] JSHintBear:
|    | 'template' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 250| »   »   »   var·cmpIdentity·=·Engine.QueryInterface(msg.entity,·IID_Identity);
|    | [NORMAL] JSHintBear:
|    | 'cmpIdentity' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 253| »   »   »   »   var·classes·=·cmpIdentity.GetClassesList();
|    | [NORMAL] JSHintBear:
|    | 'classes' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 461| »   return·this.researchQueued.get(tech)
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 393| 393| function getRepairTimeTooltip(entState)
| 394| 394| {
| 395| 395| 	return sprintf(translate("%(label)s %(details)s"), {
| 396|    |-			"label": headerFont(translate("Number of repairers:")),
|    | 396|+		"label": headerFont(translate("Number of repairers:")),
| 397| 397| 			"details": entState.repairable.numBuilders
| 398| 398| 		}) + "\n" + (entState.repairable.numBuilders ?
| 399| 399| 		sprintf(translatePlural(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 394| 394| {
| 395| 395| 	return sprintf(translate("%(label)s %(details)s"), {
| 396| 396| 			"label": headerFont(translate("Number of repairers:")),
| 397|    |-			"details": entState.repairable.numBuilders
|    | 397|+		"details": entState.repairable.numBuilders
| 398| 398| 		}) + "\n" + (entState.repairable.numBuilders ?
| 399| 399| 		sprintf(translatePlural(
| 400| 400| 			"Add another worker to speed up the repairs by %(second)s second.",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 1 tab but found 2.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 395| 395| 	return sprintf(translate("%(label)s %(details)s"), {
| 396| 396| 			"label": headerFont(translate("Number of repairers:")),
| 397| 397| 			"details": entState.repairable.numBuilders
| 398|    |-		}) + "\n" + (entState.repairable.numBuilders ?
|    | 398|+	}) + "\n" + (entState.repairable.numBuilders ?
| 399| 399| 		sprintf(translatePlural(
| 400| 400| 			"Add another worker to speed up the repairs by %(second)s second.",
| 401| 401| 			"Add another worker to speed up the repairs by %(second)s seconds.",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 415| 415| function getBuildTimeTooltip(entState)
| 416| 416| {
| 417| 417| 	return sprintf(translate("%(label)s %(details)s"), {
| 418|    |-			"label": headerFont(translate("Number of builders:")),
|    | 418|+		"label": headerFont(translate("Number of builders:")),
| 419| 419| 			"details": entState.foundation.numBuilders
| 420| 420| 		}) + "\n" + (entState.foundation.numBuilders ?
| 421| 421| 		sprintf(translatePlural(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 416| 416| {
| 417| 417| 	return sprintf(translate("%(label)s %(details)s"), {
| 418| 418| 			"label": headerFont(translate("Number of builders:")),
| 419|    |-			"details": entState.foundation.numBuilders
|    | 419|+		"details": entState.foundation.numBuilders
| 420| 420| 		}) + "\n" + (entState.foundation.numBuilders ?
| 421| 421| 		sprintf(translatePlural(
| 422| 422| 			"Add another worker to speed up the construction by %(second)s second.",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 1 tab but found 2.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 417| 417| 	return sprintf(translate("%(label)s %(details)s"), {
| 418| 418| 			"label": headerFont(translate("Number of builders:")),
| 419| 419| 			"details": entState.foundation.numBuilders
| 420|    |-		}) + "\n" + (entState.foundation.numBuilders ?
|    | 420|+	}) + "\n" + (entState.foundation.numBuilders ?
| 421| 421| 		sprintf(translatePlural(
| 422| 422| 			"Add another worker to speed up the construction by %(second)s second.",
| 423| 423| 			"Add another worker to speed up the construction by %(second)s seconds.",
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-of'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 214| 214| 
| 215| 215| m.GameState.prototype.areResearched = function(techs)
| 216| 216| {
| 217|    |-	for (let tech of techs) {
|    | 217|+	for (let tech of techs) 
| 218| 218| 		if (!this.playerData.researchedTechs.has(tech))
| 219| 219| 			return false;
| 220|    |-	}
|    | 220|+	
| 221| 221| 	return true;
| 222| 222| }
| 223| 223| 
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 219| 219| 			return false;
| 220| 220| 	}
| 221| 221| 	return true;
| 222|    |-}
|    | 222|+};
| 223| 223| 
| 224| 224| /** true if started or queued */
| 225| 225| m.GameState.prototype.isResearching = function(template)
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 619| 619| 	else if (template.resourceSupplyType() !== undefined)	// animal resources
| 620| 620| 		count += this.countEntitiesByType("resource|" + type, true);
| 621| 621| 	else
| 622|    |-	{
|    | 622|+	
| 623| 623| 		// Count entities in building production queues
| 624| 624| 		// TODO: maybe this fails for corrals.
| 625| 625| 		this.getOwnTrainingFacilities().forEach(function(ent) {
| 627| 627| 				if (item.unitTemplate == type)
| 628| 628| 					count += item.count;
| 629| 629| 		});
| 630|    |-	}
|    | 630|+	
| 631| 631| 
| 632| 632| 	return count;
| 633| 633| };
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 779| 779| 				ret.push([techs[1]._templateName, techs[1]]);
| 780| 780| 		}
| 781| 781| 		else if (this.canResearch(tech))
| 782|    |-		{
|    | 782|+		
| 783| 783| 			// Phases are treated separately
| 784| 784| 			if (this.phases.every(phase => template._templateName != phase.name))
| 785| 785| 				ret.push([tech, template]);
| 786|    |-		}
|    | 786|+		
| 787| 787| 	}
| 788| 788| 	return ret;
| 789| 789| };

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 217| »   for·(let·tech·of·techs)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 278| »   »   switch·(entity.check)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 295| »   »   »   switch·(type)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 222| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-of'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|  33|  33| 		{
|  34|  34| 			let args = string.split("/");
|  35|  35| 			for (let arg of args)
|  36|    |-			{
|    |  36|+			
|  37|  37| 				if (value[arg])
|  38|  38| 					value = value[arg];
|  39|  39| 				else
|  41|  41| 					value = undefined;
|  42|  42| 					break;
|  43|  43| 				}
|  44|    |-			}
|    |  44|+			
|  45|  45| 			this._tpCache.set(string, value);
|  46|  46| 		}
|  47|  47| 		return this._tpCache.get(string);
|    | [NORMAL] ESLintBear (no-trailing-spaces):
|    | Trailing spaces not allowed.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|  80|  80| 		return true;
|  81|  81| 	},
|  82|  82| 
|  83|    |-	"requiredTechs": function() { 
|    |  83|+	"requiredTechs": function() {
|  84|  84| 		let requiredTechnologies = this.get("Identity/RequiredTechnologies");
|  85|  85| 		if (requiredTechnologies && requiredTechnologies._string)
|  86|  86| 			return requiredTechnologies._string.split(/\s+/);
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
| 314| 314| 			return undefined;
| 315| 315| 
| 316| 316| 		if (this.get("Attack/" + type + "/Bonuses"))
| 317|    |-		{
|    | 317|+		
| 318| 318| 			for (let b in this.get("Attack/" + type + "/Bonuses"))
| 319| 319| 			{
| 320| 320| 				let bonusClasses = this.get("Attack/" + type + "/Bonuses/" + b + "/Classes");
| 324| 324| 					if (bcl == againstClass)
| 325| 325| 						return +this.get("Attack/" + type + "/Bonuses/" + b + "/Multiplier");
| 326| 326| 			}
| 327|    |-		}
|    | 327|+		
| 328| 328| 		return 1;
| 329| 329| 	},
| 330| 330| 

binaries/data/mods/public/simulation/ai/common-api/entity.js
| 101| »   »   for·(let·techRequired·of·techsRequired)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/simulation/ai/common-api/entity.js
| 804| »   »   if·(this.position()·!==·undefined)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/simulation/ai/common-api/entity.js
| 821| »   »   if·(this.position()·!==·undefined·&&·unitToFleeFrom.position()·!==·undefined)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '||' should be placed at the end of the line.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|  87|  87| 		// If the elements are still strings, split them by space or by '+'
|  88|  88| 		if (typeof sublist == "string")
|  89|  89| 			sublist = sublist.split(/[+\s]+/);
|  90|    |-		if (sublist.every(c => (c[0] == "!" && classes.indexOf(c.substr(1)) == -1)
|  91|    |-		                    || (c[0] != "!" && classes.indexOf(c) != -1)))
|    |  90|+		if (sublist.every(c => (c[0] == "!" && classes.indexOf(c.substr(1)) == -1) ||
|    |  91|+		                    (c[0] != "!" && classes.indexOf(c) != -1)))
|  92|  92| 			return true;
|  93|  93| 	}
|  94|  94| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 226| 226| 		{
| 227| 227| 			let aura = auraTemplates[auraID];
| 228| 228| 			ret.auras[auraID] = {
| 229|    |-					"name": aura.auraName,
|    | 229|+				"name": aura.auraName,
| 230| 230| 					"description": aura.auraDescription || null,
| 231| 231| 					"radius": aura.radius || null
| 232| 232| 				};
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 227| 227| 			let aura = auraTemplates[auraID];
| 228| 228| 			ret.auras[auraID] = {
| 229| 229| 					"name": aura.auraName,
| 230|    |-					"description": aura.auraDescription || null,
|    | 230|+				"description": aura.auraDescription || null,
| 231| 231| 					"radius": aura.radius || null
| 232| 232| 				};
| 233| 233| 		}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 228| 228| 			ret.auras[auraID] = {
| 229| 229| 					"name": aura.auraName,
| 230| 230| 					"description": aura.auraDescription || null,
| 231|    |-					"radius": aura.radius || null
|    | 231|+				"radius": aura.radius || null
| 232| 232| 				};
| 233| 233| 		}
| 234| 234| 	}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 4.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 229| 229| 					"name": aura.auraName,
| 230| 230| 					"description": aura.auraDescription || null,
| 231| 231| 					"radius": aura.radius || null
| 232|    |-				};
|    | 232|+			};
| 233| 233| 		}
| 234| 234| 	}
| 235| 235| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 389| 389| 		ret.icon = template.Identity.Icon;
| 390| 390| 		ret.tooltip = template.Identity.Tooltip;
| 391| 391| 		ret.requiredTechnologies = [];
| 392|    |-		if (template.Identity.RequiredTechnologies && template.Identity.RequiredTechnologies._string) {
|    | 392|+		if (template.Identity.RequiredTechnologies && template.Identity.RequiredTechnologies._string) 
| 393| 393| 			ret.requiredTechnologies = template.Identity.RequiredTechnologies._string.split(/\s+/);
| 394|    |-		}
|    | 394|+		
| 395| 395| 		ret.visibleIdentityClasses = GetVisibleIdentityClasses(template.Identity);
| 396| 396| 		ret.nativeCiv = template.Identity.Civ;
| 397| 397| 	}

binaries/data/mods/public/globalscripts/Templates.js
| 392| »   »   if·(template.Identity.RequiredTechnologies·&&·template.Identity.RequiredTechnologies._string)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/globalscripts/Templates.js
|  91| »   »   ····················||·(c[0]·!=·"!"·&&·classes.indexOf(c)·!=·-1)))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '||'; readers may interpret this as an expression boundary.
|    | [NORMAL] ESLintBear (space-before-function-paren):
|    | Unexpected space before function parentheses.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/Identity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/Identity.js
| 100| 100| 	this.visibleClassesList = GetVisibleIdentityClasses(this.template);
| 101| 101| };
| 102| 102| 
| 103|    |-Identity.prototype.Deserialize = function ()
|    | 103|+Identity.prototype.Deserialize = function()
| 104| 104| {
| 105| 105| 	this.Init();
| 106| 106| };
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
| 452| 452| 				continue;
| 453| 453| 
| 454| 454| 			if (state.pack.progress == 0)
| 455|    |-			{
|    | 455|+			
| 456| 456| 				if (state.pack.packed)
| 457| 457| 					checks.unpackButton = true;
| 458| 458| 				else
| 459| 459| 					checks.packButton = true;
| 460|    |-			}
|    | 460|+			
| 461| 461| 			else if (state.pack.packed)
| 462| 462| 				checks.unpackCancelButton = true;
| 463| 463| 			else
|    | [NORMAL] ESLintBear (space-before-function-paren):
|    | Unexpected space before function parentheses.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
| 763| 763| 				addResearchToQueue(data.item.researchFacilityId, t);
| 764| 764| 			})(tech);
| 765| 765| 
| 766|    |-			button.onPressRight = (t => function () {
|    | 766|+			button.onPressRight = (t => function() {
| 767| 767| 				showTemplateDetails(
| 768| 768| 					t,
| 769| 769| 					GetTemplateData(data.unitEntStates.find(state => state.id == data.item.researchFacilityId).template).nativeCiv);
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
| 941| 941| 			"player": data.player
| 942| 942| 		});
| 943| 943| 
| 944|    |-		let unitIds = data.unitEntStates.map(status => status.id)
|    | 944|+		let unitIds = data.unitEntStates.map(status => status.id);
| 945| 945| 		let [buildingsCountToTrainFullBatch, fullBatchSize, remainderBatch] =
| 946| 946| 			getTrainingStatus(unitIds, data.item, data.playerState);
| 947| 947| 

binaries/data/mods/public/gui/session/selection_panels.js
|  48| »   »   »   switch·(data.item)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/gui/session/selection_panels.js
|  59| »   »   switch·(data.item)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/gui/session/selection_panels.js
| 731| »   »   »   »   »   »   switch·(entity.check)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/gui/session/selection_panels.js
| 944| »   »   let·unitIds·=·data.unitEntStates.map(status·=>·status.id)
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|  66|  66| 		let phase = "";
|  67|  67| 		let cmpTechnologyManager = QueryPlayerIDInterface(i, IID_TechnologyManager);
|  68|  68| 		if (cmpTechnologyManager)
|  69|    |-		{
|    |  69|+		
|  70|  70| 			if (cmpTechnologyManager.IsTechnologyResearched("phase_city"))
|  71|  71| 				phase = "city";
|  72|  72| 			else if (cmpTechnologyManager.IsTechnologyResearched("phase_town"))
|  73|  73| 				phase = "town";
|  74|  74| 			else if (cmpTechnologyManager.IsTechnologyResearched("phase_village"))
|  75|  75| 				phase = "village";
|  76|    |-		}
|    |  76|+		
|  77|  77| 
|  78|  78| 		// store player ally/neutral/enemy data as arrays
|  79|  79| 		let allies = [];
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 410| 410| 			ret.attack[type].elevationBonus = range.elevationBonus;
| 411| 411| 
| 412| 412| 			if (cmpUnitAI && cmpPosition && cmpPosition.IsInWorld())
| 413|    |-			{
|    | 413|+			
| 414| 414| 				// For units, take the range in front of it, no spread. So angle = 0
| 415| 415| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 0);
| 416|    |-			}
|    | 416|+			
| 417| 417| 			else if(cmpPosition && cmpPosition.IsInWorld())
| 418| 418| 			{
| 419| 419| 				// For buildings, take the average elevation around it. So angle = 2*pi
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 415| 415| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 0);
| 416| 416| 			}
| 417| 417| 			else if(cmpPosition && cmpPosition.IsInWorld())
| 418|    |-			{
|    | 418|+			
| 419| 419| 				// For buildings, take the average elevation around it. So angle = 2*pi
| 420| 420| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 2*Math.PI);
| 421|    |-			}
|    | 421|+			
| 422| 422| 			else
| 423| 423| 			{
| 424| 424| 				// not in world, set a default?
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 420| 420| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 2*Math.PI);
| 421| 421| 			}
| 422| 422| 			else
| 423|    |-			{
|    | 423|+			
| 424| 424| 				// not in world, set a default?
| 425| 425| 				ret.attack[type].elevationAdaptedRange = ret.attack.maxRange;
| 426|    |-			}
|    | 426|+			
| 427| 427| 		}
| 428| 428| 	}
| 429| 429| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 804| 804| 		updateEntityColor(data.showAllStatusBars && (i == player || player == -1) ?
| 805| 805| 			[IID_Minimap, IID_RangeOverlayRenderer, IID_RallyPointRenderer, IID_StatusBars] :
| 806| 806| 			[IID_Minimap, IID_RangeOverlayRenderer, IID_RallyPointRenderer],
| 807|    |-			cmpRangeManager.GetEntitiesByPlayer(i));
|    | 807|+		cmpRangeManager.GetEntitiesByPlayer(i));
| 808| 808| 	}
| 809| 809| 	updateEntityColor([IID_Selectable, IID_StatusBars], data.selected);
| 810| 810| 	Engine.QueryInterface(SYSTEM_ENTITY, IID_TerritoryManager).UpdateColors();
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1323|1323| 		}
|1324|1324| 	}
|1325|1325| 	else
|1326|    |-	{
|    |1326|+	
|1327|1327| 		// Didn't snap to an existing entity, add the starting tower manually. To prevent odd-looking rotation jumps
|1328|1328| 		// when shift-clicking to build a wall, reuse the placement angle that was last seen on a validly positioned
|1329|1329| 		// wall piece.
|1344|1344| 			"pos": start.pos,
|1345|1345| 			"angle": previewEntities.length > 0 ? previewEntities[0].angle : this.placementWallLastAngle
|1346|1346| 		});
|1347|    |-	}
|    |1347|+	
|1348|1348| 
|1349|1349| 	if (end.pos)
|1350|1350| 	{
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1347|1347| 	}
|1348|1348| 
|1349|1349| 	if (end.pos)
|1350|    |-	{
|    |1350|+	
|1351|1351| 		// Analogous to the starting side case above
|1352|1352| 		if (end.snappedEnt && end.snappedEnt != INVALID_ENTITY)
|1353|1353| 		{
|1385|1385| 				"pos": end.pos,
|1386|1386| 				"angle": previewEntities.length > 0 ? previewEntities[previewEntities.length-1].angle : this.placementWallLastAngle
|1387|1387| 			});
|1388|    |-	}
|    |1388|+	
|1389|1389| 
|1390|1390| 	let cmpTerrain = Engine.QueryInterface(SYSTEM_ENTITY, IID_Terrain);
|1391|1391| 	if (!cmpTerrain)
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1563|1563| 
|1564|1564| 		let cmpVisual = Engine.QueryInterface(ent, IID_Visual);
|1565|1565| 		if (cmpVisual)
|1566|    |-		{
|    |1566|+		
|1567|1567| 			if (!allPiecesValid || !canAfford)
|1568|1568| 				cmpVisual.SetShadingColor(1.4, 0.4, 0.4, 1);
|1569|1569| 			else
|1570|1570| 				cmpVisual.SetShadingColor(1, 1, 1, 1);
|1571|    |-		}
|    |1571|+		
|1572|1572| 
|1573|1573| 		++entPool.numUsed;
|1574|1574| 	}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1637|1637| 			{
|1638|1638| 				minDist2 = dist2;
|1639|1639| 				minDistEntitySnapData = {
|1640|    |-						"x": pos.x,
|    |1640|+					"x": pos.x,
|1641|1641| 						"z": pos.z,
|1642|1642| 						"angle": cmpPosition.GetRotation().y,
|1643|1643| 						"ent": ent
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1638|1638| 				minDist2 = dist2;
|1639|1639| 				minDistEntitySnapData = {
|1640|1640| 						"x": pos.x,
|1641|    |-						"z": pos.z,
|    |1641|+					"z": pos.z,
|1642|1642| 						"angle": cmpPosition.GetRotation().y,
|1643|1643| 						"ent": ent
|1644|1644| 				};
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1639|1639| 				minDistEntitySnapData = {
|1640|1640| 						"x": pos.x,
|1641|1641| 						"z": pos.z,
|1642|    |-						"angle": cmpPosition.GetRotation().y,
|    |1642|+					"angle": cmpPosition.GetRotation().y,
|1643|1643| 						"ent": ent
|1644|1644| 				};
|1645|1645| 			}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1640|1640| 						"x": pos.x,
|1641|1641| 						"z": pos.z,
|1642|1642| 						"angle": cmpPosition.GetRotation().y,
|1643|    |-						"ent": ent
|    |1643|+					"ent": ent
|1644|1644| 				};
|1645|1645| 			}
|1646|1646| 		}
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1785|1785| 			result.gain = cmpEntityTrader.GetGoods().amount;
|1786|1786| 	}
|1787|1787| 	else if (data.target === secondMarket)
|1788|    |-	{
|    |1788|+	
|1789|1789| 		result = {
|1790|1790| 			"type": "is second",
|1791|1791| 			"gain": cmpEntityTrader.GetGoods().amount,
|1792|1792| 		};
|1793|    |-	}
|    |1793|+	
|1794|1794| 	else if (!firstMarket)
|1795|1795| 	{
|1796|1796| 		result = { "type": "set first" };
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1792|1792| 		};
|1793|1793| 	}
|1794|1794| 	else if (!firstMarket)
|1795|    |-	{
|    |1795|+	
|1796|1796| 		result = { "type": "set first" };
|1797|    |-	}
|    |1797|+	
|1798|1798| 	else if (!secondMarket)
|1799|1799| 	{
|1800|1800| 		result = {
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1796|1796| 		result = { "type": "set first" };
|1797|1797| 	}
|1798|1798| 	else if (!secondMarket)
|1799|    |-	{
|    |1799|+	
|1800|1800| 		result = {
|1801|1801| 			"type": "set second",
|1802|1802| 			"gain": cmpEntityTrader.CalculateGain(firstMarket, data.target),
|1803|1803| 		};
|1804|    |-	}
|    |1804|+	
|1805|1805| 	else
|1806|1806| 	{
|1807|1807| 		// Else both markets are not null and target is different from them
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1803|1803| 		};
|1804|1804| 	}
|1805|1805| 	else
|1806|    |-	{
|    |1806|+	
|1807|1807| 		// Else both markets are not null and target is different from them
|1808|1808| 		result = { "type": "set first" };
|1809|    |-	}
|    |1809|+	
|1810|1810| 	return result;
|1811|1811| };
|1812|1812| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|  97|  97| 	else if (pos.xx === undefined || pos.x == pos.xx && pos.z == pos.zz)
|  98|  98| 		builder.construct(this.type, pos.x, pos.z, pos.angle, this.metadata);
|  99|  99| 	else // try with the lowest, move towards us unless we're same
| 100|    |-	{
|    | 100|+	
| 101| 101| 		for (let step = 0; step <= 1; step += 0.2)
| 102| 102| 			builder.construct(this.type, step*pos.x + (1-step)*pos.xx, step*pos.z + (1-step)*pos.zz,
| 103| 103| 				pos.angle, this.metadata);
| 104|    |-	}
|    | 104|+	
| 105| 105| 	this.onStart(gameState);
| 106| 106| 	Engine.ProfileStop();
| 107| 107| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 131| 131| 	}
| 132| 132| 
| 133| 133| 	if (!this.position)
| 134|    |-	{
|    | 134|+	
| 135| 135| 		if (template.hasClass("CivCentre"))
| 136| 136| 		{
| 137| 137| 			let pos;
| 177| 177| 			else if (!pos)
| 178| 178| 				return false;
| 179| 179| 		}
| 180|    |-	}
|    | 180|+	
| 181| 181| 
| 182| 182| 	// Compute each tile's closeness to friendly structures:
| 183| 183| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 204| 204| 					placement.set(j, 45);
| 205| 205| 		}
| 206| 206| 		else
| 207|    |-		{
|    | 207|+		
| 208| 208| 			for (let j = 0; j < placement.map.length; ++j)
| 209| 209| 				if (HQ.basesMap.map[j] != 0)
| 210| 210| 					placement.set(j, 45);
| 211|    |-		}
|    | 211|+		
| 212| 212| 
| 213| 213| 		if (!HQ.requireHouses || !template.hasClass("House"))
| 214| 214| 		{
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 211| 211| 		}
| 212| 212| 
| 213| 213| 		if (!HQ.requireHouses || !template.hasClass("House"))
| 214|    |-		{
|    | 214|+		
| 215| 215| 			gameState.getOwnStructures().forEach(function(ent) {
| 216| 216| 				let pos = ent.position();
| 217| 217| 				let x = Math.round(pos[0] / cellSize);
| 245| 245| 				else if (template.genericName() == "Rotary Mill" && ent.hasClass("Field"))
| 246| 246| 					placement.addInfluence(x, z, 60/cellSize, 40);
| 247| 247| 			});
| 248|    |-		}
|    | 248|+		
| 249| 249| 		if (template.hasClass("Farmstead"))
| 250| 250| 		{
| 251| 251| 			for (let j = 0; j < placement.map.length; ++j)
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 219| 219| 
| 220| 220| 				let struct = m.getBuiltEntity(gameState, ent);
| 221| 221| 				if (struct.resourceDropsiteTypes() && struct.resourceDropsiteTypes().indexOf("food") != -1)
| 222|    |-				{
|    | 222|+				
| 223| 223| 					if (template.hasClass("Field") || template.hasClass("Corral"))
| 224| 224| 						placement.addInfluence(x, z, 80/cellSize, 50);
| 225| 225| 					else // If this is not a field add a negative influence because we want to leave this area for fields
| 226| 226| 						placement.addInfluence(x, z, 80/cellSize, -20);
| 227|    |-				}
|    | 227|+				
| 228| 228| 				else if (template.hasClass("House"))
| 229| 229| 				{
| 230| 230| 					if (ent.hasClass("House"))
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 247| 247| 			});
| 248| 248| 		}
| 249| 249| 		if (template.hasClass("Farmstead"))
| 250|    |-		{
|    | 250|+		
| 251| 251| 			for (let j = 0; j < placement.map.length; ++j)
| 252| 252| 			{
| 253| 253| 				let value = placement.map[j] - gameState.sharedScript.resourceMaps.wood.map[j]/3;
| 255| 255| 					value /= 2;	// we need space around farmstead, so disfavor map border
| 256| 256| 				placement.set(j, value);
| 257| 257| 			}
| 258|    |-		}
|    | 258|+		
| 259| 259| 	}
| 260| 260| 
| 261| 261| 	// Requires to be inside our territory, and inside our base territory if required
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 268| 268| 	{
| 269| 269| 		let base = this.metadata.base;
| 270| 270| 		for (let j = 0; j < placement.map.length; ++j)
| 271|    |-		{
|    | 271|+		
| 272| 272| 			if (HQ.basesMap.map[j] != base)
| 273| 273| 				placement.map[j] = 0;
| 274| 274| 			else if (placement.map[j] > 0)
| 283| 283| 				if (HQ.isNearInvadingArmy([x, z]))
| 284| 284| 					placement.map[j] = 0;
| 285| 285| 			}
| 286|    |-		}
|    | 286|+		
| 287| 287| 	}
| 288| 288| 	else
| 289| 289| 	{
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 286| 286| 		}
| 287| 287| 	}
| 288| 288| 	else
| 289|    |-	{
|    | 289|+	
| 290| 290| 		for (let j = 0; j < placement.map.length; ++j)
| 291| 291| 		{
| 292| 292| 			if (HQ.basesMap.map[j] == 0)
| 306| 306| 					placement.set(j, placement.map[j] + 100);
| 307| 307| 			}
| 308| 308| 		}
| 309|    |-	}
|    | 309|+	
| 310| 310| 
| 311| 311| 	// Find the best non-obstructed:
| 312| 312| 	// Find target building's approximate obstruction radius, and expand by a bit to make sure we're not too close,
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 288| 288| 	else
| 289| 289| 	{
| 290| 290| 		for (let j = 0; j < placement.map.length; ++j)
| 291|    |-		{
|    | 291|+		
| 292| 292| 			if (HQ.basesMap.map[j] == 0)
| 293| 293| 				placement.map[j] = 0;
| 294| 294| 			else if (placement.map[j] > 0)
| 305| 305| 				else if (favoredBase && HQ.basesMap.map[j] == favoredBase)
| 306| 306| 					placement.set(j, placement.map[j] + 100);
| 307| 307| 			}
| 308|    |-		}
|    | 308|+		
| 309| 309| 	}
| 310| 310| 
| 311| 311| 	// Find the best non-obstructed:
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 650| 650| 		{
| 651| 651| 			let count = 0;
| 652| 652| 			for (let j = 0; j < length-1; ++j)
| 653|    |-			{
|    | 653|+			
| 654| 654| 				if ((waterPoints[(i + j) % length]+1) % numPoints == waterPoints[(i + j + 1) % length])
| 655| 655| 					++count;
| 656| 656| 				else
| 657| 657| 					break;
| 658|    |-			}
|    | 658|+			
| 659| 659| 			consec[i] = count;
| 660| 660| 		}
| 661| 661| 		let start = 0;
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-in'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 661| 661| 		let start = 0;
| 662| 662| 		let count = 0;
| 663| 663| 		for (let c in consec)
| 664|    |-		{
|    | 664|+		
| 665| 665| 			if (consec[c] > count)
| 666| 666| 			{
| 667| 667| 				start = c;
| 668| 668| 				count = consec[c];
| 669| 669| 			}
| 670|    |-		}
|    | 670|+		
| 671| 671| 
| 672| 672| 		// If we've found a shoreline, stop searching
| 673| 673| 		if (count != numPoints-1)
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87, -0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50, -0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0, -1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50, -0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87, -0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 857| 857| 			let dxmax = size - dy;
| 858| 858| 			let ky = iy + dy;
| 859| 859| 			if (ky >= 0 && ky < w)
| 860|    |-			{
|    | 860|+			
| 861| 861| 				for (let dx = -dxmax; dx <= dxmax; ++dx)
| 862| 862| 				{
| 863| 863| 					let kx = ix + dx;
| 868| 868| 					total += weight * resourceMaps[k].map[kx + w * ky];
| 869| 869| 					nbcell += weight;
| 870| 870| 				}
| 871|    |-			}
|    | 871|+			
| 872| 872| 			if (dy == 0)
| 873| 873| 				continue;
| 874| 874| 			ky = iy - dy;
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 873| 873| 				continue;
| 874| 874| 			ky = iy - dy;
| 875| 875| 			if (ky >= 0 && ky < w)
| 876|    |-			{
|    | 876|+			
| 877| 877| 				for (let dx = -dxmax; dx <= dxmax; ++dx)
| 878| 878| 				{
| 879| 879| 					let kx = ix + dx;
| 884| 884| 					total += weight * resourceMaps[k].map[kx + w * ky];
| 885| 885| 					nbcell += weight;
| 886| 886| 				}
| 887|    |-			}
|    | 887|+			
| 888| 888| 		}
| 889| 889| 	}
| 890| 890| 	return nbcell ? total / nbcell : 0;
Executing section cli...

Link to build: https://jenkins.wildfiregames.com/job/differential/912/

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

Linter detected issues:
Executing section Source...
Executing section JS...
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '||' should be placed at the end of the line.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|  87|  87| 		// If the elements are still strings, split them by space or by '+'
|  88|  88| 		if (typeof sublist == "string")
|  89|  89| 			sublist = sublist.split(/[+\s]+/);
|  90|    |-		if (sublist.every(c => (c[0] == "!" && classes.indexOf(c.substr(1)) == -1)
|  91|    |-		                    || (c[0] != "!" && classes.indexOf(c) != -1)))
|    |  90|+		if (sublist.every(c => (c[0] == "!" && classes.indexOf(c.substr(1)) == -1) ||
|    |  91|+		                    (c[0] != "!" && classes.indexOf(c) != -1)))
|  92|  92| 			return true;
|  93|  93| 	}
|  94|  94| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 226| 226| 		{
| 227| 227| 			let aura = auraTemplates[auraID];
| 228| 228| 			ret.auras[auraID] = {
| 229|    |-					"name": aura.auraName,
|    | 229|+				"name": aura.auraName,
| 230| 230| 					"description": aura.auraDescription || null,
| 231| 231| 					"radius": aura.radius || null
| 232| 232| 				};
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 227| 227| 			let aura = auraTemplates[auraID];
| 228| 228| 			ret.auras[auraID] = {
| 229| 229| 					"name": aura.auraName,
| 230|    |-					"description": aura.auraDescription || null,
|    | 230|+				"description": aura.auraDescription || null,
| 231| 231| 					"radius": aura.radius || null
| 232| 232| 				};
| 233| 233| 		}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 228| 228| 			ret.auras[auraID] = {
| 229| 229| 					"name": aura.auraName,
| 230| 230| 					"description": aura.auraDescription || null,
| 231|    |-					"radius": aura.radius || null
|    | 231|+				"radius": aura.radius || null
| 232| 232| 				};
| 233| 233| 		}
| 234| 234| 	}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 4.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 229| 229| 					"name": aura.auraName,
| 230| 230| 					"description": aura.auraDescription || null,
| 231| 231| 					"radius": aura.radius || null
| 232|    |-				};
|    | 232|+			};
| 233| 233| 		}
| 234| 234| 	}
| 235| 235| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 389| 389| 		ret.icon = template.Identity.Icon;
| 390| 390| 		ret.tooltip = template.Identity.Tooltip;
| 391| 391| 		ret.requiredTechnologies = [];
| 392|    |-		if (template.Identity.RequiredTechnologies && template.Identity.RequiredTechnologies._string) {
|    | 392|+		if (template.Identity.RequiredTechnologies && template.Identity.RequiredTechnologies._string) 
| 393| 393| 			ret.requiredTechnologies = template.Identity.RequiredTechnologies._string.split(/\s+/);
| 394|    |-		}
|    | 394|+		
| 395| 395| 		ret.visibleIdentityClasses = GetVisibleIdentityClasses(template.Identity);
| 396| 396| 		ret.nativeCiv = template.Identity.Civ;
| 397| 397| 	}

binaries/data/mods/public/globalscripts/Templates.js
| 392| »   »   if·(template.Identity.RequiredTechnologies·&&·template.Identity.RequiredTechnologies._string)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/globalscripts/Templates.js
|  91| »   »   ····················||·(c[0]·!=·"!"·&&·classes.indexOf(c)·!=·-1)))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '||'; readers may interpret this as an expression boundary.
|    | [NORMAL] ESLintBear (space-before-function-paren):
|    | Unexpected space before function parentheses.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/Identity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/Identity.js
| 100| 100| 	this.visibleClassesList = GetVisibleIdentityClasses(this.template);
| 101| 101| };
| 102| 102| 
| 103|    |-Identity.prototype.Deserialize = function ()
|    | 103|+Identity.prototype.Deserialize = function()
| 104| 104| {
| 105| 105| 	this.Init();
| 106| 106| };
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 393| 393| function getRepairTimeTooltip(entState)
| 394| 394| {
| 395| 395| 	return sprintf(translate("%(label)s %(details)s"), {
| 396|    |-			"label": headerFont(translate("Number of repairers:")),
|    | 396|+		"label": headerFont(translate("Number of repairers:")),
| 397| 397| 			"details": entState.repairable.numBuilders
| 398| 398| 		}) + "\n" + (entState.repairable.numBuilders ?
| 399| 399| 		sprintf(translatePlural(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 394| 394| {
| 395| 395| 	return sprintf(translate("%(label)s %(details)s"), {
| 396| 396| 			"label": headerFont(translate("Number of repairers:")),
| 397|    |-			"details": entState.repairable.numBuilders
|    | 397|+		"details": entState.repairable.numBuilders
| 398| 398| 		}) + "\n" + (entState.repairable.numBuilders ?
| 399| 399| 		sprintf(translatePlural(
| 400| 400| 			"Add another worker to speed up the repairs by %(second)s second.",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 1 tab but found 2.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 395| 395| 	return sprintf(translate("%(label)s %(details)s"), {
| 396| 396| 			"label": headerFont(translate("Number of repairers:")),
| 397| 397| 			"details": entState.repairable.numBuilders
| 398|    |-		}) + "\n" + (entState.repairable.numBuilders ?
|    | 398|+	}) + "\n" + (entState.repairable.numBuilders ?
| 399| 399| 		sprintf(translatePlural(
| 400| 400| 			"Add another worker to speed up the repairs by %(second)s second.",
| 401| 401| 			"Add another worker to speed up the repairs by %(second)s seconds.",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 415| 415| function getBuildTimeTooltip(entState)
| 416| 416| {
| 417| 417| 	return sprintf(translate("%(label)s %(details)s"), {
| 418|    |-			"label": headerFont(translate("Number of builders:")),
|    | 418|+		"label": headerFont(translate("Number of builders:")),
| 419| 419| 			"details": entState.foundation.numBuilders
| 420| 420| 		}) + "\n" + (entState.foundation.numBuilders ?
| 421| 421| 		sprintf(translatePlural(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 416| 416| {
| 417| 417| 	return sprintf(translate("%(label)s %(details)s"), {
| 418| 418| 			"label": headerFont(translate("Number of builders:")),
| 419|    |-			"details": entState.foundation.numBuilders
|    | 419|+		"details": entState.foundation.numBuilders
| 420| 420| 		}) + "\n" + (entState.foundation.numBuilders ?
| 421| 421| 		sprintf(translatePlural(
| 422| 422| 			"Add another worker to speed up the construction by %(second)s second.",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 1 tab but found 2.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 417| 417| 	return sprintf(translate("%(label)s %(details)s"), {
| 418| 418| 			"label": headerFont(translate("Number of builders:")),
| 419| 419| 			"details": entState.foundation.numBuilders
| 420|    |-		}) + "\n" + (entState.foundation.numBuilders ?
|    | 420|+	}) + "\n" + (entState.foundation.numBuilders ?
| 421| 421| 		sprintf(translatePlural(
| 422| 422| 			"Add another worker to speed up the construction by %(second)s second.",
| 423| 423| 			"Add another worker to speed up the construction by %(second)s seconds.",
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|  97|  97| 	else if (pos.xx === undefined || pos.x == pos.xx && pos.z == pos.zz)
|  98|  98| 		builder.construct(this.type, pos.x, pos.z, pos.angle, this.metadata);
|  99|  99| 	else // try with the lowest, move towards us unless we're same
| 100|    |-	{
|    | 100|+	
| 101| 101| 		for (let step = 0; step <= 1; step += 0.2)
| 102| 102| 			builder.construct(this.type, step*pos.x + (1-step)*pos.xx, step*pos.z + (1-step)*pos.zz,
| 103| 103| 				pos.angle, this.metadata);
| 104|    |-	}
|    | 104|+	
| 105| 105| 	this.onStart(gameState);
| 106| 106| 	Engine.ProfileStop();
| 107| 107| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 131| 131| 	}
| 132| 132| 
| 133| 133| 	if (!this.position)
| 134|    |-	{
|    | 134|+	
| 135| 135| 		if (template.hasClass("CivCentre"))
| 136| 136| 		{
| 137| 137| 			let pos;
| 177| 177| 			else if (!pos)
| 178| 178| 				return false;
| 179| 179| 		}
| 180|    |-	}
|    | 180|+	
| 181| 181| 
| 182| 182| 	// Compute each tile's closeness to friendly structures:
| 183| 183| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 204| 204| 					placement.set(j, 45);
| 205| 205| 		}
| 206| 206| 		else
| 207|    |-		{
|    | 207|+		
| 208| 208| 			for (let j = 0; j < placement.map.length; ++j)
| 209| 209| 				if (HQ.basesMap.map[j] != 0)
| 210| 210| 					placement.set(j, 45);
| 211|    |-		}
|    | 211|+		
| 212| 212| 
| 213| 213| 		if (!HQ.requireHouses || !template.hasClass("House"))
| 214| 214| 		{
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 211| 211| 		}
| 212| 212| 
| 213| 213| 		if (!HQ.requireHouses || !template.hasClass("House"))
| 214|    |-		{
|    | 214|+		
| 215| 215| 			gameState.getOwnStructures().forEach(function(ent) {
| 216| 216| 				let pos = ent.position();
| 217| 217| 				let x = Math.round(pos[0] / cellSize);
| 245| 245| 				else if (template.genericName() == "Rotary Mill" && ent.hasClass("Field"))
| 246| 246| 					placement.addInfluence(x, z, 60/cellSize, 40);
| 247| 247| 			});
| 248|    |-		}
|    | 248|+		
| 249| 249| 		if (template.hasClass("Farmstead"))
| 250| 250| 		{
| 251| 251| 			for (let j = 0; j < placement.map.length; ++j)
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 219| 219| 
| 220| 220| 				let struct = m.getBuiltEntity(gameState, ent);
| 221| 221| 				if (struct.resourceDropsiteTypes() && struct.resourceDropsiteTypes().indexOf("food") != -1)
| 222|    |-				{
|    | 222|+				
| 223| 223| 					if (template.hasClass("Field") || template.hasClass("Corral"))
| 224| 224| 						placement.addInfluence(x, z, 80/cellSize, 50);
| 225| 225| 					else // If this is not a field add a negative influence because we want to leave this area for fields
| 226| 226| 						placement.addInfluence(x, z, 80/cellSize, -20);
| 227|    |-				}
|    | 227|+				
| 228| 228| 				else if (template.hasClass("House"))
| 229| 229| 				{
| 230| 230| 					if (ent.hasClass("House"))
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 247| 247| 			});
| 248| 248| 		}
| 249| 249| 		if (template.hasClass("Farmstead"))
| 250|    |-		{
|    | 250|+		
| 251| 251| 			for (let j = 0; j < placement.map.length; ++j)
| 252| 252| 			{
| 253| 253| 				let value = placement.map[j] - gameState.sharedScript.resourceMaps.wood.map[j]/3;
| 255| 255| 					value /= 2;	// we need space around farmstead, so disfavor map border
| 256| 256| 				placement.set(j, value);
| 257| 257| 			}
| 258|    |-		}
|    | 258|+		
| 259| 259| 	}
| 260| 260| 
| 261| 261| 	// Requires to be inside our territory, and inside our base territory if required
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 268| 268| 	{
| 269| 269| 		let base = this.metadata.base;
| 270| 270| 		for (let j = 0; j < placement.map.length; ++j)
| 271|    |-		{
|    | 271|+		
| 272| 272| 			if (HQ.basesMap.map[j] != base)
| 273| 273| 				placement.map[j] = 0;
| 274| 274| 			else if (placement.map[j] > 0)
| 283| 283| 				if (HQ.isNearInvadingArmy([x, z]))
| 284| 284| 					placement.map[j] = 0;
| 285| 285| 			}
| 286|    |-		}
|    | 286|+		
| 287| 287| 	}
| 288| 288| 	else
| 289| 289| 	{
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 286| 286| 		}
| 287| 287| 	}
| 288| 288| 	else
| 289|    |-	{
|    | 289|+	
| 290| 290| 		for (let j = 0; j < placement.map.length; ++j)
| 291| 291| 		{
| 292| 292| 			if (HQ.basesMap.map[j] == 0)
| 306| 306| 					placement.set(j, placement.map[j] + 100);
| 307| 307| 			}
| 308| 308| 		}
| 309|    |-	}
|    | 309|+	
| 310| 310| 
| 311| 311| 	// Find the best non-obstructed:
| 312| 312| 	// Find target building's approximate obstruction radius, and expand by a bit to make sure we're not too close,
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 288| 288| 	else
| 289| 289| 	{
| 290| 290| 		for (let j = 0; j < placement.map.length; ++j)
| 291|    |-		{
|    | 291|+		
| 292| 292| 			if (HQ.basesMap.map[j] == 0)
| 293| 293| 				placement.map[j] = 0;
| 294| 294| 			else if (placement.map[j] > 0)
| 305| 305| 				else if (favoredBase && HQ.basesMap.map[j] == favoredBase)
| 306| 306| 					placement.set(j, placement.map[j] + 100);
| 307| 307| 			}
| 308|    |-		}
|    | 308|+		
| 309| 309| 	}
| 310| 310| 
| 311| 311| 	// Find the best non-obstructed:
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 650| 650| 		{
| 651| 651| 			let count = 0;
| 652| 652| 			for (let j = 0; j < length-1; ++j)
| 653|    |-			{
|    | 653|+			
| 654| 654| 				if ((waterPoints[(i + j) % length]+1) % numPoints == waterPoints[(i + j + 1) % length])
| 655| 655| 					++count;
| 656| 656| 				else
| 657| 657| 					break;
| 658|    |-			}
|    | 658|+			
| 659| 659| 			consec[i] = count;
| 660| 660| 		}
| 661| 661| 		let start = 0;
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-in'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 661| 661| 		let start = 0;
| 662| 662| 		let count = 0;
| 663| 663| 		for (let c in consec)
| 664|    |-		{
|    | 664|+		
| 665| 665| 			if (consec[c] > count)
| 666| 666| 			{
| 667| 667| 				start = c;
| 668| 668| 				count = consec[c];
| 669| 669| 			}
| 670|    |-		}
|    | 670|+		
| 671| 671| 
| 672| 672| 		// If we've found a shoreline, stop searching
| 673| 673| 		if (count != numPoints-1)
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87, -0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50, -0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0, -1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50, -0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87, -0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 857| 857| 			let dxmax = size - dy;
| 858| 858| 			let ky = iy + dy;
| 859| 859| 			if (ky >= 0 && ky < w)
| 860|    |-			{
|    | 860|+			
| 861| 861| 				for (let dx = -dxmax; dx <= dxmax; ++dx)
| 862| 862| 				{
| 863| 863| 					let kx = ix + dx;
| 868| 868| 					total += weight * resourceMaps[k].map[kx + w * ky];
| 869| 869| 					nbcell += weight;
| 870| 870| 				}
| 871|    |-			}
|    | 871|+			
| 872| 872| 			if (dy == 0)
| 873| 873| 				continue;
| 874| 874| 			ky = iy - dy;
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 873| 873| 				continue;
| 874| 874| 			ky = iy - dy;
| 875| 875| 			if (ky >= 0 && ky < w)
| 876|    |-			{
|    | 876|+			
| 877| 877| 				for (let dx = -dxmax; dx <= dxmax; ++dx)
| 878| 878| 				{
| 879| 879| 					let kx = ix + dx;
| 884| 884| 					total += weight * resourceMaps[k].map[kx + w * ky];
| 885| 885| 					nbcell += weight;
| 886| 886| 				}
| 887|    |-			}
|    | 887|+			
| 888| 888| 		}
| 889| 889| 	}
| 890| 890| 	return nbcell ? total / nbcell : 0;
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-in'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  10|  10| 
|  11|  11| 	var ret = {};
|  12|  12| 	for (var i in this)
|  13|    |-	{
|    |  13|+	
|  14|  14| 		if (this.hasOwnProperty(i))
|  15|  15| 			ret[i] = this[i];
|  16|    |-	}
|    |  16|+	
|  17|  17| 	ret.modificationCache = {};
|  18|  18| 	return ret;
|  19|  19| };
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '||' should be placed at the end of the line.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  64|  64| 	for (let key of this.unresearchedAutoResearchTechs)
|  65|  65| 	{
|  66|  66| 		let tech = TechnologyTemplates.Get(key);
|  67|    |-		if ((tech.autoResearch && this.CanResearch(key))
|  68|    |-			|| (tech.top && (this.IsTechnologyResearched(tech.top) || this.IsTechnologyResearched(tech.bottom))))
|    |  67|+		if ((tech.autoResearch && this.CanResearch(key)) ||
|    |  68|+			(tech.top && (this.IsTechnologyResearched(tech.top) || this.IsTechnologyResearched(tech.bottom))))
|  69|  69| 		{
|  70|  70| 			this.unresearchedAutoResearchTechs.delete(key);
|  71|  71| 			this.ResearchTechnology(key);
|    | [NORMAL] ESLintBear (space-before-function-paren):
|    | Unexpected space before function parentheses.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  75|  75| };
|  76|  76| 
|  77|  77| // Checks an entity template to see if its technology requirements have been met
|  78|    |-TechnologyManager.prototype.CanProduce = function (templateName)
|    |  78|+TechnologyManager.prototype.CanProduce = function(templateName)
|  79|  79| {
|  80|  80| 	let cmpTempManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
|  81|  81| 	let template = cmpTempManager.GetTemplate(templateName);
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-of'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  98|  98| 
|  99|  99| TechnologyManager.prototype.AreTechnologiesResearched = function(techs)
| 100| 100| {
| 101|    |-	for (let tech of techs) {
|    | 101|+	for (let tech of techs) 
| 102| 102| 		if (!this.researchedTechs.has(tech))
| 103| 103| 			return false;
| 104|    |-	}
|    | 104|+	
| 105| 105| 	return true;
| 106| 106| }
| 107| 107| 
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 103| 103| 			return false;
| 104| 104| 	}
| 105| 105| 	return true;
| 106|    |-}
|    | 106|+};
| 107| 107| 
| 108| 108| TechnologyManager.prototype.IsTechnologyStarted = function(tech)
| 109| 109| {
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 202| 202| 		var classes = cmpIdentity.GetClassesList();
| 203| 203| 		// don't use foundations for the class counts but check if techs apply (e.g. health increase)
| 204| 204| 		if (!Engine.QueryInterface(msg.entity, IID_Foundation))
| 205|    |-		{
|    | 205|+		
| 206| 206| 			for (let cls of classes)
| 207| 207| 			{
| 208| 208| 				this.classCounts[cls] = this.classCounts[cls] || 0;
| 212| 212| 				this.typeCountsByClass[cls][template] = this.typeCountsByClass[cls][template] || 0;
| 213| 213| 				this.typeCountsByClass[cls][template] += 1;
| 214| 214| 			}
| 215|    |-		}
|    | 215|+		
| 216| 216| 
| 217| 217| 		// Newly created entity, check if any researched techs might apply
| 218| 218| 		// (only do this for new entities because even if an entity is converted or captured,
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 295| 295| 	}
| 296| 296| 
| 297| 297| 	if (template.replaces && template.replaces.length > 0)
| 298|    |-	{
|    | 298|+	
| 299| 299| 		for (var i of template.replaces)
| 300| 300| 		{
| 301| 301| 			if (!i || this.IsTechnologyResearched(i))
| 313| 313| 					cmpPlayerEntityLimits.UpdateLimitsFromTech(i);
| 314| 314| 			}
| 315| 315| 		}
| 316|    |-	}
|    | 316|+	
| 317| 317| 
| 318| 318| 	this.UpdateAutoResearch();
| 319| 319| 
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required after '{'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 331| 331| 		cmpPlayerEntityLimits.UpdateLimitsFromTech(tech);
| 332| 332| 
| 333| 333| 	// always send research finished message
| 334|    |-	Engine.PostMessage(this.entity, MT_ResearchFinished, {"player": playerID, "tech": tech});
|    | 334|+	Engine.PostMessage(this.entity, MT_ResearchFinished, { "player": playerID, "tech": tech});
| 335| 335| 
| 336| 336| 	for (var component in modifiedComponents)
| 337| 337| 	{
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 331| 331| 		cmpPlayerEntityLimits.UpdateLimitsFromTech(tech);
| 332| 332| 
| 333| 333| 	// always send research finished message
| 334|    |-	Engine.PostMessage(this.entity, MT_ResearchFinished, {"player": playerID, "tech": tech});
|    | 334|+	Engine.PostMessage(this.entity, MT_ResearchFinished, {"player": playerID, "tech": tech });
| 335| 335| 
| 336| 336| 	for (var component in modifiedComponents)
| 337| 337| 	{
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 335| 335| 
| 336| 336| 	for (var component in modifiedComponents)
| 337| 337| 	{
| 338|    |-		Engine.PostMessage(SYSTEM_ENTITY, MT_TemplateModification, { "player": playerID, "component": component, "valueNames": modifiedComponents[component]});
|    | 338|+		Engine.PostMessage(SYSTEM_ENTITY, MT_TemplateModification, { "player": playerID, "component": component, "valueNames": modifiedComponents[component] });
| 339| 339| 		Engine.BroadcastMessage(MT_ValueModification, { "entities": ents, "component": component, "valueNames": modifiedComponents[component]});
| 340| 340| 	}
| 341| 341| 
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 336| 336| 	for (var component in modifiedComponents)
| 337| 337| 	{
| 338| 338| 		Engine.PostMessage(SYSTEM_ENTITY, MT_TemplateModification, { "player": playerID, "component": component, "valueNames": modifiedComponents[component]});
| 339|    |-		Engine.BroadcastMessage(MT_ValueModification, { "entities": ents, "component": component, "valueNames": modifiedComponents[component]});
|    | 339|+		Engine.BroadcastMessage(MT_ValueModification, { "entities": ents, "component": component, "valueNames": modifiedComponents[component] });
| 340| 340| 	}
| 341| 341| 
| 342| 342| 	if (tech.startsWith("phase") && !template.autoResearch)
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 458| 458|  */
| 459| 459| TechnologyManager.prototype.GetResearcher = function(tech)
| 460| 460| {
| 461|    |-	return this.researchQueued.get(tech)
|    | 461|+	return this.researchQueued.get(tech);
| 462| 462| };
| 463| 463| 
| 464| 464| /**

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 101| »   for·(let·tech·of·techs)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 159| »   »   »   switch·(type)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 174| »   switch·(entity.check)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 229| ·»   »   »   »   »   if·(DoesModificationApply(modif,·classes))
|    | [NORMAL] ESLintBear (no-mixed-spaces-and-tabs):
|    | Mixed spaces and tabs.

binaries/data/mods/public/simulation/components/TechnologyManager.js
|  68| »   »   »   ||·(tech.top·&&·(this.IsTechnologyResearched(tech.top)·||·this.IsTechnologyResearched(tech.bottom))))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '||'; readers may interpret this as an expression boundary.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 106| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 238| »   »   »   for·(var·component·in·modifiedComponents)
|    | [NORMAL] JSHintBear:
|    | 'component' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 244| »   »   var·cmpTemplateManager·=·Engine.QueryInterface(SYSTEM_ENTITY,·IID_TemplateManager);
|    | [NORMAL] JSHintBear:
|    | 'cmpTemplateManager' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 245| »   »   var·template·=·cmpTemplateManager.GetCurrentTemplateName(msg.entity);
|    | [NORMAL] JSHintBear:
|    | 'template' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 250| »   »   »   var·cmpIdentity·=·Engine.QueryInterface(msg.entity,·IID_Identity);
|    | [NORMAL] JSHintBear:
|    | 'cmpIdentity' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 253| »   »   »   »   var·classes·=·cmpIdentity.GetClassesList();
|    | [NORMAL] JSHintBear:
|    | 'classes' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 461| »   return·this.researchQueued.get(tech)
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-of'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 214| 214| 
| 215| 215| m.GameState.prototype.areResearched = function(techs)
| 216| 216| {
| 217|    |-	for (let tech of techs) {
|    | 217|+	for (let tech of techs) 
| 218| 218| 		if (!this.playerData.researchedTechs.has(tech))
| 219| 219| 			return false;
| 220|    |-	}
|    | 220|+	
| 221| 221| 	return true;
| 222| 222| }
| 223| 223| 
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 219| 219| 			return false;
| 220| 220| 	}
| 221| 221| 	return true;
| 222|    |-}
|    | 222|+};
| 223| 223| 
| 224| 224| /** true if started or queued */
| 225| 225| m.GameState.prototype.isResearching = function(template)
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 619| 619| 	else if (template.resourceSupplyType() !== undefined)	// animal resources
| 620| 620| 		count += this.countEntitiesByType("resource|" + type, true);
| 621| 621| 	else
| 622|    |-	{
|    | 622|+	
| 623| 623| 		// Count entities in building production queues
| 624| 624| 		// TODO: maybe this fails for corrals.
| 625| 625| 		this.getOwnTrainingFacilities().forEach(function(ent) {
| 627| 627| 				if (item.unitTemplate == type)
| 628| 628| 					count += item.count;
| 629| 629| 		});
| 630|    |-	}
|    | 630|+	
| 631| 631| 
| 632| 632| 	return count;
| 633| 633| };
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 779| 779| 				ret.push([techs[1]._templateName, techs[1]]);
| 780| 780| 		}
| 781| 781| 		else if (this.canResearch(tech))
| 782|    |-		{
|    | 782|+		
| 783| 783| 			// Phases are treated separately
| 784| 784| 			if (this.phases.every(phase => template._templateName != phase.name))
| 785| 785| 				ret.push([tech, template]);
| 786|    |-		}
|    | 786|+		
| 787| 787| 	}
| 788| 788| 	return ret;
| 789| 789| };

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 217| »   for·(let·tech·of·techs)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 278| »   »   switch·(entity.check)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 295| »   »   »   switch·(type)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 222| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-of'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|  33|  33| 		{
|  34|  34| 			let args = string.split("/");
|  35|  35| 			for (let arg of args)
|  36|    |-			{
|    |  36|+			
|  37|  37| 				if (value[arg])
|  38|  38| 					value = value[arg];
|  39|  39| 				else
|  41|  41| 					value = undefined;
|  42|  42| 					break;
|  43|  43| 				}
|  44|    |-			}
|    |  44|+			
|  45|  45| 			this._tpCache.set(string, value);
|  46|  46| 		}
|  47|  47| 		return this._tpCache.get(string);
|    | [NORMAL] ESLintBear (no-trailing-spaces):
|    | Trailing spaces not allowed.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|  80|  80| 		return true;
|  81|  81| 	},
|  82|  82| 
|  83|    |-	"requiredTechs": function() { 
|    |  83|+	"requiredTechs": function() {
|  84|  84| 		let requiredTechnologies = this.get("Identity/RequiredTechnologies");
|  85|  85| 		if (requiredTechnologies && requiredTechnologies._string)
|  86|  86| 			return requiredTechnologies._string.split(/\s+/);
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
| 314| 314| 			return undefined;
| 315| 315| 
| 316| 316| 		if (this.get("Attack/" + type + "/Bonuses"))
| 317|    |-		{
|    | 317|+		
| 318| 318| 			for (let b in this.get("Attack/" + type + "/Bonuses"))
| 319| 319| 			{
| 320| 320| 				let bonusClasses = this.get("Attack/" + type + "/Bonuses/" + b + "/Classes");
| 324| 324| 					if (bcl == againstClass)
| 325| 325| 						return +this.get("Attack/" + type + "/Bonuses/" + b + "/Multiplier");
| 326| 326| 			}
| 327|    |-		}
|    | 327|+		
| 328| 328| 		return 1;
| 329| 329| 	},
| 330| 330| 

binaries/data/mods/public/simulation/ai/common-api/entity.js
| 101| »   »   for·(let·techRequired·of·techsRequired)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/simulation/ai/common-api/entity.js
| 804| »   »   if·(this.position()·!==·undefined)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/simulation/ai/common-api/entity.js
| 821| »   »   if·(this.position()·!==·undefined·&&·unitToFleeFrom.position()·!==·undefined)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
| 452| 452| 				continue;
| 453| 453| 
| 454| 454| 			if (state.pack.progress == 0)
| 455|    |-			{
|    | 455|+			
| 456| 456| 				if (state.pack.packed)
| 457| 457| 					checks.unpackButton = true;
| 458| 458| 				else
| 459| 459| 					checks.packButton = true;
| 460|    |-			}
|    | 460|+			
| 461| 461| 			else if (state.pack.packed)
| 462| 462| 				checks.unpackCancelButton = true;
| 463| 463| 			else
|    | [NORMAL] ESLintBear (space-before-function-paren):
|    | Unexpected space before function parentheses.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
| 763| 763| 				addResearchToQueue(data.item.researchFacilityId, t);
| 764| 764| 			})(tech);
| 765| 765| 
| 766|    |-			button.onPressRight = (t => function () {
|    | 766|+			button.onPressRight = (t => function() {
| 767| 767| 				showTemplateDetails(
| 768| 768| 					t,
| 769| 769| 					GetTemplateData(data.unitEntStates.find(state => state.id == data.item.researchFacilityId).template).nativeCiv);
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
| 941| 941| 			"player": data.player
| 942| 942| 		});
| 943| 943| 
| 944|    |-		let unitIds = data.unitEntStates.map(status => status.id)
|    | 944|+		let unitIds = data.unitEntStates.map(status => status.id);
| 945| 945| 		let [buildingsCountToTrainFullBatch, fullBatchSize, remainderBatch] =
| 946| 946| 			getTrainingStatus(unitIds, data.item, data.playerState);
| 947| 947| 

binaries/data/mods/public/gui/session/selection_panels.js
|  48| »   »   »   switch·(data.item)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/gui/session/selection_panels.js
|  59| »   »   switch·(data.item)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/gui/session/selection_panels.js
| 731| »   »   »   »   »   »   switch·(entity.check)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/gui/session/selection_panels.js
| 944| »   »   let·unitIds·=·data.unitEntStates.map(status·=>·status.id)
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|  66|  66| 		let phase = "";
|  67|  67| 		let cmpTechnologyManager = QueryPlayerIDInterface(i, IID_TechnologyManager);
|  68|  68| 		if (cmpTechnologyManager)
|  69|    |-		{
|    |  69|+		
|  70|  70| 			if (cmpTechnologyManager.IsTechnologyResearched("phase_city"))
|  71|  71| 				phase = "city";
|  72|  72| 			else if (cmpTechnologyManager.IsTechnologyResearched("phase_town"))
|  73|  73| 				phase = "town";
|  74|  74| 			else if (cmpTechnologyManager.IsTechnologyResearched("phase_village"))
|  75|  75| 				phase = "village";
|  76|    |-		}
|    |  76|+		
|  77|  77| 
|  78|  78| 		// store player ally/neutral/enemy data as arrays
|  79|  79| 		let allies = [];
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 410| 410| 			ret.attack[type].elevationBonus = range.elevationBonus;
| 411| 411| 
| 412| 412| 			if (cmpUnitAI && cmpPosition && cmpPosition.IsInWorld())
| 413|    |-			{
|    | 413|+			
| 414| 414| 				// For units, take the range in front of it, no spread. So angle = 0
| 415| 415| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 0);
| 416|    |-			}
|    | 416|+			
| 417| 417| 			else if(cmpPosition && cmpPosition.IsInWorld())
| 418| 418| 			{
| 419| 419| 				// For buildings, take the average elevation around it. So angle = 2*pi
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 415| 415| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 0);
| 416| 416| 			}
| 417| 417| 			else if(cmpPosition && cmpPosition.IsInWorld())
| 418|    |-			{
|    | 418|+			
| 419| 419| 				// For buildings, take the average elevation around it. So angle = 2*pi
| 420| 420| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 2*Math.PI);
| 421|    |-			}
|    | 421|+			
| 422| 422| 			else
| 423| 423| 			{
| 424| 424| 				// not in world, set a default?
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 420| 420| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 2*Math.PI);
| 421| 421| 			}
| 422| 422| 			else
| 423|    |-			{
|    | 423|+			
| 424| 424| 				// not in world, set a default?
| 425| 425| 				ret.attack[type].elevationAdaptedRange = ret.attack.maxRange;
| 426|    |-			}
|    | 426|+			
| 427| 427| 		}
| 428| 428| 	}
| 429| 429| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 804| 804| 		updateEntityColor(data.showAllStatusBars && (i == player || player == -1) ?
| 805| 805| 			[IID_Minimap, IID_RangeOverlayRenderer, IID_RallyPointRenderer, IID_StatusBars] :
| 806| 806| 			[IID_Minimap, IID_RangeOverlayRenderer, IID_RallyPointRenderer],
| 807|    |-			cmpRangeManager.GetEntitiesByPlayer(i));
|    | 807|+		cmpRangeManager.GetEntitiesByPlayer(i));
| 808| 808| 	}
| 809| 809| 	updateEntityColor([IID_Selectable, IID_StatusBars], data.selected);
| 810| 810| 	Engine.QueryInterface(SYSTEM_ENTITY, IID_TerritoryManager).UpdateColors();
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1323|1323| 		}
|1324|1324| 	}
|1325|1325| 	else
|1326|    |-	{
|    |1326|+	
|1327|1327| 		// Didn't snap to an existing entity, add the starting tower manually. To prevent odd-looking rotation jumps
|1328|1328| 		// when shift-clicking to build a wall, reuse the placement angle that was last seen on a validly positioned
|1329|1329| 		// wall piece.
|1344|1344| 			"pos": start.pos,
|1345|1345| 			"angle": previewEntities.length > 0 ? previewEntities[0].angle : this.placementWallLastAngle
|1346|1346| 		});
|1347|    |-	}
|    |1347|+	
|1348|1348| 
|1349|1349| 	if (end.pos)
|1350|1350| 	{
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1347|1347| 	}
|1348|1348| 
|1349|1349| 	if (end.pos)
|1350|    |-	{
|    |1350|+	
|1351|1351| 		// Analogous to the starting side case above
|1352|1352| 		if (end.snappedEnt && end.snappedEnt != INVALID_ENTITY)
|1353|1353| 		{
|1385|1385| 				"pos": end.pos,
|1386|1386| 				"angle": previewEntities.length > 0 ? previewEntities[previewEntities.length-1].angle : this.placementWallLastAngle
|1387|1387| 			});
|1388|    |-	}
|    |1388|+	
|1389|1389| 
|1390|1390| 	let cmpTerrain = Engine.QueryInterface(SYSTEM_ENTITY, IID_Terrain);
|1391|1391| 	if (!cmpTerrain)
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1563|1563| 
|1564|1564| 		let cmpVisual = Engine.QueryInterface(ent, IID_Visual);
|1565|1565| 		if (cmpVisual)
|1566|    |-		{
|    |1566|+		
|1567|1567| 			if (!allPiecesValid || !canAfford)
|1568|1568| 				cmpVisual.SetShadingColor(1.4, 0.4, 0.4, 1);
|1569|1569| 			else
|1570|1570| 				cmpVisual.SetShadingColor(1, 1, 1, 1);
|1571|    |-		}
|    |1571|+		
|1572|1572| 
|1573|1573| 		++entPool.numUsed;
|1574|1574| 	}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1637|1637| 			{
|1638|1638| 				minDist2 = dist2;
|1639|1639| 				minDistEntitySnapData = {
|1640|    |-						"x": pos.x,
|    |1640|+					"x": pos.x,
|1641|1641| 						"z": pos.z,
|1642|1642| 						"angle": cmpPosition.GetRotation().y,
|1643|1643| 						"ent": ent
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1638|1638| 				minDist2 = dist2;
|1639|1639| 				minDistEntitySnapData = {
|1640|1640| 						"x": pos.x,
|1641|    |-						"z": pos.z,
|    |1641|+					"z": pos.z,
|1642|1642| 						"angle": cmpPosition.GetRotation().y,
|1643|1643| 						"ent": ent
|1644|1644| 				};
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1639|1639| 				minDistEntitySnapData = {
|1640|1640| 						"x": pos.x,
|1641|1641| 						"z": pos.z,
|1642|    |-						"angle": cmpPosition.GetRotation().y,
|    |1642|+					"angle": cmpPosition.GetRotation().y,
|1643|1643| 						"ent": ent
|1644|1644| 				};
|1645|1645| 			}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1640|1640| 						"x": pos.x,
|1641|1641| 						"z": pos.z,
|1642|1642| 						"angle": cmpPosition.GetRotation().y,
|1643|    |-						"ent": ent
|    |1643|+					"ent": ent
|1644|1644| 				};
|1645|1645| 			}
|1646|1646| 		}
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1785|1785| 			result.gain = cmpEntityTrader.GetGoods().amount;
|1786|1786| 	}
|1787|1787| 	else if (data.target === secondMarket)
|1788|    |-	{
|    |1788|+	
|1789|1789| 		result = {
|1790|1790| 			"type": "is second",
|1791|1791| 			"gain": cmpEntityTrader.GetGoods().amount,
|1792|1792| 		};
|1793|    |-	}
|    |1793|+	
|1794|1794| 	else if (!firstMarket)
|1795|1795| 	{
|1796|1796| 		result = { "type": "set first" };
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1792|1792| 		};
|1793|1793| 	}
|1794|1794| 	else if (!firstMarket)
|1795|    |-	{
|    |1795|+	
|1796|1796| 		result = { "type": "set first" };
|1797|    |-	}
|    |1797|+	
|1798|1798| 	else if (!secondMarket)
|1799|1799| 	{
|1800|1800| 		result = {
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1796|1796| 		result = { "type": "set first" };
|1797|1797| 	}
|1798|1798| 	else if (!secondMarket)
|1799|    |-	{
|    |1799|+	
|1800|1800| 		result = {
|1801|1801| 			"type": "set second",
|1802|1802| 			"gain": cmpEntityTrader.CalculateGain(firstMarket, data.target),
|1803|1803| 		};
|1804|    |-	}
|    |1804|+	
|1805|1805| 	else
|1806|1806| 	{
|1807|1807| 		// Else both markets are not null and target is different from them
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1803|1803| 		};
|1804|1804| 	}
|1805|1805| 	else
|1806|    |-	{
|    |1806|+	
|1807|1807| 		// Else both markets are not null and target is different from them
|1808|1808| 		result = { "type": "set first" };
|1809|    |-	}
|    |1809|+	
|1810|1810| 	return result;
|1811|1811| };
|1812|1812| 
Executing section cli...

Link to build: https://jenkins.wildfiregames.com/job/differential/913/

lyv requested changes to this revision.Jan 5 2019, 6:13 AM
lyv added a subscriber: lyv.

From a quick look at the AI files.

binaries/data/mods/public/simulation/ai/common-api/entity.js
84

This might break, I recall having seen a todo saying ._string values are missing. And IIRC, classes are also derived from a function in globalscript/Templates.js

109

The only relevant code here is id = Math.max(id, 4)
This statement would always be true. In the previous code, this was never reached unless all 3 failed. But the lack of return in this one makes it so.

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
215

techs.every((tech) => this.playerData.researchedTechs.has(tech))
TBH, I dont really see the point of adding the function.

binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
31

Notice that [] is considered truthy. Use .length here and wherever this check maybe used.

This revision now requires changes to proceed.Jan 5 2019, 6:13 AM
Silier planned changes to this revision.Jan 5 2019, 9:05 AM
Silier marked 2 inline comments as done.
Silier added inline comments.
binaries/data/mods/public/simulation/ai/common-api/entity.js
109

if it has more phase requirments it takes the highest needed.

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
215

one function call instead for every tech

elexis added a subscriber: elexis.Jan 5 2019, 12:52 PM

borg- just asked 2 days ago how to make a tech that unlocks seleucid champions in the barracks, but only those champs that were unlocked in the fortress with the pair tech. I don't know if it's possible to do it currently, but with this patch it would be easier.

Silier marked 2 inline comments as done.Jan 5 2019, 1:25 PM
Silier added inline comments.
binaries/data/mods/public/simulation/ai/common-api/entity.js
84

Working for formation list in Identity component.

109

oh, I get your comment now

Silier updated this revision to Diff 7265.Jan 5 2019, 4:04 PM
Silier edited the summary of this revision. (Show Details)

Fix tooltip for upgrade as that component is still using exactly one technology, and some comments.

lyv added inline comments.Jan 5 2019, 4:06 PM
binaries/data/mods/public/simulation/ai/common-api/entity.js
84

I meant for the AI.

Stan added a subscriber: Stan.Jan 5 2019, 4:11 PM
Stan added inline comments.
binaries/data/mods/public/simulation/ai/common-api/entity.js
103

switch case ?

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
217

Can this be written differently ?

binaries/data/mods/public/simulation/components/Identity.js
86–89

nuke the 'a'

Vulcan added a comment.Jan 5 2019, 4:33 PM

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

Linter detected issues:
Executing section Source...
Executing section JS...
|    | [NORMAL] ESLintBear (space-before-function-paren):
|    | Unexpected space before function parentheses.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/Identity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/Identity.js
| 100| 100| 	this.visibleClassesList = GetVisibleIdentityClasses(this.template);
| 101| 101| };
| 102| 102| 
| 103|    |-Identity.prototype.Deserialize = function ()
|    | 103|+Identity.prototype.Deserialize = function()
| 104| 104| {
| 105| 105| 	this.Init();
| 106| 106| };
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 393| 393| function getRepairTimeTooltip(entState)
| 394| 394| {
| 395| 395| 	return sprintf(translate("%(label)s %(details)s"), {
| 396|    |-			"label": headerFont(translate("Number of repairers:")),
|    | 396|+		"label": headerFont(translate("Number of repairers:")),
| 397| 397| 			"details": entState.repairable.numBuilders
| 398| 398| 		}) + "\n" + (entState.repairable.numBuilders ?
| 399| 399| 		sprintf(translatePlural(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 394| 394| {
| 395| 395| 	return sprintf(translate("%(label)s %(details)s"), {
| 396| 396| 			"label": headerFont(translate("Number of repairers:")),
| 397|    |-			"details": entState.repairable.numBuilders
|    | 397|+		"details": entState.repairable.numBuilders
| 398| 398| 		}) + "\n" + (entState.repairable.numBuilders ?
| 399| 399| 		sprintf(translatePlural(
| 400| 400| 			"Add another worker to speed up the repairs by %(second)s second.",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 1 tab but found 2.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 395| 395| 	return sprintf(translate("%(label)s %(details)s"), {
| 396| 396| 			"label": headerFont(translate("Number of repairers:")),
| 397| 397| 			"details": entState.repairable.numBuilders
| 398|    |-		}) + "\n" + (entState.repairable.numBuilders ?
|    | 398|+	}) + "\n" + (entState.repairable.numBuilders ?
| 399| 399| 		sprintf(translatePlural(
| 400| 400| 			"Add another worker to speed up the repairs by %(second)s second.",
| 401| 401| 			"Add another worker to speed up the repairs by %(second)s seconds.",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 415| 415| function getBuildTimeTooltip(entState)
| 416| 416| {
| 417| 417| 	return sprintf(translate("%(label)s %(details)s"), {
| 418|    |-			"label": headerFont(translate("Number of builders:")),
|    | 418|+		"label": headerFont(translate("Number of builders:")),
| 419| 419| 			"details": entState.foundation.numBuilders
| 420| 420| 		}) + "\n" + (entState.foundation.numBuilders ?
| 421| 421| 		sprintf(translatePlural(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 416| 416| {
| 417| 417| 	return sprintf(translate("%(label)s %(details)s"), {
| 418| 418| 			"label": headerFont(translate("Number of builders:")),
| 419|    |-			"details": entState.foundation.numBuilders
|    | 419|+		"details": entState.foundation.numBuilders
| 420| 420| 		}) + "\n" + (entState.foundation.numBuilders ?
| 421| 421| 		sprintf(translatePlural(
| 422| 422| 			"Add another worker to speed up the construction by %(second)s second.",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 1 tab but found 2.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 417| 417| 	return sprintf(translate("%(label)s %(details)s"), {
| 418| 418| 			"label": headerFont(translate("Number of builders:")),
| 419| 419| 			"details": entState.foundation.numBuilders
| 420|    |-		}) + "\n" + (entState.foundation.numBuilders ?
|    | 420|+	}) + "\n" + (entState.foundation.numBuilders ?
| 421| 421| 		sprintf(translatePlural(
| 422| 422| 			"Add another worker to speed up the construction by %(second)s second.",
| 423| 423| 			"Add another worker to speed up the construction by %(second)s seconds.",
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
| 452| 452| 				continue;
| 453| 453| 
| 454| 454| 			if (state.pack.progress == 0)
| 455|    |-			{
|    | 455|+			
| 456| 456| 				if (state.pack.packed)
| 457| 457| 					checks.unpackButton = true;
| 458| 458| 				else
| 459| 459| 					checks.packButton = true;
| 460|    |-			}
|    | 460|+			
| 461| 461| 			else if (state.pack.packed)
| 462| 462| 				checks.unpackCancelButton = true;
| 463| 463| 			else
|    | [NORMAL] ESLintBear (space-before-function-paren):
|    | Unexpected space before function parentheses.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
| 763| 763| 				addResearchToQueue(data.item.researchFacilityId, t);
| 764| 764| 			})(tech);
| 765| 765| 
| 766|    |-			button.onPressRight = (t => function () {
|    | 766|+			button.onPressRight = (t => function() {
| 767| 767| 				showTemplateDetails(
| 768| 768| 					t,
| 769| 769| 					GetTemplateData(data.unitEntStates.find(state => state.id == data.item.researchFacilityId).template).nativeCiv);
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
| 941| 941| 			"player": data.player
| 942| 942| 		});
| 943| 943| 
| 944|    |-		let unitIds = data.unitEntStates.map(status => status.id)
|    | 944|+		let unitIds = data.unitEntStates.map(status => status.id);
| 945| 945| 		let [buildingsCountToTrainFullBatch, fullBatchSize, remainderBatch] =
| 946| 946| 			getTrainingStatus(unitIds, data.item, data.playerState);
| 947| 947| 

binaries/data/mods/public/gui/session/selection_panels.js
|  48| »   »   »   switch·(data.item)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/gui/session/selection_panels.js
|  59| »   »   switch·(data.item)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/gui/session/selection_panels.js
| 731| »   »   »   »   »   »   switch·(entity.check)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/gui/session/selection_panels.js
| 944| »   »   let·unitIds·=·data.unitEntStates.map(status·=>·status.id)
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|  97|  97| 	else if (pos.xx === undefined || pos.x == pos.xx && pos.z == pos.zz)
|  98|  98| 		builder.construct(this.type, pos.x, pos.z, pos.angle, this.metadata);
|  99|  99| 	else // try with the lowest, move towards us unless we're same
| 100|    |-	{
|    | 100|+	
| 101| 101| 		for (let step = 0; step <= 1; step += 0.2)
| 102| 102| 			builder.construct(this.type, step*pos.x + (1-step)*pos.xx, step*pos.z + (1-step)*pos.zz,
| 103| 103| 				pos.angle, this.metadata);
| 104|    |-	}
|    | 104|+	
| 105| 105| 	this.onStart(gameState);
| 106| 106| 	Engine.ProfileStop();
| 107| 107| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 131| 131| 	}
| 132| 132| 
| 133| 133| 	if (!this.position)
| 134|    |-	{
|    | 134|+	
| 135| 135| 		if (template.hasClass("CivCentre"))
| 136| 136| 		{
| 137| 137| 			let pos;
| 177| 177| 			else if (!pos)
| 178| 178| 				return false;
| 179| 179| 		}
| 180|    |-	}
|    | 180|+	
| 181| 181| 
| 182| 182| 	// Compute each tile's closeness to friendly structures:
| 183| 183| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 204| 204| 					placement.set(j, 45);
| 205| 205| 		}
| 206| 206| 		else
| 207|    |-		{
|    | 207|+		
| 208| 208| 			for (let j = 0; j < placement.map.length; ++j)
| 209| 209| 				if (HQ.basesMap.map[j] != 0)
| 210| 210| 					placement.set(j, 45);
| 211|    |-		}
|    | 211|+		
| 212| 212| 
| 213| 213| 		if (!HQ.requireHouses || !template.hasClass("House"))
| 214| 214| 		{
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 211| 211| 		}
| 212| 212| 
| 213| 213| 		if (!HQ.requireHouses || !template.hasClass("House"))
| 214|    |-		{
|    | 214|+		
| 215| 215| 			gameState.getOwnStructures().forEach(function(ent) {
| 216| 216| 				let pos = ent.position();
| 217| 217| 				let x = Math.round(pos[0] / cellSize);
| 245| 245| 				else if (template.genericName() == "Rotary Mill" && ent.hasClass("Field"))
| 246| 246| 					placement.addInfluence(x, z, 60/cellSize, 40);
| 247| 247| 			});
| 248|    |-		}
|    | 248|+		
| 249| 249| 		if (template.hasClass("Farmstead"))
| 250| 250| 		{
| 251| 251| 			for (let j = 0; j < placement.map.length; ++j)
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 219| 219| 
| 220| 220| 				let struct = m.getBuiltEntity(gameState, ent);
| 221| 221| 				if (struct.resourceDropsiteTypes() && struct.resourceDropsiteTypes().indexOf("food") != -1)
| 222|    |-				{
|    | 222|+				
| 223| 223| 					if (template.hasClass("Field") || template.hasClass("Corral"))
| 224| 224| 						placement.addInfluence(x, z, 80/cellSize, 50);
| 225| 225| 					else // If this is not a field add a negative influence because we want to leave this area for fields
| 226| 226| 						placement.addInfluence(x, z, 80/cellSize, -20);
| 227|    |-				}
|    | 227|+				
| 228| 228| 				else if (template.hasClass("House"))
| 229| 229| 				{
| 230| 230| 					if (ent.hasClass("House"))
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 247| 247| 			});
| 248| 248| 		}
| 249| 249| 		if (template.hasClass("Farmstead"))
| 250|    |-		{
|    | 250|+		
| 251| 251| 			for (let j = 0; j < placement.map.length; ++j)
| 252| 252| 			{
| 253| 253| 				let value = placement.map[j] - gameState.sharedScript.resourceMaps.wood.map[j]/3;
| 255| 255| 					value /= 2;	// we need space around farmstead, so disfavor map border
| 256| 256| 				placement.set(j, value);
| 257| 257| 			}
| 258|    |-		}
|    | 258|+		
| 259| 259| 	}
| 260| 260| 
| 261| 261| 	// Requires to be inside our territory, and inside our base territory if required
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 268| 268| 	{
| 269| 269| 		let base = this.metadata.base;
| 270| 270| 		for (let j = 0; j < placement.map.length; ++j)
| 271|    |-		{
|    | 271|+		
| 272| 272| 			if (HQ.basesMap.map[j] != base)
| 273| 273| 				placement.map[j] = 0;
| 274| 274| 			else if (placement.map[j] > 0)
| 283| 283| 				if (HQ.isNearInvadingArmy([x, z]))
| 284| 284| 					placement.map[j] = 0;
| 285| 285| 			}
| 286|    |-		}
|    | 286|+		
| 287| 287| 	}
| 288| 288| 	else
| 289| 289| 	{
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 286| 286| 		}
| 287| 287| 	}
| 288| 288| 	else
| 289|    |-	{
|    | 289|+	
| 290| 290| 		for (let j = 0; j < placement.map.length; ++j)
| 291| 291| 		{
| 292| 292| 			if (HQ.basesMap.map[j] == 0)
| 306| 306| 					placement.set(j, placement.map[j] + 100);
| 307| 307| 			}
| 308| 308| 		}
| 309|    |-	}
|    | 309|+	
| 310| 310| 
| 311| 311| 	// Find the best non-obstructed:
| 312| 312| 	// Find target building's approximate obstruction radius, and expand by a bit to make sure we're not too close,
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 288| 288| 	else
| 289| 289| 	{
| 290| 290| 		for (let j = 0; j < placement.map.length; ++j)
| 291|    |-		{
|    | 291|+		
| 292| 292| 			if (HQ.basesMap.map[j] == 0)
| 293| 293| 				placement.map[j] = 0;
| 294| 294| 			else if (placement.map[j] > 0)
| 305| 305| 				else if (favoredBase && HQ.basesMap.map[j] == favoredBase)
| 306| 306| 					placement.set(j, placement.map[j] + 100);
| 307| 307| 			}
| 308|    |-		}
|    | 308|+		
| 309| 309| 	}
| 310| 310| 
| 311| 311| 	// Find the best non-obstructed:
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 650| 650| 		{
| 651| 651| 			let count = 0;
| 652| 652| 			for (let j = 0; j < length-1; ++j)
| 653|    |-			{
|    | 653|+			
| 654| 654| 				if ((waterPoints[(i + j) % length]+1) % numPoints == waterPoints[(i + j + 1) % length])
| 655| 655| 					++count;
| 656| 656| 				else
| 657| 657| 					break;
| 658|    |-			}
|    | 658|+			
| 659| 659| 			consec[i] = count;
| 660| 660| 		}
| 661| 661| 		let start = 0;
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-in'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 661| 661| 		let start = 0;
| 662| 662| 		let count = 0;
| 663| 663| 		for (let c in consec)
| 664|    |-		{
|    | 664|+		
| 665| 665| 			if (consec[c] > count)
| 666| 666| 			{
| 667| 667| 				start = c;
| 668| 668| 				count = consec[c];
| 669| 669| 			}
| 670|    |-		}
|    | 670|+		
| 671| 671| 
| 672| 672| 		// If we've found a shoreline, stop searching
| 673| 673| 		if (count != numPoints-1)
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87, -0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50, -0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0, -1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50, -0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87, -0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 857| 857| 			let dxmax = size - dy;
| 858| 858| 			let ky = iy + dy;
| 859| 859| 			if (ky >= 0 && ky < w)
| 860|    |-			{
|    | 860|+			
| 861| 861| 				for (let dx = -dxmax; dx <= dxmax; ++dx)
| 862| 862| 				{
| 863| 863| 					let kx = ix + dx;
| 868| 868| 					total += weight * resourceMaps[k].map[kx + w * ky];
| 869| 869| 					nbcell += weight;
| 870| 870| 				}
| 871|    |-			}
|    | 871|+			
| 872| 872| 			if (dy == 0)
| 873| 873| 				continue;
| 874| 874| 			ky = iy - dy;
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 873| 873| 				continue;
| 874| 874| 			ky = iy - dy;
| 875| 875| 			if (ky >= 0 && ky < w)
| 876|    |-			{
|    | 876|+			
| 877| 877| 				for (let dx = -dxmax; dx <= dxmax; ++dx)
| 878| 878| 				{
| 879| 879| 					let kx = ix + dx;
| 884| 884| 					total += weight * resourceMaps[k].map[kx + w * ky];
| 885| 885| 					nbcell += weight;
| 886| 886| 				}
| 887|    |-			}
|    | 887|+			
| 888| 888| 		}
| 889| 889| 	}
| 890| 890| 	return nbcell ? total / nbcell : 0;
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-in'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  10|  10| 
|  11|  11| 	var ret = {};
|  12|  12| 	for (var i in this)
|  13|    |-	{
|    |  13|+	
|  14|  14| 		if (this.hasOwnProperty(i))
|  15|  15| 			ret[i] = this[i];
|  16|    |-	}
|    |  16|+	
|  17|  17| 	ret.modificationCache = {};
|  18|  18| 	return ret;
|  19|  19| };
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '||' should be placed at the end of the line.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  64|  64| 	for (let key of this.unresearchedAutoResearchTechs)
|  65|  65| 	{
|  66|  66| 		let tech = TechnologyTemplates.Get(key);
|  67|    |-		if ((tech.autoResearch && this.CanResearch(key))
|  68|    |-			|| (tech.top && (this.IsTechnologyResearched(tech.top) || this.IsTechnologyResearched(tech.bottom))))
|    |  67|+		if ((tech.autoResearch && this.CanResearch(key)) ||
|    |  68|+			(tech.top && (this.IsTechnologyResearched(tech.top) || this.IsTechnologyResearched(tech.bottom))))
|  69|  69| 		{
|  70|  70| 			this.unresearchedAutoResearchTechs.delete(key);
|  71|  71| 			this.ResearchTechnology(key);
|    | [NORMAL] ESLintBear (space-before-function-paren):
|    | Unexpected space before function parentheses.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  75|  75| };
|  76|  76| 
|  77|  77| // Checks an entity template to see if its technology requirements have been met
|  78|    |-TechnologyManager.prototype.CanProduce = function (templateName)
|    |  78|+TechnologyManager.prototype.CanProduce = function(templateName)
|  79|  79| {
|  80|  80| 	let cmpTempManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
|  81|  81| 	let template = cmpTempManager.GetTemplate(templateName);
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  99|  99| TechnologyManager.prototype.AreTechnologiesResearched = function(techs)
| 100| 100| {
| 101| 101| 	return techs.every((tech) => this.researchedTechs.has(tech));
| 102|    |-}
|    | 102|+};
| 103| 103| 
| 104| 104| TechnologyManager.prototype.IsTechnologyStarted = function(tech)
| 105| 105| {
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 198| 198| 		var classes = cmpIdentity.GetClassesList();
| 199| 199| 		// don't use foundations for the class counts but check if techs apply (e.g. health increase)
| 200| 200| 		if (!Engine.QueryInterface(msg.entity, IID_Foundation))
| 201|    |-		{
|    | 201|+		
| 202| 202| 			for (let cls of classes)
| 203| 203| 			{
| 204| 204| 				this.classCounts[cls] = this.classCounts[cls] || 0;
| 208| 208| 				this.typeCountsByClass[cls][template] = this.typeCountsByClass[cls][template] || 0;
| 209| 209| 				this.typeCountsByClass[cls][template] += 1;
| 210| 210| 			}
| 211|    |-		}
|    | 211|+		
| 212| 212| 
| 213| 213| 		// Newly created entity, check if any researched techs might apply
| 214| 214| 		// (only do this for new entities because even if an entity is converted or captured,
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 291| 291| 	}
| 292| 292| 
| 293| 293| 	if (template.replaces && template.replaces.length > 0)
| 294|    |-	{
|    | 294|+	
| 295| 295| 		for (var i of template.replaces)
| 296| 296| 		{
| 297| 297| 			if (!i || this.IsTechnologyResearched(i))
| 309| 309| 					cmpPlayerEntityLimits.UpdateLimitsFromTech(i);
| 310| 310| 			}
| 311| 311| 		}
| 312|    |-	}
|    | 312|+	
| 313| 313| 
| 314| 314| 	this.UpdateAutoResearch();
| 315| 315| 
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required after '{'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 327| 327| 		cmpPlayerEntityLimits.UpdateLimitsFromTech(tech);
| 328| 328| 
| 329| 329| 	// always send research finished message
| 330|    |-	Engine.PostMessage(this.entity, MT_ResearchFinished, {"player": playerID, "tech": tech});
|    | 330|+	Engine.PostMessage(this.entity, MT_ResearchFinished, { "player": playerID, "tech": tech});
| 331| 331| 
| 332| 332| 	for (var component in modifiedComponents)
| 333| 333| 	{
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 327| 327| 		cmpPlayerEntityLimits.UpdateLimitsFromTech(tech);
| 328| 328| 
| 329| 329| 	// always send research finished message
| 330|    |-	Engine.PostMessage(this.entity, MT_ResearchFinished, {"player": playerID, "tech": tech});
|    | 330|+	Engine.PostMessage(this.entity, MT_ResearchFinished, {"player": playerID, "tech": tech });
| 331| 331| 
| 332| 332| 	for (var component in modifiedComponents)
| 333| 333| 	{
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 331| 331| 
| 332| 332| 	for (var component in modifiedComponents)
| 333| 333| 	{
| 334|    |-		Engine.PostMessage(SYSTEM_ENTITY, MT_TemplateModification, { "player": playerID, "component": component, "valueNames": modifiedComponents[component]});
|    | 334|+		Engine.PostMessage(SYSTEM_ENTITY, MT_TemplateModification, { "player": playerID, "component": component, "valueNames": modifiedComponents[component] });
| 335| 335| 		Engine.BroadcastMessage(MT_ValueModification, { "entities": ents, "component": component, "valueNames": modifiedComponents[component]});
| 336| 336| 	}
| 337| 337| 
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 332| 332| 	for (var component in modifiedComponents)
| 333| 333| 	{
| 334| 334| 		Engine.PostMessage(SYSTEM_ENTITY, MT_TemplateModification, { "player": playerID, "component": component, "valueNames": modifiedComponents[component]});
| 335|    |-		Engine.BroadcastMessage(MT_ValueModification, { "entities": ents, "component": component, "valueNames": modifiedComponents[component]});
|    | 335|+		Engine.BroadcastMessage(MT_ValueModification, { "entities": ents, "component": component, "valueNames": modifiedComponents[component] });
| 336| 336| 	}
| 337| 337| 
| 338| 338| 	if (tech.startsWith("phase") && !template.autoResearch)
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 454| 454|  */
| 455| 455| TechnologyManager.prototype.GetResearcher = function(tech)
| 456| 456| {
| 457|    |-	return this.researchQueued.get(tech)
|    | 457|+	return this.researchQueued.get(tech);
| 458| 458| };
| 459| 459| 
| 460| 460| /**

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 155| »   »   »   switch·(type)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 170| »   switch·(entity.check)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 225| ·»   »   »   »   »   if·(DoesModificationApply(modif,·classes))
|    | [NORMAL] ESLintBear (no-mixed-spaces-and-tabs):
|    | Mixed spaces and tabs.

binaries/data/mods/public/simulation/components/TechnologyManager.js
|  68| »   »   »   ||·(tech.top·&&·(this.IsTechnologyResearched(tech.top)·||·this.IsTechnologyResearched(tech.bottom))))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '||'; readers may interpret this as an expression boundary.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 102| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 234| »   »   »   for·(var·component·in·modifiedComponents)
|    | [NORMAL] JSHintBear:
|    | 'component' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 240| »   »   var·cmpTemplateManager·=·Engine.QueryInterface(SYSTEM_ENTITY,·IID_TemplateManager);
|    | [NORMAL] JSHintBear:
|    | 'cmpTemplateManager' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 241| »   »   var·template·=·cmpTemplateManager.GetCurrentTemplateName(msg.entity);
|    | [NORMAL] JSHintBear:
|    | 'template' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 246| »   »   »   var·cmpIdentity·=·Engine.QueryInterface(msg.entity,·IID_Identity);
|    | [NORMAL] JSHintBear:
|    | 'cmpIdentity' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 249| »   »   »   »   var·classes·=·cmpIdentity.GetClassesList();
|    | [NORMAL] JSHintBear:
|    | 'classes' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 457| »   return·this.researchQueued.get(tech)
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '||' should be placed at the end of the line.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|  87|  87| 		// If the elements are still strings, split them by space or by '+'
|  88|  88| 		if (typeof sublist == "string")
|  89|  89| 			sublist = sublist.split(/[+\s]+/);
|  90|    |-		if (sublist.every(c => (c[0] == "!" && classes.indexOf(c.substr(1)) == -1)
|  91|    |-		                    || (c[0] != "!" && classes.indexOf(c) != -1)))
|    |  90|+		if (sublist.every(c => (c[0] == "!" && classes.indexOf(c.substr(1)) == -1) ||
|    |  91|+		                    (c[0] != "!" && classes.indexOf(c) != -1)))
|  92|  92| 			return true;
|  93|  93| 	}
|  94|  94| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 226| 226| 		{
| 227| 227| 			let aura = auraTemplates[auraID];
| 228| 228| 			ret.auras[auraID] = {
| 229|    |-					"name": aura.auraName,
|    | 229|+				"name": aura.auraName,
| 230| 230| 					"description": aura.auraDescription || null,
| 231| 231| 					"radius": aura.radius || null
| 232| 232| 				};
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 227| 227| 			let aura = auraTemplates[auraID];
| 228| 228| 			ret.auras[auraID] = {
| 229| 229| 					"name": aura.auraName,
| 230|    |-					"description": aura.auraDescription || null,
|    | 230|+				"description": aura.auraDescription || null,
| 231| 231| 					"radius": aura.radius || null
| 232| 232| 				};
| 233| 233| 		}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 228| 228| 			ret.auras[auraID] = {
| 229| 229| 					"name": aura.auraName,
| 230| 230| 					"description": aura.auraDescription || null,
| 231|    |-					"radius": aura.radius || null
|    | 231|+				"radius": aura.radius || null
| 232| 232| 				};
| 233| 233| 		}
| 234| 234| 	}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 4.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 229| 229| 					"name": aura.auraName,
| 230| 230| 					"description": aura.auraDescription || null,
| 231| 231| 					"radius": aura.radius || null
| 232|    |-				};
|    | 232|+			};
| 233| 233| 		}
| 234| 234| 	}
| 235| 235| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 389| 389| 		ret.icon = template.Identity.Icon;
| 390| 390| 		ret.tooltip = template.Identity.Tooltip;
| 391| 391| 		ret.requiredTechnologies = [];
| 392|    |-		if (template.Identity.RequiredTechnologies && template.Identity.RequiredTechnologies._string) {
|    | 392|+		if (template.Identity.RequiredTechnologies && template.Identity.RequiredTechnologies._string) 
| 393| 393| 			ret.requiredTechnologies = template.Identity.RequiredTechnologies._string.split(/\s+/);
| 394|    |-		}
|    | 394|+		
| 395| 395| 		ret.visibleIdentityClasses = GetVisibleIdentityClasses(template.Identity);
| 396| 396| 		ret.nativeCiv = template.Identity.Civ;
| 397| 397| 	}

binaries/data/mods/public/globalscripts/Templates.js
| 392| »   »   if·(template.Identity.RequiredTechnologies·&&·template.Identity.RequiredTechnologies._string)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/globalscripts/Templates.js
|  91| »   »   ····················||·(c[0]·!=·"!"·&&·classes.indexOf(c)·!=·-1)))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '||'; readers may interpret this as an expression boundary.
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 215| 215| m.GameState.prototype.areResearched = function(techs)
| 216| 216| {
| 217| 217| 	return techs.every((tech) => this.playerData.researchedTechs.has(tech));
| 218|    |-}
|    | 218|+};
| 219| 219| 
| 220| 220| /** true if started or queued */
| 221| 221| m.GameState.prototype.isResearching = function(template)
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 615| 615| 	else if (template.resourceSupplyType() !== undefined)	// animal resources
| 616| 616| 		count += this.countEntitiesByType("resource|" + type, true);
| 617| 617| 	else
| 618|    |-	{
|    | 618|+	
| 619| 619| 		// Count entities in building production queues
| 620| 620| 		// TODO: maybe this fails for corrals.
| 621| 621| 		this.getOwnTrainingFacilities().forEach(function(ent) {
| 623| 623| 				if (item.unitTemplate == type)
| 624| 624| 					count += item.count;
| 625| 625| 		});
| 626|    |-	}
|    | 626|+	
| 627| 627| 
| 628| 628| 	return count;
| 629| 629| };
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 775| 775| 				ret.push([techs[1]._templateName, techs[1]]);
| 776| 776| 		}
| 777| 777| 		else if (this.canResearch(tech))
| 778|    |-		{
|    | 778|+		
| 779| 779| 			// Phases are treated separately
| 780| 780| 			if (this.phases.every(phase => template._templateName != phase.name))
| 781| 781| 				ret.push([tech, template]);
| 782|    |-		}
|    | 782|+		
| 783| 783| 	}
| 784| 784| 	return ret;
| 785| 785| };

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 274| »   »   switch·(entity.check)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 291| »   »   »   switch·(type)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 218| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|  66|  66| 		let phase = "";
|  67|  67| 		let cmpTechnologyManager = QueryPlayerIDInterface(i, IID_TechnologyManager);
|  68|  68| 		if (cmpTechnologyManager)
|  69|    |-		{
|    |  69|+		
|  70|  70| 			if (cmpTechnologyManager.IsTechnologyResearched("phase_city"))
|  71|  71| 				phase = "city";
|  72|  72| 			else if (cmpTechnologyManager.IsTechnologyResearched("phase_town"))
|  73|  73| 				phase = "town";
|  74|  74| 			else if (cmpTechnologyManager.IsTechnologyResearched("phase_village"))
|  75|  75| 				phase = "village";
|  76|    |-		}
|    |  76|+		
|  77|  77| 
|  78|  78| 		// store player ally/neutral/enemy data as arrays
|  79|  79| 		let allies = [];
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 410| 410| 			ret.attack[type].elevationBonus = range.elevationBonus;
| 411| 411| 
| 412| 412| 			if (cmpUnitAI && cmpPosition && cmpPosition.IsInWorld())
| 413|    |-			{
|    | 413|+			
| 414| 414| 				// For units, take the range in front of it, no spread. So angle = 0
| 415| 415| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 0);
| 416|    |-			}
|    | 416|+			
| 417| 417| 			else if(cmpPosition && cmpPosition.IsInWorld())
| 418| 418| 			{
| 419| 419| 				// For buildings, take the average elevation around it. So angle = 2*pi
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 415| 415| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 0);
| 416| 416| 			}
| 417| 417| 			else if(cmpPosition && cmpPosition.IsInWorld())
| 418|    |-			{
|    | 418|+			
| 419| 419| 				// For buildings, take the average elevation around it. So angle = 2*pi
| 420| 420| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 2*Math.PI);
| 421|    |-			}
|    | 421|+			
| 422| 422| 			else
| 423| 423| 			{
| 424| 424| 				// not in world, set a default?
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 420| 420| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 2*Math.PI);
| 421| 421| 			}
| 422| 422| 			else
| 423|    |-			{
|    | 423|+			
| 424| 424| 				// not in world, set a default?
| 425| 425| 				ret.attack[type].elevationAdaptedRange = ret.attack.maxRange;
| 426|    |-			}
|    | 426|+			
| 427| 427| 		}
| 428| 428| 	}
| 429| 429| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 804| 804| 		updateEntityColor(data.showAllStatusBars && (i == player || player == -1) ?
| 805| 805| 			[IID_Minimap, IID_RangeOverlayRenderer, IID_RallyPointRenderer, IID_StatusBars] :
| 806| 806| 			[IID_Minimap, IID_RangeOverlayRenderer, IID_RallyPointRenderer],
| 807|    |-			cmpRangeManager.GetEntitiesByPlayer(i));
|    | 807|+		cmpRangeManager.GetEntitiesByPlayer(i));
| 808| 808| 	}
| 809| 809| 	updateEntityColor([IID_Selectable, IID_StatusBars], data.selected);
| 810| 810| 	Engine.QueryInterface(SYSTEM_ENTITY, IID_TerritoryManager).UpdateColors();
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1323|1323| 		}
|1324|1324| 	}
|1325|1325| 	else
|1326|    |-	{
|    |1326|+	
|1327|1327| 		// Didn't snap to an existing entity, add the starting tower manually. To prevent odd-looking rotation jumps
|1328|1328| 		// when shift-clicking to build a wall, reuse the placement angle that was last seen on a validly positioned
|1329|1329| 		// wall piece.
|1344|1344| 			"pos": start.pos,
|1345|1345| 			"angle": previewEntities.length > 0 ? previewEntities[0].angle : this.placementWallLastAngle
|1346|1346| 		});
|1347|    |-	}
|    |1347|+	
|1348|1348| 
|1349|1349| 	if (end.pos)
|1350|1350| 	{
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1347|1347| 	}
|1348|1348| 
|1349|1349| 	if (end.pos)
|1350|    |-	{
|    |1350|+	
|1351|1351| 		// Analogous to the starting side case above
|1352|1352| 		if (end.snappedEnt && end.snappedEnt != INVALID_ENTITY)
|1353|1353| 		{
|1385|1385| 				"pos": end.pos,
|1386|1386| 				"angle": previewEntities.length > 0 ? previewEntities[previewEntities.length-1].angle : this.placementWallLastAngle
|1387|1387| 			});
|1388|    |-	}
|    |1388|+	
|1389|1389| 
|1390|1390| 	let cmpTerrain = Engine.QueryInterface(SYSTEM_ENTITY, IID_Terrain);
|1391|1391| 	if (!cmpTerrain)
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1563|1563| 
|1564|1564| 		let cmpVisual = Engine.QueryInterface(ent, IID_Visual);
|1565|1565| 		if (cmpVisual)
|1566|    |-		{
|    |1566|+		
|1567|1567| 			if (!allPiecesValid || !canAfford)
|1568|1568| 				cmpVisual.SetShadingColor(1.4, 0.4, 0.4, 1);
|1569|1569| 			else
|1570|1570| 				cmpVisual.SetShadingColor(1, 1, 1, 1);
|1571|    |-		}
|    |1571|+		
|1572|1572| 
|1573|1573| 		++entPool.numUsed;
|1574|1574| 	}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1637|1637| 			{
|1638|1638| 				minDist2 = dist2;
|1639|1639| 				minDistEntitySnapData = {
|1640|    |-						"x": pos.x,
|    |1640|+					"x": pos.x,
|1641|1641| 						"z": pos.z,
|1642|1642| 						"angle": cmpPosition.GetRotation().y,
|1643|1643| 						"ent": ent
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1638|1638| 				minDist2 = dist2;
|1639|1639| 				minDistEntitySnapData = {
|1640|1640| 						"x": pos.x,
|1641|    |-						"z": pos.z,
|    |1641|+					"z": pos.z,
|1642|1642| 						"angle": cmpPosition.GetRotation().y,
|1643|1643| 						"ent": ent
|1644|1644| 				};
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1639|1639| 				minDistEntitySnapData = {
|1640|1640| 						"x": pos.x,
|1641|1641| 						"z": pos.z,
|1642|    |-						"angle": cmpPosition.GetRotation().y,
|    |1642|+					"angle": cmpPosition.GetRotation().y,
|1643|1643| 						"ent": ent
|1644|1644| 				};
|1645|1645| 			}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1640|1640| 						"x": pos.x,
|1641|1641| 						"z": pos.z,
|1642|1642| 						"angle": cmpPosition.GetRotation().y,
|1643|    |-						"ent": ent
|    |1643|+					"ent": ent
|1644|1644| 				};
|1645|1645| 			}
|1646|1646| 		}
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1785|1785| 			result.gain = cmpEntityTrader.GetGoods().amount;
|1786|1786| 	}
|1787|1787| 	else if (data.target === secondMarket)
|1788|    |-	{
|    |1788|+	
|1789|1789| 		result = {
|1790|1790| 			"type": "is second",
|1791|1791| 			"gain": cmpEntityTrader.GetGoods().amount,
|1792|1792| 		};
|1793|    |-	}
|    |1793|+	
|1794|1794| 	else if (!firstMarket)
|1795|1795| 	{
|1796|1796| 		result = { "type": "set first" };
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1792|1792| 		};
|1793|1793| 	}
|1794|1794| 	else if (!firstMarket)
|1795|    |-	{
|    |1795|+	
|1796|1796| 		result = { "type": "set first" };
|1797|    |-	}
|    |1797|+	
|1798|1798| 	else if (!secondMarket)
|1799|1799| 	{
|1800|1800| 		result = {
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1796|1796| 		result = { "type": "set first" };
|1797|1797| 	}
|1798|1798| 	else if (!secondMarket)
|1799|    |-	{
|    |1799|+	
|1800|1800| 		result = {
|1801|1801| 			"type": "set second",
|1802|1802| 			"gain": cmpEntityTrader.CalculateGain(firstMarket, data.target),
|1803|1803| 		};
|1804|    |-	}
|    |1804|+	
|1805|1805| 	else
|1806|1806| 	{
|1807|1807| 		// Else both markets are not null and target is different from them
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1803|1803| 		};
|1804|1804| 	}
|1805|1805| 	else
|1806|    |-	{
|    |1806|+	
|1807|1807| 		// Else both markets are not null and target is different from them
|1808|1808| 		result = { "type": "set first" };
|1809|    |-	}
|    |1809|+	
|1810|1810| 	return result;
|1811|1811| };
|1812|1812| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-of'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|  33|  33| 		{
|  34|  34| 			let args = string.split("/");
|  35|  35| 			for (let arg of args)
|  36|    |-			{
|    |  36|+			
|  37|  37| 				if (value[arg])
|  38|  38| 					value = value[arg];
|  39|  39| 				else
|  41|  41| 					value = undefined;
|  42|  42| 					break;
|  43|  43| 				}
|  44|    |-			}
|    |  44|+			
|  45|  45| 			this._tpCache.set(string, value);
|  46|  46| 		}
|  47|  47| 		return this._tpCache.get(string);
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-of'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|  98|  98| 	"phase": function() {
|  99|  99| 		let techsRequired = this.requiredTechs();
| 100| 100| 		let id = 0;
| 101|    |-		for (let techRequired of techsRequired) {
|    | 101|+		for (let techRequired of techsRequired) 
| 102| 102| 			if (techRequired == "phase_village")
| 103| 103| 				id = Math.max(id, 1);
| 104| 104| 			else if (techRequired == "phase_town")
| 107| 107| 				id = Math.max(id, 3);
| 108| 108| 			else if (techRequired.startsWith("phase_"))
| 109| 109| 				id = Math.max(id, 4);
| 110|    |-		}
|    | 110|+		
| 111| 111| 		return id;
| 112| 112| 	},
| 113| 113| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
| 314| 314| 			return undefined;
| 315| 315| 
| 316| 316| 		if (this.get("Attack/" + type + "/Bonuses"))
| 317|    |-		{
|    | 317|+		
| 318| 318| 			for (let b in this.get("Attack/" + type + "/Bonuses"))
| 319| 319| 			{
| 320| 320| 				let bonusClasses = this.get("Attack/" + type + "/Bonuses/" + b + "/Classes");
| 324| 324| 					if (bcl == againstClass)
| 325| 325| 						return +this.get("Attack/" + type + "/Bonuses/" + b + "/Multiplier");
| 326| 326| 			}
| 327|    |-		}
|    | 327|+		
| 328| 328| 		return 1;
| 329| 329| 	},
| 330| 330| 

binaries/data/mods/public/simulation/ai/common-api/entity.js
| 101| »   »   for·(let·techRequired·of·techsRequired)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/simulation/ai/common-api/entity.js
| 804| »   »   if·(this.position()·!==·undefined)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/simulation/ai/common-api/entity.js
| 821| »   »   if·(this.position()·!==·undefined·&&·unitToFleeFrom.position()·!==·undefined)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.
Executing section cli...

Link to build: https://jenkins.wildfiregames.com/job/differential/920/

Silier marked 3 inline comments as done.Jan 6 2019, 11:23 PM
Silier added inline comments.
binaries/data/mods/public/simulation/ai/common-api/entity.js
103

I dont think I can write switch case for .startsWith

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
217

for each loop, for loop, while, or this, I think this is the shortest way

Silier edited the summary of this revision. (Show Details)Jan 7 2019, 7:32 PM
Silier planned changes to this revision.Jan 7 2019, 8:14 PM
lyv added inline comments.Jan 8 2019, 1:07 PM
binaries/data/mods/public/simulation/ai/common-api/entity.js
19

The TODO I mentioned. Although, I have not checked whether what it's saying is true.

Silier updated this revision to Diff 7337.Jan 13 2019, 6:44 PM

fix spy, AI _string, palisade and structure tree

Silier edited the summary of this revision. (Show Details)Jan 13 2019, 6:45 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 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 393| 393| function getRepairTimeTooltip(entState)
| 394| 394| {
| 395| 395| 	return sprintf(translate("%(label)s %(details)s"), {
| 396|    |-			"label": headerFont(translate("Number of repairers:")),
|    | 396|+		"label": headerFont(translate("Number of repairers:")),
| 397| 397| 			"details": entState.repairable.numBuilders
| 398| 398| 		}) + "\n" + (entState.repairable.numBuilders ?
| 399| 399| 		sprintf(translatePlural(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 394| 394| {
| 395| 395| 	return sprintf(translate("%(label)s %(details)s"), {
| 396| 396| 			"label": headerFont(translate("Number of repairers:")),
| 397|    |-			"details": entState.repairable.numBuilders
|    | 397|+		"details": entState.repairable.numBuilders
| 398| 398| 		}) + "\n" + (entState.repairable.numBuilders ?
| 399| 399| 		sprintf(translatePlural(
| 400| 400| 			"Add another worker to speed up the repairs by %(second)s second.",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 1 tab but found 2.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 395| 395| 	return sprintf(translate("%(label)s %(details)s"), {
| 396| 396| 			"label": headerFont(translate("Number of repairers:")),
| 397| 397| 			"details": entState.repairable.numBuilders
| 398|    |-		}) + "\n" + (entState.repairable.numBuilders ?
|    | 398|+	}) + "\n" + (entState.repairable.numBuilders ?
| 399| 399| 		sprintf(translatePlural(
| 400| 400| 			"Add another worker to speed up the repairs by %(second)s second.",
| 401| 401| 			"Add another worker to speed up the repairs by %(second)s seconds.",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 415| 415| function getBuildTimeTooltip(entState)
| 416| 416| {
| 417| 417| 	return sprintf(translate("%(label)s %(details)s"), {
| 418|    |-			"label": headerFont(translate("Number of builders:")),
|    | 418|+		"label": headerFont(translate("Number of builders:")),
| 419| 419| 			"details": entState.foundation.numBuilders
| 420| 420| 		}) + "\n" + (entState.foundation.numBuilders ?
| 421| 421| 		sprintf(translatePlural(
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 416| 416| {
| 417| 417| 	return sprintf(translate("%(label)s %(details)s"), {
| 418| 418| 			"label": headerFont(translate("Number of builders:")),
| 419|    |-			"details": entState.foundation.numBuilders
|    | 419|+		"details": entState.foundation.numBuilders
| 420| 420| 		}) + "\n" + (entState.foundation.numBuilders ?
| 421| 421| 		sprintf(translatePlural(
| 422| 422| 			"Add another worker to speed up the construction by %(second)s second.",
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 1 tab but found 2.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/common/tooltips.js
| 417| 417| 	return sprintf(translate("%(label)s %(details)s"), {
| 418| 418| 			"label": headerFont(translate("Number of builders:")),
| 419| 419| 			"details": entState.foundation.numBuilders
| 420|    |-		}) + "\n" + (entState.foundation.numBuilders ?
|    | 420|+	}) + "\n" + (entState.foundation.numBuilders ?
| 421| 421| 		sprintf(translatePlural(
| 422| 422| 			"Add another worker to speed up the construction by %(second)s second.",
| 423| 423| 			"Add another worker to speed up the construction by %(second)s seconds.",
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '||' should be placed at the end of the line.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|  87|  87| 		// If the elements are still strings, split them by space or by '+'
|  88|  88| 		if (typeof sublist == "string")
|  89|  89| 			sublist = sublist.split(/[+\s]+/);
|  90|    |-		if (sublist.every(c => (c[0] == "!" && classes.indexOf(c.substr(1)) == -1)
|  91|    |-		                    || (c[0] != "!" && classes.indexOf(c) != -1)))
|    |  90|+		if (sublist.every(c => (c[0] == "!" && classes.indexOf(c.substr(1)) == -1) ||
|    |  91|+		                    (c[0] != "!" && classes.indexOf(c) != -1)))
|  92|  92| 			return true;
|  93|  93| 	}
|  94|  94| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 226| 226| 		{
| 227| 227| 			let aura = auraTemplates[auraID];
| 228| 228| 			ret.auras[auraID] = {
| 229|    |-					"name": aura.auraName,
|    | 229|+				"name": aura.auraName,
| 230| 230| 					"description": aura.auraDescription || null,
| 231| 231| 					"radius": aura.radius || null
| 232| 232| 				};
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 227| 227| 			let aura = auraTemplates[auraID];
| 228| 228| 			ret.auras[auraID] = {
| 229| 229| 					"name": aura.auraName,
| 230|    |-					"description": aura.auraDescription || null,
|    | 230|+				"description": aura.auraDescription || null,
| 231| 231| 					"radius": aura.radius || null
| 232| 232| 				};
| 233| 233| 		}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 4 tabs but found 5.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 228| 228| 			ret.auras[auraID] = {
| 229| 229| 					"name": aura.auraName,
| 230| 230| 					"description": aura.auraDescription || null,
| 231|    |-					"radius": aura.radius || null
|    | 231|+				"radius": aura.radius || null
| 232| 232| 				};
| 233| 233| 		}
| 234| 234| 	}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 4.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 229| 229| 					"name": aura.auraName,
| 230| 230| 					"description": aura.auraDescription || null,
| 231| 231| 					"radius": aura.radius || null
| 232|    |-				};
|    | 232|+			};
| 233| 233| 		}
| 234| 234| 	}
| 235| 235| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/globalscripts/Templates.js
| 389| 389| 		ret.icon = template.Identity.Icon;
| 390| 390| 		ret.tooltip = template.Identity.Tooltip;
| 391| 391| 		ret.requiredTechnologies = [];
| 392|    |-		if (template.Identity.RequiredTechnologies && template.Identity.RequiredTechnologies._string) {
|    | 392|+		if (template.Identity.RequiredTechnologies && template.Identity.RequiredTechnologies._string) 
| 393| 393| 			ret.requiredTechnologies = template.Identity.RequiredTechnologies._string.split(/\s+/);
| 394|    |-		}
|    | 394|+		
| 395| 395| 		ret.visibleIdentityClasses = GetVisibleIdentityClasses(template.Identity);
| 396| 396| 		ret.nativeCiv = template.Identity.Civ;
| 397| 397| 	}

binaries/data/mods/public/globalscripts/Templates.js
| 392| »   »   if·(template.Identity.RequiredTechnologies·&&·template.Identity.RequiredTechnologies._string)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/globalscripts/Templates.js
|  91| »   »   ····················||·(c[0]·!=·"!"·&&·classes.indexOf(c)·!=·-1)))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '||'; readers may interpret this as an expression boundary.
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/menu.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/menu.js
| 873| 873| 	Engine.GetGUIObjectByName("barterHelp").hidden = !canBarter;
| 874| 874| 
| 875| 875| 	if (canBarter)
| 876|    |-		g_ResourceData.GetCodes().forEach((resCode, i) => { barterUpdateCommon(resCode, i, "barter", g_ViewedPlayer) });
|    | 876|+		g_ResourceData.GetCodes().forEach((resCode, i) => { barterUpdateCommon(resCode, i, "barter", g_ViewedPlayer); });
| 877| 877| }
| 878| 878| 
| 879| 879| function getIdleLandTradersText(traderNumber)

binaries/data/mods/public/gui/session/menu.js
| 482| »   »   button.onPress·=·(function(player,·stance)·{·return·function()·{
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'stance' is already declared in the upper scope.

binaries/data/mods/public/gui/session/menu.js
| 514| »   »   button.onPress·=·(function(i,·resCode,·button)·{
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.

binaries/data/mods/public/gui/session/menu.js
| 514| »   »   button.onPress·=·(function(i,·resCode,·button)·{
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'resCode' is already declared in the upper scope.

binaries/data/mods/public/gui/session/menu.js
| 514| »   »   button.onPress·=·(function(i,·resCode,·button)·{
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'button' is already declared in the upper scope.

binaries/data/mods/public/gui/session/menu.js
| 557| »   button.onPress·=·(function(i)·{·return·function()·{
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.

binaries/data/mods/public/gui/session/menu.js
| 623| »   button.onPress·=·(function(i,·button)·{·return·function()·{
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'i' is already declared in the upper scope.

binaries/data/mods/public/gui/session/menu.js
| 623| »   button.onPress·=·(function(i,·button)·{·return·function()·{
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'button' is already declared in the upper scope.

binaries/data/mods/public/gui/session/menu.js
| 876| »   »   g_ResourceData.GetCodes().forEach((resCode,·i)·=>·{·barterUpdateCommon(resCode,·i,·"barter",·g_ViewedPlayer)·});
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|  66|  66| 		let phase = "";
|  67|  67| 		let cmpTechnologyManager = QueryPlayerIDInterface(i, IID_TechnologyManager);
|  68|  68| 		if (cmpTechnologyManager)
|  69|    |-		{
|    |  69|+		
|  70|  70| 			if (cmpTechnologyManager.IsTechnologyResearched("phase_city"))
|  71|  71| 				phase = "city";
|  72|  72| 			else if (cmpTechnologyManager.IsTechnologyResearched("phase_town"))
|  73|  73| 				phase = "town";
|  74|  74| 			else if (cmpTechnologyManager.IsTechnologyResearched("phase_village"))
|  75|  75| 				phase = "village";
|  76|    |-		}
|    |  76|+		
|  77|  77| 
|  78|  78| 		// store player ally/neutral/enemy data as arrays
|  79|  79| 		let allies = [];
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 410| 410| 			ret.attack[type].elevationBonus = range.elevationBonus;
| 411| 411| 
| 412| 412| 			if (cmpUnitAI && cmpPosition && cmpPosition.IsInWorld())
| 413|    |-			{
|    | 413|+			
| 414| 414| 				// For units, take the range in front of it, no spread. So angle = 0
| 415| 415| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 0);
| 416|    |-			}
|    | 416|+			
| 417| 417| 			else if(cmpPosition && cmpPosition.IsInWorld())
| 418| 418| 			{
| 419| 419| 				// For buildings, take the average elevation around it. So angle = 2*pi
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 415| 415| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 0);
| 416| 416| 			}
| 417| 417| 			else if(cmpPosition && cmpPosition.IsInWorld())
| 418|    |-			{
|    | 418|+			
| 419| 419| 				// For buildings, take the average elevation around it. So angle = 2*pi
| 420| 420| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 2*Math.PI);
| 421|    |-			}
|    | 421|+			
| 422| 422| 			else
| 423| 423| 			{
| 424| 424| 				// not in world, set a default?
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 420| 420| 				ret.attack[type].elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 2*Math.PI);
| 421| 421| 			}
| 422| 422| 			else
| 423|    |-			{
|    | 423|+			
| 424| 424| 				// not in world, set a default?
| 425| 425| 				ret.attack[type].elevationAdaptedRange = ret.attack.maxRange;
| 426|    |-			}
|    | 426|+			
| 427| 427| 		}
| 428| 428| 	}
| 429| 429| 
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 3.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
| 804| 804| 		updateEntityColor(data.showAllStatusBars && (i == player || player == -1) ?
| 805| 805| 			[IID_Minimap, IID_RangeOverlayRenderer, IID_RallyPointRenderer, IID_StatusBars] :
| 806| 806| 			[IID_Minimap, IID_RangeOverlayRenderer, IID_RallyPointRenderer],
| 807|    |-			cmpRangeManager.GetEntitiesByPlayer(i));
|    | 807|+		cmpRangeManager.GetEntitiesByPlayer(i));
| 808| 808| 	}
| 809| 809| 	updateEntityColor([IID_Selectable, IID_StatusBars], data.selected);
| 810| 810| 	Engine.QueryInterface(SYSTEM_ENTITY, IID_TerritoryManager).UpdateColors();
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1323|1323| 		}
|1324|1324| 	}
|1325|1325| 	else
|1326|    |-	{
|    |1326|+	
|1327|1327| 		// Didn't snap to an existing entity, add the starting tower manually. To prevent odd-looking rotation jumps
|1328|1328| 		// when shift-clicking to build a wall, reuse the placement angle that was last seen on a validly positioned
|1329|1329| 		// wall piece.
|1344|1344| 			"pos": start.pos,
|1345|1345| 			"angle": previewEntities.length > 0 ? previewEntities[0].angle : this.placementWallLastAngle
|1346|1346| 		});
|1347|    |-	}
|    |1347|+	
|1348|1348| 
|1349|1349| 	if (end.pos)
|1350|1350| 	{
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1347|1347| 	}
|1348|1348| 
|1349|1349| 	if (end.pos)
|1350|    |-	{
|    |1350|+	
|1351|1351| 		// Analogous to the starting side case above
|1352|1352| 		if (end.snappedEnt && end.snappedEnt != INVALID_ENTITY)
|1353|1353| 		{
|1385|1385| 				"pos": end.pos,
|1386|1386| 				"angle": previewEntities.length > 0 ? previewEntities[previewEntities.length-1].angle : this.placementWallLastAngle
|1387|1387| 			});
|1388|    |-	}
|    |1388|+	
|1389|1389| 
|1390|1390| 	let cmpTerrain = Engine.QueryInterface(SYSTEM_ENTITY, IID_Terrain);
|1391|1391| 	if (!cmpTerrain)
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1563|1563| 
|1564|1564| 		let cmpVisual = Engine.QueryInterface(ent, IID_Visual);
|1565|1565| 		if (cmpVisual)
|1566|    |-		{
|    |1566|+		
|1567|1567| 			if (!allPiecesValid || !canAfford)
|1568|1568| 				cmpVisual.SetShadingColor(1.4, 0.4, 0.4, 1);
|1569|1569| 			else
|1570|1570| 				cmpVisual.SetShadingColor(1, 1, 1, 1);
|1571|    |-		}
|    |1571|+		
|1572|1572| 
|1573|1573| 		++entPool.numUsed;
|1574|1574| 	}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1637|1637| 			{
|1638|1638| 				minDist2 = dist2;
|1639|1639| 				minDistEntitySnapData = {
|1640|    |-						"x": pos.x,
|    |1640|+					"x": pos.x,
|1641|1641| 						"z": pos.z,
|1642|1642| 						"angle": cmpPosition.GetRotation().y,
|1643|1643| 						"ent": ent
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1638|1638| 				minDist2 = dist2;
|1639|1639| 				minDistEntitySnapData = {
|1640|1640| 						"x": pos.x,
|1641|    |-						"z": pos.z,
|    |1641|+					"z": pos.z,
|1642|1642| 						"angle": cmpPosition.GetRotation().y,
|1643|1643| 						"ent": ent
|1644|1644| 				};
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1639|1639| 				minDistEntitySnapData = {
|1640|1640| 						"x": pos.x,
|1641|1641| 						"z": pos.z,
|1642|    |-						"angle": cmpPosition.GetRotation().y,
|    |1642|+					"angle": cmpPosition.GetRotation().y,
|1643|1643| 						"ent": ent
|1644|1644| 				};
|1645|1645| 			}
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 5 tabs but found 6.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1640|1640| 						"x": pos.x,
|1641|1641| 						"z": pos.z,
|1642|1642| 						"angle": cmpPosition.GetRotation().y,
|1643|    |-						"ent": ent
|    |1643|+					"ent": ent
|1644|1644| 				};
|1645|1645| 			}
|1646|1646| 		}
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1785|1785| 			result.gain = cmpEntityTrader.GetGoods().amount;
|1786|1786| 	}
|1787|1787| 	else if (data.target === secondMarket)
|1788|    |-	{
|    |1788|+	
|1789|1789| 		result = {
|1790|1790| 			"type": "is second",
|1791|1791| 			"gain": cmpEntityTrader.GetGoods().amount,
|1792|1792| 		};
|1793|    |-	}
|    |1793|+	
|1794|1794| 	else if (!firstMarket)
|1795|1795| 	{
|1796|1796| 		result = { "type": "set first" };
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1792|1792| 		};
|1793|1793| 	}
|1794|1794| 	else if (!firstMarket)
|1795|    |-	{
|    |1795|+	
|1796|1796| 		result = { "type": "set first" };
|1797|    |-	}
|    |1797|+	
|1798|1798| 	else if (!secondMarket)
|1799|1799| 	{
|1800|1800| 		result = {
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1796|1796| 		result = { "type": "set first" };
|1797|1797| 	}
|1798|1798| 	else if (!secondMarket)
|1799|    |-	{
|    |1799|+	
|1800|1800| 		result = {
|1801|1801| 			"type": "set second",
|1802|1802| 			"gain": cmpEntityTrader.CalculateGain(firstMarket, data.target),
|1803|1803| 		};
|1804|    |-	}
|    |1804|+	
|1805|1805| 	else
|1806|1806| 	{
|1807|1807| 		// Else both markets are not null and target is different from them
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/GuiInterface.js
|1803|1803| 		};
|1804|1804| 	}
|1805|1805| 	else
|1806|    |-	{
|    |1806|+	
|1807|1807| 		// Else both markets are not null and target is different from them
|1808|1808| 		result = { "type": "set first" };
|1809|    |-	}
|    |1809|+	
|1810|1810| 	return result;
|1811|1811| };
|1812|1812| 
|    | [NORMAL] ESLintBear (space-before-function-paren):
|    | Unexpected space before function parentheses.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/Identity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/Identity.js
| 100| 100| 	this.visibleClassesList = GetVisibleIdentityClasses(this.template);
| 101| 101| };
| 102| 102| 
| 103|    |-Identity.prototype.Deserialize = function ()
|    | 103|+Identity.prototype.Deserialize = function()
| 104| 104| {
| 105| 105| 	this.Init();
| 106| 106| };
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 215| 215| m.GameState.prototype.areResearched = function(techs)
| 216| 216| {
| 217| 217| 	return techs.every((tech) => this.playerData.researchedTechs.has(tech));
| 218|    |-}
|    | 218|+};
| 219| 219| 
| 220| 220| /** true if started or queued */
| 221| 221| m.GameState.prototype.isResearching = function(template)
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 615| 615| 	else if (template.resourceSupplyType() !== undefined)	// animal resources
| 616| 616| 		count += this.countEntitiesByType("resource|" + type, true);
| 617| 617| 	else
| 618|    |-	{
|    | 618|+	
| 619| 619| 		// Count entities in building production queues
| 620| 620| 		// TODO: maybe this fails for corrals.
| 621| 621| 		this.getOwnTrainingFacilities().forEach(function(ent) {
| 623| 623| 				if (item.unitTemplate == type)
| 624| 624| 					count += item.count;
| 625| 625| 		});
| 626|    |-	}
|    | 626|+	
| 627| 627| 
| 628| 628| 	return count;
| 629| 629| };
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 775| 775| 				ret.push([techs[1]._templateName, techs[1]]);
| 776| 776| 		}
| 777| 777| 		else if (this.canResearch(tech))
| 778|    |-		{
|    | 778|+		
| 779| 779| 			// Phases are treated separately
| 780| 780| 			if (this.phases.every(phase => template._templateName != phase.name))
| 781| 781| 				ret.push([tech, template]);
| 782|    |-		}
|    | 782|+		
| 783| 783| 	}
| 784| 784| 	return ret;
| 785| 785| };

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 274| »   »   switch·(entity.check)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 291| »   »   »   switch·(type)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
| 218| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|  97|  97| 	else if (pos.xx === undefined || pos.x == pos.xx && pos.z == pos.zz)
|  98|  98| 		builder.construct(this.type, pos.x, pos.z, pos.angle, this.metadata);
|  99|  99| 	else // try with the lowest, move towards us unless we're same
| 100|    |-	{
|    | 100|+	
| 101| 101| 		for (let step = 0; step <= 1; step += 0.2)
| 102| 102| 			builder.construct(this.type, step*pos.x + (1-step)*pos.xx, step*pos.z + (1-step)*pos.zz,
| 103| 103| 				pos.angle, this.metadata);
| 104|    |-	}
|    | 104|+	
| 105| 105| 	this.onStart(gameState);
| 106| 106| 	Engine.ProfileStop();
| 107| 107| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 131| 131| 	}
| 132| 132| 
| 133| 133| 	if (!this.position)
| 134|    |-	{
|    | 134|+	
| 135| 135| 		if (template.hasClass("CivCentre"))
| 136| 136| 		{
| 137| 137| 			let pos;
| 177| 177| 			else if (!pos)
| 178| 178| 				return false;
| 179| 179| 		}
| 180|    |-	}
|    | 180|+	
| 181| 181| 
| 182| 182| 	// Compute each tile's closeness to friendly structures:
| 183| 183| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 204| 204| 					placement.set(j, 45);
| 205| 205| 		}
| 206| 206| 		else
| 207|    |-		{
|    | 207|+		
| 208| 208| 			for (let j = 0; j < placement.map.length; ++j)
| 209| 209| 				if (HQ.basesMap.map[j] != 0)
| 210| 210| 					placement.set(j, 45);
| 211|    |-		}
|    | 211|+		
| 212| 212| 
| 213| 213| 		if (!HQ.requireHouses || !template.hasClass("House"))
| 214| 214| 		{
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 211| 211| 		}
| 212| 212| 
| 213| 213| 		if (!HQ.requireHouses || !template.hasClass("House"))
| 214|    |-		{
|    | 214|+		
| 215| 215| 			gameState.getOwnStructures().forEach(function(ent) {
| 216| 216| 				let pos = ent.position();
| 217| 217| 				let x = Math.round(pos[0] / cellSize);
| 245| 245| 				else if (template.genericName() == "Rotary Mill" && ent.hasClass("Field"))
| 246| 246| 					placement.addInfluence(x, z, 60/cellSize, 40);
| 247| 247| 			});
| 248|    |-		}
|    | 248|+		
| 249| 249| 		if (template.hasClass("Farmstead"))
| 250| 250| 		{
| 251| 251| 			for (let j = 0; j < placement.map.length; ++j)
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 219| 219| 
| 220| 220| 				let struct = m.getBuiltEntity(gameState, ent);
| 221| 221| 				if (struct.resourceDropsiteTypes() && struct.resourceDropsiteTypes().indexOf("food") != -1)
| 222|    |-				{
|    | 222|+				
| 223| 223| 					if (template.hasClass("Field") || template.hasClass("Corral"))
| 224| 224| 						placement.addInfluence(x, z, 80/cellSize, 50);
| 225| 225| 					else // If this is not a field add a negative influence because we want to leave this area for fields
| 226| 226| 						placement.addInfluence(x, z, 80/cellSize, -20);
| 227|    |-				}
|    | 227|+				
| 228| 228| 				else if (template.hasClass("House"))
| 229| 229| 				{
| 230| 230| 					if (ent.hasClass("House"))
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 247| 247| 			});
| 248| 248| 		}
| 249| 249| 		if (template.hasClass("Farmstead"))
| 250|    |-		{
|    | 250|+		
| 251| 251| 			for (let j = 0; j < placement.map.length; ++j)
| 252| 252| 			{
| 253| 253| 				let value = placement.map[j] - gameState.sharedScript.resourceMaps.wood.map[j]/3;
| 255| 255| 					value /= 2;	// we need space around farmstead, so disfavor map border
| 256| 256| 				placement.set(j, value);
| 257| 257| 			}
| 258|    |-		}
|    | 258|+		
| 259| 259| 	}
| 260| 260| 
| 261| 261| 	// Requires to be inside our territory, and inside our base territory if required
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 268| 268| 	{
| 269| 269| 		let base = this.metadata.base;
| 270| 270| 		for (let j = 0; j < placement.map.length; ++j)
| 271|    |-		{
|    | 271|+		
| 272| 272| 			if (HQ.basesMap.map[j] != base)
| 273| 273| 				placement.map[j] = 0;
| 274| 274| 			else if (placement.map[j] > 0)
| 283| 283| 				if (HQ.isNearInvadingArmy([x, z]))
| 284| 284| 					placement.map[j] = 0;
| 285| 285| 			}
| 286|    |-		}
|    | 286|+		
| 287| 287| 	}
| 288| 288| 	else
| 289| 289| 	{
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'else'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 286| 286| 		}
| 287| 287| 	}
| 288| 288| 	else
| 289|    |-	{
|    | 289|+	
| 290| 290| 		for (let j = 0; j < placement.map.length; ++j)
| 291| 291| 		{
| 292| 292| 			if (HQ.basesMap.map[j] == 0)
| 306| 306| 					placement.set(j, placement.map[j] + 100);
| 307| 307| 			}
| 308| 308| 		}
| 309|    |-	}
|    | 309|+	
| 310| 310| 
| 311| 311| 	// Find the best non-obstructed:
| 312| 312| 	// Find target building's approximate obstruction radius, and expand by a bit to make sure we're not too close,
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 288| 288| 	else
| 289| 289| 	{
| 290| 290| 		for (let j = 0; j < placement.map.length; ++j)
| 291|    |-		{
|    | 291|+		
| 292| 292| 			if (HQ.basesMap.map[j] == 0)
| 293| 293| 				placement.map[j] = 0;
| 294| 294| 			else if (placement.map[j] > 0)
| 305| 305| 				else if (favoredBase && HQ.basesMap.map[j] == favoredBase)
| 306| 306| 					placement.set(j, placement.map[j] + 100);
| 307| 307| 			}
| 308|    |-		}
|    | 308|+		
| 309| 309| 	}
| 310| 310| 
| 311| 311| 	// Find the best non-obstructed:
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 650| 650| 		{
| 651| 651| 			let count = 0;
| 652| 652| 			for (let j = 0; j < length-1; ++j)
| 653|    |-			{
|    | 653|+			
| 654| 654| 				if ((waterPoints[(i + j) % length]+1) % numPoints == waterPoints[(i + j + 1) % length])
| 655| 655| 					++count;
| 656| 656| 				else
| 657| 657| 					break;
| 658|    |-			}
|    | 658|+			
| 659| 659| 			consec[i] = count;
| 660| 660| 		}
| 661| 661| 		let start = 0;
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-in'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 661| 661| 		let start = 0;
| 662| 662| 		let count = 0;
| 663| 663| 		for (let c in consec)
| 664|    |-		{
|    | 664|+		
| 665| 665| 			if (consec[c] > count)
| 666| 666| 			{
| 667| 667| 				start = c;
| 668| 668| 				count = consec[c];
| 669| 669| 			}
| 670|    |-		}
|    | 670|+		
| 671| 671| 
| 672| 672| 		// If we've found a shoreline, stop searching
| 673| 673| 		if (count != numPoints-1)
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87, -0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50, -0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0, -1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50, -0.87], [ 0.87,-0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 744| 744|  * if wantedSea is given, this tile should be inside this sea
| 745| 745|  */
| 746| 746| const around = [[ 1.0, 0.0], [ 0.87, 0.50], [ 0.50, 0.87], [ 0.0, 1.0], [-0.50, 0.87], [-0.87, 0.50],
| 747|    |-	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87,-0.50]];
|    | 747|+	        [-1.0, 0.0], [-0.87,-0.50], [-0.50,-0.87], [ 0.0,-1.0], [ 0.50,-0.87], [ 0.87, -0.50]];
| 748| 748| 
| 749| 749| m.ConstructionPlan.prototype.isDockLocation = function(gameState, j, dimension, wantedLand, wantedSea)
| 750| 750| {
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 857| 857| 			let dxmax = size - dy;
| 858| 858| 			let ky = iy + dy;
| 859| 859| 			if (ky >= 0 && ky < w)
| 860|    |-			{
|    | 860|+			
| 861| 861| 				for (let dx = -dxmax; dx <= dxmax; ++dx)
| 862| 862| 				{
| 863| 863| 					let kx = ix + dx;
| 868| 868| 					total += weight * resourceMaps[k].map[kx + w * ky];
| 869| 869| 					nbcell += weight;
| 870| 870| 				}
| 871|    |-			}
|    | 871|+			
| 872| 872| 			if (dy == 0)
| 873| 873| 				continue;
| 874| 874| 			ky = iy - dy;
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/petra/queueplanBuilding.js
| 873| 873| 				continue;
| 874| 874| 			ky = iy - dy;
| 875| 875| 			if (ky >= 0 && ky < w)
| 876|    |-			{
|    | 876|+			
| 877| 877| 				for (let dx = -dxmax; dx <= dxmax; ++dx)
| 878| 878| 				{
| 879| 879| 					let kx = ix + dx;
| 884| 884| 					total += weight * resourceMaps[k].map[kx + w * ky];
| 885| 885| 					nbcell += weight;
| 886| 886| 				}
| 887|    |-			}
|    | 887|+			
| 888| 888| 		}
| 889| 889| 	}
| 890| 890| 	return nbcell ? total / nbcell : 0;
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-of'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|  33|  33| 		{
|  34|  34| 			let args = string.split("/");
|  35|  35| 			for (let arg of args)
|  36|    |-			{
|    |  36|+			
|  37|  37| 				if (value[arg])
|  38|  38| 					value = value[arg];
|  39|  39| 				else
|  41|  41| 					value = undefined;
|  42|  42| 					break;
|  43|  43| 				}
|  44|    |-			}
|    |  44|+			
|  45|  45| 			this._tpCache.set(string, value);
|  46|  46| 		}
|  47|  47| 		return this._tpCache.get(string);
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-of'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|  99|  99| 	"phase": function() {
| 100| 100| 		let techsRequired = this.requiredTechs();
| 101| 101| 		let id = 0;
| 102|    |-		for (let techRequired of techsRequired) {
|    | 102|+		for (let techRequired of techsRequired) 
| 103| 103| 			if (techRequired == "phase_village")
| 104| 104| 				id = Math.max(id, 1);
| 105| 105| 			else if (techRequired == "phase_town")
| 108| 108| 				id = Math.max(id, 3);
| 109| 109| 			else if (techRequired.startsWith("phase_"))
| 110| 110| 				id = Math.max(id, 4);
| 111|    |-		}
|    | 111|+		
| 112| 112| 		return id;
| 113| 113| 	},
| 114| 114| 
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/ai/common-api/entity.js
| 315| 315| 			return undefined;
| 316| 316| 
| 317| 317| 		if (this.get("Attack/" + type + "/Bonuses"))
| 318|    |-		{
|    | 318|+		
| 319| 319| 			for (let b in this.get("Attack/" + type + "/Bonuses"))
| 320| 320| 			{
| 321| 321| 				let bonusClasses = this.get("Attack/" + type + "/Bonuses/" + b + "/Classes");
| 325| 325| 					if (bcl == againstClass)
| 326| 326| 						return +this.get("Attack/" + type + "/Bonuses/" + b + "/Multiplier");
| 327| 327| 			}
| 328|    |-		}
|    | 328|+		
| 329| 329| 		return 1;
| 330| 330| 	},
| 331| 331| 

binaries/data/mods/public/simulation/ai/common-api/entity.js
| 102| »   »   for·(let·techRequired·of·techsRequired)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/simulation/ai/common-api/entity.js
| 805| »   »   if·(this.position()·!==·undefined)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.

binaries/data/mods/public/simulation/ai/common-api/entity.js
| 822| »   »   if·(this.position()·!==·undefined·&&·unitToFleeFrom.position()·!==·undefined)·{
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-in'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  10|  10| 
|  11|  11| 	var ret = {};
|  12|  12| 	for (var i in this)
|  13|    |-	{
|    |  13|+	
|  14|  14| 		if (this.hasOwnProperty(i))
|  15|  15| 			ret[i] = this[i];
|  16|    |-	}
|    |  16|+	
|  17|  17| 	ret.modificationCache = {};
|  18|  18| 	return ret;
|  19|  19| };
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '||' should be placed at the end of the line.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  64|  64| 	for (let key of this.unresearchedAutoResearchTechs)
|  65|  65| 	{
|  66|  66| 		let tech = TechnologyTemplates.Get(key);
|  67|    |-		if ((tech.autoResearch && this.CanResearch(key))
|  68|    |-			|| (tech.top && (this.IsTechnologyResearched(tech.top) || this.IsTechnologyResearched(tech.bottom))))
|    |  67|+		if ((tech.autoResearch && this.CanResearch(key)) ||
|    |  68|+			(tech.top && (this.IsTechnologyResearched(tech.top) || this.IsTechnologyResearched(tech.bottom))))
|  69|  69| 		{
|  70|  70| 			this.unresearchedAutoResearchTechs.delete(key);
|  71|  71| 			this.ResearchTechnology(key);
|    | [NORMAL] ESLintBear (space-before-function-paren):
|    | Unexpected space before function parentheses.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  75|  75| };
|  76|  76| 
|  77|  77| // Checks an entity template to see if its technology requirements have been met
|  78|    |-TechnologyManager.prototype.CanProduce = function (templateName)
|    |  78|+TechnologyManager.prototype.CanProduce = function(templateName)
|  79|  79| {
|  80|  80| 	let cmpTempManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
|  81|  81| 	let template = cmpTempManager.GetTemplate(templateName);
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|  99|  99| TechnologyManager.prototype.AreTechnologiesResearched = function(techs)
| 100| 100| {
| 101| 101| 	return techs.every((tech) => this.researchedTechs.has(tech));
| 102|    |-}
|    | 102|+};
| 103| 103| 
| 104| 104| TechnologyManager.prototype.IsTechnologyStarted = function(tech)
| 105| 105| {
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 198| 198| 		var classes = cmpIdentity.GetClassesList();
| 199| 199| 		// don't use foundations for the class counts but check if techs apply (e.g. health increase)
| 200| 200| 		if (!Engine.QueryInterface(msg.entity, IID_Foundation))
| 201|    |-		{
|    | 201|+		
| 202| 202| 			for (let cls of classes)
| 203| 203| 			{
| 204| 204| 				this.classCounts[cls] = this.classCounts[cls] || 0;
| 208| 208| 				this.typeCountsByClass[cls][template] = this.typeCountsByClass[cls][template] || 0;
| 209| 209| 				this.typeCountsByClass[cls][template] += 1;
| 210| 210| 			}
| 211|    |-		}
|    | 211|+		
| 212| 212| 
| 213| 213| 		// Newly created entity, check if any researched techs might apply
| 214| 214| 		// (only do this for new entities because even if an entity is converted or captured,
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 291| 291| 	}
| 292| 292| 
| 293| 293| 	if (template.replaces && template.replaces.length > 0)
| 294|    |-	{
|    | 294|+	
| 295| 295| 		for (var i of template.replaces)
| 296| 296| 		{
| 297| 297| 			if (!i || this.IsTechnologyResearched(i))
| 309| 309| 					cmpPlayerEntityLimits.UpdateLimitsFromTech(i);
| 310| 310| 			}
| 311| 311| 		}
| 312|    |-	}
|    | 312|+	
| 313| 313| 
| 314| 314| 	this.UpdateAutoResearch();
| 315| 315| 
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required after '{'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 327| 327| 		cmpPlayerEntityLimits.UpdateLimitsFromTech(tech);
| 328| 328| 
| 329| 329| 	// always send research finished message
| 330|    |-	Engine.PostMessage(this.entity, MT_ResearchFinished, {"player": playerID, "tech": tech});
|    | 330|+	Engine.PostMessage(this.entity, MT_ResearchFinished, { "player": playerID, "tech": tech});
| 331| 331| 
| 332| 332| 	for (var component in modifiedComponents)
| 333| 333| 	{
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 327| 327| 		cmpPlayerEntityLimits.UpdateLimitsFromTech(tech);
| 328| 328| 
| 329| 329| 	// always send research finished message
| 330|    |-	Engine.PostMessage(this.entity, MT_ResearchFinished, {"player": playerID, "tech": tech});
|    | 330|+	Engine.PostMessage(this.entity, MT_ResearchFinished, {"player": playerID, "tech": tech });
| 331| 331| 
| 332| 332| 	for (var component in modifiedComponents)
| 333| 333| 	{
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 331| 331| 
| 332| 332| 	for (var component in modifiedComponents)
| 333| 333| 	{
| 334|    |-		Engine.PostMessage(SYSTEM_ENTITY, MT_TemplateModification, { "player": playerID, "component": component, "valueNames": modifiedComponents[component]});
|    | 334|+		Engine.PostMessage(SYSTEM_ENTITY, MT_TemplateModification, { "player": playerID, "component": component, "valueNames": modifiedComponents[component] });
| 335| 335| 		Engine.BroadcastMessage(MT_ValueModification, { "entities": ents, "component": component, "valueNames": modifiedComponents[component]});
| 336| 336| 	}
| 337| 337| 
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 332| 332| 	for (var component in modifiedComponents)
| 333| 333| 	{
| 334| 334| 		Engine.PostMessage(SYSTEM_ENTITY, MT_TemplateModification, { "player": playerID, "component": component, "valueNames": modifiedComponents[component]});
| 335|    |-		Engine.BroadcastMessage(MT_ValueModification, { "entities": ents, "component": component, "valueNames": modifiedComponents[component]});
|    | 335|+		Engine.BroadcastMessage(MT_ValueModification, { "entities": ents, "component": component, "valueNames": modifiedComponents[component] });
| 336| 336| 	}
| 337| 337| 
| 338| 338| 	if (tech.startsWith("phase") && !template.autoResearch)
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/simulation/components/TechnologyManager.js
| 454| 454|  */
| 455| 455| TechnologyManager.prototype.GetResearcher = function(tech)
| 456| 456| {
| 457|    |-	return this.researchQueued.get(tech)
|    | 457|+	return this.researchQueued.get(tech);
| 458| 458| };
| 459| 459| 
| 460| 460| /**

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 155| »   »   »   switch·(type)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 170| »   switch·(entity.check)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 225| ·»   »   »   »   »   if·(DoesModificationApply(modif,·classes))
|    | [NORMAL] ESLintBear (no-mixed-spaces-and-tabs):
|    | Mixed spaces and tabs.

binaries/data/mods/public/simulation/components/TechnologyManager.js
|  68| »   »   »   ||·(tech.top·&&·(this.IsTechnologyResearched(tech.top)·||·this.IsTechnologyResearched(tech.bottom))))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '||'; readers may interpret this as an expression boundary.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 102| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 234| »   »   »   for·(var·component·in·modifiedComponents)
|    | [NORMAL] JSHintBear:
|    | 'component' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 240| »   »   var·cmpTemplateManager·=·Engine.QueryInterface(SYSTEM_ENTITY,·IID_TemplateManager);
|    | [NORMAL] JSHintBear:
|    | 'cmpTemplateManager' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 241| »   »   var·template·=·cmpTemplateManager.GetCurrentTemplateName(msg.entity);
|    | [NORMAL] JSHintBear:
|    | 'template' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 246| »   »   »   var·cmpIdentity·=·Engine.QueryInterface(msg.entity,·IID_Identity);
|    | [NORMAL] JSHintBear:
|    | 'cmpIdentity' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 249| »   »   »   »   var·classes·=·cmpIdentity.GetClassesList();
|    | [NORMAL] JSHintBear:
|    | 'classes' is already defined.

binaries/data/mods/public/simulation/components/TechnologyManager.js
| 457| »   return·this.researchQueued.get(tech)
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
|    | [NORMAL] ESLintBear (no-trailing-spaces):
|    | Trailing spaces not allowed.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/reference/common/helper.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/reference/common/helper.js
| 110| 110| {
| 111| 111| 	if (!template.requiredTechnologies.length)
| 112| 112| 		return g_ParsedData.phaseList[0];
| 113|    |-	
|    | 113|+
| 114| 114| 	for (let tech of template.requiredTechnologies) { 
| 115| 115| 		if (basename(tech).startsWith("phase"))
| 116| 116| 			return getActualPhase(tech);
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'for-of'.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/reference/common/helper.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/reference/common/helper.js
| 111| 111| 	if (!template.requiredTechnologies.length)
| 112| 112| 		return g_ParsedData.phaseList[0];
| 113| 113| 	
| 114|    |-	for (let tech of template.requiredTechnologies) { 
|    | 114|+	for (let tech of template.requiredTechnologies)  
| 115| 115| 		if (basename(tech).startsWith("phase"))
| 116| 116| 			return getActualPhase(tech);
| 117|    |-	}
|    | 117|+	
| 118| 118| 	return getPhaseOfTechnology(template.requiredTechnologies[0]);
| 119| 119| }
| 120| 120| 
|    | [NORMAL] ESLintBear (no-trailing-spaces):
|    | Trailing spaces not allowed.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/reference/common/helper.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/reference/common/helper.js
| 111| 111| 	if (!template.requiredTechnologies.length)
| 112| 112| 		return g_ParsedData.phaseList[0];
| 113| 113| 	
| 114|    |-	for (let tech of template.requiredTechnologies) { 
|    | 114|+	for (let tech of template.requiredTechnologies) {
| 115| 115| 		if (basename(tech).startsWith("phase"))
| 116| 116| 			return getActualPhase(tech);
| 117| 117| 	}

binaries/data/mods/public/gui/reference/common/helper.js
| 114| »   for·(let·tech·of·template.requiredTechnologies)·{·
|    | [NORMAL] ESLintBear (brace-rules/brace-on-same-line):
|    | Opening curly brace appears on the same line as controlling statement.
|    | [NORMAL] ESLintBear (curly):
|    | Unnecessary { after 'if' condition.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
| 452| 452| 				continue;
| 453| 453| 
| 454| 454| 			if (state.pack.progress == 0)
| 455|    |-			{
|    | 455|+			
| 456| 456| 				if (state.pack.packed)
| 457| 457| 					checks.unpackButton = true;
| 458| 458| 				else
| 459| 459| 					checks.packButton = true;
| 460|    |-			}
|    | 460|+			
| 461| 461| 			else if (state.pack.packed)
| 462| 462| 				checks.unpackCancelButton = true;
| 463| 463| 			else
|    | [NORMAL] ESLintBear (space-before-function-paren):
|    | Unexpected space before function parentheses.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
| 763| 763| 				addResearchToQueue(data.item.researchFacilityId, t);
| 764| 764| 			})(tech);
| 765| 765| 
| 766|    |-			button.onPressRight = (t => function () {
|    | 766|+			button.onPressRight = (t => function() {
| 767| 767| 				showTemplateDetails(
| 768| 768| 					t,
| 769| 769| 					GetTemplateData(data.unitEntStates.find(state => state.id == data.item.researchFacilityId).template).nativeCiv);
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
|    |++++| /mnt/data/jenkins-phabricator/workspace/differential/binaries/data/mods/public/gui/session/selection_panels.js
| 941| 941| 			"player": data.player
| 942| 942| 		});
| 943| 943| 
| 944|    |-		let unitIds = data.unitEntStates.map(status => status.id)
|    | 944|+		let unitIds = data.unitEntStates.map(status => status.id);
| 945| 945| 		let [buildingsCountToTrainFullBatch, fullBatchSize, remainderBatch] =
| 946| 946| 			getTrainingStatus(unitIds, data.item, data.playerState);
| 947| 947| 

binaries/data/mods/public/gui/session/selection_panels.js
|  48| »   »   »   switch·(data.item)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/gui/session/selection_panels.js
|  59| »   »   switch·(data.item)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/gui/session/selection_panels.js
| 731| »   »   »   »   »   »   switch·(entity.check)
|    | [NORMAL] ESLintBear (default-case):
|    | Expected a default case.

binaries/data/mods/public/gui/session/selection_panels.js
| 944| »   »   let·unitIds·=·data.unitEntStates.map(status·=>·status.id)
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
Executing section cli...

Link to build: https://jenkins.wildfiregames.com/job/differential/959/

lyv resigned from this revision.Jan 15 2019, 8:37 AM

The concerns I raised seems to be fixed. At least the id one. IDK about the _string one.

wraitii added reviewers: Restricted Owners Package, wraitii.Jan 27 2019, 3:54 PM
wraitii requested changes to this revision.Apr 20 2019, 4:58 PM

Some basic changes to improve the code imo. Haven't actually checked anything else so far, but what I've read looks sensible.

binaries/data/mods/public/simulation/ai/common-api/entity.js
111

I'd change this to Math.max(this.requiredTechs().map([the if here]))

binaries/data/mods/public/simulation/ai/common-api/gamestate.js
210

I have a hunch this might no longer be required. Needs grep-ing.

binaries/data/mods/public/simulation/components/GuiInterface.js
578

I'd say put return false at the end and do if (cmpTechnologyManager) {...} instead

binaries/data/mods/public/simulation/components/TechnologyManager.js
94

Same here, is this still required now?

101

If IsTechnologyResearched is no longer needed, keep this, else use IsTechnologyResearched here.

This revision now requires changes to proceed.Apr 20 2019, 4:58 PM
Freagarach added inline comments.
binaries/data/mods/public/globalscripts/Templates.js
392

+\n before the {

binaries/data/mods/public/gui/common/tooltips.js
638

Shouldn't this comment be one line below?

binaries/data/mods/public/gui/reference/common/helper.js
114

+\n

binaries/data/mods/public/simulation/components/GuiInterface.js
574

-\n

Stan added a comment.EditedJul 8 2020, 9:31 AM

Can you add upgrade as well? (Used in HC)

Lionkanzen added a subscriber: Lionkanzen.
Stan added a comment.Jun 29 2022, 6:36 PM

@Freagarach I think this is superseeded by your patch.

Herald added a reviewer: Restricted Owners Package. · View Herald TranscriptJun 29 2022, 6:36 PM