Menu-FN: Added the slightly buggy 'View game info' function. I now need to write a cache for the server entries, because the engine might clear its own cache by the time we want to display entries.

This commit is contained in:
Marco Cawthorne 2023-08-23 08:21:53 -07:00
parent ae8c2f16ba
commit 0dc3f19b1a
Signed by: eukara
GPG Key ID: CE2032F0A2882A22
8 changed files with 270 additions and 41 deletions

View File

@ -117,7 +117,6 @@ m_init(void)
registercommand("map_background");
registercommand("menu_musicstart");
registercommand("richpresence_dump");
registercommand("platformRefreshUpdates");
Font_Load("fonts/fontcon.font", font_console);
Font_Load("fonts/menu_label.font", font_label);
@ -409,9 +408,6 @@ m_consolecommand(string cmd)
localcmd(sprintf("maxplayers 2\nset coop 1\nset sv_background 1\nmap %s\n",
argv(1)));
break;
case "platformRefreshUpdates":
Updates_RefreshState();
break;
default:
return (0);
}

View File

@ -34,6 +34,7 @@ CListBox inet_lbServers_Map;
CListBox inet_lbServers_Game;
CListBox inet_lbServers_Players;
CListBox inet_lbServers_Addresses;
CListBox inet_lbServers_CacheIndex;
CScrollbar inet_sbServers;
CDialog inet_dgRefresh;
@ -69,6 +70,25 @@ inet_btncreate_start(void)
header.SetExecute(inet_btncreate_end);
}
void menu_viewgameinfo_setserver(float serverNum);
void
inet_btnview_start(void)
{
static void lan_btnview_end(void) {
g_menupage = PAGE_VIEWGAMEINFO;
}
localsound("../media/launch_upmenu1.wav");
header.SetStartEndPos(30,172,45,45);
header.SetStartEndSize(156,26,460,80);
header.m_lerp = 0.0f;
header.m_visible = TRUE;
header.SetHeader(HEAD_MULTI);
header.SetExecute(lan_btnview_end);
float cacheIndex = stof(inet_lbServers_CacheIndex.GetSelectedItem());
menu_viewgameinfo_setserver(cacheIndex);
}
void
inet_btndone_start(void)
{
@ -102,7 +122,7 @@ inet_refreshframe(void)
return;
Master_RefreshCache();
count = gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT);
count = Master_GetInternetServers();
refreshtime = time + 0.5f;
inet_lbServers_Name.Clear();
@ -111,6 +131,7 @@ inet_refreshframe(void)
inet_lbServers_Game.Clear();
inet_lbServers_Players.Clear();
inet_lbServers_Addresses.Clear();
inet_lbServers_CacheIndex.Clear();
for (int i = 0; i < count; i++) {
string address;
@ -135,6 +156,7 @@ inet_refreshframe(void)
inet_lbServers_Game.AddEntry(gethostcachestring(srv_fldGame, i));
inet_lbServers_Players.AddEntry(players);
inet_lbServers_Addresses.AddEntry(address);
inet_lbServers_CacheIndex.AddEntry(sprintf("%i", i));
NSLog("Adding %s to the Internet server list", address);
added++;
}
@ -157,6 +179,7 @@ inet_lb_clicked(int val)
inet_lbServers_Game.SetSelected(val, FALSE);
inet_lbServers_Players.SetSelected(val, FALSE);
inet_lbServers_Addresses.SetSelected(val, FALSE);
inet_lbServers_CacheIndex.SetSelected(val, FALSE);
}
void
@ -188,7 +211,7 @@ menu_internetgames_init(void)
inet_btnViewGame = spawn(CMainButton);
inet_btnViewGame.SetImage(BTN_GAMEINFO);
//inet_btnViewGame.SetExecute(btn_console);
inet_btnViewGame.SetExecute(inet_btnview_start);
inet_btnViewGame.SetPos(30,204);
Widget_Add(fn_inet, inet_btnViewGame);
@ -258,6 +281,7 @@ menu_internetgames_init(void)
Widget_Add(fn_inet, inet_lbServers_Players);
inet_lbServers_Addresses = spawn(CListBox);
inet_lbServers_CacheIndex = spawn(CListBox);
inet_sbServers = spawn(CScrollbar);
inet_sbServers.SetPos(614,141);

View File

@ -115,6 +115,21 @@ lan_btncreate_start(void)
header.SetExecute(lan_btncreate_end);
}
void
lan_btnview_start(void)
{
static void lan_btnview_end(void) {
g_menupage = PAGE_VIEWGAMEINFO;
}
localsound("../media/launch_upmenu1.wav");
header.SetStartEndPos(30,172,45,45);
header.SetStartEndSize(156,26,460,80);
header.m_lerp = 0.0f;
header.m_visible = TRUE;
header.SetHeader(HEAD_MULTI);
header.SetExecute(lan_btnview_end);
}
void
lan_btndone_start(void)
{
@ -184,7 +199,7 @@ menu_langames_init(void)
lan_btnViewGame = spawn(CMainButton);
lan_btnViewGame.SetImage(BTN_GAMEINFO);
//lan_btnViewGame.SetExecute(btn_console);
lan_btnViewGame.SetExecute(lan_btnview_start);
lan_btnViewGame.SetPos(30,204);
Widget_Add(fn_lan, lan_btnViewGame);

View File

@ -14,17 +14,240 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
CWidget fn_viewgameinfo;
CMainButton vgi_btnDone;
CFrame vgi_frPlayers;
CScrollbar vgi_sbPlayers;
CFrame vgi_frServerinfo;
CScrollbar vgi_sbServerinfo;
CListBox vgi_lbPlayerNum;
CListBox vgi_lbPlayerName;
CListBox vgi_lbPlayerKills;
CListBox vgi_lbPlayerTime;
CListBox vgi_lbServerKey;
CListBox vgi_lbServerValue;
string g_vgiLabelName;
string g_vgiLabelAddress;
string g_vgiLabelPing;
static void
vgi_btndone_start(void)
{
static void vgi_btndone_end(void) {
g_menupage = PAGE_MULTIPLAYER;
}
localsound("../media/launch_dnmenu1.wav");
header.SetStartEndPos(45, 45, 50, 172);
header.SetStartEndSize(460, 80, 156, 26);
header.m_lerp = 0.0f;
header.m_visible = TRUE;
header.SetHeader(HEAD_MULTI);
header.SetExecute(vgi_btndone_end);
}
static void
vgi_sbplayers_changed(int val)
{
vgi_lbPlayerNum.SetScroll(val);
vgi_lbPlayerName.SetScroll(val);
vgi_lbPlayerKills.SetScroll(val);
vgi_lbPlayerTime.SetScroll(val);
}
static void
vgi_sbserverinfo_changed(int val)
{
vgi_lbServerKey.SetScroll(val);
vgi_lbServerValue.SetScroll(val);
}
static void
vgi_lbplayers_clicked(int val)
{
vgi_lbPlayerNum.SetSelected(val, FALSE);
vgi_lbPlayerName.SetSelected(val, FALSE);
vgi_lbPlayerKills.SetSelected(val, FALSE);
vgi_lbPlayerTime.SetSelected(val, FALSE);
}
static void
vgi_lbserverinfo_clicked(int val)
{
vgi_lbServerKey.SetSelected(val, FALSE);
vgi_lbServerValue.SetSelected(val, FALSE);
}
/* this gets called every time we prepare a new menu for the player */
void
menu_viewgameinfo_setserver(float serverNum)
{
float playerCount = stof(gethostcachestring(srv_fldPlayers, serverNum));
string serverInfo = gethostcachestring(srv_fldServerInfo, serverNum);
vgi_sbPlayers.SetMax(playerCount+1);
print(sprintf("Server Num? %d\n", serverNum));
print(sprintf("PlayerCount? %d\n", playerCount));
print(sprintf("ServerInfo? %S\n", serverInfo));
print(sprintf("Player? %S\n", gethostcachestring( srv_fldPlayer0, serverNum )));
print(sprintf("Player1? %S\n", gethostcachestring( gethostcacheindexforkey("player1"), serverNum )));
print(sprintf("Player2? %S\n", gethostcachestring( gethostcacheindexforkey("player0"), serverNum )));
vgi_lbPlayerNum.Clear();
vgi_lbPlayerName.Clear();
vgi_lbPlayerKills.Clear();
vgi_lbPlayerTime.Clear();
vgi_lbServerKey.Clear();
vgi_lbServerValue.Clear();
g_vgiLabelName = gethostcachestring(srv_fldName, serverNum);
g_vgiLabelAddress = gethostcachestring(srv_fldAdress, serverNum);
float serverPing = stof(gethostcachestring(srv_fldPing, serverNum));
if (serverPing == 65534)
g_vgiLabelPing = "Unavailable (ICE)";
else
g_vgiLabelPing = sprintf("%d ms.", serverPing);
/* add the player info entries */
for (int i = 0; i < playerCount; i++) {
#if 0
string playerName = gethostcachestring(gethostcacheindexforkey(sprintf("player%i", i)), serverNum);
#else
string playerName = sprintf("Player %i", i);
#endif
vgi_lbPlayerNum.AddEntry(sprintf("%i", i+1i));
vgi_lbPlayerName.AddEntry(playerName);
vgi_lbPlayerKills.AddEntry(sprintf("%i", i));
vgi_lbPlayerTime.AddEntry(sprintf("%i", i));
}
/* add the server info entries */
int serverInfoCount = (int)tokenizebyseparator(serverInfo, "\\");
vgi_sbServerinfo.SetMax((serverInfoCount/2)+1);
for (int i = 0; i < serverInfoCount; i+=2) {
vgi_lbServerKey.AddEntry(argv(i+1));
vgi_lbServerValue.AddEntry(argv(i+0));
}
}
void
menu_viewgameinfo_init(void)
{
fn_viewgameinfo = spawn(CWidget);
vgi_btnDone = spawn(CMainButton);
vgi_btnDone.SetImage(BTN_DONE);
vgi_btnDone.SetExecute(vgi_btndone_start);
vgi_btnDone.SetPos(50, 405);
Widget_Add(fn_viewgameinfo, vgi_btnDone);
vgi_frPlayers = spawn(CFrame);
vgi_frPlayers.SetPos(216,156);
vgi_frPlayers.SetSize(404,154);
Widget_Add(fn_viewgameinfo, vgi_frPlayers);
vgi_frServerinfo = spawn(CFrame);
vgi_frServerinfo.SetPos(216,336);
vgi_frServerinfo.SetSize(404,124);
Widget_Add(fn_viewgameinfo, vgi_frServerinfo);
vgi_sbPlayers = spawn(CScrollbar);
vgi_sbPlayers.SetPos(604,156);
vgi_sbPlayers.SetHeight(154);
vgi_sbPlayers.SetCallback(vgi_sbplayers_changed);
Widget_Add(fn_viewgameinfo, vgi_sbPlayers);
vgi_sbServerinfo = spawn(CScrollbar);
vgi_sbServerinfo.SetPos(604,336);
vgi_sbServerinfo.SetHeight(124);
vgi_sbServerinfo.SetCallback(vgi_sbserverinfo_changed);
Widget_Add(fn_viewgameinfo, vgi_sbServerinfo);
/* listboxes ahoy */
vgi_lbPlayerNum = spawn(CListBox);
vgi_lbPlayerNum.SetPos(219,159);
vgi_lbPlayerNum.SetSize(25,148);
vgi_lbPlayerNum.SetChanged(vgi_lbplayers_clicked);
Widget_Add(fn_viewgameinfo, vgi_lbPlayerNum);
vgi_lbPlayerName = spawn(CListBox);
vgi_lbPlayerName.SetPos(244,159);
vgi_lbPlayerName.SetSize(100, 148);
vgi_lbPlayerName.SetChanged(vgi_lbplayers_clicked);
Widget_Add(fn_viewgameinfo, vgi_lbPlayerName);
vgi_lbPlayerKills = spawn(CListBox);
vgi_lbPlayerKills.SetPos(344,159);
vgi_lbPlayerKills.SetSize(35, 148);
vgi_lbPlayerKills.SetChanged(vgi_lbplayers_clicked);
Widget_Add(fn_viewgameinfo, vgi_lbPlayerKills);
vgi_lbPlayerTime = spawn(CListBox);
vgi_lbPlayerTime.SetPos(379,159);
vgi_lbPlayerTime.SetSize(225, 148);
vgi_lbPlayerTime.SetChanged(vgi_lbplayers_clicked);
Widget_Add(fn_viewgameinfo, vgi_lbPlayerTime);
vgi_lbServerKey = spawn(CListBox);
vgi_lbServerKey.SetPos(220,339);
vgi_lbServerKey.SetSize(150,118);
vgi_lbServerKey.SetChanged(vgi_lbserverinfo_clicked);
Widget_Add(fn_viewgameinfo, vgi_lbServerKey);
vgi_lbServerValue = spawn(CListBox);
vgi_lbServerValue.SetPos(370, 339);
vgi_lbServerValue.SetSize(232,118);
vgi_lbServerValue.SetChanged(vgi_lbserverinfo_clicked);
Widget_Add(fn_viewgameinfo, vgi_lbServerValue);
menu_viewgameinfo_setserver(0);
}
void
menu_viewgameinfo_draw(void)
{
Widget_Draw(fn_viewgameinfo);
Header_Draw(HEAD_MULTI);
/* draw the left side-bar elements and descriptions */
WLabel_Static(57, 156, m_reslbl[IDS_PLAYERINFO_SERVERNAME], 14, 14, col_button_bg,
1.0f, 0, font_label_b);
WLabel_Static(57, 240, m_reslbl[IDS_PLAYERINFO_SERVERIP], 14, 14, col_button_bg,
1.0f, 0, font_label_b);
WLabel_Static(57, 324, m_reslbl[IDS_PLAYERINFO_SERVERPING], 14, 14, col_button_bg,
1.0f, 0, font_label_b);
WField_Static(56, 189, g_vgiLabelName, 128, 64, [1,1,1],
1.0f, AF_LEFT | AF_TOP, font_label);
WLabel_Static(56, 272, g_vgiLabelAddress, 11, 11, [1,1,1],
1.0f, 0, font_label);
WLabel_Static(56, 356, g_vgiLabelPing, 11, 11, [1,1,1],
1.0f, 0, font_label);
/* the descriptions over the two frames */
/* player list */
WLabel_Static(220, 143, m_reslbl[IDS_PLAYERINFO_NUMBER], 11, 11, [1,1,1],
1.0f, 0, font_arial);
WLabel_Static(245, 143, m_reslbl[IDS_PLAYERINFO_NAME], 11, 11, [1,1,1],
1.0f, 0, font_arial);
WLabel_Static(345, 143, m_reslbl[IDS_PLAYERINFO_KILLS], 11, 11, [1,1,1],
1.0f, 0, font_arial);
WLabel_Static(380, 143, m_reslbl[IDS_PLAYERINFO_TIME], 11, 11, [1,1,1],
1.0f, 0, font_arial);
/* serverinfo */
WLabel_Static(220, 323, m_reslbl[IDS_PLAYERINFO_RULENAME], 11, 11, [1,1,1],
1.0f, 0, font_arial);
WLabel_Static(370, 323, m_reslbl[IDS_PLAYERINFO_RULEVALUE], 11, 11, [1,1,1],
1.0f, 0, font_arial);
}
void
menu_viewgameinfo_input(float evtype, float scanx, float chary, float devid)
menu_viewgameinfo_input(float evtype, float x, float y, float devid)
{
Widget_Input(fn_viewgameinfo, evtype, x, y, devid);
}

View File

@ -736,7 +736,6 @@ GameLibrary_Deactivate(void)
localcmd("menu_musicstart\n");
}
/** Return the ID for the currently activate game. */
int
GameLibrary_GetCurrentGame(void)
{

View File

@ -71,7 +71,7 @@ ModServer_ParseList(string data)
int skip = 0;
string gamedir = argv(i);
for (int x = 0; x < gameinfo_count; x++) {
for (int x = 0; x < GameLibrary_GetGameCount(); x++) {
/* skip mods we already have. */
if (gamedir == GameLibrary_GetGameInfo(x, GAMEINFO_GAMEDIR)) {
skip = 1;

View File

@ -101,6 +101,4 @@ bool Updates_Remove(int);
/** Mark an update as pending uninstallation. May return true/false if it succeeded in marking the package. */
bool Updates_Destroy(int);
/** Apply all pending changes to packages. May return true/false if it succeeded in doing so. */
bool Updates_ApplyPendingChanges(void);
/** Called by the console command `platformRefreshUpdates`, which your menu needs to implement. Otherwise you will not see pending changes reflected in your menu interface. */
void Updates_RefreshState(void);
bool Updates_ApplyPendingChanges(void);

View File

@ -218,6 +218,8 @@ Updates_GetInfo(int packageID, updateType_t fieldType)
return __NULL__;
}
Updates_RefreshStateValues(packageID);
switch (fieldType) {
case UPDATE_NAME:
return (string)updates[packageID].name;
@ -259,8 +261,6 @@ Updates_GetInfo(int packageID, updateType_t fieldType)
/* if we have a action, focus on that */
switch (updates[packageID].pending_action) {
case UPDATEACTION_INSTALL:
Updates_RefreshStateValues(packageID);
if (updates[packageID].dlpercentage > 0.0) {
return sprintf("%d %%", updates[packageID].dlpercentage);
} else {
@ -268,23 +268,18 @@ Updates_GetInfo(int packageID, updateType_t fieldType)
}
break;
case UPDATEACTION_REINSTALL:
Updates_RefreshStateValues(packageID);
return _("UPDATE_PENDING_REINSTALL");
break;
case UPDATEACTION_UNINSTALL:
Updates_RefreshStateValues(packageID);
return _("UPDATE_PENDING_UNINSTALL");
break;
case UPDATEACTION_AUTOINSTALL:
Updates_RefreshStateValues(packageID);
return _("UPDATE_PENDING_AUTOINSTALL");
break;
case UPDATEACTION_DISABLE:
Updates_RefreshStateValues(packageID);
return _("UPDATE_PENDING_DISABLE");
break;
case UPDATEACTION_RETAIN:
Updates_RefreshStateValues(packageID);
return _("UPDATE_PENDING_RETAIN");
break;
default:
@ -399,27 +394,6 @@ Updates_ApplyPendingChanges(void)
return true;
}
/* I hate having to put this in, but because we can only interact with the
engine its own package manager via console commands (they are delayed as
as result) we cannot query the result of our `pkg` commands right after
calling them via localcmd(). Therefore menus need to implement the console
command `platformRefreshUpdates` which calls this very function below.
All in the hopes of improving performance just a tiny bit. */
void
Updates_RefreshState(void)
{
/* at least try to be a bit clever about it. */
if (argv(0) == "platformRefreshUpdates") {
Updates_RefreshStateValues((int)stof(argv(1)));
return;
}
/* just force refresh them all otherwise. */
for (int i = 0i; i < g_platform_update_count; i++) {
Updates_RefreshStateValues(i);
}
}
void
Updater_URI_Callback(float id, float code, string data, int resourcebytes)
{