fekalnigtacko/src/game/remote_menu.cpp
2026-03-26 23:14:50 +01:00

106 lines
2.5 KiB
C++

#include "remote_menu.hpp"
#include "net/defs.hpp"
game::RemoteMenuItem::RemoteMenuItem(RemoteMenu& menu, RemoteMenuItemType type, std::string text) : menu_(menu), type_(type)
{
}
void game::RemoteMenuItem::SetText(std::string text)
{
if (text == text_)
return;
text_ = std::move(text);
text_synced_ = false;
menu_.items_synced_ = false;
}
void game::RemoteMenuItem::SetSelection(std::string selection)
{
if (selection == selection_)
return;
selection_ = std::move(selection);
selection_synced_ = false;
menu_.items_synced_ = false;
}
game::RemoteMenu::RemoteMenu(net::MenuId id) : id_(id)
{
}
game::RemoteMenuItem& game::RemoteMenu::AddItem(RemoteMenuItemType type, std::string text)
{
auto item = std::make_unique<RemoteMenuItem>(*this, type, std::move(text));
auto& item_ref = *item;
items_.push_back(std::move(item));
synced_ = false;
return item_ref;
}
void game::RemoteMenu::Update()
{
if (synced_ && items_synced_)
return;
// not synced at all, write full update
if (!synced_)
{
auto msg = BeginMenuMsg(net::MMSG_UPDATE);
msg.Write<net::MenuItemCount>(items_.size());
for (auto& item : items_)
{
msg.Write(item->type_);
msg.Write(net::MenuItemText(item->text_));
msg.Write(net::MenuItemSelection(item->selection_));
item->text_synced_ = true;
item->selection_synced_ = true;
}
synced_ = true;
items_synced_ = true;
return;
}
// some items want sync
if (!items_synced_)
{
for (size_t i = 0; i < items_.size(); ++i)
{
auto& item = *items_[i];
if (!item.text_synced_)
{
auto msg = BeginMenuMsg(net::MMSG_ITEM_UPDATE_TEXT);
msg.Write<net::MenuItemId>(i);
msg.Write(net::MenuItemText(item.text_));
item.text_synced_ = true;
}
if (!item.selection_synced_)
{
auto msg = BeginMenuMsg(net::MMSG_ITEM_UPDATE_SELECTION);
msg.Write<net::MenuItemId>(i);
msg.Write(net::MenuItemSelection(item.selection_));
item.selection_synced_ = true;
}
}
items_synced_ = true;
}
}
net::OutMessage game::RemoteMenu::BeginMenuMsg(net::MenuMessageType type)
{
auto msg = BeginMsg(net::MSG_REMOTEMENU);
msg.Write(id_);
msg.Write(type);
return msg;
}