diff --git a/src/menu-fn/colors.qc b/src/menu-fn/colors.qc index ef300e2a..c60bbc33 100644 --- a/src/menu-fn/colors.qc +++ b/src/menu-fn/colors.qc @@ -50,7 +50,7 @@ Colors_Init(void) col_refresh_text = [255,255,255] / 255; col_refresh_bg = [56,56,56] / 255; - col_button_bg = [1,1,1]; + col_button_bg = [247,181,57] / 255; col_button_select = [1,0,0]; col_button_click = [1,1,0]; col_button_disabled = [0.25, 0.25, 0.25]; diff --git a/src/menu-fn/defs.h b/src/menu-fn/defs.h index 079a90c6..bd48d231 100644 --- a/src/menu-fn/defs.h +++ b/src/menu-fn/defs.h @@ -103,44 +103,6 @@ var int gameinfo_current = -1; int gameinfo_count; gameinfo_t *games; -#ifndef WEBMENU -string(float id, float b) getgamedirinfo = #0; -string(int packageidx, int desiredfield) getpackagemanagerinfo = #0; - -enum -{ - GPMI_NAME, // name of the package, for use with the pkg command. - GPMI_CATEGORY, // category text - GPMI_TITLE, // name of the package, for showing the user. - GPMI_VERSION, // version info (may have multiple with the same name but different versions) - GPMI_DESCRIPTION, // some blurb - GPMI_LICENSE, // what license its distributed under - GPMI_AUTHOR, // name of the person(s) who created it - GPMI_WEBSITE, // where to contribute/find out more info/etc - GPMI_INSTALLED, // current state - GPMI_ACTION, // desired state - GPMI_AVAILABLE, // whether it may be downloaded or not. - GPMI_FILESIZE, // whether it may be downloaded or not. -}; - -typedef struct -{ - string name; - string category; - string title; - string version; - string description; - string license; - string author; - string website; - string installed; - int size; - int uid; -} update_t; -int update_count; -update_t *updates; -#endif - int g_menupage; enum diff --git a/src/menu-fn/entry.qc b/src/menu-fn/entry.qc index c068dd66..b3934421 100644 --- a/src/menu-fn/entry.qc +++ b/src/menu-fn/entry.qc @@ -63,6 +63,22 @@ Menu_GammaHack(void) } } +bool +Menu_HasStartupVideos(void) +{ + if (Platform_FileInCurrentGamedir("media/valve.avi")) + return true; + + return false; +} + +void +Menu_PlayStartupVideos(void) +{ + print("playing startup videos\n"); + //localcmd("playvideo av:media/sierra.avi av:media/valve.avi\n"); +} + /* called upon menu init/restart */ void m_init(void) @@ -121,6 +137,7 @@ m_init(void) Colors_Init(); Strings_Init(); + Updates_Init(); if (games[gameinfo_current].gamedir != "valve" || games[gameinfo_current].steambg == 1) { m_intro_skip(); @@ -153,6 +170,9 @@ m_init(void) /* prepare spray logo keys */ spray_setinfokeys(); + if (Menu_HasStartupVideos() == true) + Menu_PlayStartupVideos(); + g_initialized = true; } diff --git a/src/menu-fn/m_customgame.qc b/src/menu-fn/m_customgame.qc index afa2f414..39b6b851 100644 --- a/src/menu-fn/m_customgame.qc +++ b/src/menu-fn/m_customgame.qc @@ -721,10 +721,12 @@ customgame_lbmods_changed(void) void games_setdefaultpkgs(int id) { +#if 0 if (games[id].gamedir == "valve") { games[id].pkgname = "valve_patch;addon_furtherdata;addon_holidaymodels"; games[id].pkgfile = "maps/crossfire.bsp"; /* only found in patches */ } +#endif } void diff --git a/src/menu-fn/m_updates.qc b/src/menu-fn/m_updates.qc index 5bb1d33f..1f16bac8 100644 --- a/src/menu-fn/m_updates.qc +++ b/src/menu-fn/m_updates.qc @@ -14,27 +14,8 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#define FN_UPDATE_IMGURL "http://www.frag-net.com/dl/img/%s.jpg" #ifndef WEBMENU -enum -{ - GPMI_NAME, // name of the package, for use with the pkg command. - GPMI_CATEGORY, // category text - GPMI_TITLE, // name of the package, for showing the user. - GPMI_VERSION, // version info (may have multiple with the same name but different versions) - GPMI_DESCRIPTION, // some blurb - GPMI_LICENSE, // what license its distributed under - GPMI_AUTHOR, // name of the person(s) who created it - GPMI_WEBSITE, // where to contribute/find out more info/etc - GPMI_INSTALLED, // current state - GPMI_ACTION, // desired state - GPMI_AVAILABLE, // whether it may be downloaded or not. - GPMI_FILESIZE, // size to download. -}; - -string(int, int) getpackagemanagerinfo = #0; - var int g_updates_initialized = FALSE; var int autocvar_menu_updating = FALSE; @@ -63,49 +44,25 @@ up_btndone_start(void) void up_btninstall_start(void) { - int pkgid; - - pkgid = up_lbUpdates.GetSelected(); - localcmd(sprintf("pkg add %s\n", updates[pkgid].name)); - updates[pkgid].installed = "pending"; - print(sprintf("Marking package %s for install.\n", updates[pkgid].title)); + Updates_Remove(up_lbUpdates.GetSelected()); } void up_btnremove_start(void) { - int pkgid; - - pkgid = up_lbUpdates.GetSelected(); - localcmd(sprintf("pkg rem %s\n", updates[pkgid].name)); - updates[pkgid].installed = "rem"; - print(sprintf("Marking package %s for 'removal'.\n", updates[pkgid].title)); + Updates_Install(up_lbUpdates.GetSelected()); } void up_toggleinstall(void) { - int pkgid; - pkgid = up_lbUpdates.GetSelected(); - - switch (updates[pkgid].installed) { - case "": - case "rem": - localcmd(sprintf("pkg add %s\n", updates[pkgid].name)); - updates[pkgid].installed = "pending"; - break; - default: - localcmd(sprintf("pkg rem %s\n", updates[pkgid].name)); - updates[pkgid].installed = "rem"; - } + Updates_Toggle(up_lbUpdates.GetSelected()); } void up_btnapply_start(void) { - cvar_set("menu_updating", "1"); - localcmd("pkg apply\n"); - print("Applying package changes.\n"); + Updates_ApplyPendingChanges(); } void @@ -134,94 +91,14 @@ up_sbupdates_changed(int val) up_lbUpdates.SetScroll(val); } - void menu_updates_refresh(void) { - int c; - update_count = 0; + Updates_Refresh(); + int updateCount = Updates_GetPackageCount(); - if (updates) { - memfree(updates); - } - -#if 0 - for (int i = 0; (getpackagemanagerinfo(i, GPMI_NAME)); i++) { - string cat = getpackagemanagerinfo(i, GPMI_CATEGORY); - if (cat == "Plugins/") { - continue; - } - if (cat == "Mod/") { - continue; - } - update_count++; - } -#else - /* look for the valid packages in the gameinfo pkgname */ - int pkgcount = tokenize(games[gameinfo_current].pkgname); - for (int i = 0i; i < pkgcount; i++) { - int id = game_getpackageid(argv(i)); - if (id == -1) - continue; - - update_count++; - } -#endif - - c = 0; - updates = memalloc(sizeof(update_t) * update_count); - -#if 0 - for (int i = 0; (getpackagemanagerinfo(i, GPMI_NAME)); i++) { - string cat = getpackagemanagerinfo(i, GPMI_CATEGORY); - if (cat == "Plugins/") { - continue; - } - if (cat == "Mod/") { - continue; - } - - updates[c].name = getpackagemanagerinfo(i, GPMI_NAME); - updates[c].category = getpackagemanagerinfo(i, GPMI_CATEGORY); - updates[c].title = getpackagemanagerinfo(i, GPMI_TITLE); - updates[c].version = getpackagemanagerinfo(i, GPMI_VERSION); - updates[c].description = getpackagemanagerinfo(i, GPMI_DESCRIPTION); - updates[c].license = getpackagemanagerinfo(i, GPMI_LICENSE); - updates[c].author = getpackagemanagerinfo(i, GPMI_AUTHOR); - updates[c].website = getpackagemanagerinfo(i, GPMI_WEBSITE); - updates[c].installed = getpackagemanagerinfo(i, GPMI_INSTALLED); - updates[c].size = (int)stof(getpackagemanagerinfo(i, GPMI_FILESIZE)); - updates[c].uid = i; - precache_pic(sprintf(FN_UPDATE_IMGURL, updates[c].name)); - - c++; - } -#else - for (int i = 0i; i < pkgcount; i++) { - int id = game_getpackageid(argv(i)); - - if (id == -1) - continue; - - updates[c].name = getpackagemanagerinfo(id, GPMI_NAME); - updates[c].category = getpackagemanagerinfo(id, GPMI_CATEGORY); - updates[c].title = getpackagemanagerinfo(id, GPMI_TITLE); - updates[c].version = getpackagemanagerinfo(id, GPMI_VERSION); - updates[c].description = getpackagemanagerinfo(id, GPMI_DESCRIPTION); - updates[c].license = getpackagemanagerinfo(id, GPMI_LICENSE); - updates[c].author = getpackagemanagerinfo(id, GPMI_AUTHOR); - updates[c].website = getpackagemanagerinfo(id, GPMI_WEBSITE); - updates[c].installed = getpackagemanagerinfo(id, GPMI_INSTALLED); - updates[c].size = (int)stof(getpackagemanagerinfo(id, GPMI_FILESIZE)); - updates[c].uid = id; - precache_pic(sprintf(FN_UPDATE_IMGURL, updates[c].name)); - - c++; - } -#endif - - up_sbUpdates.SetMax(update_count); - up_lbUpdates.SetMax(update_count); + up_sbUpdates.SetMax(updateCount); + up_lbUpdates.SetMax(updateCount); up_lbUpdates.SetSelected(0); } #endif @@ -281,6 +158,8 @@ menu_updates_init(void) up_frPreview.SetPos(350,160); up_frPreview.SetSize(256+6,128+6); Widget_Add(fn_updates, up_frPreview); + + Updates_Refresh(); #endif } @@ -312,8 +191,8 @@ menu_updates_draw(void) } /* query until 1 package is ready */ - for (int i = 0; (getpackagemanagerinfo(i, GPMI_NAME)); i++) { - string installed = getpackagemanagerinfo(i, GPMI_INSTALLED); + for (int i = 0; (Updates_GetInfo(i, GPMI_NAME)); i++) { + string installed = Updates_GetInfo(i, GPMI_INSTALLED); /* increment to keep track */ if (installed == "enabled") old_enabled++; diff --git a/src/platform/defs.h b/src/platform/defs.h index 89fc2702..2c31b191 100644 --- a/src/platform/defs.h +++ b/src/platform/defs.h @@ -14,6 +14,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include "util.h" #include "achievements.h" #include "master.h" #include "modserver.h" @@ -21,4 +22,4 @@ #include "richpresence.h" #include "servers.h" #include "tcp.h" -#include "util.h" +#include "updates.h" \ No newline at end of file diff --git a/src/platform/includes.src b/src/platform/includes.src index ae5b4820..84d14557 100644 --- a/src/platform/includes.src +++ b/src/platform/includes.src @@ -7,4 +7,5 @@ richpresence.qc servers.qc tcp.qc util.qc +updates.qc #endlist diff --git a/src/platform/updates.h b/src/platform/updates.h new file mode 100644 index 00000000..04496a96 --- /dev/null +++ b/src/platform/updates.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2016-2022 Vera Visions LLC. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +string(float id, float b) getgamedirinfo = #0; +string(int packageidx, int desiredfield) getpackagemanagerinfo = #0; + +typedef enum +{ + GPMI_NAME, /**< name of the package, for use with the pkg command. */ + GPMI_CATEGORY, /**< category text */ + GPMI_TITLE, /**< name of the package, for showing the user. */ + GPMI_VERSION, /**< version info (may have multiple with the same name but different versions) */ + GPMI_DESCRIPTION, /**< some blurb */ + GPMI_LICENSE, /**< what license its distributed under */ + GPMI_AUTHOR, /**< name of the person(s) who created it */ + GPMI_WEBSITE, /**< where to contribute/find out more info/etc */ + GPMI_INSTALLED, /**< current state */ + GPMI_ACTION, /**< desired state */ + GPMI_AVAILABLE, /**< whether it may be downloaded or not. */ + GPMI_FILESIZE, /**< size to download. */ +} updateType_t; + +typedef struct +{ + string name; + string category; + string title; + string version; + string description; + string license; + string author; + string website; + string installed; + int size; + int uid; +} update_t; + +int g_platform_update_count; +update_t *updates; + +#define FN_UPDATE_IMGURL "http://www.frag-net.com/dl/img/%s.jpg" + +void Updates_Init(void); +void Updates_Refresh(void); +int Updates_GetPackageCount(void); +int Updates_IDForName(string); +string Updates_NameForID(int); +string Updates_GetInfo(int, updateType_t); +bool Updates_Available(void); + +bool Updates_Toggle(int); +bool Updates_Install(int); +bool Updates_Remove(int); +bool Updates_ApplyPendingChanges(void); \ No newline at end of file diff --git a/src/platform/updates.qc b/src/platform/updates.qc new file mode 100644 index 00000000..e01ab497 --- /dev/null +++ b/src/platform/updates.qc @@ -0,0 +1,153 @@ +/** needs to be called upon menu-init, and call Updates_Refresh() if auto-updates + are enabled. if a chooser does not want updates, then we won't. */ +void +Updates_Init(void) +{ + /*localcmd("pkg addsource https://www.frag-net.com/pkgs/list\n");*/ + print("Update system initialized.\n"); +} + +/** will return a cached value */ +int +Updates_GetPackageCount(void) +{ + return g_platform_update_count; +} + +/** called whenever we need to re-initialize the updates struct */ +void +Updates_Refresh(void) +{ + int c = 0i; + g_platform_update_count = 0i; + + /* clear */ + if (updates) { + memfree(updates); + } + + /* count all updates that we've got in our package sources */ + for (int i = 0i; (Updates_GetInfo(i, GPMI_NAME)); i++) { + g_platform_update_count++; + } + + updates = memalloc(sizeof(update_t) * g_platform_update_count); + + /* limit it to packages that the game wants */ + tokenizebyseparator(games[gameinfo_current].pkgname, ";"); + + /* fill in all the package values */ + for (int i = 0i; i < g_platform_update_count; i++) { + int id = game_getpackageid(argv(i)); + + if (id == -1) + continue; + + updates[c].name = Updates_GetInfo(id, GPMI_NAME); + updates[c].category = Updates_GetInfo(id, GPMI_CATEGORY); + updates[c].title = Updates_GetInfo(id, GPMI_TITLE); + updates[c].version = Updates_GetInfo(id, GPMI_VERSION); + updates[c].description = Updates_GetInfo(id, GPMI_DESCRIPTION); + updates[c].license = Updates_GetInfo(id, GPMI_LICENSE); + updates[c].author = Updates_GetInfo(id, GPMI_AUTHOR); + updates[c].website = Updates_GetInfo(id, GPMI_WEBSITE); + updates[c].installed = Updates_GetInfo(id, GPMI_INSTALLED); + updates[c].size = (int)stof(Updates_GetInfo(id, GPMI_FILESIZE)); + updates[c].uid = id; + precache_pic(sprintf(FN_UPDATE_IMGURL, updates[c].name)); + + c++; + } + + print(sprintf("Updates packages for this game: %i (%i Total)\n", c, g_platform_update_count)); + g_platform_update_count = c; +} + +/** Returns the package ID for a given name. Will return -1 when not available. */ +int +Updates_IDForName(string packageName) +{ + string tempString = ""; + + for (int i = 0i; (tempString = getpackagemanagerinfo(i, GPMI_NAME)); i++) { + if (tempString == packageName) + return i; + } + + return -1i; +} + +/** Returns the package name for a given ID. Returns __NULL__ when not available. */ +string +Updates_NameForID(int packageID) +{ + string packageName = getpackagemanagerinfo(packageID, GPMI_NAME); + + if not (packageName) + return __NULL__; + + return packageName; +} + +/** Query a package (by ID) for its various info fields. See updateType_t for available fields. */ +string +Updates_GetInfo(int packageID, updateType_t fieldType) +{ + return getpackagemanagerinfo(packageID, (int)fieldType); +} + +/** Returns if our current game has updates available for any installed packages. */ +bool +Updates_Available(void) +{ + return true; +} + +/** Toggle the installation of a package. Will return true if it was done. */ +bool +Updates_Toggle(int packageID) +{ + switch (updates[packageID].installed) { + case "": + case "rem": + localcmd(sprintf("pkg add %s\n", updates[packageID].name)); + updates[packageID].installed = "pending"; + break; + default: + localcmd(sprintf("pkg rem %s\n", updates[packageID].name)); + updates[packageID].installed = "rem"; + } + + return true; +} + +/** Mark a package as pending installion. May return true/false if it succeeded in marking the package. */ +bool +Updates_Install(int packageID) +{ + localcmd(sprintf("pkg add %s\n", updates[packageID].name)); + updates[packageID].installed = "pending"; + print(sprintf("Marking package %s for install.\n", updates[packageID].title)); + return true; +} + +/** Mark a package as pending deletion. May return true/false if it succeeded in marking the package. */ +bool +Updates_Remove(int packageID) +{ + + localcmd(sprintf("pkg rem %s\n", updates[packageID].name)); + updates[packageID].installed = "rem"; + print(sprintf("Marking package %s for 'removal'.\n", updates[packageID].title)); + return true; +} + +/** Apply all pending changes to packages. May return true/false if it succeeded in doing so. */ +bool +Updates_ApplyPendingChanges(void) +{ + cvar_set("menu_updating", "1"); + localcmd("pkg apply\n"); + print("Applying package changes.\n"); + return true; +} \ No newline at end of file