sm64coopdx/src/pc/djui/djui_panel_pause.c
2024-06-05 15:59:21 -04:00

96 lines
3.8 KiB
C

#include "sm64.h"
#include "djui.h"
#include "djui_panel.h"
#include "djui_panel_player.h"
#include "djui_panel_dynos.h"
#include "djui_panel_options.h"
#include "djui_panel_host.h"
#include "djui_panel_menu.h"
#include "djui_panel_confirm.h"
#include "djui_panel_mod_menu.h"
#include "pc/pc_main.h"
#include "pc/network/network.h"
#include "pc/lua/smlua_hooks.h"
#include "game/object_helpers.h"
#include "behavior_table.h"
bool gDjuiPanelPauseCreated = false;
static void djui_panel_pause_resume(UNUSED struct DjuiBase* caller) {
djui_panel_shutdown();
}
void djui_panel_pause_quit_yes(UNUSED struct DjuiBase* caller) {
network_reset_reconnect_and_rehost();
network_shutdown(true, false, false, false);
}
void djui_panel_pause_disconnect_key_update(int scancode) {
if (gDjuiInMainMenu || find_object_with_behavior(bhvActSelector) != NULL) { return; }
for (int i = 0; i < MAX_BINDS; i++) {
if (scancode == (int)configKeyDisconnect[i]) {
djui_panel_pause_quit_yes(NULL);
}
}
}
static void djui_panel_pause_quit(struct DjuiBase* caller) {
if (gMarioStates[0].action == ACT_PUSHING_DOOR || gMarioStates[0].action == ACT_PULLING_DOOR) { return; }
if (gNetworkType == NT_SERVER) {
djui_panel_confirm_create(caller,
DLANG(PAUSE, QUIT_TITLE),
DLANG(PAUSE, QUIT_HOST),
djui_panel_pause_quit_yes);
} else {
djui_panel_confirm_create(caller,
DLANG(PAUSE, QUIT_TITLE),
DLANG(PAUSE, QUIT_CLIENT),
djui_panel_pause_quit_yes);
}
}
void djui_panel_pause_create(struct DjuiBase* caller) {
if (gDjuiChatBoxFocus) { djui_chat_box_toggle(); }
struct DjuiBase* defaultBase = NULL;
struct DjuiThreePanel* panel = djui_panel_menu_create(DLANG(PAUSE, PAUSE_TITLE));
struct DjuiBase* body = djui_three_panel_get_body(panel);
{
struct DjuiRect* rect1 = djui_rect_container_create(body, 64);
{
djui_button_left_create(&rect1->base, DLANG(PAUSE, PLAYER), DJUI_BUTTON_STYLE_NORMAL, djui_panel_player_create);
djui_button_right_create(&rect1->base, DLANG(PAUSE, DYNOS_PACKS), DJUI_BUTTON_STYLE_NORMAL, djui_panel_dynos_create);
}
struct DjuiButton* button3 = djui_button_create(body, DLANG(PAUSE, OPTIONS), DJUI_BUTTON_STYLE_NORMAL, djui_panel_options_create);
defaultBase = &button3->base;
if (gNetworkType == NT_SERVER) {
djui_button_create(body, DLANG(PAUSE, SERVER_SETTINGS), DJUI_BUTTON_STYLE_NORMAL, djui_panel_host_create);
}
if (gHookedModMenuElementsCount == 1 && gHookedModMenuElements[0].element == MOD_MENU_ELEMENT_BUTTON) {
struct LuaHookedModMenuElement* hooked = &gHookedModMenuElements[0];
char buffer[256] = { 0 };
snprintf(buffer, 256, "%s - %s", hooked->mod->name, hooked->name);
struct DjuiButton* button = djui_button_create(body, buffer, DJUI_BUTTON_STYLE_NORMAL, djui_panel_mod_menu_mod_button);
button->base.tag = 0;
} else if (gHookedModMenuElementsCount > 0) {
djui_button_create(body, DLANG(PAUSE, MOD_MENU), DJUI_BUTTON_STYLE_NORMAL, djui_panel_mod_menu_create);
}
djui_button_create(body, DLANG(PAUSE, RESUME), DJUI_BUTTON_STYLE_NORMAL, djui_panel_pause_resume);
if (gNetworkType == NT_SERVER) {
djui_button_create(body, DLANG(PAUSE, STOP_HOSTING), DJUI_BUTTON_STYLE_BACK, djui_panel_pause_quit);
} else {
djui_button_create(body, DLANG(PAUSE, DISCONNECT), DJUI_BUTTON_STYLE_BACK, djui_panel_pause_quit);
}
}
djui_panel_add(caller, panel, defaultBase);
gInteractableOverridePad = true;
gDjuiPanelPauseCreated = true;
}