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 это жестко


отступ

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


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

лишний

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

не используеться
```
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;
}
}
```
вместо

изучи что делает std::minmax_element, не факт что я верно написал, компилировать не пробовал. Но должно работать и зачисти 3 строчки пустых в конце файла

public

тут я уже выписывал, ну и + код повторяется, мож в utils вынести, саму лямбду

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

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

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

codestyle

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

pragma once

Games

отступ

ненужный cpp

можно auto юзать

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


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)));
}
```
а тот метод удалить. И замени на константы, опять магия
Можно

заменить на
```
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 не долюбливаю в таких ситуациях.

Можно выделить переменные colls rows, и в цикле поменять i и j


pragma once
и у меня ругаеться на vcore::VCORE_Route::Position_t
форвард или инклюд добавить бы
и cpp инклюды поправь
