コード例 #1
0
 private void SetupPaintingFinalColors(ColorBlindSet activeSet)
 {
     foreach (PaintingCell cell in _painting.Cells)
     {
         if (activeSet != null)
         {
             ColorBlindSet.ColorSwap swap = activeSet.Swaps.FirstOrDefault((x) => x.From == cell.ColorOption);
             if (swap != null)
             {
                 _bombModule.LogFormat("{0} must swap from {1} to {2}.", cell.name, swap.From, swap.To);
                 cell.FinalColorOption = swap.To;
             }
             else
             {
                 _bombModule.LogFormat("{0} must remain as {1}.", cell.name, cell.ColorOption);
                 cell.FinalColorOption = cell.ColorOption;
             }
         }
         else
         {
             cell.FinalColorOption = null;
             _bombModule.LogFormat("{0} must swap from {1} to any other color (special rule).", cell.name, cell.ColorOption);
         }
     }
 }
コード例 #2
0
    private void OnActivate()
    {
        ColorBlindSet activeSet = DetermineActiveColorBlindSet();

        SetupPaintingFinalColors(activeSet);
    }
コード例 #3
0
    private ColorBlindSet DetermineActiveColorBlindSet()
    {
        _bombModule.Log("Determining active color-blind set...");

        bool specialRuleMatch = _bombInfo.GetPortCount(KMBombInfoExtensions.KnownPortType.DVI) == 2 && _bombInfo.GetPortCount(KMBombInfoExtensions.KnownPortType.RJ45) == 1 && _bombInfo.GetOnIndicators().Contains("CLR");

        if (specialRuleMatch)
        {
            _bombModule.Log("Special rule takes effect -- express your creativity!");
            return(null);
        }

        int ruleATotal = _bombInfo.GetBatteryCount() + _bombInfo.GetIndicators().Count() + _bombInfo.GetPorts().Count() + 2;

        _bombModule.LogFormat("Rule A total = {0} (battery count ({1}) + indicator count ({2}) + port count ({3}) + {4}.", ruleATotal, _bombInfo.GetBatteryCount(), _bombInfo.GetIndicators().Count(), _bombInfo.GetPorts().Count(), 2);
        ColorBlindSet ruleASet = ColorBlindSets.FirstOrDefault((x) => x.Name.Length == ruleATotal);

        if (ruleASet != null)
        {
            _bombModule.LogFormat("Rule A matched against color-blind set {0}.", ruleASet.Name);
            return(ruleASet);
        }
        else
        {
            _bombModule.Log("No match for rule A.");
        }

        char[] ruleBIndicatorCharacters = _bombInfo.GetIndicators().SelectMany((x) => x.ToUpperInvariant().ToCharArray()).Distinct().ToArray();
        _bombModule.LogFormat("Rule B unique character set from indicators = {{{0}}}.", string.Join(",", Array.ConvertAll(ruleBIndicatorCharacters, (x) => x.ToString())));

        ColorBlindSet ruleBSet            = null;
        int           ruleBCharacterCount = -1;
        bool          ruleBDuplicate      = false;

        foreach (ColorBlindSet set in ColorBlindSets)
        {
            int characterCount = set.Name.ToUpperInvariant().Where((x) => ruleBIndicatorCharacters.Contains(x)).Count();
            _bombModule.LogFormat("{0} scores {1} on rule B.", set.Name, characterCount);

            if (characterCount > ruleBCharacterCount)
            {
                ruleBSet            = set;
                ruleBCharacterCount = characterCount;
                ruleBDuplicate      = false;
            }
            else if (characterCount == ruleBCharacterCount)
            {
                ruleBDuplicate = true;
            }
        }

        if (ruleBSet != null && !ruleBDuplicate)
        {
            _bombModule.LogFormat("Rule B matched against color-blind set {0}.", ruleBSet.Name);
            return(ruleBSet);
        }
        else
        {
            _bombModule.Log("No match for rule B (duplicate scores found).");
        }

        ColorBlindSet ruleCSet = ColorBlindSets.FirstOrDefault((x) => x.Name.Equals("Protanomaly", StringComparison.InvariantCultureIgnoreCase));

        _bombModule.LogFormat("Rule C matched against color-blind set {0}.", ruleCSet.Name);

        return(ruleCSet);
    }