protected override bool PerformDropIn(Object dropInItem, Farmer farmer) { if (FirstDroppedItem == null) { FirstDroppedItem = dropInItem; PlaySound(Sound.Ship); } else { SecondDroppedItem = dropInItem; var q1 = FirstDroppedItem.quality; var q2 = SecondDroppedItem.quality; var itemQuality = Math.Max(0, q1 + q2 - 1); var itemPrice = (FirstDroppedItem.price * (4 + q1) + SecondDroppedItem.price * (4 + q2)) / 4; var random = GetRandom(); var postfix = $"{FirstDroppedItem.Name.First()}{SecondDroppedItem.Name.First()}-{(char)random.Next('A', 'Z')}{random.Next(1, 9)}{random.Next(0, 9)}"; var hue = random.Next(0, 359); // TODO: Not random color. var color = RawColor.FromHSL(hue, 0.75, 0.55).ToXnaColor(); PutItem(NewMachinesModConfig.ExperementalLiquidID, 1, itemQuality, $"{{0}} {postfix}", itemPrice, color); // TODO: From config? minutesUntilReady = GetMinutesUntilReady(GetOutputItem(SecondDroppedItem)); // TODO: From config? PlaySound(Sound.Ship); PlaySound(Sound.Bubbles); } return(true); }
public void CheckHsbConversion() { var c1 = new RawColor(18, 171, 52); double h, s, l; c1.ToHSL(out h, out s, out l); var c2 = RawColor.FromHSL(h, s, l); Assert.AreEqual(c1.R, c2.R, 1); Assert.AreEqual(c1.G, c2.G, 1); Assert.AreEqual(c1.B, c2.B, 1); }
public static unsafe XColor GetDominantColor(int spriteIndex, Texture2D texture, int width, int height) { XColor cachedColor; if (ColorCache.TryGetValue(spriteIndex, out cachedColor)) { return(cachedColor); } var rect = TextureInfo.Default[TextureType.Items].GetSourceRect(spriteIndex); var size = width * height; var data = new XColor[size]; texture.GetData(0, rect, data, 0, data.Length); const byte empty = 0; const byte inner = 1; const byte edge = 2; var alpha = new byte[size]; var colors = new Dictionary <int, int>(); fixed(byte *pAlpha0 = alpha) fixed(XColor * pData0 = data) { var pAlpha = pAlpha0; var pData = pData0; for (var i = 0; i < size; ++i) { var c = *pData; * pAlpha = (c.A >= 128)? inner : empty; ++pData; ++pAlpha; } pAlpha = pAlpha0 + width; var hi = height - 1; var wi = width - 1; for (var y = 1; y < hi; ++y) { ++pAlpha; for (var x = 1; x < wi; ++x, ++pAlpha) { if (*(pAlpha - width) == empty || *(pAlpha + width) == empty || *(pAlpha - 1) == empty || *(pAlpha + width) == empty) { *pAlpha = edge; } } ++pAlpha; } pAlpha = pAlpha0 + width; pData = pData0 + width; for (var y = 1; y < hi; ++y) { ++pAlpha; ++pData; for (var x = 1; x < wi; ++x, ++pAlpha, ++pData) { if (*pAlpha != 1) { continue; } var xColor = *pData; var c = WColor.FromArgb(xColor.R, xColor.G, xColor.B); var l = c.GetBrightness(); if (l <= 0.15f || 0.85f <= l) { continue; } var s = c.GetSaturation(); if (s <= 0.25f) { continue; } var h = c.GetHue(); var kh = (int)((h + 5) / 10); // 0..36 var ks = (int)((s + 0.17f) * 3); // 0..3 var kl = (int)((l + 0.17f) * 3); // 0..3 var key = (kh << 4) | (ks << 2) | kl; int value; if (colors.TryGetValue(key, out value)) { colors[key] = value + 1; } else { colors.Add(key, 1); } } } } if (!colors.Any()) { Log.Error("No dominant color found!"); cachedColor = XColor.Gray; } else { var dominantColors = colors.OrderByDescending(x => x.Value).Take(3).ToArray(); var dominantColor = dominantColors[0]; if (IsGreenColor(dominantColor)) { var notGreenColors = dominantColors.Where(c => !IsGreenColor(c)).Take(2).ToArray(); if (notGreenColors.Any()) { var altColor1 = notGreenColors[0]; var altColor2 = (notGreenColors.Length > 2)? notGreenColors[1] : altColor1; if ((altColor1.Value + altColor2.Value) * 4 >= dominantColor.Value * 3) { dominantColor = altColor1; } } } var dominantColorKey = dominantColor.Key; var finalH = Math.Min(Math.Max(0, (dominantColorKey >> 4) * 10 - 5), 359); var finalL = Math.Min(Math.Max(0, 0.40 + (dominantColorKey & 3) * 0.1), 1); cachedColor = RawColor.FromHSL(finalH, 0.80, finalL).ToXnaColor(); } ColorCache.Add(spriteIndex, cachedColor); return(cachedColor); }