public decimal TestCalculateTotalBet() { var user = new UserGameKey(-1, 104); var requestContext = new RequestContext <SpinArgs>("unittest", "God of Fortune", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, }; var userSession = new UserSession { SessionKey = "unittest" }; var spinArgs = new SpinArgs { LineBet = 1, Multiplier = 1 }; requestContext.Parameters = spinArgs; requestContext.UserSession = userSession; return(module.CalculateTotalBet(new UserGameSpinData(), requestContext)); }
public void TestBonusBuilder() { // arrange var user = new UserGameKey(-1, 109); var requestContext = new RequestContext <SpinArgs>("simulation", "Cleopatra", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, }; var userSession = new UserSession { SessionKey = "unittest" }; var spinArgs = new SpinArgs { LineBet = 1, Multiplier = 1 }; requestContext.Parameters = spinArgs; requestContext.UserSession = userSession; var freeSpinWheel = new FortuneChimesWheel { Reels = new List <int[]> { new [] { 0, 1, 2 }, new [] { 0, 10, 1 }, new [] { 0, 10, 3 }, new [] { 0, 10, 2 }, new [] { 2, 3, 4 } } }; var explodingWheel = new FortuneChimesWheel { Reels = new List <int[]> { new [] { 0, 1, 2 }, new [] { 0, 4, 1 }, new [] { 0, 10, 3 }, new [] { 0, 10, 2 }, new [] { 2, 3, 4 } } }; // Action var freeSpin = GameReduce.DoSpin(1, requestContext, freeSpinWheel); var expoding = GameReduce.DoSpin(1, requestContext, explodingWheel); // Assert Assert.IsTrue(freeSpin.HasBonus); Assert.IsTrue(freeSpin.Bonus.ClientId == 3); Assert.IsTrue(freeSpin.Bonus.Count == 14); Assert.IsTrue(expoding.HasBonus); Assert.IsTrue(expoding.Bonus.ClientId == 4); Assert.IsTrue(expoding.Bonus.Count == 1); }
public void TestSpin() { // Arrange var user = new UserGameKey(-1, 51); var requestContext = new RequestContext <SpinArgs>("simulation", "FortuneKoi", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, }; var userSession = new UserSession { SessionKey = "unittest" }; var spinArgs = new SpinArgs { LineBet = 1, Multiplier = 1 }; requestContext.Parameters = spinArgs; requestContext.UserSession = userSession; var wheel = new FortuneKoiWheel { Reels = new List <int[]> { new [] { 0, 1, 2 }, new [] { 0, 10, 1 }, new [] { 0, 10, 3 }, new [] { 0, 10, 2 }, new [] { 2, 3, 4 } } }; // Action var result = GameReduce.DoSpin(1, requestContext, wheel); var responseXml = xmlhelper.Serialize(result.ToResponseXml(ResponseXmlFormat.None)); var element = XElement.Parse(responseXml, LoadOptions.PreserveWhitespace); var xelement = result.ToXElement(); // Assert Assert.IsTrue(result.ToString() != null); Assert.IsTrue(result.XmlType == XmlType.SpinXml); Assert.IsTrue(result.GameResultType == GameResultType.SpinResult); Assert.IsNotNull(element); Assert.IsNotNull(xelement); Assert.IsTrue(element.Element("wheels") != null); Assert.IsTrue(element.Element("wheels").Attribute("val") != null); Assert.AreEqual(element.Element("wheels").Attribute("val").Value, "0,1,2,0,10,1,0,10,3,0,10,2,2,3,4"); Assert.IsTrue(element.Element("win") != null); Assert.AreEqual(result.Win, decimal.Parse(element.Element("win").Value)); Assert.IsTrue(element.Element("winposition") != null); Assert.AreEqual(result.HasBonus, element.Element("bonus") != null); Assert.AreEqual(result.HasBonus, element.Element("bonusposition") != null); }
public void TestSpin() { // Arrange var user = new UserGameKey(-1, 3); var requestContext = new RequestContext <SpinArgs>("simulation", "Bikini Beach", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, }; var userSession = new UserSession { SessionKey = "unittest" }; var spinArgs = new SpinArgs { LineBet = 1, Multiplier = 1 }; requestContext.Parameters = spinArgs; requestContext.UserSession = userSession; // Action var spin = module.ExecuteSpin(1, new UserGameSpinData(), requestContext); var result = spin.Value as BikiniBeachResult; // Assert Assert.AreEqual(1, result.Level); Assert.AreNotEqual(result.Wheel, default(BikiniBeachWheel)); Assert.IsTrue(result.Bet == 30); if (result.HasBonus) { switch (result.Bonus.ClientId) { case 2: Assert.AreEqual(4, result.Bonus.Count); break; case 3: Assert.AreEqual(1, result.Bonus.Count); break; case 4: Assert.AreEqual(3, result.Bonus.Count); break; } } }
public async Task <Result <RequestContext <SpinArgs>, ErrorCode> > Build(SpinMessage message) { var buildRequest = await RequestContextBuilder.Build <SpinArgs>(userService, gameService, cachedSettings, httpContextAccessor, message.Key, message.Game); if (buildRequest.IsError) { return(buildRequest.Error); } var request = buildRequest.Value; var gameState = await userService.GetGameState(request); if (gameState.Type == GameStateType.SlotStateBonus) { return(ErrorCode.IncorrectState); } request.LastGameState = gameState; if (message.Bet < 0m) { return(ErrorCode.IncorrectBet); } if (!request.GameSetting.CoinsDenomination .Split(';') .Select(decimal.Parse).ToList().Any(s => s == message.Bet)) { return(ErrorCode.IncorrectBet); } EnsureBetMultiplier(message, request.GameSetting.CoinsMultiplier); if (message.SideBet && !request.Game.IsSideBet) { return(ErrorCode.WrongParameter); } request.Query.TryGetInt32("cheat", out int cheat); var args = new SpinArgs { LineBet = message.Bet, SideBet = message.SideBet, FunPlayDemoKey = cheat, IsAutoSpin = false, BettingLines = 0, Multiplier = message.Multiplier }; request.Parameters = args; return(request); }
public void TestSpin() { // Arrange var user = new UserGameKey(-1, 109); var requestContext = new RequestContext <SpinArgs>("simulation", "Cleopatra", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, }; var userSession = new UserSession { SessionKey = "unittest" }; var spinArgs = new SpinArgs { LineBet = 1, Multiplier = 1 }; requestContext.Parameters = spinArgs; requestContext.UserSession = userSession; var wheel = new FortuneChimesWheel { Reels = new List <int[]> { new [] { 0, 1, 2 }, new [] { 0, 10, 1 }, new [] { 0, 10, 3 }, new [] { 0, 10, 2 }, new [] { 2, 3, 4 } } }; // Action var result = GameReduce.DoSpin(1, requestContext, wheel); var responseXml = xmlhelper.Serialize(result.ToResponseXml(ResponseXmlFormat.None)); var element = XElement.Parse(responseXml, LoadOptions.PreserveWhitespace); // Assert Assert.IsNotNull(element); Assert.IsTrue(element.Element("wheels") != null); Assert.AreEqual(wheel.Reels.Select(ele => string.Join(',', ele)).Aggregate((s1, s2) => string.Join(',', s1, s2)), element.Element("wheels").Attribute("val").Value); Assert.AreEqual(result.Win > 0, element.Element("win") != null); Assert.AreEqual(result.Win, decimal.Parse(element.Element("win").Value)); Assert.AreEqual(result.Win > 0, element.Element("winposition") != null); Assert.AreEqual(result.HasBonus, element.Element("bonus") != null); Assert.AreEqual(result.HasBonus, element.Element("bonusposition") != null); }
public void Spin(int level, int numusers, int numItrPerUser, decimal spinBet) { var sdt = DateTime.Now; var spinArgs = new SpinArgs { LineBet = spinBet, Multiplier = 1 }; var users = Utilities.GenerateUsers(GameId, numusers, level); var summData = users.AsParallel().Select(user => { var data = new SummaryData(); var request = user.CreateRequestContext <SpinArgs>("FortunePack"); request.Parameters = spinArgs; foreach (var iter in new byte[numItrPerUser]) { data.SpinCounter++; data.TotalBet += 8 * spinBet; var executeResult = module.ExecuteSpin(level, new UserGameSpinData(), request); var result = executeResult.Value as FortunePackResult; data.TotalWin += result.Win; } return(data); }).AsEnumerable() .Aggregate((s1, s2) => s1 + s2); var edt = DateTime.Now; var oldOut = Console.Out; var fileStream = new FileStream($@"..\..\..\Results\FortunePack\{TestContext.CurrentContext.Test.Name}.txt", FileMode.OpenOrCreate, FileAccess.Write); var writer = new StreamWriter(fileStream); Console.SetOut(writer); Console.WriteLine(String.Format("Test.Level : {0}", level)); Console.WriteLine(String.Format("Test.TimeStart : {0} {1}", sdt.ToShortDateString(), sdt.ToLongTimeString())); Console.WriteLine(String.Format("Test.TimeEnd : {0} {1}", edt.ToShortDateString(), edt.ToLongTimeString())); Console.WriteLine(String.Format("Test.SpinMode : {0}", "Random")); Console.WriteLine("----------------------------------------"); Console.WriteLine(String.Format("SpinCount : {0}", summData.SpinCounter)); Console.WriteLine(String.Format("TotalBet : {0,12:0.00}", summData.TotalBet)); Console.WriteLine(String.Format("Game Win : {0,12:0.00}", summData.TotalWin)); Console.WriteLine("--- RTP.OverAll ------------------------"); Console.WriteLine(String.Format("RTP.Total (Over All) : {0,11:0.00}%", 100 * summData.RTPOverAll)); Console.SetOut(oldOut); writer.Close(); fileStream.Close(); Console.WriteLine("Done"); }
public void TestSpin() { // Arrange var user = new UserGameKey(-1, 51); var requestContext = new RequestContext <SpinArgs>("simulation", "Qixi", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, }; var userSession = new UserSession { SessionKey = "unittest" }; var spinArgs = new SpinArgs { LineBet = 1, Multiplier = 1 }; requestContext.Parameters = spinArgs; requestContext.UserSession = userSession; // Action var result = module.ExecuteSpin(1, new UserGameSpinData(), requestContext).Value as QixiSpinResult; var responseXml = xmlhelper.Serialize(result.ToResponseXml(ResponseXmlFormat.None)); var element = XElement.Parse(responseXml, LoadOptions.PreserveWhitespace); var xelement = result.ToXElement(); // Assert Assert.IsTrue(result.ToString() != null); Assert.IsTrue(result.XmlType == XmlType.SpinXml); Assert.IsTrue(result.GameResultType == GameResultType.SpinResult); Assert.IsNotNull(element); Assert.IsNotNull(xelement); Assert.IsTrue(element.Element("wheels") != null); Assert.IsTrue(element.Element("wheels").Attribute("val") != null); Assert.IsTrue(element.Element("wheels").Attribute("val").Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray().Length == 15); Assert.IsTrue(element.Element("win") != null); Assert.AreEqual(result.Win, decimal.Parse(element.Element("win").Value)); Assert.IsTrue(element.Element("winposition") != null); Assert.AreEqual(null, element.Element("bonus")); Assert.AreEqual(null, element.Element("bonusposition")); }
public void TestSpin() { // Arrange var user = new UserGameKey(-1, 104); var requestContext = new RequestContext <SpinArgs>("simulation", "Dragon Riches", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, }; var userSession = new UserSession { SessionKey = "unittest" }; var spinArgs = new SpinArgs { LineBet = 1, Multiplier = 1 }; requestContext.Parameters = spinArgs; requestContext.UserSession = userSession; // Action var spin = module.ExecuteSpin(1, new UserGameSpinData(), requestContext); var result = spin.Value as Games.DragonRiches.DragonRichesResult; // Assert Assert.AreEqual(1, result.Level); Assert.AreNotEqual(result.Wheel, default(Games.DragonRiches.DragonRichesWheel)); Assert.IsTrue(result.Bet == 30); if (result.HasBonus) { if (result.Bonus.ClientId == 3) { Assert.AreEqual(6, result.Bonus.Count); } else { Assert.AreEqual(3, result.Bonus.ClientId); } } }
public void TestSpin() { // Arrange var user = new UserGameKey(-1, 32); var requestContext = new RequestContext <SpinArgs>("simulation", "FortuneKoi", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, }; var userSession = new UserSession { SessionKey = "unittest" }; var spinArgs = new SpinArgs { LineBet = 1, Multiplier = 1 }; requestContext.Parameters = spinArgs; requestContext.UserSession = userSession; // Action var spin = module.ExecuteSpin(1, new UserGameSpinData(), requestContext); var result = spin.Value as FortuneKoiSpinResult; // Assert Assert.AreEqual(1, result.Level); Assert.AreNotEqual(result.Wheel, default(FortuneKoiWheel)); Assert.IsTrue(result.Bet == 10); Assert.AreEqual(result.GameResultType, GameResultType.SpinResult); if (result.HasBonus) { Assert.NotNull(result.Bonus); Assert.AreEqual(1, result.Bonus.Count); } }
public void ReSpinMode(int level, int purchaseReel, int numItrPerUser, string stringWheel) { var sdt = DateTime.Now; var summData = new SummaryData { SpinCounter = numItrPerUser, TotalBet = 0 }; var spin = new SpinArgs { LineBet = 1, Multiplier = 1 }; var user = new UserGameKey(-1, GameId) { Level = level }; var requestContext = user.CreateRequestContext <SpinArgs>("monkeysmash"); requestContext.Parameters = spin; var bonusRequestcontext = user.CreateRequestContext <BonusArgs>("monkeysmash"); var reels = Utilities.Encoding(stringWheel); var priorSpinResult = new ReelGemResult() { Wheel = Utilities.Encoding(stringWheel, 5, 3), ReelRespinCredits = ReelGemsEngine.CalcWagerCost(level, reels) }; foreach (var item in new sbyte[numItrPerUser]) { summData.TotalBet += priorSpinResult.ReelRespinCredits[purchaseReel]; var result = ReelGemsEngine.BuyReel(level, purchaseReel, priorSpinResult, requestContext); Assert.NotNull(result); summData.TotalWin += result.Win; if (result.HasBonus) { var freeSpinResult = ExecuteFreeSpin(level, bonusRequestcontext, result); summData.FSTotalWin += freeSpinResult.TotalWin; } } PrintResult(level, sdt, DateTime.Now, summData, TestContext.CurrentContext.Test.Name); }
public void TestSpin() { // Arrange var user = new UserGameKey(-1, 14); var requestContext = new RequestContext <SpinArgs>("simulation", "God of Fortune", PlatformType.None) { GameSetting = new GameSetting { GameSettingGroupId = 1 }, Query = new QueryCollection { }, }; var userSession = new UserSession { SessionKey = "unittest" }; var spinArgs = new SpinArgs { LineBet = 1, Multiplier = 1 }; requestContext.Parameters = spinArgs; requestContext.UserSession = userSession; // Action var spin = module.ExecuteSpin(1, new UserGameSpinData(), requestContext); var result = spin.Value as Games.FortunePack.FortunePackResult; // Assert Assert.AreEqual(1, result.Level); Assert.AreNotEqual(result.Wheel, default(Wheel)); Assert.IsTrue(result.Bet == 8); }
public void Spin(int level, int numusers, int numItrPerUser, decimal spinBet) { var sdt = DateTime.Now; var spinArgs = new SpinArgs { LineBet = spinBet, Multiplier = 1 }; var users = Utilities.GenerateUsers(GameId, numusers, level); var summData = users.AsParallel().WithDegreeOfParallelism(Environment.ProcessorCount).Select(user => { var data = new SummaryData(); var request = user.CreateRequestContext <SpinArgs>("bonus-bear"); request.Parameters = spinArgs; foreach (var iter in new byte[numItrPerUser]) { data.SpinCounter++; data.TotalBet += 25 * spinBet; var executeResult = module.ExecuteSpin(level, new UserGameSpinData(), request); var result = executeResult.Value as BearResult; data.MainGameWin += result.Win; if (result.HasBonus) { var bonus = result.Bonus; var bonusRequest = user.CreateRequestContext <BonusArgs>("Bonus Bear-hunter"); var typeOfBonus = bonus.ClientId; switch (typeOfBonus) { case 4: data.MgHoneyHit++; data += ExecuteMainGameHoney(level, bonusRequest, result); break; case 3: data.MgFHit++; data += ExecuteFreeSpin(level, bonusRequest, result); break; default: throw new Exception(); } } } return(data); }).AsEnumerable() .Aggregate((s1, s2) => s1 + s2); var edt = DateTime.Now; var oldOut = Console.Out; var fileStream = new FileStream($@"..\..\..\Results\CaptainRabbit\{TestContext.CurrentContext.Test.Name}.txt", FileMode.OpenOrCreate, FileAccess.Write); var writer = new StreamWriter(fileStream); Console.SetOut(writer); Console.WriteLine(String.Format("Test.Level : {0}", level)); Console.WriteLine(String.Format("Test.TimeStart : {0} {1}", sdt.ToShortDateString(), sdt.ToLongTimeString())); Console.WriteLine(String.Format("Test.TimeEnd : {0} {1}", edt.ToShortDateString(), edt.ToLongTimeString())); Console.WriteLine(String.Format("SpinCount : {0}", summData.SpinCounter)); Console.WriteLine(String.Format("TotalBet : {0,12:0.00}", summData.TotalBet)); Console.WriteLine("----------------------------------------"); Console.WriteLine(String.Format("Honey Hit Rate (MG) : {0,12:0.00}", summData.MgHoneyHitRate)); Console.WriteLine(String.Format("Feature Hit Rate (MG) : {0,12:0.00}", summData.MgFHitRate)); Console.WriteLine(String.Format("Honey Hit Rate (FG) : {0,12:0.00}", summData.FgHoneyHitRate)); Console.WriteLine(String.Format("Feature Hit Rate (FG) : {0,12:0.00}", summData.FgFHitRate)); Console.WriteLine(String.Format("MG Win : {0,12:0.00}", summData.MainGameWin)); Console.WriteLine(String.Format("MG Honey Win : {0,12:0.00}", summData.MgHoneyWin)); Console.WriteLine(String.Format("FG Win : {0,12:0.00}", summData.FSTotalWin)); Console.WriteLine(String.Format("FG Honey Win : {0,12:0.00}", summData.FgHoneyWin)); Console.WriteLine("----------------------------------------"); if (summData.TotalBet > 0) { Console.WriteLine(String.Format("MG RTP : {0,11:0.00}%", 100 * summData.MainGameWin / summData.TotalBet)); Console.WriteLine(String.Format("MG Honey RTP : {0,11:0.00}%", 100 * summData.MgHoneyWin / summData.TotalBet)); Console.WriteLine(String.Format("FG RTP : {0,11:0.00}%", 100 * summData.FSTotalWin / summData.TotalBet)); Console.WriteLine(String.Format("FG Honey RTP : {0,11:0.00}%", 100 * summData.FgHoneyWin / summData.TotalBet)); } Console.WriteLine("--- RTP.OverAll ------------------------"); Console.WriteLine(String.Format("RTP.Total (Over All) : {0,11:0.0000}%", 100 * summData.RTPOverAll)); Console.SetOut(oldOut); writer.Close(); fileStream.Close(); Console.WriteLine("Done"); }
public void Spin(int level, int numusers, int numItrPerUser, decimal spinBet) { var sdt = DateTime.Now; var spinArgs = new SpinArgs { LineBet = spinBet, Multiplier = 1 }; var users = Utilities.GenerateUsers(GameId, numusers, level); var summData = users .AsParallel() .Select(user => { var data = new SummaryData(); var request = user.CreateRequestContext <SpinArgs>("monkeysmash"); request.Parameters = spinArgs; foreach (var iter in new byte[numItrPerUser]) { data.SpinCounter++; data.TotalBet += spinBet * 25; var executeResult = module.ExecuteSpin(level, new UserGameSpinData(), request); var result = executeResult.Value as ReelGemResult; data.TotalWin += result.Win; if (result.HasBonus) { var bonusRequest = user.CreateRequestContext <BonusArgs>("monkeysmash"); var freeSpinResult = ExecuteFreeSpin(level, bonusRequest, result); data.FSTotalWin += freeSpinResult.TotalWin; } else { var priorSpinResult = result.Copy(); for (int pr = 0; pr < 5; pr++) { var buyReelResult = BuyReel(level, pr, priorSpinResult); data.BuyReel += buyReelResult; } } } return(data); }) .AsEnumerable() .Aggregate((s1, s2) => s1 + s2); var edt = DateTime.Now; var oldOut = Console.Out; var fileStream = new FileStream($@"..\..\..\Results\MonkeySmash\{TestContext.CurrentContext.Test.Name}.txt", FileMode.OpenOrCreate, FileAccess.Write); var writer = new StreamWriter(fileStream); Console.SetOut(writer); Console.WriteLine(String.Format("Test.Level : {0}", level)); Console.WriteLine(String.Format("Test.TimeStart : {0} {1}", sdt.ToShortDateString(), sdt.ToLongTimeString())); Console.WriteLine(String.Format("Test.TimeEnd : {0} {1}", edt.ToShortDateString(), edt.ToLongTimeString())); Console.WriteLine(String.Format("Test.SpinMode : {0}", "Random")); Console.WriteLine("---NORMAL -------------------------------"); Console.WriteLine(String.Format("Test.SpinCount : {0}", summData.SpinCounter)); Console.WriteLine(String.Format("TotalBet : {0,12:0.00}", summData.TotalBet)); Console.WriteLine(String.Format("Game Win : {0,12:0.00}", summData.TotalWin)); Console.WriteLine(String.Format("Free Spin Win : {0,12:0.00}", summData.FSTotalWin)); if (summData.TotalBet > 0) { Console.WriteLine(String.Format("Main Game RTP : {0,12:0.00}", 100 * summData.TotalWin / summData.TotalBet)); Console.WriteLine(String.Format("Free Spin RTP : {0,12:0.00}", 100 * summData.FSTotalWin / summData.TotalBet)); Console.WriteLine(String.Format("Total RTP : {0,12:0.00}", 100 * (summData.TotalWin + summData.FSTotalWin) / summData.TotalBet)); } var buyReelSum = summData.BuyReel; Console.WriteLine("--- BUY REEL----------------------------"); Console.WriteLine(String.Format("Test.SpinCount : {0}", buyReelSum.SpinCounter)); Console.WriteLine(String.Format("TotalBet : {0,12:0.00}", buyReelSum.TotalBet)); Console.WriteLine(String.Format("Game Win : {0,12:0.00}", buyReelSum.TotalWin)); Console.WriteLine(String.Format("Free Spin Win : {0,12:0.00}", buyReelSum.FSTotalWin)); if (summData.BuyReel.TotalBet > 0) { Console.WriteLine(String.Format("Main Game RTP : {0,12:0.00}", 100 * buyReelSum.TotalWin / buyReelSum.TotalBet)); Console.WriteLine(String.Format("Free Spin RTP : {0,12:0.00}", 100 * buyReelSum.FSTotalWin / buyReelSum.TotalBet)); Console.WriteLine(String.Format("Total RTP : {0,12:0.00}", 100 * (buyReelSum.TotalWin + buyReelSum.FSTotalWin) / buyReelSum.TotalBet)); } Console.WriteLine("--- RTP.OverAll -------------------------"); Console.WriteLine(String.Format("RTP.Total (Over All) : {0,12:0.00}", 100 * summData.RTPOverAll)); Console.SetOut(oldOut); writer.Close(); fileStream.Close(); Console.WriteLine("Done"); }
public void Spin(int level, int numusers, int numItrPerUser, decimal spinBet) { var sdt = DateTime.Now; var spinArgs = new SpinArgs { LineBet = spinBet, Multiplier = 1 }; var users = Utilities.GenerateUsers(GameId, numusers, level); var summData = users.AsParallel().WithDegreeOfParallelism(Environment.ProcessorCount).Select(user => { var data = new SummaryData(); var request = user.CreateRequestContext <SpinArgs>("fortunechimes"); request.Parameters = spinArgs; foreach (var iter in new byte[numItrPerUser]) { data.SpinCounter++; data.TotalBet += 30 * spinBet; var executeResult = module.ExecuteSpin(level, new UserGameSpinData(), request); var result = executeResult.Value as FortuneChimesSpinResult; var scatterPayout = result.WinPositions.Where(ele => ele.Line == 0 && ele.Symbol == 10).Sum(item => item.Win); data.MainGameScatterWin += scatterPayout; data.MainGameNoneScatterWin += result.Win - scatterPayout; if (result.HasBonus) { var bonus = result.Bonus; var bonusRequest = user.CreateRequestContext <BonusArgs>("fortunechimes"); var typeOfBonus = bonus.ClientId; switch (typeOfBonus) { case 4: case 5: data.MgExplodingHit++; break; case 3: data.MgFHit++; break; default: throw new Exception(); } data += ExecuteBonus(level, bonusRequest, result); } } return(data); }).AsEnumerable() .Aggregate((s1, s2) => s1 + s2); var edt = DateTime.Now; var oldOut = Console.Out; var fileStream = new FileStream($@"..\..\..\Results\FortuneChimes\{TestContext.CurrentContext.Test.Name}.txt", FileMode.OpenOrCreate, FileAccess.Write); var writer = new StreamWriter(fileStream); Console.SetOut(writer); Console.WriteLine(String.Format("Test.Level : {0}", level)); Console.WriteLine(String.Format("Test.TimeStart : {0} {1}", sdt.ToShortDateString(), sdt.ToLongTimeString())); Console.WriteLine(String.Format("Test.TimeEnd : {0} {1}", edt.ToShortDateString(), edt.ToLongTimeString())); Console.WriteLine(String.Format("SpinCount : {0}", summData.SpinCounter)); Console.WriteLine(String.Format("TotalBet : {0,12:0.00}", summData.TotalBet)); Console.WriteLine("----------------------------------------"); Console.WriteLine(String.Format("Exploding Hit Rate (MG) : {0,12:0.00}", summData.MgExplodingHitRate)); Console.WriteLine(String.Format("MG Avg Feature Hit Rate : {0,12:0.00}", summData.MgFHitRate)); Console.WriteLine(String.Format("Exploding Feature Hit Rate : {0,12:0.00}", summData.MgExplodingFHitRate)); Console.WriteLine(String.Format("Exploding Hit Rate (FG) : {0,12:0.00}", summData.FgExplodingHitRate)); Console.WriteLine(String.Format("Reveal Hit Rate (FG) : {0,12:0.00}", summData.FgRevealHitRate)); Console.WriteLine(String.Format("MG Scatter Win : {0,12:0.00}", summData.MainGameScatterWin)); Console.WriteLine(String.Format("MG None Scatter Win : {0,12:0.00}", summData.MainGameNoneScatterWin)); Console.WriteLine(String.Format("MG ReSpin Scatter Win : {0,12:0.00}", summData.MgScatterExplodingWin)); Console.WriteLine(String.Format("MG ReSpin None Scatter Win : {0,12:0.00}", summData.MgNonScatterExplodingWin)); Console.WriteLine(String.Format("MG Reveal Win : {0,12:0.00}", summData.MgRevealWin)); Console.WriteLine(String.Format("FG Win : {0,12:0.00}", summData.FSTotalWin)); Console.WriteLine(String.Format("FG Exploding Win : {0,12:0.00}", summData.FgExplodingWin)); Console.WriteLine(String.Format("FG Reveal Win : {0,12:0.00}", summData.FgRevealWin)); Console.WriteLine("----------------------------------------"); if (summData.TotalBet > 0) { Console.WriteLine(String.Format("MG Scatter RTP : {0,11:0.00}%", 100 * summData.MainGameScatterWin / summData.TotalBet)); Console.WriteLine(String.Format("MG None Scatter RTP : {0,11:0.00}%", 100 * summData.MainGameNoneScatterWin / summData.TotalBet)); Console.WriteLine(String.Format("MG ReSpin Scatter RTP : {0,11:0.00}%", 100 * summData.MgScatterExplodingWin / summData.TotalBet)); Console.WriteLine(String.Format("MG ReSpin NOne Scatter RTP : {0,11:0.00}%", 100 * summData.MgNonScatterExplodingWin / summData.TotalBet)); Console.WriteLine(String.Format("MG Reveal RTP : {0,11:0.00}%", 100 * summData.MgRevealWin / summData.TotalBet)); Console.WriteLine(String.Format("FG RTP : {0,11:0.00}%", 100 * summData.FSTotalWin / summData.TotalBet)); Console.WriteLine(String.Format("FG Exploding RTP : {0,11:0.00}%", 100 * summData.FgExplodingWin / summData.TotalBet)); Console.WriteLine(String.Format("FG Reveal RTP : {0,11:0.00}%", 100 * summData.FgRevealWin / summData.TotalBet)); } Console.WriteLine("--- RTP.OverAll ------------------------"); Console.WriteLine(String.Format("RTP.Total (Over All) : {0,11:0.0000}%", 100 * summData.RTPOverAll)); Console.SetOut(oldOut); writer.Close(); fileStream.Close(); Console.WriteLine("Done"); }
public void FullCycle(int level, decimal spinBet) { var strips = Slot.Games.FortuneChimes.Configuration.Config.MainGameReelStrip[0]; var reel1 = strips[0]; var reel2 = strips[1]; var reel3 = strips[2]; var reel4 = strips[3]; var reel5 = strips[4]; var user = new UserGameKey(-1, 109) { Level = level }; var summData = new SummaryData(); var sdt = DateTime.Now; var spinArgs = new SpinArgs { LineBet = spinBet, Multiplier = 1 }; var request = user.CreateRequestContext <SpinArgs>("fortunechimes"); for (int i1 = 0; i1 < reel1.Count; i1++) { for (int i2 = 0; i2 < reel2.Count; i2++) { for (int i3 = 0; i3 < reel3.Count; i3++) { for (int i4 = 0; i4 < reel4.Count; i4++) { for (int i5 = 0; i5 < reel5.Count; i5++) { request.Parameters = spinArgs; var r1 = reel1.TakeCircular(i1, 3).ToArray(); var r2 = reel2.TakeCircular(i2, 3).ToArray(); var r3 = reel3.TakeCircular(i3, 3).ToArray(); var r4 = reel4.TakeCircular(i4, 3).ToArray(); var r5 = reel5.TakeCircular(i5, 3).ToArray(); if (i1 == 2 && i2 == i3 && i3 == i4 && i4 == 9) { } var wheel = new FortuneChimesWheel { Reels = new List <int[]> { r1, r2, r3, r4, r5 }, Indices = new int[] { i1, i2, i3, i4, i5 } }; summData.SpinCounter++; summData.TotalBet += Slot.Games.FortuneChimes.Configuration.Config.Lines * spinBet; var result = GameReduce.DoSpin(level, request, wheel); var scatterPayout = result.WinPositions.Where(ele => ele.Line == 0 && ele.Symbol == 10).Sum(item => item.Win); summData.MainGameScatterWin += scatterPayout; summData.MainGameNoneScatterWin += result.Win - scatterPayout; if (scatterPayout > 0) { summData.MgFHit++; } if (result.HasBonus) { var bonus = result.Bonus; var bonusRequest = user.CreateRequestContext <BonusArgs>("fortunechimes"); var typeOfBonus = bonus.ClientId; switch (typeOfBonus) { case 4: case 5: summData.MgExplodingHit++; break; case 3: summData.MgFHit++; break; default: throw new Exception(); } summData += ExecuteBonus(level, bonusRequest, result); } } } } } } var edt = DateTime.Now; var oldOut = Console.Out; var fileStream = new FileStream($@"..\..\..\Results\FortuneChimes\{TestContext.CurrentContext.Test.Name}.txt", FileMode.OpenOrCreate, FileAccess.Write); var writer = new StreamWriter(fileStream); Console.SetOut(writer); Console.WriteLine(String.Format("Test.Level : {0}", level)); Console.WriteLine(String.Format("Test.TimeStart : {0} {1}", sdt.ToShortDateString(), sdt.ToLongTimeString())); Console.WriteLine(String.Format("Test.TimeEnd : {0} {1}", edt.ToShortDateString(), edt.ToLongTimeString())); Console.WriteLine(String.Format("SpinCount : {0}", summData.SpinCounter)); Console.WriteLine(String.Format("TotalBet : {0,12:0.00}", summData.TotalBet)); Console.WriteLine("----------------------------------------"); Console.WriteLine(String.Format("Exploding Hit Rate (MG) : {0,12:0.00}", summData.MgExplodingHitRate)); Console.WriteLine(String.Format("MG Feature Hit Rate : {0,12:0.00}", summData.MgFHitRate)); Console.WriteLine(String.Format("MG Scatter ReSpin Hit : {0,12:0.00}", summData.MgScatterReSpinFHit)); Console.WriteLine(String.Format("MG None Scatter ReSpin Hit : {0,12:0.00}", summData.MgNoneScatterReSpinFHit)); Console.WriteLine(String.Format("MG ReSpin Feature Hit Rate : {0,12:0.00}", summData.MgReSpinFHitRate)); //Console.WriteLine(String.Format("MG Avg Feature Hit Rate : {0,12:0.00}", summData)); Console.WriteLine(String.Format("Exploding Feature Hit Rate : {0,12:0.00}", summData.MgExplodingFHitRate)); Console.WriteLine(String.Format("Exploding Hit Rate (FG) : {0,12:0.00}", summData.FgExplodingHitRate)); Console.WriteLine(String.Format("Reveal Hit Rate (FG) : {0,12:0.00}", summData.FgRevealHitRate)); Console.WriteLine(String.Format("MG Scatter Win : {0,12:0.00}", summData.MainGameScatterWin)); Console.WriteLine(String.Format("MG None Scatter Win : {0,12:0.00}", summData.MainGameNoneScatterWin)); Console.WriteLine(String.Format("MG ReSpin Scatter Win : {0,12:0.00}", summData.MgScatterExplodingWin)); Console.WriteLine(String.Format("MG ReSpin None Scatter Win : {0,12:0.00}", summData.MgNonScatterExplodingWin)); Console.WriteLine(String.Format("MG Reveal Win : {0,12:0.00}", summData.MgRevealWin)); Console.WriteLine(String.Format("FG Win : {0,12:0.00}", summData.FSTotalWin)); Console.WriteLine(String.Format("FG Exploding Win : {0,12:0.00}", summData.FgExplodingWin)); Console.WriteLine(String.Format("FG Reveal Win : {0,12:0.00}", summData.FgRevealWin)); Console.WriteLine("----------------------------------------"); if (summData.TotalBet > 0) { Console.WriteLine(String.Format("MG Scatter RTP : {0,11:0.00000000000000000000000000}%", 100 * summData.MainGameScatterWin / summData.TotalBet)); Console.WriteLine(String.Format("MG None Scatter RTP : {0,11:0.00000000000000000000000000}%", 100 * summData.MainGameNoneScatterWin / summData.TotalBet)); Console.WriteLine(String.Format("MG ReSpin Scatter RTP : {0,11:0.00000000000000000000000000}%", 100 * summData.MgScatterExplodingWin / summData.TotalBet)); Console.WriteLine(String.Format("MG ReSpin None Scatter RTP : {0,11:0.00000000000000000000000000}%", 100 * summData.MgNonScatterExplodingWin / summData.TotalBet)); Console.WriteLine(String.Format("MG Reveal RTP : {0,11:0.00000000000000000000000000}%", 100 * summData.MgRevealWin / summData.TotalBet)); Console.WriteLine(String.Format("FG RTP : {0,11:0.00}%", 100 * summData.FSTotalWin / summData.TotalBet)); Console.WriteLine(String.Format("FG Exploding RTP : {0,11:0.00}%", 100 * summData.FgExplodingWin / summData.TotalBet)); Console.WriteLine(String.Format("FG Reveal RTP : {0,11:0.00}%", 100 * summData.FgRevealWin / summData.TotalBet)); } Console.WriteLine("--- RTP.OverAll ------------------------"); Console.WriteLine(String.Format("RTP.Total (Over All) : {0,11:0.0000}%", 100 * summData.RTPOverAll)); Console.SetOut(oldOut); writer.Close(); fileStream.Close(); Console.WriteLine($"Max Collapse {maxCollapse}"); Console.WriteLine("Done"); }
public void Spin(int level, int numusers, int numItrPerUser, decimal spinBet) { var sdt = DateTime.Now; var spinArgs = new SpinArgs { LineBet = spinBet, Multiplier = 1 }; var users = Utilities.GenerateUsers(GameId, numusers, level); var summData = users.AsParallel().Select(user => { var data = new SummaryData(); var request = user.CreateRequestContext <SpinArgs>("fudaole"); request.Parameters = spinArgs; foreach (var iter in new byte[numItrPerUser]) { data.SpinCounter++; data.TotalBet += 38 * spinBet; var executeResult = module.ExecuteSpin(level, new UserGameSpinData(), request); var result = executeResult.Value as FuDaoLeResult; if (result.Wheel.Reels[2].All(ele => ele == 15)) { data.ExpandingHit++; } if (result.Win <= 0) { continue; } var normalWinning = result.WinPositions.Where(item => item.Line > 0).ToList(); var nonNormalWinning = result.WinPositions.Where(item => item.Line == 0).ToList(); data.MainGameWin += normalWinning.Sum(ele => ele.Win); data.EnvelopeJackpotWin += nonNormalWinning.Where(ele => ele.Symbol < 14).Sum(item => item.Win); data.ScatterWin += nonNormalWinning.Where(ele => ele.Symbol == 14).Sum(item => item.Win); if (result.HasBonus) { var bonusRequest = user.CreateRequestContext <BonusArgs>("fudaole"); var freeSpinResult = ExecuteFreeSpin(level, bonusRequest, result); data += freeSpinResult; data.MgFHit++; } } return(data); }).AsEnumerable() .Aggregate((s1, s2) => s1 + s2); var edt = DateTime.Now; var oldOut = Console.Out; var fileStream = new FileStream($@"..\..\..\Results\FuDaoLe\{TestContext.CurrentContext.Test.Name}.txt", FileMode.OpenOrCreate, FileAccess.Write); var writer = new StreamWriter(fileStream); Console.SetOut(writer); Console.WriteLine(String.Format("Test.Level : {0}", level)); Console.WriteLine(String.Format("Test.TimeStart : {0} {1}", sdt.ToShortDateString(), sdt.ToLongTimeString())); Console.WriteLine(String.Format("Test.TimeEnd : {0} {1}", edt.ToShortDateString(), edt.ToLongTimeString())); Console.WriteLine(String.Format("Test.SpinMode : {0}", "Random")); Console.WriteLine("----------------------------------------"); Console.WriteLine(String.Format("SpinCount : {0}", summData.SpinCounter)); Console.WriteLine(String.Format("Expanding Hit : {0}", summData.ExpandingHit)); Console.WriteLine(String.Format("Scatter Hit : {0}", summData.MgFHit)); Console.WriteLine(String.Format("TotalBet : {0,12:0.00}", summData.TotalBet)); Console.WriteLine(String.Format("Game Win : {0,12:0.00}", summData.MainGameWin)); Console.WriteLine(String.Format("Scatter Win : {0,12:0.00}", summData.ScatterWin)); Console.WriteLine(String.Format("Envelope Jackpot Win : {0,12:0.00}", summData.EnvelopeJackpotWin)); Console.WriteLine(String.Format("Free Spin Win : {0,12:0.00}", summData.FSTotalWin)); Console.WriteLine(String.Format("Free SpinCount : {0,12:0.00}", summData.FSpinCounter)); Console.WriteLine(String.Format("Av Num of Free Games : {0,12:0.00}", (decimal)summData.FSpinCounter / summData.MgFHit)); Console.WriteLine(String.Format("Expanding Hit Rate : {0,12:0.00}", summData.ExpandingHitHitRate)); Console.WriteLine(String.Format("MG Feature Hit Rate : {0,12:0.00}", summData.MgFHitRate)); Console.WriteLine(String.Format("FG Feature Hit Rate : {0,12:0.00}", summData.FgFHitRate)); Console.WriteLine("----------------------------------------"); if (summData.TotalBet > 0) { Console.WriteLine(String.Format("Main Game Non Scatter RTP : {0,11:0.00}%", 100 * summData.MainGameWin / summData.TotalBet)); Console.WriteLine(String.Format("Scatter RTP : {0,11:0.00}%", 100.0m * summData.ScatterWin / summData.TotalBet)); Console.WriteLine(String.Format("Envelope Jackpot RTP : {0,11:0.00}%", 100 * summData.EnvelopeJackpotWin / summData.TotalBet)); Console.WriteLine(String.Format("Free Spin RTP : {0,11:0.00}%", 100 * summData.FSTotalWin / summData.TotalBet)); } Console.WriteLine("--- RTP.OverAll ------------------------"); Console.WriteLine(String.Format("RTP.Total (Over All) : {0,11:0.00}%", 100 * summData.RTPOverAll)); Console.SetOut(oldOut); writer.Close(); fileStream.Close(); Console.WriteLine("Done"); }
public void Spin(int level, int numusers, int numItrPerUser, decimal spinBet) { var sdt = DateTime.Now; var spinArgs = new SpinArgs { LineBet = spinBet, Multiplier = 1 }; var users = Utilities.GenerateUsers(GameId, numusers, level); var summData = users.AsParallel().Select(user => { var data = new SummaryData(); var request = user.CreateRequestContext <SpinArgs>("geniesluck"); request.Parameters = spinArgs; foreach (var iter in new byte[numItrPerUser]) { data.SpinCounter++; data.TotalBet += 40 * spinBet; var executeResult = module.ExecuteSpin(level, new UserGameSpinData(), request); var result = executeResult.Value as GeniesLuckResult; data.MainGameWin += result.Win; if (result.HasBonus) { if (result.Bonus.ClientId == 3) { data.MgFHit++; } else { data.MgReHit++; } var bonusRequest = user.CreateRequestContext <BonusArgs>("geniesluck"); var freeSpinResult = ExecuteBonus(level, bonusRequest, result); data += freeSpinResult; } } return(data); }).AsEnumerable() .Aggregate((s1, s2) => s1 + s2); var edt = DateTime.Now; var oldOut = Console.Out; var fileStream = new FileStream($@"..\..\..\Results\GeniesLuck\{TestContext.CurrentContext.Test.Name}.txt", FileMode.OpenOrCreate, FileAccess.Write); var writer = new StreamWriter(fileStream); Console.SetOut(writer); Console.WriteLine(String.Format("Test.Level : {0}", level)); Console.WriteLine(String.Format("Test.TimeStart : {0} {1}", sdt.ToShortDateString(), sdt.ToLongTimeString())); Console.WriteLine(String.Format("Test.TimeEnd : {0} {1}", edt.ToShortDateString(), edt.ToLongTimeString())); Console.WriteLine(String.Format("Test.SpinMode : {0}", "Random")); Console.WriteLine("----------------------------------------"); Console.WriteLine(String.Format("SpinCount : {0}", summData.SpinCounter)); Console.WriteLine(String.Format("TotalBet : {0,12:0.00}", summData.TotalBet)); Console.WriteLine(String.Format("Game Win : {0,12:0.00}", summData.MainGameWin)); Console.WriteLine(String.Format("Free Spin Win : {0,12:0.00}", summData.FSWin)); Console.WriteLine(String.Format("Free SpinCount : {0,12:0.00}", summData.FSpinCounter)); Console.WriteLine(String.Format("MG ReSpin Hit Rate : {0,12:0.00}", summData.MgReHitRate)); Console.WriteLine(String.Format("MG Feature Hit Rate : {0,12:0.00}", summData.MgFHitRate)); Console.WriteLine(String.Format("FG ReSpin Hit Rate : {0,12:0.00}", summData.FgReHitRate)); Console.WriteLine(String.Format("FG Feature Hit Rate : {0,12:0.00}", summData.FgFHitRate)); Console.WriteLine("----------------------------------------"); if (summData.TotalBet > 0) { Console.WriteLine(String.Format("Main Game RTP : {0,11:0.00}%", 100 * summData.MainGameWin / summData.TotalBet)); Console.WriteLine(String.Format("ReSpin RTP : {0,11:0.00}%", 100 * summData.ReSpinWin / summData.TotalBet)); Console.WriteLine(String.Format("Main Game RTP : {0,11:0.00}%", 100 * summData.FSWin / summData.TotalBet)); Console.WriteLine(String.Format("ReSpin Free Game RTP : {0,11:0.00}%", 100 * summData.ReSpinFSWin / summData.TotalBet)); } Console.WriteLine("--- RTP.OverAll ------------------------"); Console.WriteLine(String.Format("RTP.Total (Over All) : {0,11:0.00}%", 100 * summData.RTPOverAll)); Console.SetOut(oldOut); writer.Close(); fileStream.Close(); Console.WriteLine("Done"); }