From 36c9558b5fdf985687fcd3dbcd5a5ee2e9852acb Mon Sep 17 00:00:00 2001 From: RoosterDragon Date: Fri, 25 Mar 2016 10:37:08 +0000 Subject: [PATCH] Added some comments to TraitsInConstructOrder. --- OpenRA.Game/GameRules/ActorInfo.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/OpenRA.Game/GameRules/ActorInfo.cs b/OpenRA.Game/GameRules/ActorInfo.cs index e721634d7c..6b18022f05 100644 --- a/OpenRA.Game/GameRules/ActorInfo.cs +++ b/OpenRA.Game/GameRules/ActorInfo.cs @@ -100,9 +100,15 @@ namespace OpenRA var unresolved = source.Except(resolved); var testResolve = new Func((a, b) => a == b || a.IsAssignableFrom(b)); - var more = unresolved.Where(u => u.Dependencies.All(d => resolved.Exists(r => testResolve(d, r.Type)) && !unresolved.Any(u1 => testResolve(d, u1.Type)))); - // Re-evaluate the vars above until sorted + // This query detects which unresolved traits can be immediately resolved as all their direct dependencies are met. + var more = unresolved.Where(u => + u.Dependencies.All(d => // To be resolvable, all dependencies must be satisfied according to the following conditions: + resolved.Exists(r => testResolve(d, r.Type)) && // There must exist a resolved trait that meets the dependency. + !unresolved.Any(u1 => testResolve(d, u1.Type)))); // All matching traits that meet this dependency must be resolved first. + + // Continue resolving traits as long as possible. + // Each time we resolve some traits, this means dependencies for other traits may then be possible to satisfy in the next pass. while (more.Any()) resolved.AddRange(more);