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)