Update player votes with icon

This commit is contained in:
Benau
2018-12-18 01:57:04 +08:00
parent f53060e0df
commit 13f0276aac
3 changed files with 120 additions and 70 deletions

View File

@@ -451,6 +451,7 @@ void ClientLobby::receivePlayerVote(Event* event)
vote.m_track_name.c_str());
}
addVote(host_id, vote);
TracksScreen::getInstance()->addVote(host_id);
TracksScreen::getInstance()->updatePlayerVotes();
} // receivePlayerVote
@@ -483,6 +484,7 @@ void ClientLobby::disconnectedPlayer(Event* event)
// Use the friend icon to avoid an error-like message
MessageQueue::add(MessageQueue::MT_FRIEND, msg);
}
TracksScreen::getInstance()->removeVote(host_id);
TracksScreen::getInstance()->updatePlayerVotes();
} // disconnectedPlayer
@@ -680,7 +682,6 @@ void ClientLobby::updatePlayerList(Event* event)
m_total_players = total_players;
NetworkingLobby::getInstance()->updatePlayers(players);
TracksScreen::getInstance()->updateNumPlayers(players.size());
} // updatePlayerList
//-----------------------------------------------------------------------------

View File

@@ -22,6 +22,7 @@
#include "config/user_config.hpp"
#include "graphics/irr_driver.hpp"
#include "graphics/stk_tex_manager.hpp"
#include "guiengine/CGUISpriteBank.hpp"
#include "guiengine/message_queue.hpp"
#include "guiengine/scalable_font.hpp"
#include "guiengine/widget.hpp"
@@ -153,8 +154,16 @@ void TracksScreen::loadedFromFile()
{
m_reversed = NULL;
m_laps = NULL;
m_track_icons = new gui::STKModifiedSpriteBank(GUIEngine::getGUIEnv());
} // loadedFromFile
// ----------------------------------------------------------------------------
void TracksScreen::unloaded()
{
delete m_track_icons;
m_track_icons = NULL;
} // unloaded
// -----------------------------------------------------------------------------
void TracksScreen::beforeAddingWidget()
{
@@ -170,6 +179,7 @@ void TracksScreen::beforeAddingWidget()
m_bottom_box_height = rect_box->m_h;
m_vote_list = getWidget<ListWidget>("vote-list");
m_track_icons->clear();
if (m_network_tracks)
{
rect_box->setVisible(true);
@@ -319,7 +329,6 @@ void TracksScreen::init()
tabs->select(UserConfigParams::m_last_used_track_group, PLAYER_ID_GAME_MASTER);
buildTrackList();
// select old track for the game master (if found)
STKTexManager::getInstance()->setTextureErrorMessage(
"While loading screenshot in track screen for last track '%s':",
@@ -336,6 +345,30 @@ void TracksScreen::init()
// goals / time limit and random item location
auto cl = LobbyProtocol::get<ClientLobby>();
assert(cl);
for (const std::string& track : cl->getAvailableTracks())
{
Track* t = track_manager->getTrack(track);
if (!t)
{
Log::fatal("TracksScreen", "Missing network track %s",
track.c_str());
}
video::ITexture* tex =
irr_driver->getTexture(t->getScreenshotFile());
if (!tex)
{
tex = irr_driver->getTexture(file_manager
->getAsset(FileManager::GUI_ICON, "main_help.png"));
}
assert(tex);
m_track_icons->addTextureAsSprite(tex);
}
int icon_height = getHeight() / 13;
m_track_icons->setScale(icon_height / 256.0f);
m_track_icons->setTargetIconSize(256, 256);
m_vote_list->setIcons(m_track_icons, (int)icon_height);
const PeerVote* vote = cl->getVote(STKHost::get()->getMyHostId());
if (vote)
{
@@ -614,17 +647,6 @@ void TracksScreen::showVoteResult()
//}
} // showVoteResult
// ----------------------------------------------------------------------------
/** Stores the number of players. This can be used to determine how many
* slotes for votes are required. This function is called from ClientLobby
* upon an update from the server.
* \param n New number of players that can vote.
*/
void TracksScreen::updateNumPlayers(int n)
{
m_max_num_votes = n;
} //updateNumPlayers
// -----------------------------------------------------------------------------
/** Selects in which part of the vote list the new host is being shown and
* stores this information in the m_index_to_hostid mapping. If the host_id is
@@ -632,12 +654,12 @@ void TracksScreen::updateNumPlayers(int n)
* its vote.
* \param host_id Index of the host that is voting.
*/
void TracksScreen::addVote(int host_id)
void TracksScreen::addVote(uint32_t host_id)
{
auto it = std::find(m_index_to_hostid.begin(), m_index_to_hostid.end(),
host_id);
Log::verbose("TracksScreen", "addVote: hostid %d is new %d",
Log::debug("TracksScreen", "addVote: hostid %d is new %d",
host_id, it == m_index_to_hostid.end());
// Add a new index if this is the first vote for the host/
@@ -645,22 +667,18 @@ void TracksScreen::addVote(int host_id)
{
m_index_to_hostid.push_back(host_id);
}
// If the screen is already shown, update the voting display
if (GUIEngine::getCurrentScreen() == this)
showVote(host_id);
} // addVote
// ----------------------------------------------------------------------------
/** Removes a vote, which is triggered when a client disconnects.
* \param host_id Host id of the disconnected client.
*/
void TracksScreen::removeVote(int host_id)
void TracksScreen::removeVote(uint32_t host_id)
{
auto it = std::find(m_index_to_hostid.begin(), m_index_to_hostid.end(),
host_id);
Log::verbose("TracksScreen", "removeVote: hostid %d found %d",
Log::debug("TracksScreen", "removeVote: hostid %d found %d",
host_id, it != m_index_to_hostid.end());
// Add a new index if this is the first vote for the host/
@@ -670,49 +688,6 @@ void TracksScreen::removeVote(int host_id)
}
} //removeVote
// ----------------------------------------------------------------------------
/** Populates one entry in the voting list with the vote from the
* corresponding host. A mapping of host_id to index MUST exist for this
* host when this function is called.
* \param host_id Host id from hich a new vote was received.
*/
void TracksScreen::showVote(int host_id)
{
auto it = std::find(m_index_to_hostid.begin(), m_index_to_hostid.end(),
host_id);
assert(it != m_index_to_hostid.end());
int index = it - m_index_to_hostid.begin();
auto lp = LobbyProtocol::get<LobbyProtocol>();
const PeerVote *vote = lp->getVote(host_id);
assert(vote);
// This is the old code that needs to be updated for the new list display
#ifdef OLD_DISPLAY
std::string s = StringUtils::insertValues("name-%d", index);
LabelWidget *name_widget = getWidget<LabelWidget>(s.c_str());
name_widget->setText(_("Name: %s", vote->m_player_name), true);
s = StringUtils::insertValues("track-%d", index);
IconButtonWidget *track_widget = getWidget<IconButtonWidget>(s.c_str());
Track *track = track_manager->getTrack(vote->m_track_name);
track_widget->setVisible(true);
track_widget->setImage(track->getScreenshotFile());
s = StringUtils::insertValues("numlaps-%d", index);
LabelWidget *laps_widget = getWidget<LabelWidget>(s.c_str());
laps_widget->setText(_("Laps: %d", vote->m_num_laps), true);
s = StringUtils::insertValues("reverse-%d", index);
LabelWidget *reverse_widget = getWidget<LabelWidget>(s.c_str());
core::stringw yes = _("yes");
core::stringw no = _("no");
reverse_widget->setText(_("Reverse: %s", vote->m_reverse ? yes : no),
true);
#endif
} // addVote
// -----------------------------------------------------------------------------
/** Received the winning vote. i.e. the data about the track to play (including
* #laps etc).
@@ -768,4 +743,69 @@ void TracksScreen::setResult(const PeerVote &winner_vote)
*/
void TracksScreen::updatePlayerVotes()
{
auto cl = LobbyProtocol::get<ClientLobby>();
if (GUIEngine::getCurrentScreen() != this || !cl)
return;
m_vote_list->clear();
for (unsigned i = 0; i < m_index_to_hostid.size(); i++)
{
const PeerVote* p = cl->getVote(m_index_to_hostid[i]);
assert(p);
std::vector<GUIEngine::ListWidget::ListCell> row;
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_FREE_FOR_ALL)
{
row.push_back(GUIEngine::ListWidget::ListCell
(p->m_player_name , -1, 5));
int icon = -1;
const auto& tracks = cl->getAvailableTracks();
auto it = tracks.find(p->m_track_name);
if (it != tracks.end())
{
icon = (int)std::distance(tracks.begin(), it);
}
row.push_back(GUIEngine::ListWidget::ListCell
("" , icon, 2));
row.push_back(GUIEngine::ListWidget::ListCell
(p->m_reverse ? _("Yes") : _("No") , -1, 1));
m_vote_list->addItem(
StringUtils::toString(m_index_to_hostid[i]), row);
}
else if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_CAPTURE_THE_FLAG)
{
row.push_back(GUIEngine::ListWidget::ListCell
(p->m_player_name , -1, 6));
int icon = -1;
const auto& tracks = cl->getAvailableTracks();
auto it = tracks.find(p->m_track_name);
if (it != tracks.end())
{
icon = (int)std::distance(tracks.begin(), it);
}
row.push_back(GUIEngine::ListWidget::ListCell
("" , icon, 2));
m_vote_list->addItem(
StringUtils::toString(m_index_to_hostid[i]), row);
}
else
{
row.push_back(GUIEngine::ListWidget::ListCell
(p->m_player_name , -1, 4));
int icon = -1;
const auto& tracks = cl->getAvailableTracks();
auto it = tracks.find(p->m_track_name);
if (it != tracks.end())
{
icon = (int)std::distance(tracks.begin(), it);
}
row.push_back(GUIEngine::ListWidget::ListCell
("" , icon, 2));
int laps = p->m_num_laps;
row.push_back(GUIEngine::ListWidget::ListCell
(StringUtils::toWString(laps) , -1, 1));
row.push_back(GUIEngine::ListWidget::ListCell
(p->m_reverse ? _("Yes") : _("No") , -1, 1));
m_vote_list->addItem(
StringUtils::toString(m_index_to_hostid[i]), row);
}
}
} // updatePlayerVotes

View File

@@ -36,6 +36,14 @@ namespace GUIEngine
class ProgressBarWidget;
}
namespace irr
{
namespace gui
{
class STKModifiedSpriteBank;
}
}
/**
* \brief screen where the user can select a track
* \ingroup states_screens
@@ -56,8 +64,7 @@ private:
* (going backwards). */
GUIEngine::ProgressBarWidget *m_timer;
/** Maximum number of votes, as sent by the server. */
unsigned int m_max_num_votes;
irr::gui::STKModifiedSpriteBank* m_track_icons;
bool m_network_tracks, m_quit_server;
@@ -68,7 +75,7 @@ private:
/** This stores which vote (hostid) is shown at which index in
* the vote overview list. */
std::vector<int> m_index_to_hostid;
std::vector<uint32_t> m_index_to_hostid;
std::deque<std::string> m_random_track_list;
@@ -86,9 +93,8 @@ private:
public:
void addVote(int host_id);
void removeVote(int host_id);
void showVote(int host_id);
void addVote(uint32_t host_id);
void removeVote(uint32_t host_id);
void setResult(const PeerVote &winner_vote);
void showVoteResult();
void updateNumPlayers(int n);
@@ -115,6 +121,9 @@ public:
/** \brief implement callback from parent class GUIEngine::Screen */
virtual void onUpdate(float dt) OVERRIDE;
/** \brief implement callback from parent class GUIEngine::Screen */
virtual void unloaded() OVERRIDE;
// ------------------------------------------------------------------------
void setFocusOnTrack(const std::string& trackName);
// ------------------------------------------------------------------------