public static bool AreMechsCrossVariantCompartible(MechDef a, MechDef b)
        {
            // a excluded had been checked before
            if (b.IsCrossAssemblyExcluded())
            {
                return(false); // b excluded
            }
            string va = a.Chassis.GetVariant();
            string vb = b.Chassis.GetVariant();

            if (IsCrossAssemblyOverrideEnabled(a, b, va, vb))
            {
                return(true); // override enabled
            }
            if (string.IsNullOrEmpty(va) || !va.Equals(vb))
            {
                return(false); // wrong or invalid variant
            }
            if (a.Chassis.MovementCapDef == null)
            {
                a.Chassis.RefreshMovementCaps();
                if (a.Chassis.MovementCapDef == null)
                {
                    Log.LogError(string.Format("{0} {1} (a) has no MovementCapDef, aborting speed comparison", a.Chassis.Description.UIName, a.Chassis.VariantName));
                    return(false);
                }
            }
            if (b.Chassis.MovementCapDef == null)
            {
                b.Chassis.RefreshMovementCaps();
                if (b.Chassis.MovementCapDef == null)
                {
                    Log.LogError(string.Format("{0} {1} (b) has no MovementCapDef, aborting speed comparison", b.Chassis.Description.UIName, b.Chassis.VariantName));
                    return(false);
                }
            }
            if (Settings.CrossAssemblySpeedMatch && (a.Chassis.MovementCapDef.MaxWalkDistance != b.Chassis.MovementCapDef.MaxWalkDistance))
            {
                return(false); // speed missmatch
            }
            if (Settings.CrossAssemblyTonnsMatch && (a.Chassis.Tonnage != b.Chassis.Tonnage))
            {
                return(false); // tonnage missmatch
            }
            foreach (string tag in Settings.CrossAssemblyTagsMatch)
            {
                if (a.Chassis.ChassisTags.Contains(tag) != b.Chassis.ChassisTags.Contains(tag))
                {
                    return(false); // tag missmatch
                }
            }
            foreach (string it in Settings.CrossAssemblyInventoryMatch)
            {
                if (a.CountMechInventory(it) != b.CountMechInventory(it))
                {
                    return(false); // inventory mismatch
                }
            }
            return(true);
        }