Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }