public void ReelWindow_LessThanDefaultHeight() { reels = new ReelGroup(); ReelStrip reel1 = new ReelStrip(); reel1.AddSymbol(new Symbol(0, "AA")); ReelStrip reel2 = new ReelStrip(); reel2.AddSymbol(new Symbol(1, "BB")); ReelStrip reel3 = new ReelStrip(); reel3.AddSymbol(new Symbol(2, "CC")); reels.AddReel(reel1); reels.AddReel(reel2); reels.AddReel(reel3); ReelWindow reelWindow = new ReelWindow(reels, new List <int> { 0, 0, 0 }); List <List <Symbol> > window = reelWindow.Window; Assert.AreEqual(3, window.Count); Assert.AreEqual(1, window[0].Count); Assert.AreEqual(1, window[1].Count); Assert.AreEqual(1, window[2].Count); Assert.AreEqual("AA", window[0][0].Name); Assert.AreEqual("BB", window[1][0].Name); Assert.AreEqual("CC", window[2][0].Name); }
public void ReelWindow_SymbolPositions() { reels = new ReelGroup(); ReelStrip reel1 = new ReelStrip(); reel1.AddSymbol(new Symbol(0, "AA")); reel1.AddSymbol(new Symbol(1, "BB")); reel1.AddSymbol(new Symbol(2, "CC")); reel1.AddSymbol(new Symbol(3, "DD")); reel1.AddSymbol(new Symbol(4, "EE")); reels.AddReel(reel1); reels.AddReel(reel1); reels.AddReel(reel1); reels.AddReel(reel1); reels.AddReel(reel1); ReelWindow reelWindow = new ReelWindow(reels, new List <int> { 0, 0, 0, 0, 0 }); List <SymbolPosition> positions = reelWindow.SymbolPositions[new Symbol(0, "AA")]; Assert.AreEqual(5, positions.Count); Assert.AreEqual(0, positions[0].ReelIndex); Assert.AreEqual(0, positions[0].ReelOffset); Assert.AreEqual(4, positions[4].ReelIndex); Assert.AreEqual(0, positions[4].ReelOffset); }
public SlotResult Evaluate(Paytable paytable, ReelWindow reelWindow, IRng rng) { if (paytable.ScatterComboGroup == null) { throw new Exception("ScatterEvaluator cannot evalate a paytable without a ScatterComboGroup"); } SlotResult result = new SlotResult(); ScattersComponent component = new ScattersComponent(); List <PayCombo> payCombos = paytable.ScatterComboGroup.Combos; for (int combo = 0; combo < payCombos.Count; ++combo) { PayCombo payCombo = payCombos[combo]; int bestPayAmount = 0; PayCombo bestPayCombo = null; // TODO: This assumes the scatter combo contains one type of symbol only. // In almost all cases, this will be true so leaving it for now. bool match = false; Symbol symbol = payCombo.SymbolsInPayCombo[0]; if (reelWindow.SymbolPositions.ContainsKey(symbol) && reelWindow.SymbolPositions[symbol].Count >= payCombo.SymbolsInPayCombo.Count) { match = true; } if (match && (payCombo.PayAmount >= bestPayAmount)) { bestPayCombo = payCombo; bestPayAmount = payCombo.PayAmount; } if (bestPayCombo != null) { // TODO: Might be able to optimize this but making PaylineCoord and SymbolPosition the same thing... Payline payline = new Payline(); foreach (var position in reelWindow.SymbolPositions[symbol]) { payline.AddPaylineCoord(new PaylineCoord { ReelIndex = position.ReelIndex, Offset = position.ReelOffset }); } component.PayResults.Add(new PayResult { PayCombo = bestPayCombo, Payline = payline }); result.TotalWin += bestPayCombo.PayAmount; } } if (component.PayResults.Count > 0) { result.AddComponent <ScattersComponent>(component); } return(result); }
public void Evaluation_Initialization() { ReelWindow reelWindow = new ReelWindow(paytable.BaseGameReelGroup, new List <int> { 0, 0, 0, 0, 0 }); SlotResult results = paylineEvaluator.Evaluate(paytable, reelWindow, rng); Assert.IsNotNull(results); }
public SlotResult Evaluate(Paytable paytable, ReelWindow reelWindow, IRng rng) { if (paytable.PayComboGroup == null) { throw new Exception("PaylineEvaluator cannot evalate a paytable without a PayComboGroup"); } SlotResult result = new SlotResult(); PaylinesComponent component = new PaylinesComponent(); // Iterate through each payline defined in the paytable. List <Payline> paylines = paytable.PaylineGroup.Paylines; foreach (Payline payline in paylines) { // Get the list of symbols on the payline. List <Symbol> symbolsInPayline = reelWindow.GetSymbolsInPayline(payline); // Look for the highest pay amount on a given payline. int bestPayAmount = 0; PayCombo bestPayCombo = null; List <PayCombo> payCombos = paytable.PayComboGroup.Combos; foreach (PayCombo payCombo in payCombos) { bool match = payCombo.IsMatch(paytable.PayComboGroup.SymbolComparer, symbolsInPayline); if (match && (payCombo.PayAmount > bestPayAmount)) { // Update the best pay combo so far. bestPayCombo = payCombo; bestPayAmount = payCombo.PayAmount; } } // Add the best pay combo. if (bestPayCombo != null) { component.PayResults.Add(new PayResult { PayCombo = bestPayCombo, Payline = payline }); result.TotalWin += bestPayCombo.PayAmount; } } if (component.PayResults.Count > 0) { result.AddComponent <PaylinesComponent>(component); } return(result); }
public void Evaluation_SlotResult4() { paytable.ScatterComboGroup.Combos.Clear(); paytable.ScatterComboGroup.AddPayCombo(new PayCombo(new Symbol(1, "BB"), 4, 1000)); ReelWindow reelWindow = new ReelWindow(paytable.BaseGameReelGroup, new List <int> { 0, 0, 0 }); SlotResult results = scatterEvaluator.Evaluate(paytable, reelWindow, rng); var component = results.GetComponent <ScattersComponent>(); Assert.IsNull(component); }
public void Evaluation_SlotResult1() { paytable.ScatterComboGroup.Combos.Clear(); paytable.ScatterComboGroup.AddPayCombo(new PayCombo(new Symbol(0, "AA"), 3, 1000)); ReelWindow reelWindow = new ReelWindow(paytable.BaseGameReelGroup, new List <int> { 0, 0, 0 }); SlotResult results = scatterEvaluator.Evaluate(paytable, reelWindow, rng); var component = results.GetComponent <ScattersComponent>(); Assert.IsNotNull(component); Assert.AreEqual(1, component.PayResults.Count); Assert.AreEqual(1000, component.PayResults[0].PayCombo.PayAmount); }
public void Evaluation_Payline8() { // Reel Window // WW AA BB AA AA // AA AA CC BB BB // BB CC WW CC CC ReelWindow reelWindow = new ReelWindow(paytable.BaseGameReelGroup, new List <int> { 3, 0, 1, 0, 0 }); SlotResult results = paylineEvaluator.Evaluate(paytable, reelWindow, rng); var component = results.GetComponent <PaylinesComponent>(); Assert.IsNull(component); }
public void Evaluation_Payline7() { // Reel Window // WW WW WW AA AA // AA AA AA BB BB // BB BB BB CC CC ReelWindow reelWindow = new ReelWindow(paytable.BaseGameReelGroup, new List <int> { 3, 3, 3, 0, 0 }); SlotResult results = paylineEvaluator.Evaluate(paytable, reelWindow, rng); var component = results.GetComponent <PaylinesComponent>(); Assert.IsNotNull(component); Assert.AreEqual(1, component.PayResults.Count); Assert.AreEqual(100, component.PayResults[0].PayCombo.PayAmount); // 3 x WW }
public void Evaluation_Payline4() { // Reel Window // AA AA WW BB BB // BB BB AA CC CC // CC CC BB WW WW ReelWindow reelWindow = new ReelWindow(paytable.BaseGameReelGroup, new List <int> { 0, 0, 3, 1, 1 }); SlotResult results = paylineEvaluator.Evaluate(paytable, reelWindow, rng); var component = results.GetComponent <PaylinesComponent>(); Assert.IsNotNull(component); Assert.AreEqual(1, component.PayResults.Count); Assert.AreEqual(10, component.PayResults[0].PayCombo.PayAmount); // 3 x AA }
public void Evaluation_SlotResult3() { // Reel Window // CC CC CC // DD DD DD // EE EE EE ReelWindow reelWindow = new ReelWindow(paytable.BaseGameReelGroup, new List <int> { 2, 2, 2 }); SlotResult results = paylineEvaluator.Evaluate(paytable, reelWindow, rng); var component = results.GetComponent <PaylinesComponent>(); Assert.IsNotNull(component); Assert.AreEqual(1, component.PayResults.Count); Assert.AreEqual(20, component.PayResults[0].PayCombo.PayAmount); // 3 x CC }
public void Evaluation_SlotResult5() { // Reel Window // FF FF FF // GG GG GG // AA AA AA ReelWindow reelWindow = new ReelWindow(paytable.BaseGameReelGroup, new List <int> { 5, 5, 5 }); SlotResult results = paylineEvaluator.Evaluate(paytable, reelWindow, rng); var component = results.GetComponent <PaylinesComponent>(); Assert.IsNotNull(component); Assert.AreEqual(1, component.PayResults.Count); Assert.AreEqual(100, component.PayResults[0].PayCombo.PayAmount); // 3 x AA }
public void Evaluation_Payline_4_4_of_a_kind() { // Reel Window // AA CC BB CC BB // CC AA CC AA CC // AA BB AA BB AA ReelWindow reelWindow = new ReelWindow(paytable.BaseGameReelGroup, new List <int> { 0, 2, 1, 2, 1 }); SlotResult results = paylineEvaluator.Evaluate(paytable, reelWindow, rng); var component = results.GetComponent <PaylinesComponent>(); Assert.IsNotNull(component); Assert.AreEqual(1, component.PayResults.Count); Assert.AreEqual(25, component.PayResults[0].PayCombo.PayAmount); // 4 x AA }
public SlotResult Evaluate(Paytable paytable, ReelWindow reelWindow, IRng rng) { //PaylineEvaluator paylineEvaluator = new PaylineEvaluator (); //ScatterEvaluator scatterEvaluator = new ScatterEvaluator (); //SlotResults paylineResults; //SlotResults scatterResults; //paylineResults = paylineEvaluator.Evaluate (paytable, rng); //scatterResults = scatterEvaluator.Evaluate (paytable, rng); // TODO: Get all triggers from the results // TODO: Evaluate those triggers in turn. // Try to keep the SlotResults separate, possibly in a list as this will assist with // the presentation being able to pull apart the results later. //return paylineResults; throw new NotImplementedException(); }
public void Evaluation_Payline_1_2_3() { // Reel Window // AA AA AA AA AA // BB BB BB BB BB // CC CC CC CC CC ReelWindow reelWindow = new ReelWindow(paytable.BaseGameReelGroup, new List <int> { 0, 0, 0, 0, 0 }); SlotResult results = paylineEvaluator.Evaluate(paytable, reelWindow, rng); var component = results.GetComponent <PaylinesComponent>(); Assert.IsNotNull(component); Assert.AreEqual(3, component.PayResults.Count); Assert.AreEqual(50, component.PayResults[0].PayCombo.PayAmount); // 5 x AA Assert.AreEqual(15, component.PayResults[1].PayCombo.PayAmount); // 5 x BB Assert.AreEqual(10, component.PayResults[2].PayCombo.PayAmount); // 5 x CC }
public void Evaluation_PaylineMix3() { // Reel Window // BB AA AA BB CC // CC BB BB CC AA // AA CC CC AA BB ReelWindow reelWindow = new ReelWindow(paytable.BaseGameReelGroup, new List <int> { 1, 0, 0, 1, 2 }); SlotResult results = paylineEvaluator.Evaluate(paytable, reelWindow, rng); var component = results.GetComponent <PaylinesComponent>(); Assert.IsNotNull(component); Assert.AreEqual(2, component.PayResults.Count); Assert.AreEqual(33, component.PayResults[0].PayCombo.PayAmount); // 4 x MX (Payline 0) Assert.AreEqual(22, component.PayResults[1].PayCombo.PayAmount); // 3 x MX (Payline 4) }
public void Evaluation_SlotResult8() { paytable.ScatterComboGroup.Combos.Clear(); paytable.ScatterComboGroup.AddPayCombo(new PayCombo(new Symbol(0, "AA"), 3, 100, "Free Spins")); ReelWindow reelWindow = new ReelWindow(paytable.BaseGameReelGroup, new List <int> { 0, 0, 0 }); SlotResult results = scatterEvaluator.Evaluate(paytable, reelWindow, rng); var component = results.GetComponent <ScattersComponent>(); Payline payline = component.PayResults[0].Payline; Assert.AreEqual(0, payline.PaylineCoords[0].ReelIndex); Assert.AreEqual(0, payline.PaylineCoords[0].Offset); Assert.AreEqual(1, payline.PaylineCoords[1].ReelIndex); Assert.AreEqual(0, payline.PaylineCoords[1].Offset); Assert.AreEqual(2, payline.PaylineCoords[2].ReelIndex); Assert.AreEqual(0, payline.PaylineCoords[2].Offset); }
public void ReelWindow_SpecifiedHeight() { reels = new ReelGroup(); ReelStrip reel1 = new ReelStrip(); reel1.AddSymbol(new Symbol(0, "AA")); reel1.AddSymbol(new Symbol(1, "BB")); reel1.AddSymbol(new Symbol(2, "CC")); reel1.AddSymbol(new Symbol(3, "DD")); reel1.AddSymbol(new Symbol(4, "EE")); reels.AddReel(reel1, 5); ReelWindow reelWindow = new ReelWindow(reels, new List <int> { 0 }); List <List <Symbol> > window = reelWindow.Window; Assert.AreEqual(5, window[0].Count); }
public SlotResult Evaluate(Paytable paytable, ReelWindow reelWindow, IRng rng) { if (paytable.PickTableGroup.PickTable.ContainsKey(PickFeatureId) == false) { // Can't evaluate if it doesn't exist in paytable. return(null); } PickTable pickTable = paytable.PickTableGroup.PickTable [PickFeatureId]; // Make a copy of the list since we will be removing elements from it. List <PickItem> pickItems = new List <PickItem> (pickTable.PickItemList); PickItem item; PickComponent component = new PickComponent(); do { // Continue picking items until a trigger is found. int randomNumber = rng.GetRandomNumber(pickItems.Count); item = pickItems [randomNumber]; pickItems.RemoveAt(randomNumber); component.PickResults.Add(new PickResult { Name = item.Name, Value = item.Value, Trigger = item.Trigger.Name }); } while (string.IsNullOrEmpty(item.Trigger.Name)); // Add the pick component to the slot result. SlotResult slotResult = new SlotResult(); if (component.PickResults.Count > 0) { slotResult.AddComponent <PickComponent>(component); } return(slotResult); }
public SlotResult Evaluate(Paytable paytable, ReelWindow reelWindow, IRng rng) { throw new System.NotImplementedException(); }
public void ReelWindow_CorrectSymbols() { reels = new ReelGroup(); ReelStrip reel1 = new ReelStrip(); reel1.AddSymbol(new Symbol(0, "AA")); reel1.AddSymbol(new Symbol(1, "BB")); reel1.AddSymbol(new Symbol(2, "CC")); reel1.AddSymbol(new Symbol(3, "DD")); reel1.AddSymbol(new Symbol(4, "EE")); reels.AddReel(reel1); ReelWindow reelWindow = new ReelWindow(reels, new List <int> { 0 }); List <List <Symbol> > window = reelWindow.Window; ReelStrip expected = new ReelStrip(); expected.AddSymbol(new Symbol(0, "AA")); expected.AddSymbol(new Symbol(1, "BB")); expected.AddSymbol(new Symbol(2, "CC")); CollectionAssert.AreEqual(expected.Symbols, window[0]); reelWindow.UpdateReelWindow(reels, new List <int> { 1 }); window = reelWindow.Window; expected = new ReelStrip(); expected.AddSymbol(new Symbol(1, "BB")); expected.AddSymbol(new Symbol(2, "CC")); expected.AddSymbol(new Symbol(3, "DD")); CollectionAssert.AreEqual(expected.Symbols, window[0]); reelWindow.UpdateReelWindow(reels, new List <int> { 2 }); window = reelWindow.Window; expected = new ReelStrip(); expected.AddSymbol(new Symbol(2, "CC")); expected.AddSymbol(new Symbol(3, "DD")); expected.AddSymbol(new Symbol(4, "EE")); CollectionAssert.AreEqual(expected.Symbols, window[0]); reelWindow.UpdateReelWindow(reels, new List <int> { 3 }); window = reelWindow.Window; expected = new ReelStrip(); expected.AddSymbol(new Symbol(3, "DD")); expected.AddSymbol(new Symbol(4, "EE")); expected.AddSymbol(new Symbol(0, "AA")); CollectionAssert.AreEqual(expected.Symbols, window[0]); reelWindow.UpdateReelWindow(reels, new List <int> { 4 }); window = reelWindow.Window; expected = new ReelStrip(); expected.AddSymbol(new Symbol(4, "EE")); expected.AddSymbol(new Symbol(0, "AA")); expected.AddSymbol(new Symbol(1, "BB")); CollectionAssert.AreEqual(expected.Symbols, window[0]); reelWindow.UpdateReelWindow(reels, new List <int> { 5 }); window = reelWindow.Window; expected = new ReelStrip(); expected.AddSymbol(new Symbol(0, "AA")); expected.AddSymbol(new Symbol(1, "BB")); expected.AddSymbol(new Symbol(2, "CC")); CollectionAssert.AreEqual(expected.Symbols, window[0]); }
/// <summary> /// The theme specific game evaluation logic. /// </summary> public SlotResults RunOneGame(int bet) { // Create the slot results. SlotResults slotResults = new SlotResults(); // Create the evaluators for the base game. PaylineEvaluator bgPaylineEval = new PaylineEvaluator(); ScatterEvaluator bgScatterEval = new ScatterEvaluator(); // Create the evaluators for the free games. PaylineEvaluator fgPaylineEval = new PaylineEvaluator(); ScatterEvaluator fgScatterEval = new ScatterEvaluator(); // Generate the random numbers. List <int> randomNumbers = new List <int>(); for (int reel = 0; reel < paytable.BaseGameReelGroup.Reels.Count; ++reel) { ReelStrip reelStrip = paytable.BaseGameReelGroup.Reels[reel].ReelStrip; randomNumbers.Add(rng.GetRandomNumber(reelStrip.Symbols.Count)); } ReelWindow reelWindow = new ReelWindow(paytable.BaseGameReelGroup, randomNumbers); // Evaluate the base game (payline and scatter evaluation). SlotResult paylineResults = bgPaylineEval.Evaluate(paytable, reelWindow, rng); SlotResult scatterResults = bgScatterEval.Evaluate(paytable, reelWindow, rng); slotResults.Results.Add(paylineResults); slotResults.Results.Add(scatterResults); slotResults.TotalWin += paylineResults.TotalWin; slotResults.TotalWin += scatterResults.TotalWin; // Evaluate the free games (if any). if (scatterResults.GetComponent <ScattersComponent>() != null) { // Add total number of free games. int freeGamesAwarded = 5; for (int i = 0; i < freeGamesAwarded; ++i) { // Generate the random numbers. randomNumbers = new List <int>(); for (int reel = 0; reel < paytable.FreeGamesReelGroup.Reels.Count; ++reel) { ReelStrip reelStrip = paytable.FreeGamesReelGroup.Reels[reel].ReelStrip; randomNumbers.Add(rng.GetRandomNumber(reelStrip.Symbols.Count)); } reelWindow = new ReelWindow(paytable.FreeGamesReelGroup, randomNumbers); // Evaluate the free game (payline and scatter evaluation). SlotResult fgPaylineResults = fgPaylineEval.Evaluate(paytable, reelWindow, rng); SlotResult fgScatterResults = fgScatterEval.Evaluate(paytable, reelWindow, rng); slotResults.Results.Add(fgPaylineResults); slotResults.Results.Add(fgScatterResults); slotResults.TotalWin += paylineResults.TotalWin; slotResults.TotalWin += scatterResults.TotalWin; } } return(slotResults); }