Example #1
0
        public object finalShuffleInternal(object source, int mode)
        {
            var sourceObject = (source as IEnumerable <object>);

            if (sourceObject == null)
            {
                throw new NullReferenceException("Object sent to final shuffle is null or not an array.");
            }

            var resultArray = sourceObject.ToArray();

            if (resultArray.Length == 0)
            {
                return(resultArray);
            }

            GameRandomHelper.GameRandom mt;
            if (context != null && context.Game.Runtime.isProvablyFair)
            {
                canSetPlayerSeed = false;
                var    seedSha = String.Concat(playerSeed, serverSeed).ToSha256Bytes();
                UInt32 seed    = 0;
                for (var i = 0; i < 4; i++)
                {
                    seed = (seed * 256) + seedSha[i];
                }

                mt = GameRandomHelper.GetGameRandom(seed);
            }
            else
            {
                mt = GameRandomHelper.GetGameRandom();
            }

            var count = resultArray.Length - 1;

            switch (mode)
            {
            case 0:
                for (int i = 0; i < resultArray.Length; i++)
                {
                    var index = mt.Next(0, count);
                    var temp  = resultArray[index];
                    resultArray[index] = resultArray[i];
                    resultArray[i]     = temp;
                }

                break;

            case 1:
            {
                var index = mt.Next(0, count);
                resultArray = swapArray(resultArray, index);
            }
            break;
            }

            if (context != null && context.Game.Runtime.isProvablyFair)
            {
                finalShuffleString = resultArray.SerializeJSON().Replace("\r", String.Empty).Replace("\n", String.Empty).Replace("\t", String.Empty);
            }

            return(resultArray);
        }
Example #2
0
        public object shuffleInternal(object source, int mode)
        {
            var sourceObject = (source as IEnumerable <object>);

            if (sourceObject == null)
            {
                throw new NullReferenceException("Object sent to shuffle is null or not an array.");
            }

            var resultArray = sourceObject.ToArray();

            if (resultArray.Length == 0)
            {
                return(resultArray);
            }

            var count = resultArray.Length - 1;
            var mt    = GameRandomHelper.GetGameRandom();

            var cycles = mt.Next(1, count);

            switch (mode)
            {
            case 0:

                for (var j = 0; j < cycles; j++)
                {
                    for (var i = 0; i < resultArray.Length; i++)
                    {
                        var index = mt.Next(0, count);
                        var temp  = resultArray[index];
                        resultArray[index] = resultArray[i];
                        resultArray[i]     = temp;
                    }
                }

                break;

            case 1:

                for (var i = 0; i < cycles; i++)
                {
                    var index = mt.Next(0, count);
                    resultArray = swapArray(resultArray, index);
                }

                break;
            }


            if (context != null && context.Game.Runtime.isProvablyFair)
            {
                if (!String.IsNullOrEmpty(sessionId) && !String.IsNullOrEmpty(finalShuffleString))
                {
                    secretPacket = new Dictionary <string, object>
                    {
                        { "hash", serverHash },
                        { "initialShuffle", initialShuffleString },
                        { "finalShuffle", finalShuffleString },
                        { "serverSeed", serverSeed },
                        { "playerSeed", playerSeed },
                    };

                    context.sendSystemInternal(sessionId, SessionMessageTypeEnum.ProvablyFairServerSecret, secretPacket);
                }

                var buffer = new byte[32];
                shuffleRandom.GetNonZeroBytes(buffer);

                finalShuffleString   = null;
                serverSeed           = BitConverter.ToString(buffer).Replace("-", String.Empty);
                initialShuffleString = resultArray.SerializeJSON().Replace("\r", String.Empty).Replace("\n", String.Empty).Replace("\t", String.Empty);
                serverHash           = String.Concat(serverSeed, initialShuffleString).ToSha256();

                if (!String.IsNullOrEmpty(sessionId))
                {
                    hashPacket = new Dictionary <string, object> {
                        { "hash", serverHash }
                    };
                    context.sendSystemInternal(sessionId, SessionMessageTypeEnum.ProvablyFairServerHash, hashPacket);
                }

                canSetPlayerSeed = true;
            }

            return(resultArray);
        }