diff --git a/lang/Czech.ini b/lang/Czech.ini index afc8b18ea..e404762b0 100644 --- a/lang/Czech.ini +++ b/lang/Czech.ini @@ -174,6 +174,7 @@ HOST = "Hostovat" MODS = "MODY" CATEGORIES = "Kategorie" WARNING = "\\#ffffa0\\Varování:\\#dcdcdc\\ Máte povoleno 10 nebo více módů, vypněte prosím některé, abyste zabránili nestabilitě nebo zpoždění." +NO_MODS_FOUND = "Nebyly nalezeny žádné úpravy." [HOST_MOD_CATEGORIES] ALL = "Všechny" @@ -382,7 +383,7 @@ REFRESH = "Obnovit" REFRESHING = "Obnovování..." ENTER_PASSWORD = "Zadejte heslo soukromé hry:" SEARCH = "Hledat" -NONE_FOUND = "Nebyly nalezeny žádné hry." +NO_LOBBIES_FOUND = "Nebyly nalezeny žádné hry." [CHANGELOG] CHANGELOG_TITLE = "ZÁZNAM ZMĚN" diff --git a/lang/Dutch.ini b/lang/Dutch.ini index 026050841..283e43493 100644 --- a/lang/Dutch.ini +++ b/lang/Dutch.ini @@ -174,6 +174,7 @@ HOST = "Organisator" MODS = "MODS" CATEGORIES = "Categorieën" WARNING = "\\#ffffa0\\Waarschuwing:\\#dcdcdc\\ Je hebt 10 of meer mods ingeschakeld, schakel er een paar uit om instabiliteit of lag te voorkomen." +NO_MODS_FOUND = "Er zijn geen mods gevonden." [HOST_MOD_CATEGORIES] ALL = "Alle" @@ -382,7 +383,7 @@ REFRESH = "Herlaad" REFRESHING = "herladen..." ENTER_PASSWORD = "Typ het wachtwoord van de privé lobby:" SEARCH = "Zoek" -NONE_FOUND = "Er zijn geen lobby's gevonden." +NO_LOBBIES_FOUND = "Er zijn geen lobby's gevonden." [CHANGELOG] CHANGELOG_TITLE = "WIJZIGINGENLOGBOEK" diff --git a/lang/English.ini b/lang/English.ini index cfa1f8525..e1d7fa528 100644 --- a/lang/English.ini +++ b/lang/English.ini @@ -174,6 +174,7 @@ HOST = "Host" MODS = "MODS" CATEGORIES = "Categories" WARNING = "\\#ffffa0\\Warning:\\#dcdcdc\\ You have 10 or more mods enabled, please disable some to prevent instability or lag." +NO_MODS_FOUND = "No mods were found." [HOST_MOD_CATEGORIES] ALL = "All" @@ -385,7 +386,7 @@ REFRESH = "Refresh" REFRESHING = "Refreshing..." ENTER_PASSWORD = "Enter the private lobby's password:" SEARCH = "Search" -NONE_FOUND = "No lobbies were found." +NO_LOBBIES_FOUND = "No lobbies were found." [CHANGELOG] CHANGELOG_TITLE = "CHANGELOG" diff --git a/lang/French.ini b/lang/French.ini index 8e8e2a39a..fb837fb5e 100644 --- a/lang/French.ini +++ b/lang/French.ini @@ -174,6 +174,7 @@ HOST = "Héberger" MODS = "MODS" CATEGORIES = "Catégories" WARNING = "\\#ffffa0\\Avertissement :\\#dcdcdc\\ 10 mods ou plus sont activés, veuillez en désactiver certains pour éviter l'instabilité ou le lag." +NO_MODS_FOUND = "Aucun mod n'a été trouvé." [HOST_MOD_CATEGORIES] ALL = "Tous" @@ -382,7 +383,7 @@ REFRESH = "Actualiser" REFRESHING = "Actualisation..." ENTER_PASSWORD = "Entrez le mot de passe de la partie:" SEARCH = "Rechercher" -NONE_FOUND = "Aucune partie n'a été trouvée." +NO_LOBBIES_FOUND = "Aucune partie n'a été trouvée." [CHANGELOG] CHANGELOG_TITLE = "MODIFICATIONS" diff --git a/lang/German.ini b/lang/German.ini index 6e1037035..33ea65be4 100644 --- a/lang/German.ini +++ b/lang/German.ini @@ -174,6 +174,7 @@ HOST = "Hosten" MODS = "MODS" CATEGORIES = "Kategorien" WARNING = "\\#ffffa0\\Warnung:\\#dcdcdc\\ Du hast 10 oder mehr Mods aktiviert, bitte deaktiviere einige, um Instabilität oder Lag zu vermeiden." +NO_MODS_FOUND = "Es wurden keine Mods gefunden." [HOST_MOD_CATEGORIES] ALL = "Alle" @@ -382,7 +383,7 @@ REFRESH = "Aktualisieren" REFRESHING = "Aktualisiere..." ENTER_PASSWORD = "Gib das Passwort für die Lobby ein:" SEARCH = "Suchen" -NONE_FOUND = "Keine Lobbys gefunden." +NO_LOBBIES_FOUND = "Keine Lobbys gefunden." [CHANGELOG] CHANGELOG_TITLE = "ÄNDERUNGSPROTOKOLL" diff --git a/lang/Italian.ini b/lang/Italian.ini index 14251cad6..7e17cf2ef 100644 --- a/lang/Italian.ini +++ b/lang/Italian.ini @@ -172,6 +172,7 @@ HOST = "Crea" MODS = "MODS" CATEGORIES = "Categorie" WARNING = "\\#ffffa0\\Attenzione:\\#dcdcdc\\ Sono state attivate 10 o più mod, disabilitarne alcune per evitare instabilità o lag." +NO_MODS_FOUND = "Non è stata trovata alcuna modifica." [HOST_MOD_CATEGORIES] ALL = "Tutti" @@ -380,7 +381,7 @@ REFRESH = "Refresh" REFRESHING = "Refreshing..." ENTER_PASSWORD = "Enter the private lobby's password:" SEARCH = "Search" -NONE_FOUND = "No lobbies were found." +NO_LOBBIES_FOUND = "No lobbies were found." [CHANGELOG] CHANGELOG_TITLE = "REGISTRO DELLE MODIFICHE" diff --git a/lang/Polish.ini b/lang/Polish.ini index c523d903b..64b388b50 100644 --- a/lang/Polish.ini +++ b/lang/Polish.ini @@ -174,6 +174,7 @@ HOST = "Hostuj" MODS = "MODYFIKACJE" CATEGORIES = "Kategorie" WARNING = "\\#ffffa0\\Ostrzeżenie:\\#dcdcdc\\ Masz włączonych 10 lub więcej Modyfikacji. Wyłącz niektóre, aby zapobiec niestabilności lub opóźnieniom." +NO_MODS_FOUND = "Nie znaleziono żadnych modów." [HOST_MOD_CATEGORIES] ALL = "Wszystkie" @@ -382,7 +383,7 @@ REFRESH = "Odśwież" REFRESHING = "Odświeżanie..." ENTER_PASSWORD = "Wprowadź hasło do prywatnego lobby:" SEARCH = "Szukaj" -NONE_FOUND = "Nie znaleziono żadnego lobby." +NO_LOBBIES_FOUND = "Nie znaleziono żadnego lobby." [CHANGELOG] CHANGELOG_TITLE = "REJESTR ZMIAN" diff --git a/lang/Portuguese.ini b/lang/Portuguese.ini index 26125ee9c..2838543f1 100644 --- a/lang/Portuguese.ini +++ b/lang/Portuguese.ini @@ -174,6 +174,7 @@ HOST = "Criar" MODS = "MODS" CATEGORIES = "Categorias" WARNING = "\\#ffffa0\\Aviso:\\#dcdcdc\\ Você tem 10 ou mais mods ativados, desative alguns para evitar instabilidade ou lag." +NO_MODS_FOUND = "Não foram encontrados mods." [HOST_MOD_CATEGORIES] ALL = "Todos" @@ -382,7 +383,7 @@ REFRESH = "Recarregar" REFRESHING = "Recarregando..." ENTER_PASSWORD = "Digite a senha da partida privada:" SEARCH = "Pesquisar" -NONE_FOUND = "Nenhuma partida foi encontrada." +NO_LOBBIES_FOUND = "Nenhuma partida foi encontrada." [CHANGELOG] CHANGELOG_TITLE = "ALTERAÇÕES" \ No newline at end of file diff --git a/lang/Russian.ini b/lang/Russian.ini index 7271b22b2..627d2cc56 100644 --- a/lang/Russian.ini +++ b/lang/Russian.ini @@ -173,6 +173,7 @@ HOST = "Хост" MODS = "MODS" CATEGORIES = "Категории" WARNING = "\\#ffffa0\\Внимание:\\#dcdcdc\\ У вас включено 10 или более модов, пожалуйста, отключите некоторые из них, чтобы предотвратить нестабильность или лаги." +NO_MODS_FOUND = "Модов не обнаружено." [HOST_MOD_CATEGORIES] ALL = "Все" @@ -381,7 +382,7 @@ REFRESH = "Обновить" REFRESHING = "Обновление..." ENTER_PASSWORD = "Введите пароль закрытой группы:" SEARCH = "Поиск" -NONE_FOUND = "Группы не найдены." +NO_LOBBIES_FOUND = "Группы не найдены." [CHANGELOG] CHANGELOG_TITLE = "ЖУРНАЛ ИЗМЕНЕНИЙ" diff --git a/lang/Spanish.ini b/lang/Spanish.ini index 61a897f11..b8404bdc7 100644 --- a/lang/Spanish.ini +++ b/lang/Spanish.ini @@ -174,6 +174,7 @@ HOST = "Crear" MODS = "MODS" CATEGORIES = "Categorías" WARNING = "\\#ffffa0\\Advertencia:\\#dcdcdc\\ Tienes 10 o más mods activados, por favor desactiva algunos para prevenir inestabilidad o lag." +NO_MODS_FOUND = "No se han encontrado mods." [HOST_MOD_CATEGORIES] ALL = "Todos" @@ -382,7 +383,7 @@ REFRESH = "Refrescar" REFRESHING = "Refrescando..." ENTER_PASSWORD = "Introduce la contraseña de la partida privada:" SEARCH = "Buscar" -NONE_FOUND = "No se han encontrado partidas." +NO_LOBBIES_FOUND = "No se han encontrado partidas." [CHANGELOG] CHANGELOG_TITLE = "REGISTRO DE CAMBIOS" diff --git a/src/pc/djui/djui_paginated.c b/src/pc/djui/djui_paginated.c index cc03f8cae..77a557e8f 100644 --- a/src/pc/djui/djui_paginated.c +++ b/src/pc/djui/djui_paginated.c @@ -28,7 +28,7 @@ static s32 djui_paginated_get_count(struct DjuiPaginated* paginated) { void djui_paginated_update_page_buttons(struct DjuiPaginated* paginated) { s32 count = djui_paginated_get_count(paginated); - paginated->startIndex = MIN(paginated->startIndex, count); + paginated->startIndex = MIN(paginated->startIndex, count) & ~(paginated->showCount - 1); char pageNumString[32] = { 0 }; snprintf(pageNumString, 32, "%d/%d", paginated->startIndex / paginated->showCount + 1, (count - 1) / paginated->showCount + 1); @@ -64,16 +64,21 @@ void djui_paginated_calculate_height(struct DjuiPaginated* paginated) { f32 height = 0; s32 count = 0; - while (dbc != NULL) { - struct DjuiBase* cbase = dbc->base; - if (count < paginated->showCount) { - if (height != 0) { - height += paginated->layout->margin.value; + if (paginated->showMaxCount) { + height = paginated->showCount * (32 + paginated->layout->margin.value); + count = paginated->showCount + 1; + } else { + while (dbc != NULL) { + struct DjuiBase* cbase = dbc->base; + if (count < paginated->showCount) { + if (height != 0) { + height += paginated->layout->margin.value; + } + height += cbase->height.value; } - height += cbase->height.value; + count++; + dbc = dbc->next; } - count++; - dbc = dbc->next; } if (count <= paginated->showCount) { diff --git a/src/pc/djui/djui_paginated.h b/src/pc/djui/djui_paginated.h index 05291672a..37cad348d 100644 --- a/src/pc/djui/djui_paginated.h +++ b/src/pc/djui/djui_paginated.h @@ -9,6 +9,7 @@ struct DjuiPaginated { struct DjuiText* pageNumText; s32 startIndex; s32 showCount; + bool showMaxCount; }; void djui_paginated_update_page_buttons(struct DjuiPaginated* paginated); diff --git a/src/pc/djui/djui_panel_host_mods.c b/src/pc/djui/djui_panel_host_mods.c index 410f1c17b..99f681886 100644 --- a/src/pc/djui/djui_panel_host_mods.c +++ b/src/pc/djui/djui_panel_host_mods.c @@ -14,24 +14,27 @@ #include "djui_panel_pause.h" #define DJUI_MOD_PANEL_WIDTH (410.0f + (16 * 2.0f)) -#define MOD_CATEGORY_ALL "MOD_CATEGORY_ALL" -#define MOD_CATEGORY_MISC "MOD_CATEGORY_MISC" +#define MOD_CATEGORY_ALL 0 +#define MOD_CATEGORY_MISC 1 +#define MOD_CATEGORY_START 2 static struct DjuiFlowLayout* sModLayout = NULL; static struct DjuiThreePanel* sDescriptionPanel = NULL; static struct DjuiText* sTooltip = NULL; -unsigned int selectedCategory = 0; +static struct DjuiPaginated* sModPaginated = NULL; +unsigned int selectedCategory = MOD_CATEGORY_ALL; static bool sWarned = false; struct ModCategory sCategories[] = { // lang key, mod category - { "ALL", MOD_CATEGORY_ALL }, + { "ALL", NULL }, + { "MISC", NULL }, { "ROMHACKS", "romhack" }, { "GAMEMODES", "gamemode" }, { "MOVESETS", "moveset" }, { "CHARACTER_SELECT", "cs" }, - { "MISC", MOD_CATEGORY_MISC }, }; +static const int numCategories = sizeof(sCategories) / sizeof(sCategories[0]); void djui_panel_host_mods_create(struct DjuiBase* caller); @@ -110,16 +113,6 @@ static void djui_mod_checkbox_on_value_change(UNUSED struct DjuiBase* base) { } } -static void djui_panel_menu_refresh(UNUSED struct DjuiBase* base) { - mods_refresh_local(); - - djui_panel_shutdown(); - gDjuiInMainMenu = true; - djui_panel_main_create(NULL); - djui_panel_host_create(NULL); - djui_panel_host_mods_create(NULL); -} - static void djui_panel_host_mods_destroy(struct DjuiBase* base) { struct DjuiThreePanel* threePanel = (struct DjuiThreePanel*)base; free(threePanel); @@ -132,19 +125,58 @@ static void djui_panel_host_mods_destroy(struct DjuiBase* base) { sTooltip = NULL; } -void djui_panel_on_categories_change(UNUSED struct DjuiBase* caller) { - if (gDjuiInMainMenu) { - djui_panel_shutdown(); - gDjuiInMainMenu = true; - djui_panel_main_create(NULL); - djui_panel_host_create(NULL); - djui_panel_host_mods_create(NULL); - } else { - djui_panel_shutdown(); - djui_panel_pause_create(NULL); - djui_panel_host_create(NULL); - djui_panel_host_mods_create(NULL); +void djui_panel_host_mods_add_mods(struct DjuiBase* layoutBase) { + bool foundAny = false; + for (int i = 0; i < gLocalMods.entryCount; i++) { + struct Mod* mod = gLocalMods.entries[i]; + char* category = mod->category != NULL ? mod->category : mod->incompatible; + switch (selectedCategory) { + case MOD_CATEGORY_ALL: { break; } + case MOD_CATEGORY_MISC: { + bool doContinue = false; + if (category) { + for (int i = MOD_CATEGORY_START; i < numCategories; i++) { + if (strstr(category, sCategories[i].category)) { + doContinue = true; + break; + } + } + } + if (doContinue) { continue; } + break; + } + default: { + if (!category || !strstr(category, sCategories[selectedCategory].category)) { + continue; + } + break; + } + } + struct DjuiCheckbox* checkbox = djui_checkbox_create(layoutBase, mod->name, &mod->enabled, djui_mod_checkbox_on_value_change); + checkbox->base.tag = i; + djui_base_set_enabled(&checkbox->base, mod->selectable); + djui_interactable_hook_hover(&checkbox->base, djui_mod_checkbox_on_hover, djui_mod_checkbox_on_hover_end); + foundAny = true; } + if (!foundAny) { + struct DjuiText* text = djui_text_create(layoutBase, DLANG(HOST_MODS, NO_MODS_FOUND)); + djui_base_set_size_type(&text->base, DJUI_SVT_RELATIVE, DJUI_SVT_RELATIVE); + djui_base_set_size(&text->base, 1, 1); + djui_text_set_alignment(text, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER); + djui_text_set_drop_shadow(text, 64, 64, 64, 100); + } +} + +static void djui_panel_on_categories_change(UNUSED struct DjuiBase* caller) { + djui_base_destroy_children(&sModLayout->base); + djui_panel_host_mods_add_mods(&sModLayout->base); + djui_paginated_calculate_height(sModPaginated); +} + +static void djui_panel_menu_refresh(UNUSED struct DjuiBase* base) { + mods_refresh_local(); + mods_update_selectable(); + djui_panel_on_categories_change(NULL); } void djui_panel_host_mods_create(struct DjuiBase* caller) { @@ -157,7 +189,6 @@ void djui_panel_host_mods_create(struct DjuiBase* caller) { struct DjuiBase* body = djui_three_panel_get_body(panel); { // copy category choices from sCategories - int numCategories = sizeof(sCategories) / sizeof(sCategories[0]); char* categoryChoices[sizeof(sCategories)]; // loop thru all categories names, and add those to the categoryChoices string array @@ -166,31 +197,11 @@ void djui_panel_host_mods_create(struct DjuiBase* caller) { } djui_selectionbox_create(body, DLANG(HOST_MODS, CATEGORIES), categoryChoices, numCategories, &selectedCategory, djui_panel_on_categories_change); struct DjuiPaginated* paginated = djui_paginated_create(body, 8); + paginated->showMaxCount = true; sModLayout = paginated->layout; - struct DjuiBase* layoutBase = &paginated->layout->base; - for (int i = 0; i < gLocalMods.entryCount; i++) { - struct Mod* mod = gLocalMods.entries[i]; - char* category = mod->category; - if (!category) { category = mod->incompatible; } - if (!strstr(sCategories[selectedCategory].category, MOD_CATEGORY_ALL) && !strstr(sCategories[selectedCategory].category, MOD_CATEGORY_MISC) && (!category || !strstr(category, sCategories[selectedCategory].category))) { - continue; - } else if (!strstr(sCategories[selectedCategory].category, MOD_CATEGORY_ALL) && strstr(sCategories[selectedCategory].category, MOD_CATEGORY_MISC)) { - bool doContinue = false; - for (int i = 0; i < numCategories; i++) { - if (strstr(sCategories[selectedCategory].category, MOD_CATEGORY_MISC) && (category && strstr(category, sCategories[i].category))) { - doContinue = true; - break; - } - } - - if (doContinue) { continue; } - } - struct DjuiCheckbox* checkbox = djui_checkbox_create(layoutBase, mod->name, &mod->enabled, djui_mod_checkbox_on_value_change); - checkbox->base.tag = i; - djui_base_set_enabled(&checkbox->base, mod->selectable); - djui_interactable_hook_hover(&checkbox->base, djui_mod_checkbox_on_hover, djui_mod_checkbox_on_hover_end); - } + djui_panel_host_mods_add_mods(&paginated->layout->base); djui_paginated_calculate_height(paginated); + sModPaginated = paginated; if (gNetworkType == NT_NONE) { struct DjuiRect* rect1 = djui_rect_container_create(body, 64); diff --git a/src/pc/djui/djui_panel_join_lobbies.c b/src/pc/djui/djui_panel_join_lobbies.c index 4ce60608d..bc0d7514f 100644 --- a/src/pc/djui/djui_panel_join_lobbies.c +++ b/src/pc/djui/djui_panel_join_lobbies.c @@ -107,7 +107,7 @@ void djui_panel_join_query_finish(void) { djui_base_set_enabled(&sRefreshButton->base, true); if (sLobbyLayout->base.child == NULL) { - struct DjuiText* text = djui_text_create(&sLobbyLayout->base, DLANG(LOBBIES, NONE_FOUND)); + struct DjuiText* text = djui_text_create(&sLobbyLayout->base, DLANG(LOBBIES, NO_LOBBIES_FOUND)); djui_base_set_size_type(&text->base, DJUI_SVT_RELATIVE, DJUI_SVT_RELATIVE); djui_base_set_size(&text->base, 1, 1); djui_text_set_alignment(text, DJUI_HALIGN_CENTER, DJUI_VALIGN_CENTER);