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); }
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); }