// Copyright (C) 1999-2000 Id Software, Inc. // #include "ui_local.h" #include "ui_logger.h" enum ui_modsLimits_e { MAX_MODS = 64, NAMEBUFSIZE = (MAX_MODS * 48), GAMEBUFSIZE = (MAX_MODS * 16) }; enum ui_modsIDs_e { ID_BACK = 10, ID_GO, ID_LIST, ID_MAINMENU = 100 }; typedef struct { menuframework_s menu; menulist_s list; menubitmap_s mainmenu; menubitmap_s go; qhandle_t corner_ul; qhandle_t corner_ur; qhandle_t corner_ll; qhandle_t corner_lr; char description[NAMEBUFSIZE]; char fs_game[GAMEBUFSIZE]; char *descriptionPtr; char *fs_gamePtr; char *descriptionList[MAX_MODS]; char *fs_gameList[MAX_MODS]; } mods_t; static mods_t s_mods; /* =============== Mods_MenuEvent =============== */ static void Mods_MenuEvent(void *ptr, int32_t event) { UI_LogFuncBegin(); if (event != QM_ACTIVATED) { UI_LogFuncEnd(); return; } switch (((menucommon_s*)ptr)->id) { case ID_GO: trap_Cvar_Set("fs_game", s_mods.fs_gameList[s_mods.list.curvalue]); trap_Cmd_ExecuteText(EXEC_APPEND, "vid_restart;"); UI_PopMenu(); break; case ID_MAINMENU: UI_PopMenu(); break; } UI_LogFuncEnd(); } /* =============== UI_Mods_ParseInfos =============== */ static void UI_Mods_ParseInfos(char *modDir, char *modDesc) { UI_LogFuncBegin(); s_mods.fs_gameList[s_mods.list.numitems] = s_mods.fs_gamePtr; Q_strncpyz(s_mods.fs_gamePtr, modDir, 16); s_mods.descriptionList[s_mods.list.numitems] = s_mods.descriptionPtr; Q_strncpyz(s_mods.descriptionPtr, modDesc, 48); s_mods.list.itemnames[s_mods.list.numitems] = s_mods.descriptionPtr; s_mods.descriptionPtr += strlen(s_mods.descriptionPtr) + 1; s_mods.fs_gamePtr += strlen(s_mods.fs_gamePtr) + 1; s_mods.list.numitems++; UI_LogFuncEnd(); } /* =============== Mods_LoadMods =============== */ static void Mods_LoadMods(void) { UI_LogFuncBegin(); int32_t numdirs; char dirlist[4096]; char *dirptr; char *descptr; int32_t i; int32_t dirlen; s_mods.list.itemnames = (const char **)s_mods.descriptionList; s_mods.descriptionPtr = s_mods.description; s_mods.fs_gamePtr = s_mods.fs_game; // always start off with baseEF s_mods.list.numitems = 1; s_mods.list.itemnames[0] = s_mods.descriptionList[0] = (char*)menu_normal_text[MNT_ELITEFORCE_HOLOMATCH]; s_mods.fs_gameList[0] = ""; numdirs = trap_FS_GetFileList("$modlist", "", dirlist, sizeof(dirlist)); dirptr = dirlist; for (i = 0; i < numdirs && s_mods.list.numitems < MAX_MODS; i++) { dirlen = strlen(dirptr) + 1; descptr = dirptr + dirlen; UI_Mods_ParseInfos(dirptr, descptr); dirptr += dirlen + strlen(descptr) + 1; } trap_Print(va("%i mods parsed\n", s_mods.list.numitems)); if (s_mods.list.numitems > MAX_MODS) { s_mods.list.numitems = MAX_MODS; } UI_LogFuncEnd(); } /* ================= M_MainMenu_Graphics ================= */ void ModsMenu_Graphics(void) { UI_LogFuncBegin(); // Draw the basic screen layout UI_MenuFrame(&s_mods.menu); UI_DrawProportionalString(74, 66, "66", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(74, 84, "122855", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(74, 188, "81", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(74, 206, "4561", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(74, 395, "2000", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); trap_R_SetColor(colorTable[CT_LTBROWN1]); UI_DrawHandlePic(30, 203, 47, 123, uis.whiteShader); // Top left column square on bottom 3rd UI_DrawHandlePic(30, 328, 47, 61, uis.whiteShader); // Bottom left column square on bottom 3rd UI_DrawProportionalString(74, 206, "38", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); UI_DrawProportionalString(74, 332, "28", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); trap_R_SetColor(colorTable[CT_DKPURPLE3]); UI_DrawHandlePic(127, 167, 32, 32, s_mods.corner_ul); UI_DrawHandlePic(550, 167, 32, 32, s_mods.corner_ur); UI_DrawHandlePic(127, 410, 32, 32, s_mods.corner_ll); UI_DrawHandlePic(550, 410, 32, 32, s_mods.corner_lr); UI_DrawHandlePic(149, 167, 402, 18, uis.whiteShader); // Top line UI_DrawHandlePic(127, 192, 18, 215, uis.whiteShader); // Left side UI_DrawHandlePic(554, 192, 18, 215, uis.whiteShader); // Right side UI_DrawHandlePic(149, 414, 133, 18, uis.whiteShader); // Bottom line to left of button UI_DrawHandlePic(418, 414, 133, 18, uis.whiteShader); // Bottom line to right of button trap_R_SetColor(colorTable[CT_LTBROWN1]); UI_DrawProportionalString(152, 168, menu_normal_text[MNT_AVAILABLEMODS], UI_SMALLFONT, colorTable[CT_BLACK]); //colorTable[CT_LTPURPLE3] //210 UI_DrawProportionalString(568, 170, "38-56", UI_RIGHT | UI_TINYFONT, colorTable[CT_BLACK]); UI_LogFuncEnd(); } /* ================= ModsMenu_Draw ================= */ void ModsMenu_Draw(void) { UI_LogFuncBegin(); // Draw graphics particular to Mods Menu ModsMenu_Graphics(); Menu_Draw(&s_mods.menu); UI_LogFuncEnd(); } /* ================= UI_Mods_Cache ================= */ void UI_ModsMenu_Cache(void) { UI_LogFuncBegin(); s_mods.corner_ul = trap_R_RegisterShaderNoMip("menu/common/corner_ul_18_18.tga"); s_mods.corner_ur = trap_R_RegisterShaderNoMip("menu/common/corner_ur_18_18.tga"); s_mods.corner_ll = trap_R_RegisterShaderNoMip("menu/common/corner_ll_18_18.tga"); s_mods.corner_lr = trap_R_RegisterShaderNoMip("menu/common/corner_lr_18_18.tga"); UI_LogFuncEnd(); } /* =============== UI_Mods_MenuInit =============== */ static void UI_Mods_MenuInit(void) { UI_LogFuncBegin(); // Menu Data memset(&s_mods, 0, sizeof(mods_t)); s_mods.menu.wrapAround = qtrue; s_mods.menu.fullscreen = qtrue; s_mods.menu.draw = ModsMenu_Draw; s_mods.menu.descX = MENU_DESC_X; s_mods.menu.descY = MENU_DESC_Y; s_mods.menu.titleX = MENU_TITLE_X; s_mods.menu.titleY = MENU_TITLE_Y; s_mods.menu.titleI = MNT_MODS_TITLE; s_mods.menu.footNoteEnum = MNT_MODS; UI_ModsMenu_Cache(); // Button Data s_mods.mainmenu.generic.type = MTYPE_BITMAP; s_mods.mainmenu.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_mods.mainmenu.generic.x = 482; s_mods.mainmenu.generic.y = 136; s_mods.mainmenu.generic.name = BUTTON_GRAPHIC_LONGRIGHT; s_mods.mainmenu.generic.id = ID_MAINMENU; s_mods.mainmenu.generic.callback = Mods_MenuEvent; s_mods.mainmenu.width = MENU_BUTTON_MED_WIDTH; s_mods.mainmenu.height = MENU_BUTTON_MED_HEIGHT; s_mods.mainmenu.color = CT_DKPURPLE1; s_mods.mainmenu.color2 = CT_LTPURPLE1; s_mods.mainmenu.textX = MENU_BUTTON_TEXT_X; s_mods.mainmenu.textY = MENU_BUTTON_TEXT_Y; s_mods.mainmenu.textEnum = MBT_MAINMENU; s_mods.mainmenu.textcolor = CT_BLACK; s_mods.mainmenu.textcolor2 = CT_WHITE; s_mods.go.generic.type = MTYPE_BITMAP; s_mods.go.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_mods.go.generic.x = 285; s_mods.go.generic.y = 414; s_mods.go.generic.name = GRAPHIC_SQUARE; s_mods.go.generic.id = ID_GO; s_mods.go.generic.callback = Mods_MenuEvent; s_mods.go.width = MENU_BUTTON_MED_WIDTH; s_mods.go.height = MENU_BUTTON_MED_HEIGHT; s_mods.go.color = CT_DKPURPLE1; s_mods.go.color2 = CT_LTPURPLE1; s_mods.go.textX = MENU_BUTTON_TEXT_X; s_mods.go.textY = MENU_BUTTON_TEXT_Y; s_mods.go.textEnum = MBT_LOADMOD; s_mods.go.textcolor = CT_BLACK; s_mods.go.textcolor2 = CT_WHITE; // scan for mods s_mods.list.generic.type = MTYPE_SCROLLLIST; s_mods.list.generic.flags = QMF_PULSEIFFOCUS; s_mods.list.generic.callback = Mods_MenuEvent; s_mods.list.generic.id = ID_LIST; s_mods.list.generic.x = 159; s_mods.list.generic.y = 195; s_mods.list.width = 48; s_mods.list.height = 14; Mods_LoadMods(); Menu_AddItem(&s_mods.menu, &s_mods.mainmenu); Menu_AddItem(&s_mods.menu, &s_mods.list); Menu_AddItem(&s_mods.menu, &s_mods.go); UI_LogFuncEnd(); } /* =============== UI_ModsMenu =============== */ void UI_ModsMenu(void) { UI_LogFuncBegin(); UI_Mods_MenuInit(); UI_PushMenu(&s_mods.menu); UI_LogFuncEnd(); }