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); } } }
private void OnActivate() { ColorBlindSet activeSet = DetermineActiveColorBlindSet(); SetupPaintingFinalColors(activeSet); }
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); }