Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
    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);
    }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
    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);
    }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
    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);
    }
Exemplo n.º 7
0
    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);
    }
Exemplo n.º 8
0
    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);
    }
Exemplo n.º 9
0
    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
    }
Exemplo n.º 10
0
    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
    }
Exemplo n.º 11
0
    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
    }
Exemplo n.º 12
0
    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
    }
Exemplo n.º 13
0
    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
    }
Exemplo n.º 14
0
        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();
        }
Exemplo n.º 15
0
    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
    }
Exemplo n.º 16
0
    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)
    }
Exemplo n.º 17
0
    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);
    }
Exemplo n.º 18
0
    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);
    }
Exemplo n.º 19
0
        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);
        }
Exemplo n.º 20
0
 public SlotResult Evaluate(Paytable paytable, ReelWindow reelWindow, IRng rng)
 {
     throw new System.NotImplementedException();
 }
Exemplo n.º 21
0
    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]);
    }
Exemplo n.º 22
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);
    }