Page MenuHomeWildfire Games
Feed All Stories

Aug 2 2020

borg- added a comment to D2911: Allow women citizen to lay the same foundations as citizen soldiers..
In D2911#126234, @borg- wrote:

@wraitii need remove "They are also capable of constructing defense towers and palisades" on spart.json.
Slave also needs to be updated too.

Aug 2 2020, 1:11 AM

Aug 1 2020

wraitii added a comment to D2911: Allow women citizen to lay the same foundations as citizen soldiers..
In D2911#126760, @Itms wrote:

I am not sure I understood you, I 100% agree with Justus that the current "female citizens" should just be "citizens" with two kinds of models/voices, using the phenotype system. Those citizens with various phenotypes would be better at gathering food, would have a boosting aura, couldn't fight, etc. I don't see how that conflicts with citizen soldiers, which are different units?

I think I remember that in DE, workers aren't "citizen soldiers" but either pure citizen or pure soldier. That I don't think we're considering at the moment -> hence my "no"?

Maybe the confusion arises from the word "citizens" which wouldn't be clear anymore if all units are citizens (workers or soldiers). Maybe call them farmers, or maybe do the naming depending on the civ. For instance, in Athens I believe all citizens go to war whereas the ones who always stay in the country do not have citizen rights.

Indeed, . I don't actually mind having a "worker" class instead of just women, which has always seemed kind of odd, but it's somewhat accurate for Greek society that citizens were both workers & soldiers, and that non-citizens weren't soldiers. We chose to not really represent slaves iirc, which would be the obvious choice.
In other culture of the time, things _would_ be different, but that's a bit of a different issue.

Aug 1 2020, 10:37 PM
borg- added a comment to D2911: Allow women citizen to lay the same foundations as citizen soldiers..

I like how 0ad works now, women with different attributes than men. I really don't see a problem with that. Add another male unit to the game so soldiers couldn’t collect resources. Anyway Its for another discussion in the future, now this patch is good and fix current balancing issues.

Aug 1 2020, 10:37 PM
Vulcan added a comment to D2025: correct technology specific names.

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

Aug 1 2020, 10:25 PM
Nescio updated the diff for D2025: correct technology specific names.
  • rebased and updated
Aug 1 2020, 10:20 PM
Vulcan added a comment to D2579: standardize armor technology tooltips.

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

Aug 1 2020, 10:01 PM
Nescio updated the diff for D2579: standardize armor technology tooltips.
  • rebased
Aug 1 2020, 9:56 PM
Nescio added a comment to D2911: Allow women citizen to lay the same foundations as citizen soldiers..

Yes, calling workers (i.e. gatherers + builders) in 0 A.D. “citizens” is a really unfortunate choice of words. Citizenship implies legal and political rights, and is limited to only a subset of the population (the French revolution had not yet happened in our timeframe).

If you make women build everything, even military buildings and fortresses and stuff

Actually female citizens can already build everything, they just can't initiate all foundations (that's not a problem for the AI).

then you should go the DE route and change "Female Citizens" to just Citizens (male and female) using the phenotype system.

I would welcome having male non-soldier “citizen” workers, but that requires someone to create the actors, and is outside the scope of this patch.

Aug 1 2020, 9:09 PM
Itms added a comment to D2911: Allow women citizen to lay the same foundations as citizen soldiers..

At the moment I don't think we plan on stopping citizen soldiers from being soldiers, so that's a likely no for now.

Aug 1 2020, 8:20 PM
Vulcan added a comment to D148: Fix gametime overlay and watermark in summary screen.

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

Aug 1 2020, 7:58 PM
Imarok updated the diff for D148: Fix gametime overlay and watermark in summary screen.

Rebase. Add note that this is only a workaround

Aug 1 2020, 7:46 PM
Vulcan added a comment to D2897: Remove dead AI manager serializablePrototype code.

Build failure - The Moirai have given mortals hearts that can endure.

Aug 1 2020, 7:27 PM
Itms updated the Trac tickets for D2897: Remove dead AI manager serializablePrototype code.
Aug 1 2020, 7:21 PM
Imarok added inline comments to D148: Fix gametime overlay and watermark in summary screen.
Aug 1 2020, 7:21 PM
Itms updated the diff for D2897: Remove dead AI manager serializablePrototype code.

Update with the version from the SM52 git migration branch.

Aug 1 2020, 7:20 PM
Itms commandeered D2897: Remove dead AI manager serializablePrototype code.
Aug 1 2020, 7:19 PM
Silier accepted D2796: italiote → italic.

I checked for completeness.

Aug 1 2020, 7:15 PM
wraitii added inline comments to D665: Make ship pickup nicer.
Aug 1 2020, 6:45 PM
Vulcan added a comment to D2785: Switch range manager from unsigned integers to a proper data structure.

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

Aug 1 2020, 6:44 PM
Imarok added a comment to D665: Make ship pickup nicer.
In D665#126639, @Vulcan wrote:

Build failure - The Moirai have given mortals hearts that can endure.

Linter detected issues:
Executing section Source...

source/simulation2/components/ICmpPathfinder.h
|   1| /*·Copyright·(C)·2019·Wildfire·Games.
|    | [NORMAL] LicenseYearBear:
|    | License should have "2020" year instead of "2019"

source/simulation2/components/ICmpPathfinder.h
|  34| template<typename·T>·class·Grid;
|    | [MAJOR] CPPCheckBear (syntaxError):
|    | Code 'template<...' is invalid C code. Use --std or --language to configure the language.

source/simulation2/components/ICmpUnitMotion.h
|  34| class·ICmpUnitMotion·:·public·IComponent
|    | [MAJOR] CPPCheckBear (syntaxError):
|    | Code 'classICmpUnitMotion:' is invalid C code. Use --std or --language to configure the language.

source/simulation2/helpers/HierarchicalPathfinder.h
|   1| /*·Copyright·(C)·2019·Wildfire·Games.
|    | [NORMAL] LicenseYearBear:
|    | License should have "2020" year instead of "2019"

source/simulation2/helpers/HierarchicalPathfinder.h
|  32| ·*·The·navcell-grid·representation·of·the·map·is·split·into·fixed-size·chunks.
|    | [MAJOR] CPPCheckBear (syntaxError):
|    | Code 'classPathGoal{' is invalid C code. Use --std or --language to configure the language.

source/simulation2/components/CCmpPathfinder_Common.h
|  34| #include·"graphics/Overlay.h"
|    | [MAJOR] CPPCheckBear (syntaxError):
|    | Code 'template<...' is invalid C code. Use --std or --language to configure the language.

source/simulation2/helpers/HierarchicalPathfinder.cpp
|   1| /*·Copyright·(C)·2019·Wildfire·Games.
|    | [NORMAL] LicenseYearBear:
|    | License should have "2020" year instead of "2019"
Executing section JS...
|    | [NORMAL] ESLintBear (no-else-return):
|    | Unnecessary 'else' after 'return'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
| 796| 796| 					this.FinishOrder();
| 797| 797| 					return;
| 798| 798| 				}
| 799|    |-				else
| 800|    |-				{
|    | 799|+				
| 801| 800| 					this.SetNextState("GARRISON.APPROACHING");
| 802| 801| 					return;
| 803|    |-				}
|    | 802|+				
| 804| 803| 			}
| 805| 804| 
| 806| 805| 			this.SetNextState("GARRISON.GARRISONING");
|    | [NORMAL] ESLintBear (key-spacing):
|    | Missing space before value for key 'GARRISON'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|1060|1060| 			},
|1061|1061| 		},
|1062|1062| 
|1063|    |-		"GARRISON":{
|    |1063|+		"GARRISON": {
|1064|1064| 			"APPROACHING": {
|1065|1065| 				"enter": function() {
|1066|1066| 					if (!this.MoveToGarrisonRange(this.order.data.target))
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '&&' should be placed at the end of the line.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|2064|2064| 
|2065|2065| 				"Attacked": function(msg) {
|2066|2066| 					// If we are capturing and are attacked by something that we would not capture, attack that entity instead
|2067|    |-					if (this.order.data.attackType == "Capture" && (this.GetStance().targetAttackersAlways || !this.order.data.force)
|2068|    |-						&& this.order.data.target != msg.data.attacker && this.GetBestAttackAgainst(msg.data.attacker, true) != "Capture")
|    |2067|+					if (this.order.data.attackType == "Capture" && (this.GetStance().targetAttackersAlways || !this.order.data.force) &&
|    |2068|+						this.order.data.target != msg.data.attacker && this.GetBestAttackAgainst(msg.data.attacker, true) != "Capture")
|2069|2069| 						this.RespondToTargetedEntities([msg.data.attacker]);
|2070|2070| 				},
|2071|2071| 			},
|    | [NORMAL] ESLintBear (no-trailing-spaces):
|    | Trailing spaces not allowed.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|2223|2223| 					"MovementUpdate": function(msg) {
|2224|2224| 						// If it looks like the path is failing, and we are close enough (3 tiles) from wanted range
|2225|2225| 						// stop anyways. This avoids pathing for an unreachable goal and reduces lag considerably.
|2226|    |-						if (msg.likelyFailure || 
|    |2226|+						if (msg.likelyFailure ||
|2227|2227| 							msg.obstructed && this.RelaxedMaxRangeCheck(this.order.data, this.order.data.max + this.DefaultRelaxedMaxRange) ||
|2228|2228| 							!msg.obstructed && this.CheckRange(this.order.data))
|2229|2229| 							this.FinishOrder();
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 7 tabs but found 6.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|2526|2526| 
|2527|2527| 								return type.specific == resourceType.specific &&
|2528|2528| 								    (type.specific != "meat" || resourceTemplate == template);
|2529|    |-						});
|    |2529|+							});
|2530|2530| 
|2531|2531| 						if (nearbyResource)
|2532|2532| 						{
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required after '{'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|2858|2858| 					{
|2859|2859| 						// The building was already finished/fully repaired before we arrived;
|2860|2860| 						// let the ConstructionFinished handler handle this.
|2861|    |-						this.OnGlobalConstructionFinished({"entity": this.repairTarget, "newentity": this.repairTarget});
|    |2861|+						this.OnGlobalConstructionFinished({ "entity": this.repairTarget, "newentity": this.repairTarget});
|2862|2862| 						return true;
|2863|2863| 					}
|2864|2864| 
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|2858|2858| 					{
|2859|2859| 						// The building was already finished/fully repaired before we arrived;
|2860|2860| 						// let the ConstructionFinished handler handle this.
|2861|    |-						this.OnGlobalConstructionFinished({"entity": this.repairTarget, "newentity": this.repairTarget});
|    |2861|+						this.OnGlobalConstructionFinished({"entity": this.repairTarget, "newentity": this.repairTarget });
|2862|2862| 						return true;
|2863|2863| 					}
|2864|2864| 
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|3145|3145| 				this.StopTimer();
|3146|3146| 				this.ResetAnimation();
|3147|3147| 				if (this.formationAnimationVariant)
|3148|    |-					this.SetAnimationVariant(this.formationAnimationVariant)
|    |3148|+					this.SetAnimationVariant(this.formationAnimationVariant);
|3149|3149| 				else
|3150|3150| 					this.SetDefaultAnimationVariant();
|3151|3151| 				var cmpResistance = Engine.QueryInterface(this.entity, IID_Resistance);
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 2 tabs but found 7.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|3359|3359| 		"COMBAT": "INDIVIDUAL.COMBAT", // reuse the same combat behaviour for animals
|3360|3360| 
|3361|3361| 		"WALKING": "INDIVIDUAL.WALKING",	// reuse the same walking behaviour for animals
|3362|    |-							// only used for domestic animals
|    |3362|+		// only used for domestic animals
|3363|3363| 
|3364|3364| 		// Reuse the same garrison behaviour for animals.
|3365|3365| 		"GARRISON": "INDIVIDUAL.GARRISON",
|    | [NORMAL] ESLintBear (no-unneeded-ternary):
|    | Unnecessary use of boolean literals in conditional expression.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|3409|3409| 
|3410|3410| UnitAI.prototype.IsAnimal = function()
|3411|3411| {
|3412|    |-	return (this.template.NaturalBehaviour ? true : false);
|    |3412|+	return (!!this.template.NaturalBehaviour);
|3413|3413| };
|3414|3414| 
|3415|3415| UnitAI.prototype.IsDangerousAnimal = function()
|    | [NORMAL] ESLintBear (comma-spacing):
|    | A space is required after ','.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|3549|3549| 		{
|3550|3550| 			let index = this.GetCurrentState().indexOf(".");
|3551|3551| 			if (index != -1)
|3552|    |-				this.UnitFsm.SwitchToNextState(this, this.GetCurrentState().slice(0,index));
|    |3552|+				this.UnitFsm.SwitchToNextState(this, this.GetCurrentState().slice(0, index));
|3553|3553| 			this.Stop(false);
|3554|3554| 		}
|3555|3555| 
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required after '{'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|3606|3606| 		if (this.orderQueue[i].type != "PickupUnit" || this.orderQueue[i].data.target != msg.entity)
|3607|3607| 			continue;
|3608|3608| 		if (i == 0)
|3609|    |-			this.UnitFsm.ProcessMessage(this, {"type": "PickupCanceled", "data": msg});
|    |3609|+			this.UnitFsm.ProcessMessage(this, { "type": "PickupCanceled", "data": msg});
|3610|3610| 		else
|3611|3611| 			this.orderQueue.splice(i, 1);
|3612|3612| 		Engine.PostMessage(this.entity, MT_UnitAIOrderDataChanged, { "to": this.GetOrderData() });
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|3606|3606| 		if (this.orderQueue[i].type != "PickupUnit" || this.orderQueue[i].data.target != msg.entity)
|3607|3607| 			continue;
|3608|3608| 		if (i == 0)
|3609|    |-			this.UnitFsm.ProcessMessage(this, {"type": "PickupCanceled", "data": msg});
|    |3609|+			this.UnitFsm.ProcessMessage(this, {"type": "PickupCanceled", "data": msg });
|3610|3610| 		else
|3611|3611| 			this.orderQueue.splice(i, 1);
|3612|3612| 		Engine.PostMessage(this.entity, MT_UnitAIOrderDataChanged, { "to": this.GetOrderData() });
|    | [NORMAL] ESLintBear (spaced-comment):
|    | Expected space or tab after '//' in comment.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|3735|3735| };
|3736|3736| 
|3737|3737| 
|3738|    |-//// FSM linkage functions ////
|    |3738|+// // FSM linkage functions ////
|3739|3739| 
|3740|3740| // Setting the next state to the current state will leave/re-enter the top-most substate.
|3741|3741| UnitAI.prototype.SetNextState = function(state)
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required after '{'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|3908|3908| 				continue;
|3909|3909| 			if (this.orderQueue[i].type == type)
|3910|3910| 				continue;
|3911|    |-			this.orderQueue.splice(i, 0, {"type": type, "data": data});
|    |3911|+			this.orderQueue.splice(i, 0, { "type": type, "data": data});
|3912|3912| 			Engine.PostMessage(this.entity, MT_UnitAIOrderDataChanged, { "to": this.GetOrderData() });
|3913|3913| 			return;
|3914|3914| 		}
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|3908|3908| 				continue;
|3909|3909| 			if (this.orderQueue[i].type == type)
|3910|3910| 				continue;
|3911|    |-			this.orderQueue.splice(i, 0, {"type": type, "data": data});
|    |3911|+			this.orderQueue.splice(i, 0, {"type": type, "data": data });
|3912|3912| 			Engine.PostMessage(this.entity, MT_UnitAIOrderDataChanged, { "to": this.GetOrderData() });
|3913|3913| 			return;
|3914|3914| 		}
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required after '{'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|4149|4149| 	if (data.timerRepeat === undefined)
|4150|4150| 		this.timer = undefined;
|4151|4151| 
|4152|    |-	this.UnitFsm.ProcessMessage(this, {"type": "Timer", "data": data, "lateness": lateness});
|    |4152|+	this.UnitFsm.ProcessMessage(this, { "type": "Timer", "data": data, "lateness": lateness});
|4153|4153| };
|4154|4154| 
|4155|4155| /**
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|4149|4149| 	if (data.timerRepeat === undefined)
|4150|4150| 		this.timer = undefined;
|4151|4151| 
|4152|    |-	this.UnitFsm.ProcessMessage(this, {"type": "Timer", "data": data, "lateness": lateness});
|    |4152|+	this.UnitFsm.ProcessMessage(this, {"type": "Timer", "data": data, "lateness": lateness });
|4153|4153| };
|4154|4154| 
|4155|4155| /**
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required after '{'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|4194|4194| 	// TODO: This is a bit inefficient since every unit listens to every
|4195|4195| 	// construction message - ideally we could scope it to only the one we're building
|4196|4196| 
|4197|    |-	this.UnitFsm.ProcessMessage(this, {"type": "ConstructionFinished", "data": msg});
|    |4197|+	this.UnitFsm.ProcessMessage(this, { "type": "ConstructionFinished", "data": msg});
|4198|4198| };
|4199|4199| 
|4200|4200| UnitAI.prototype.OnGlobalEntityRenamed = function(msg)
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|4194|4194| 	// TODO: This is a bit inefficient since every unit listens to every
|4195|4195| 	// construction message - ideally we could scope it to only the one we're building
|4196|4196| 
|4197|    |-	this.UnitFsm.ProcessMessage(this, {"type": "ConstructionFinished", "data": msg});
|    |4197|+	this.UnitFsm.ProcessMessage(this, {"type": "ConstructionFinished", "data": msg });
|4198|4198| };
|4199|4199| 
|4200|4200| UnitAI.prototype.OnGlobalEntityRenamed = function(msg)
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required after '{'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|4233|4233| 	if (msg.fromStatusEffect)
|4234|4234| 		return;
|4235|4235| 
|4236|    |-	this.UnitFsm.ProcessMessage(this, {"type": "Attacked", "data": msg});
|    |4236|+	this.UnitFsm.ProcessMessage(this, { "type": "Attacked", "data": msg});
|4237|4237| };
|4238|4238| 
|4239|4239| UnitAI.prototype.OnGuardedAttacked = function(msg)
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|4233|4233| 	if (msg.fromStatusEffect)
|4234|4234| 		return;
|4235|4235| 
|4236|    |-	this.UnitFsm.ProcessMessage(this, {"type": "Attacked", "data": msg});
|    |4236|+	this.UnitFsm.ProcessMessage(this, {"type": "Attacked", "data": msg });
|4237|4237| };
|4238|4238| 
|4239|4239| UnitAI.prototype.OnGuardedAttacked = function(msg)
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required after '{'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|4238|4238| 
|4239|4239| UnitAI.prototype.OnGuardedAttacked = function(msg)
|4240|4240| {
|4241|    |-	this.UnitFsm.ProcessMessage(this, {"type": "GuardedAttacked", "data": msg.data});
|    |4241|+	this.UnitFsm.ProcessMessage(this, { "type": "GuardedAttacked", "data": msg.data});
|4242|4242| };
|4243|4243| 
|4244|4244| UnitAI.prototype.OnHealthChanged = function(msg)
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|4238|4238| 
|4239|4239| UnitAI.prototype.OnGuardedAttacked = function(msg)
|4240|4240| {
|4241|    |-	this.UnitFsm.ProcessMessage(this, {"type": "GuardedAttacked", "data": msg.data});
|    |4241|+	this.UnitFsm.ProcessMessage(this, {"type": "GuardedAttacked", "data": msg.data });
|4242|4242| };
|4243|4243| 
|4244|4244| UnitAI.prototype.OnHealthChanged = function(msg)
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required after '{'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|4243|4243| 
|4244|4244| UnitAI.prototype.OnHealthChanged = function(msg)
|4245|4245| {
|4246|    |-	this.UnitFsm.ProcessMessage(this, {"type": "HealthChanged", "from": msg.from, "to": msg.to});
|    |4246|+	this.UnitFsm.ProcessMessage(this, { "type": "HealthChanged", "from": msg.from, "to": msg.to});
|4247|4247| };
|4248|4248| 
|4249|4249| UnitAI.prototype.OnRangeUpdate = function(msg)
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|4243|4243| 
|4244|4244| UnitAI.prototype.OnHealthChanged = function(msg)
|4245|4245| {
|4246|    |-	this.UnitFsm.ProcessMessage(this, {"type": "HealthChanged", "from": msg.from, "to": msg.to});
|    |4246|+	this.UnitFsm.ProcessMessage(this, {"type": "HealthChanged", "from": msg.from, "to": msg.to });
|4247|4247| };
|4248|4248| 
|4249|4249| UnitAI.prototype.OnRangeUpdate = function(msg)
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required after '{'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|4258|4258| 
|4259|4259| UnitAI.prototype.OnPackFinished = function(msg)
|4260|4260| {
|4261|    |-	this.UnitFsm.ProcessMessage(this, {"type": "PackFinished", "packed": msg.packed});
|    |4261|+	this.UnitFsm.ProcessMessage(this, { "type": "PackFinished", "packed": msg.packed});
|4262|4262| };
|4263|4263| 
|4264|4264| //// Helper functions to be called by the FSM ////
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|4258|4258| 
|4259|4259| UnitAI.prototype.OnPackFinished = function(msg)
|4260|4260| {
|4261|    |-	this.UnitFsm.ProcessMessage(this, {"type": "PackFinished", "packed": msg.packed});
|    |4261|+	this.UnitFsm.ProcessMessage(this, {"type": "PackFinished", "packed": msg.packed });
|4262|4262| };
|4263|4263| 
|4264|4264| //// Helper functions to be called by the FSM ////
|    | [NORMAL] ESLintBear (spaced-comment):
|    | Expected space or tab after '//' in comment.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|4261|4261| 	this.UnitFsm.ProcessMessage(this, {"type": "PackFinished", "packed": msg.packed});
|4262|4262| };
|4263|4263| 
|4264|    |-//// Helper functions to be called by the FSM ////
|    |4264|+// // Helper functions to be called by the FSM ////
|4265|4265| 
|4266|4266| UnitAI.prototype.GetWalkSpeed = function()
|4267|4267| {
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '&&' should be placed at the end of the line.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|4986|4986| UnitAI.prototype.AttackEntityInZone = function(ents)
|4987|4987| {
|4988|4988| 	var target = ents.find(target =>
|4989|    |-		this.CanAttack(target)
|4990|    |-		&& this.CheckTargetDistanceFromHeldPosition(target, IID_Attack, this.GetBestAttackAgainst(target, true))
|    |4989|+		this.CanAttack(target) &&
|    |4990|+		this.CheckTargetDistanceFromHeldPosition(target, IID_Attack, this.GetBestAttackAgainst(target, true))
|4991|4991| 		&& (this.GetStance().respondChaseBeyondVision || this.CheckTargetIsInVisionRange(target))
|4992|4992| 	);
|4993|4993| 	if (!target)
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '&&' should be placed at the end of the line.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|4987|4987| {
|4988|4988| 	var target = ents.find(target =>
|4989|4989| 		this.CanAttack(target)
|4990|    |-		&& this.CheckTargetDistanceFromHeldPosition(target, IID_Attack, this.GetBestAttackAgainst(target, true))
|4991|    |-		&& (this.GetStance().respondChaseBeyondVision || this.CheckTargetIsInVisionRange(target))
|    |4990|+		&& this.CheckTargetDistanceFromHeldPosition(target, IID_Attack, this.GetBestAttackAgainst(target, true)) &&
|    |4991|+		(this.GetStance().respondChaseBeyondVision || this.CheckTargetIsInVisionRange(target))
|4992|4992| 	);
|4993|4993| 	if (!target)
|4994|4994| 		return false;
|    | [NORMAL] ESLintBear (no-multi-spaces):
|    | Multiple spaces found before 'Engine'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|5071|5071| 	// If we are guarding/escorting, don't abandon as long as the guarded unit is in target range of the attacker
|5072|5072| 	if (this.isGuardOf)
|5073|5073| 	{
|5074|    |-		var cmpUnitAI =  Engine.QueryInterface(target, IID_UnitAI);
|    |5074|+		var cmpUnitAI = Engine.QueryInterface(target, IID_UnitAI);
|5075|5075| 		var cmpAttack = Engine.QueryInterface(target, IID_Attack);
|5076|5076| 		if (cmpUnitAI && cmpAttack &&
|5077|5077| 		    cmpAttack.GetAttackTypes().some(type => cmpUnitAI.CheckTargetAttackRange(this.isGuardOf, type)))
|    | [NORMAL] ESLintBear (indent):
|    | Expected indentation of 3 tabs but found 4.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|5075|5075| 		var cmpAttack = Engine.QueryInterface(target, IID_Attack);
|5076|5076| 		if (cmpUnitAI && cmpAttack &&
|5077|5077| 		    cmpAttack.GetAttackTypes().some(type => cmpUnitAI.CheckTargetAttackRange(this.isGuardOf, type)))
|5078|    |-				return false;
|    |5078|+			return false;
|5079|5079| 	}
|5080|5080| 
|5081|5081| 	// Stop if we're in hold-ground mode and it's too far from the holding point
|    | [NORMAL] ESLintBear (no-multi-spaces):
|    | Multiple spaces found before 'Engine'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|5113|5113| 	// If we are guarding/escorting, chase at least as long as the guarded unit is in target range of the attacker
|5114|5114| 	if (this.isGuardOf)
|5115|5115| 	{
|5116|    |-		let cmpUnitAI =  Engine.QueryInterface(target, IID_UnitAI);
|    |5116|+		let cmpUnitAI = Engine.QueryInterface(target, IID_UnitAI);
|5117|5117| 		let cmpAttack = Engine.QueryInterface(target, IID_Attack);
|5118|5118| 		if (cmpUnitAI && cmpAttack &&
|5119|5119| 		    cmpAttack.GetAttackTypes().some(type => cmpUnitAI.CheckTargetAttackRange(this.isGuardOf, type)))
|    | [NORMAL] ESLintBear (spaced-comment):
|    | Expected space or tab after '//' in comment.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|5126|5126| 	return false;
|5127|5127| };
|5128|5128| 
|5129|    |-//// External interface functions ////
|    |5129|+// // External interface functions ////
|5130|5130| 
|5131|5131| UnitAI.prototype.SetFormationController = function(ent)
|5132|5132| {
|    | [NORMAL] ESLintBear (no-else-return):
|    | Unnecessary 'else' after 'return'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|5282|5282| 	{
|5283|5283| 		if (this.isGuardOf == target && this.order && this.order.type == "Guard")
|5284|5284| 			return;
|5285|    |-		else
|5286|    |-			this.RemoveGuard();
|    |5285|+		this.RemoveGuard();
|5287|5286| 	}
|5288|5287| 
|5289|5288| 	this.AddOrder("Guard", { "target": target, "force": false }, queued);
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|5616|5616| 
|5617|5617| 	if (this.IsFormationController())
|5618|5618| 		this.CallMemberFunction("CancelSetupTradeRoute", [target]);
|5619|    |-}
|    |5619|+};
|5620|5620| /**
|5621|5621|  * Adds trade order to the queue. Either walk to the first market, or
|5622|5622|  * start a new route. Not forced, so it can be interrupted by attacks.
|    | [NORMAL] ESLintBear (no-trailing-spaces):
|    | Trailing spaces not allowed.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|5637|5637| 	    this.workOrders.length && this.workOrders[0].type == "Trade")
|5638|5638| 	{
|5639|5639| 		let cmpTrader = Engine.QueryInterface(this.entity, IID_Trader);
|5640|    |-		if (cmpTrader.HasBothMarkets() && 
|    |5640|+		if (cmpTrader.HasBothMarkets() &&
|5641|5641| 		   (cmpTrader.GetFirstMarket() == target && cmpTrader.GetSecondMarket() == source ||
|5642|5642| 		    cmpTrader.GetFirstMarket() == source && cmpTrader.GetSecondMarket() == target))
|5643|5643| 		{
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '&&' should be placed at the end of the line.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|5944|5944| 				{
|5945|5945| 					var cmpIdentity = Engine.QueryInterface(targ, IID_Identity);
|5946|5946| 					var targetClasses = this.order.data.targetClasses;
|5947|    |-					if (targetClasses.attack && cmpIdentity
|5948|    |-						&& !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack))
|    |5947|+					if (targetClasses.attack && cmpIdentity &&
|    |5948|+						!MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack))
|5949|5949| 						continue;
|5950|5950| 					if (targetClasses.avoid && cmpIdentity
|5951|5951| 						&& MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid))
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '&&' should be placed at the end of the line.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|5947|5947| 					if (targetClasses.attack && cmpIdentity
|5948|5948| 						&& !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack))
|5949|5949| 						continue;
|5950|    |-					if (targetClasses.avoid && cmpIdentity
|5951|    |-						&& MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid))
|    |5950|+					if (targetClasses.avoid && cmpIdentity &&
|    |5951|+						MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid))
|5952|5952| 						continue;
|5953|5953| 					// Only used by the AIs to prevent some choices of targets
|5954|5954| 					if (targetClasses.vetoEntities && targetClasses.vetoEntities[targ])
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '&&' should be placed at the end of the line.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|5970|5970| 		{
|5971|5971| 			var cmpIdentity = Engine.QueryInterface(targ, IID_Identity);
|5972|5972| 			var targetClasses = this.order.data.targetClasses;
|5973|    |-			if (cmpIdentity && targetClasses.attack
|5974|    |-				&& !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack))
|    |5973|+			if (cmpIdentity && targetClasses.attack &&
|    |5974|+				!MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack))
|5975|5975| 				continue;
|5976|5976| 			if (cmpIdentity && targetClasses.avoid
|5977|5977| 				&& MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid))
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '&&' should be placed at the end of the line.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|5973|5973| 			if (cmpIdentity && targetClasses.attack
|5974|5974| 				&& !MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.attack))
|5975|5975| 				continue;
|5976|    |-			if (cmpIdentity && targetClasses.avoid
|5977|    |-				&& MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid))
|    |5976|+			if (cmpIdentity && targetClasses.avoid &&
|    |5977|+				MatchesClassList(cmpIdentity.GetClassesList(), targetClasses.avoid))
|5978|5978| 				continue;
|5979|5979| 			// Only used by the AIs to prevent some choices of targets
|5980|5980| 			if (targetClasses.vetoEntities && targetClasses.vetoEntities[targ])
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required after '{'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|6126|6126| 
|6127|6127| UnitAI.prototype.SetHeldPosition = function(x, z)
|6128|6128| {
|6129|    |-	this.heldPosition = {"x": x, "z": z};
|    |6129|+	this.heldPosition = { "x": x, "z": z};
|6130|6130| };
|6131|6131| 
|6132|6132| UnitAI.prototype.SetHeldPositionOnEntity = function(entity)
|    | [NORMAL] ESLintBear (object-curly-spacing):
|    | A space is required before '}'.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|6126|6126| 
|6127|6127| UnitAI.prototype.SetHeldPosition = function(x, z)
|6128|6128| {
|6129|    |-	this.heldPosition = {"x": x, "z": z};
|    |6129|+	this.heldPosition = {"x": x, "z": z };
|6130|6130| };
|6131|6131| 
|6132|6132| UnitAI.prototype.SetHeldPositionOnEntity = function(entity)
|    | [NORMAL] ESLintBear (spaced-comment):
|    | Expected space or tab after '//' in comment.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|6153|6153| 	return false;
|6154|6154| };
|6155|6155| 
|6156|    |-//// Helper functions ////
|    |6156|+// // Helper functions ////
|6157|6157| 
|6158|6158| /**
|6159|6159|  * General getter for ranges.
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|6172|6172| 		return undefined;
|6173|6173| 
|6174|6174| 	return component.GetRange(type);
|6175|    |-}
|    |6175|+};
|6176|6176| 
|6177|6177| UnitAI.prototype.CanAttack = function(target)
|6178|6178| {
|    | [NORMAL] ESLintBear (spaced-comment):
|    | Expected space or tab after '//' in comment.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|6348|6348| 	return cmpPack && cmpPack.IsPacking();
|6349|6349| };
|6350|6350| 
|6351|    |-//// Formation specific functions ////
|    |6351|+// // Formation specific functions ////
|6352|6352| 
|6353|6353| UnitAI.prototype.IsAttackingAsFormation = function()
|6354|6354| {
|    | [NORMAL] ESLintBear (operator-linebreak):
|    | '&&' should be placed at the end of the line.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|6353|6353| UnitAI.prototype.IsAttackingAsFormation = function()
|6354|6354| {
|6355|6355| 	var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
|6356|    |-	return cmpAttack && cmpAttack.CanAttackAsFormation()
|6357|    |-		&& this.GetCurrentState() == "FORMATIONCONTROLLER.COMBAT.ATTACKING";
|    |6356|+	return cmpAttack && cmpAttack.CanAttackAsFormation() &&
|    |6357|+		this.GetCurrentState() == "FORMATIONCONTROLLER.COMBAT.ATTACKING";
|6358|6358| };
|6359|6359| 
|6360|6360| //// Animal specific functions ////
|    | [NORMAL] ESLintBear (spaced-comment):
|    | Expected space or tab after '//' in comment.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|6357|6357| 		&& this.GetCurrentState() == "FORMATIONCONTROLLER.COMBAT.ATTACKING";
|6358|6358| };
|6359|6359| 
|6360|    |-//// Animal specific functions ////
|    |6360|+// // Animal specific functions ////
|6361|6361| 
|6362|6362| UnitAI.prototype.MoveRandomly = function(distance)
|6363|6363| {
|    | [NORMAL] ESLintBear (semi):
|    | Missing semicolon.
|----|    | /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|    |++++| /zpool0/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
|6408|6408| {
|6409|6409| 	let cmpUnitMotion = Engine.QueryInterface(this.entity, IID_UnitMotion);
|6410|6410| 	return cmpUnitMotion && cmpUnitMotion.GetFacePointAfterMove();
|6411|    |-}
|    |6411|+};
|6412|6412| 
|6413|6413| UnitAI.prototype.AttackEntitiesByPreference = function(ents)
|6414|6414| {

binaries/data/mods/public/simulation/components/UnitAI.js
| 349| »   »   »   return·true;
|    | [NORMAL] ESLintBear (consistent-return):
|    | Method 'Order.WalkToTarget' expected no return value.

binaries/data/mods/public/simulation/components/UnitAI.js
|4054| »   var·isWorkType·=·type·=>·type·==·"Gather"·||·type·==·"Trade"·||·type·==·"Repair"·||·type·==·"ReturnResource";
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'type' is already declared in the upper scope.

binaries/data/mods/public/simulation/components/UnitAI.js
|4973| »   var·target·=·ents.find(target·=>·this.CanAttack(target));
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'target' is already declared in the upper scope.

binaries/data/mods/public/simulation/components/UnitAI.js
|4988| »   var·target·=·ents.find(target·=>
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'target' is already declared in the upper scope.

binaries/data/mods/public/simulation/components/UnitAI.js
|5054| »   let·ent·=·ents.find(ent·=>·this.CanHeal(ent));
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'ent' is already declared in the upper scope.

binaries/data/mods/public/simulation/components/UnitAI.js
|5077| »   »   ····cmpAttack.GetAttackTypes().some(type·=>·cmpUnitAI.CheckTargetAttackRange(this.isGuardOf,·type)))
|    | [NORMAL] ESLintBear (no-shadow):
|    | 'type' is already declared in the upper scope.

binaries/data/mods/public/simulation/components/UnitAI.js
|2068| »   »   »   »   »   »   &&·this.order.data.target·!=·msg.data.attacker·&&·this.GetBestAttackAgainst(msg.data.attacker,·true)·!=·"Capture")
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '&&'; readers may interpret this as an expression boundary.

binaries/data/mods/public/simulation/components/UnitAI.js
|3148| »   »   »   »   »   this.SetAnimationVariant(this.formationAnimationVariant)
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.

binaries/data/mods/public/simulation/components/UnitAI.js
|4001| »   »   var·order·=·{·"type":·type,·"data":·data·};
|    | [NORMAL] JSHintBear:
|    | 'order' is already defined.

binaries/data/mods/public/simulation/components/UnitAI.js
|4085| »   for·(var·i·=·0;·i·<·this.orderQueue.length;·++i)
|    | [NORMAL] JSHintBear:
|    | 'i' is already defined.

binaries/data/mods/public/simulation/components/UnitAI.js
|4990| »   »   &&·this.CheckTargetDistanceFromHeldPosition(target,·IID_Attack,·this.GetBestAttackAgainst(target,·true))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '&&'; readers may interpret this as an expression boundary.

binaries/data/mods/public/simulation/components/UnitAI.js
|4991| »   »   &&·(this.GetStance().respondChaseBeyondVision·||·this.CheckTargetIsInVisionRange(target))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '&&'; readers may interpret this as an expression boundary.

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

binaries/data/mods/public/simulation/components/UnitAI.js
|5948| »   »   »   »   »   »   &&·!MatchesClassList(cmpIdentity.GetClassesList(),·targetClasses.attack))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '&&'; readers may interpret this as an expression boundary.

binaries/data/mods/public/simulation/components/UnitAI.js
|5951| »   »   »   »   »   »   &&·MatchesClassList(cmpIdentity.GetClassesList(),·targetClasses.avoid))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '&&'; readers may interpret this as an expression boundary.

binaries/data/mods/public/simulation/components/UnitAI.js
|5964| »   var·targets·=·this.GetTargetsFromUnit();
|    | [NORMAL] JSHintBear:
|    | 'targets' is already defined.

binaries/data/mods/public/simulation/components/UnitAI.js
|5965| »   for·(var·targ·of·targets)
|    | [NORMAL] JSHintBear:
|    | 'targ' is already defined.

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

binaries/data/mods/public/simulation/components/UnitAI.js
|5972| »   »   »   var·targetClasses·=·this.order.data.targetClasses;
|    | [NORMAL] JSHintBear:
|    | 'targetClasses' is already defined.

binaries/data/mods/public/simulation/components/UnitAI.js
|5974| »   »   »   »   &&·!MatchesClassList(cmpIdentity.GetClassesList(),·targetClasses.attack))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '&&'; readers may interpret this as an expression boundary.

binaries/data/mods/public/simulation/components/UnitAI.js
|5977| »   »   »   »   &&·MatchesClassList(cmpIdentity.GetClassesList(),·targetClasses.avoid))
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '&&'; readers may interpret this as an expression boundary.

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

binaries/data/mods/public/simulation/components/UnitAI.js
|6357| »   »   &&·this.GetCurrentState()·==·"FORMATIONCONTROLLER.COMBAT.ATTACKING";
|    | [NORMAL] JSHintBear:
|    | Misleading line break before '&&'; readers may interpret this as an expression boundary.

binaries/data/mods/public/simulation/components/UnitAI.js
|6411| }
|    | [NORMAL] JSHintBear:
|    | Missing semicolon.
Executing section cli...

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

Aug 1 2020, 6:42 PM
Silier accepted D2920: Fix gathering infinite loop when the gatherer is out of the world..
  1. Without position unit is not in game. Just cant happen so aborting state is ok.
  2. We do nothing with original unit when we promote it, so it ends out of world, but it finishes order in unitai and since FSM keeps swtiching states while they are called from enter, we got unit to infinite loop.

Notice gather ordered given are not queued nor pushed so they are processed inside current state.

// If func called SetNextState then switch into the new state,
// and continue switching if the new state's 'enter' called SetNextState again

I am accepting this as fixing the issue, but one should check another states affected by moving promoted unit out of world or one should ensure promoted unit gets deleted all orders and is moved to some trash state.

Aug 1 2020, 6:41 PM
Imarok updated the summary of D148: Fix gametime overlay and watermark in summary screen.
Aug 1 2020, 6:20 PM
wraitii updated the diff for D2785: Switch range manager from unsigned integers to a proper data structure.

Rebased & fix compilation errors.

Aug 1 2020, 6:14 PM
Vulcan added a comment to D2377: Fix text input max_length attribute..

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

Aug 1 2020, 6:11 PM
Stan updated the diff for D2377: Fix text input max_length attribute..

Broken attempt @wraitii can you help me

Aug 1 2020, 6:04 PM
wraitii accepted D148: Fix gametime overlay and watermark in summary screen.

In that case, I think this is the best we can do for now.

Aug 1 2020, 5:52 PM
Imarok added a comment to D148: Fix gametime overlay and watermark in summary screen.

I have one alternate proposition:

  • How about you make the FPS counter have a completely transparent background (doesn't matter too much if it's not seen)?
  • The in-game time counter could be made a "first-class citizen", since it's specific to in-game.

Then you wouldn't have to hack with the order of things.

Hmm, not that happy about this solution.
With a fully transparent background the white font gets unreadable in some situations. (e.g. main menu)

Aug 1 2020, 5:49 PM
wraitii planned changes to D2746: Correctly serialize/deserialize user-defined JS objects..

Will rebase after SM52

Aug 1 2020, 5:33 PM
wraitii added inline comments to D2752: Do not thread the game in Atlas.
Aug 1 2020, 5:32 PM
wraitii committed rP23918: Fix segfault when sending a very large net chat message..
Fix segfault when sending a very large net chat message.
Aug 1 2020, 5:25 PM
wraitii closed D2629: Fix remote segfault when spamming chat.
Aug 1 2020, 5:25 PM
wraitii requested changes to D2377: Fix text input max_length attribute..

You're missing the case where the user-autocompletes a pseudo, or any JS modifying "caption" in fact. You probably need to add a final check in UpdateText() or in HandleMessage.

Aug 1 2020, 5:18 PM
Vulcan added a comment to D2915: [wip] General system for file inclusions in XML files / Generalize paramnode capabilities.

Build failure - The Moirai have given mortals hearts that can endure.

Aug 1 2020, 5:15 PM
Vulcan added a comment to D2915: [wip] General system for file inclusions in XML files / Generalize paramnode capabilities.

Build failure - The Moirai have given mortals hearts that can endure.

Aug 1 2020, 5:04 PM
Vulcan added a comment to D2915: [wip] General system for file inclusions in XML files / Generalize paramnode capabilities.

Build failure - The Moirai have given mortals hearts that can endure.

Aug 1 2020, 5:04 PM
wraitii updated the diff for D2915: [wip] General system for file inclusions in XML files / Generalize paramnode capabilities.

Much bigger diff.
I went the way of creating a general algorithm for "data file inclusion", which is intended to replace the "transformation" aspect of ParamNode.

Aug 1 2020, 5:02 PM
lyv added a comment to D2377: Fix text input max_length attribute..

Thanks for the fair warning, and the time you took to express it :)

Aug 1 2020, 4:59 PM
Vulcan added a comment to D2563: NVTT build fixes.

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

Aug 1 2020, 4:55 PM
lyv added inline comments to D2399: [BSD] Replace ecvt() in FCollada with something else.
Aug 1 2020, 4:47 PM
Stan updated the diff for D2563: NVTT build fixes.

Include D2691 This way it's sure it won't be forgotten.

Aug 1 2020, 4:46 PM
Stan removed 1 blocking reviewer(s) for D2399: [BSD] Replace ecvt() in FCollada with something else: Itms.
Aug 1 2020, 4:41 PM
Vulcan added a comment to D2377: Fix text input max_length attribute..

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

Aug 1 2020, 2:55 PM
Stan updated the diff for D2377: Fix text input max_length attribute..

Fix Unix* builds

Aug 1 2020, 2:48 PM
Vulcan added a comment to D2629: Fix remote segfault when spamming chat.

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

Aug 1 2020, 2:35 PM
wraitii updated the diff for D2629: Fix remote segfault when spamming chat.

Apply my inline comments.

Aug 1 2020, 2:28 PM
Vulcan added a comment to D1481: Remove the unneeded sound warnings when no sound.

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

Aug 1 2020, 2:23 PM
Stan updated the diff for D1481: Remove the unneeded sound warnings when no sound.

Much simpler solution, thanks to elexis;

Aug 1 2020, 2:17 PM
Vulcan added a comment to D1481: Remove the unneeded sound warnings when no sound.

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

Aug 1 2020, 2:01 PM
Stan updated the diff for D1481: Remove the unneeded sound warnings when no sound.

Rebase

Aug 1 2020, 1:52 PM
Stan commandeered D1481: Remove the unneeded sound warnings when no sound.
Aug 1 2020, 1:51 PM
Itms awarded rP23917: Add an interface for Reinforcement Learning. a 100 token.
Aug 1 2020, 1:09 PM
wraitii committed rP23917: Add an interface for Reinforcement Learning..
Add an interface for Reinforcement Learning.
Aug 1 2020, 12:53 PM
wraitii closed D2199: Add RL interface for Reinforcement Learning.
Aug 1 2020, 12:53 PM
wraitii committed rP23916: Use new FastMoving class instead of Cavalry in AI/petra..
Use new FastMoving class instead of Cavalry in AI/petra.
Aug 1 2020, 12:36 PM
wraitii closed D2251: [ai/petra] replace Cavalry with new FastMoving class.
Aug 1 2020, 12:36 PM
wraitii committed rP23915: Delete paired wall technologies..
Delete paired wall technologies.
Aug 1 2020, 12:35 PM
wraitii closed D2880: [gameplay] delete wall technology.
Aug 1 2020, 12:34 PM
Vulcan added a comment to D2880: [gameplay] delete wall technology.

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

Aug 1 2020, 12:02 PM
Vulcan added a comment to D2199: Add RL interface for Reinforcement Learning.

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

Aug 1 2020, 11:58 AM
Vulcan added a comment to D2251: [ai/petra] replace Cavalry with new FastMoving class.

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

Aug 1 2020, 11:53 AM
wraitii added a comment to D665: Make ship pickup nicer.

The jenkins error is spurious -> checkrefs passes locally and the map works and has the correct header.

Aug 1 2020, 11:02 AM
wraitii updated subscribers of D2911: Allow women citizen to lay the same foundations as citizen soldiers..

At the moment I don't think we plan on stopping citizen soldiers from being soldiers, so that's a likely no for now.

Aug 1 2020, 11:01 AM
wowgetoffyourcellphone added a comment to D2911: Allow women citizen to lay the same foundations as citizen soldiers..

If you make women build everything, even military buildings and fortresses and stuff, then you should go the DE route and change "Female Citizens" to just Citizens (male and female) using the phenotype system.

Aug 1 2020, 10:58 AM
wraitii updated the diff for D2251: [ai/petra] replace Cavalry with new FastMoving class.

Rebased, will commit once lights are green

Aug 1 2020, 10:45 AM
Vulcan added a comment to D2199: Add RL interface for Reinforcement Learning.

Build failure - The Moirai have given mortals hearts that can endure.

Aug 1 2020, 10:44 AM
Vulcan added a comment to D2199: Add RL interface for Reinforcement Learning.

Build failure - The Moirai have given mortals hearts that can endure.

Aug 1 2020, 10:41 AM
Vulcan added a comment to D2880: [gameplay] delete wall technology.

Build failure - The Moirai have given mortals hearts that can endure.

Aug 1 2020, 10:32 AM
Vulcan added a comment to D2199: Add RL interface for Reinforcement Learning.

Build failure - The Moirai have given mortals hearts that can endure.

Aug 1 2020, 10:31 AM
Vulcan added a comment to D665: Make ship pickup nicer.

Build failure - The Moirai have given mortals hearts that can endure.

Aug 1 2020, 10:28 AM
wraitii accepted D2880: [gameplay] delete wall technology.

I agree that these techs make no sense and removing them seems good.

Aug 1 2020, 10:21 AM
wraitii updated the diff for D2880: [gameplay] delete wall technology.

Rebased.

Aug 1 2020, 10:21 AM
wraitii added a comment to D665: Make ship pickup nicer.

@borg- Did you test this?

Aug 1 2020, 10:17 AM
wraitii added a comment to D2852: [gameplay] Tweak maurya worker elephant stats.
In D2852#126596, @borg- wrote:

I'm trying to update the patch but I'm not getting it, am I doing something wrong?

Aug 1 2020, 10:10 AM
wraitii updated the diff for D2199: Add RL interface for Reinforcement Learning.

Should compile like this, went a bit overboard with the headers :p .

Aug 1 2020, 10:08 AM
Vulcan added a comment to D2199: Add RL interface for Reinforcement Learning.

Build was aborted.

Aug 1 2020, 10:05 AM
wraitii updated the diff for D665: Make ship pickup nicer.

Reupload to try and fix the map... Not sure what's going on there :p

Aug 1 2020, 10:04 AM
Vulcan added a comment to D2199: Add RL interface for Reinforcement Learning.

Build failure - The Moirai have given mortals hearts that can endure.

Aug 1 2020, 9:53 AM
Vulcan added a comment to D2199: Add RL interface for Reinforcement Learning.

Build failure - The Moirai have given mortals hearts that can endure.

Aug 1 2020, 9:52 AM
wraitii accepted D2199: Add RL interface for Reinforcement Learning.

Thanks again for the hard work and keeping up with this :) It's a great addition.

Aug 1 2020, 9:51 AM
wraitii updated the diff for D2199: Add RL interface for Reinforcement Learning.

Quick tweaks before merging.

Aug 1 2020, 9:50 AM

Jul 31 2020

Stan added a comment to D2908: Deny to run the game with Fixed rendering pipeline.

New behavior seems better as the message is correct and the game actually exits anyway even if you press continue

Jul 31 2020, 7:20 PM
Vulcan added a comment to D2908: Deny to run the game with Fixed rendering pipeline.

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

Jul 31 2020, 4:12 PM
vladislavbelov updated the diff for D2908: Deny to run the game with Fixed rendering pipeline.
Jul 31 2020, 4:05 PM
vladislavbelov added a comment to D2921: Adds ARB shaders for GUI materials to replace fixed ones.
In D2921#126612, @Stan wrote:

Not sure why you changed the last file.

I removed the unused variable for more clear comparison of ARB and GLSL shaders.

Jul 31 2020, 3:10 PM
Stan added a comment to D2921: Adds ARB shaders for GUI materials to replace fixed ones.

Works fine for me in release and debug, Not sure why you changed the last file. ARB and GLSL show no difference.

Jul 31 2020, 2:58 PM
Vulcan added a comment to D2199: Add RL interface for Reinforcement Learning.

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

Jul 31 2020, 2:48 PM
irishninja updated the diff for D2199: Add RL interface for Reinforcement Learning.

Fixed minor style issues

Jul 31 2020, 2:36 PM
autobuild committed rP23914: [i18n] Updated POT and PO files..
[i18n] Updated POT and PO files.
Jul 31 2020, 9:31 AM
Itms accepted D2199: Add RL interface for Reinforcement Learning.

Thanks again for the great work ?

Jul 31 2020, 9:30 AM
vladislavbelov retitled D2921: Adds ARB shaders for GUI materials to replace fixed ones from Adds ARB shaders for GUI materials to replace fixed once to Adds ARB shaders for GUI materials to replace fixed ones.
Jul 31 2020, 5:31 AM
vladislavbelov resigned from rP23906: Fixes the broken animation of the persian champion_cavalry_archer.
Jul 31 2020, 5:31 AM
Harbormaster failed to build B12670: rP23913: Resolve issue with palisade health in Structure Tree for rP23913: Resolve issue with palisade health in Structure Tree!
Jul 31 2020, 2:17 AM
s0600204 committed rP23913: Resolve issue with palisade health in Structure Tree.
Resolve issue with palisade health in Structure Tree
Jul 31 2020, 2:16 AM
borg- updated the diff for D2917: [gameplay] enable cart apartment.
  • Keep <BuildTime>80</BuildTime> <Resources> <wood>225</wood> </Resources>
  • Research time 30 --> 40.
Jul 31 2020, 1:51 AM
borg- added a comment to D2852: [gameplay] Tweak maurya worker elephant stats.

Yes. Feel free to update the patch, like I did, or if you intend to make further changes, consider commandeering it.
I actually dislike this patch, but if others really think it's an improvement, I have no real objections, worker elephants are not that important.

Jul 31 2020, 1:36 AM
Vulcan added a comment to D2199: Add RL interface for Reinforcement Learning.

Build failure - The Moirai have given mortals hearts that can endure.

Jul 31 2020, 12:22 AM
Harbormaster failed remote builds in B12669: Diff 12972 for D2199: Add RL interface for Reinforcement Learning!
Jul 31 2020, 12:22 AM
irishninja updated the diff for D2199: Add RL interface for Reinforcement Learning.

Fixed seg fault due to user exiting the game from the UI when the script is using it, too.

Jul 31 2020, 12:20 AM

Jul 30 2020

Nescio updated the summary of D2496: tweak soldier footprints.
Jul 30 2020, 11:20 PM
Harbormaster failed remote builds in B12668: Diff 12971 for D2496: tweak soldier footprints!
Jul 30 2020, 11:03 PM