rpgxef/code/ui/ui_mods.cpp
Walter Julius Hennecke 9cac290629 Make all game code projects compile as cpp code
- Fixed all errors that occured due to using c++ compiler
- changed c++ standart to c++17
- removed lua, added library instead
- made all bg_* and q_* file into a shared item project
2017-09-30 21:49:31 +02:00

303 lines
7.7 KiB
C++

// 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();
}