---
# System prepended metadata

title: Buffalo Cash Pool Rewiev

---

    Buffalo Cash Pool Rewiev
    
```
void AppPlugin::SetupGnWinCounter() const
->

void AppPlugin::SetupGnWinCounter() const
{
    if (const auto counter = vlib::ObjectFac::Instance()->LoadCounter("gn.win.counter"))
    {
        auto calc_delta = [](gwc::Time start_tick, gwc::Time last_tick, gwc::Time curr_tick, vgui::CounterValue_t curr_value, vgui::CounterValue_t final_value) -> vgui::CounterDelta_t
        {
            if (vlib::SlotInput::Instance()->GetSavedTurboMode() == vlib::TurboMode_t::MAX_TURBO)
            {
                return final_value - curr_value;
            }

            double bet = vcore::VCORE_Account::Instance()->GetLevelStake();
            const auto& params = vsdk::SlotCfg::Instance()->GetCustomCounterParams();

            const auto& a = params.a;
            const auto& b = params.b;
            const auto& c = params.c;

            const auto last_time = static_cast<double>(last_tick - start_tick) / 1000.0;
            const auto cur_time = static_cast<double>(curr_tick - start_tick) / 1000.0;

            const vgui::CounterDelta_t delta = bet * a * (pow(b * cur_time, c) - pow(b * last_time, c));

            return delta;
        };
        counter->SetCustomCalcDeltaFunc(calc_delta);
    }
}
```
Нейминг abc это жестко

![image](https://hackmd.io/_uploads/SyUXVMnda.png)

![image](https://hackmd.io/_uploads/ByZoVGn_6.png)

отступ

![image](https://hackmd.io/_uploads/ry2CNfn_6.png)

шото не то с инклюдом

![image](https://hackmd.io/_uploads/HJLDHz2_T.png)

![image](https://hackmd.io/_uploads/BkLz_zhuT.png)

не используеться

![image](https://hackmd.io/_uploads/HJOTdGhua.png)

лишний

![image](https://hackmd.io/_uploads/H1dNFzhO6.png)

можно в Types вынести структуры.

![image](https://hackmd.io/_uploads/ByARFf3_6.png)

не используеться

```
void CashPoolLineView::SaveSymbolLimitPositions()
{
    if (!m_default_positions.empty())
    {
        auto min_max_it = std::minmax_element(m_default_positions.begin(), m_default_positions.end(),
                                            [](const auto& a, const auto& b) {
                                                return a.second.x < b.second.x;
                                            });

        m_limit_views_positions.min = min_max_it.first->second.x;
        m_limit_views_positions.max = min_max_it.second->second.x;
    }
}
```
вместо 
![image](https://hackmd.io/_uploads/BJiIsz2OT.png)
изучи что делает std::minmax_element, не факт что я верно написал, компилировать не пробовал. Но должно работать и зачисти 3 строчки пустых в конце файла

![image](https://hackmd.io/_uploads/BJNPhznO6.png)
public

![image](https://hackmd.io/_uploads/rk062G2dp.png)
тут я уже выписывал, ну и + код повторяется, мож в utils вынести, саму лямбду

![image](https://hackmd.io/_uploads/ByFcaG2_T.png)

зачем в структуру инкапсулировать один callback, передавай просто явно callback

![image](https://hackmd.io/_uploads/BJUBCMhO6.png)

вынести в конструктор, получиться у тебя универстальный класс. 


По коду очень много магических чисел. Я не стал их выписывать, тут по ситуации constexpr, или в анонимый namespace в cpp или в constants или если это данные которые может конфигурировать гейм-дизайнер, можно дать ему такую возможность ) правок меньше будет.

![image](https://hackmd.io/_uploads/S1JElQ2da.png)

Тож, повыноси в Types. Тебе потом на следующих играх проще будет инклюдить.

![image](https://hackmd.io/_uploads/rkIDlm2_p.png)

codestyle

![image](https://hackmd.io/_uploads/B1Lqlm3da.png)

метод назван, что он билдит, должен чтото вернуть, а он еще и запуском занимаеться.

![image](https://hackmd.io/_uploads/Syvlb7hdT.png)

pragma once

![image](https://hackmd.io/_uploads/S1kfZXhdp.png)

Games

![image](https://hackmd.io/_uploads/HyYNbX2da.png)

отступ


![image](https://hackmd.io/_uploads/HyGuZQhOp.png)

ненужный cpp

![image](https://hackmd.io/_uploads/r1MR-7hdp.png)

можно auto юзать

![image](https://hackmd.io/_uploads/HkhfMX2_a.png)

RLmodel legasy code
Можешь взять из fortune bowls или вот тебе реализация но надо ее затестить, корректно ли работает.

```
#include <fmt/format.h>

void RulesModel::UpdatePayments()
{
    const auto& figures = vlib::VLIB_FiguresProvider::Instance()->GetFigures();
    for (const auto& figure : figures)
    {
        if (!figure)
        {
            continue;
        }

        auto figure_identity = figure->GetIdentity();
        for (vcore::VCORE_Figure::Paytable_t::size_type comb_size = 1; comb_size <= figure->GetPayTableSize(); ++comb_size)
        {
            int payment = figure->GetPayment(comb_size);

            if (!payment || payment < 0)
            {
                continue;
            }

            int comb_length = static_cast<int>(comb_size);

            auto update_payment_event = fmt::format("{}#{}#{}", vsdk::RL_EVENT.UPDATE_FIGURE_PAYMENT, figure_identity, comb_length);
            const auto jackpot = BuffaloCashPoolUtils::IsJackpot(figure_identity) ? fmt::format("{}", BuffaloCashPoolUtils::GetPaymentForJackpot(figure_identity, comb_length)) : GetPayment(figure, comb_length, false);
            Notify(update_payment_event, 0, jackpot);

            auto value_label = fmt::format("rl.payout.F{:02d}.{:02d}.val", figure_identity, comb_length);
            auto label = LoadLabel(value_label);
            if (label)
            {
                auto payment_label = GetPayment(figure, comb_length, false);
                label->SetText(payment_label);
            }

            auto mutate_label = fmt::format("rl.payout.F{:02d}.{:02d}.mutate", figure_identity, comb_length);
            label = LoadLabel(mutate_label);
            if (label)
            {
                auto payment_label = GetPayment(figure, comb_length, true);
                label->SetText(payment_label);
            }
        }
    }
}
```

SRmodel
![image](https://hackmd.io/_uploads/Bk1IXmhdT.png)


![image](https://hackmd.io/_uploads/Hy0wN72dT.png)

fmt::format через "M{:02}" и вообще по идее можно сделать так, если только GetSpineForCashPool его дергает

```
cpp::count_ptr<gui::SpineView> BuffaloCashPoolUtils::GetSpineForCashPool(int figure_id)
{
    auto get_spine_name = [](const auto figure_id) -> std::string
    {
        if(figure_id || figure_id == 18)
        {
            figure_id = 18;
        }
        else
        {
            figure_id = 19;
        }
        return fmt::format("M{:02}", figure_id);
    };
    return cpp::make_count_ptr<gui::SpineView>(vgui::ResourceManager::Instance()->GetSpineAnimation(get_spine_name(figure_id)));
}
```
а тот метод удалить. И замени на константы, опять магия


Можно 
![image](https://hackmd.io/_uploads/rJkbDQ3_T.png)
заменить на 
```
std::string BuffaloCashPoolUtils::GetColor(int figure_id)
{
    static const std::unordered_map<int, std::string> color_map = {
        {CASH_POOL_SYMBOLS::WHEEL, "wheel"},
        {CASH_POOL_SYMBOLS::BLUE, "blue"},
        {CASH_POOL_SYMBOLS::GREEN, "green"},
        {CASH_POOL_SYMBOLS::PURPLE, "purple"},
        {CASH_POOL_SYMBOLS::RED, "red"},
        {CASH_POOL_SYMBOLS::ORANGE, "orange"},
        {SYMBOLS::MAJOR_JACKPOT, "purple"},
        {SYMBOLS::GRAND_JACKPOT, "orange"}
    };

    auto it = color_map.find(figure_id);
    if (it != color_map.end())
    {
        return it->second;
    }

    throw std::runtime_error(fmt::format("BuffaloCashPoolUtils::{}, invalid figure_id = {}", __func__, figure_id));
}
```
Ну это такое, может я просто switch case не долюбливаю в таких ситуациях.

![image](https://hackmd.io/_uploads/SkIgpQ3da.png)
Можно  выделить переменные colls rows, и в цикле поменять i и j
![image](https://hackmd.io/_uploads/HJt-TXhuT.png)


![image](https://hackmd.io/_uploads/H13J0QnOT.png)
pragma once
и у меня ругаеться на vcore::VCORE_Route::Position_t
форвард или инклюд добавить бы
и cpp инклюды поправь
![image](https://hackmd.io/_uploads/r1JIR7n_a.png)
