q2wf-portable/p_menu.c

279 lines
4.8 KiB
C
Raw Normal View History

#include "g_local.h"
//#define DEBUG_NT 1
//#define DEBUG_UNIX 2
#ifdef DEBUG_NT
#include <crtdbg.h>
#endif
void PMenu_Open(edict_t *ent, pmenu_t *entries, int cur, int num, qboolean usekeys, qboolean showbackground)
{
pmenuhnd_t *hnd;
pmenu_t *p;
int i;
if (!ent->client)
return;
if (ent->client->menu) {
gi.dprintf("warning, ent already has a menu\n");
PMenu_Close(ent);
}
hnd = malloc(sizeof(*hnd));
hnd->entries = entries;
hnd->num = num;
hnd->MenuTimeout = 0; //Default to no timeout
hnd->UseNumberKeys = usekeys; //Can select items with number keys?
hnd->ShowBackground = showbackground;
if (cur < 0 || !entries[cur].SelectFunc) {
for (i = 0, p = entries; i < num; i++, p++)
if (p->SelectFunc)
break;
} else
i = cur;
if (i >= num)
hnd->cur = -1;
else
hnd->cur = i;
ent->client->showscores = true;
ent->client->inmenu = true;
ent->client->menu = hnd;
PMenu_Update(ent);
gi.unicast (ent, true);
}
void PMenu_Close(edict_t *ent)
{
if (!ent->client->menu)
return;
free(ent->client->menu);
ent->client->menu = NULL;
ent->client->showscores = false;
}
void PMenu_Update(edict_t *ent)
{
char string[1400];
int i;
pmenu_t *p;
int x;
pmenuhnd_t *hnd;
char *t;
qboolean alt = false;
if (ent->health<1)
{
PMenu_Close(ent);
return;
}
if (!ent->client->menu) {
gi.dprintf("warning: ent has no menu\n");
return;
}
hnd = ent->client->menu;
//JR Disabled this to slow down overflows//Nope added it back since it didn't work right then
if (hnd->ShowBackground)
strcpy(string, "xv 32 yv 8 picn inventory ");
else
strcpy(string, "");
for (i = 0, p = hnd->entries; i < hnd->num; i++, p++)
{
if (!p->text || !*(p->text))
continue; // blank line
t = p->text;
if (*t == '*') {
alt = true;
t++;
}
//WF - made inventory screen larger
sprintf(string + strlen(string), "yv %d ", 32 + i * 8);
if (p->align == PMENU_ALIGN_CENTER)
x = 196/2 - strlen(t)*4 + 64;
// x = 240/2 - strlen(t)*4 + 64;
else if (p->align == PMENU_ALIGN_RIGHT)
// x = 64 + (196 - strlen(t)*8);
x = 64 + (240 - strlen(t)*8);
else
x = 64;
sprintf(string + strlen(string), "xv %d ",
x - ((hnd->cur == i) ? 8 : 0));
if (hnd->cur == i)
sprintf(string + strlen(string), "string2 \"\x0d%s\" ", t);
else if (alt)
sprintf(string + strlen(string), "string2 \"%s\" ", t);
else
sprintf(string + strlen(string), "string \"%s\" ", t);
alt = false;
}
gi.WriteByte (svc_layout);
gi.WriteString (string);
//gi.dprintf("%s\n", string);
}
void PMenu_Next(edict_t *ent)
{
pmenuhnd_t *hnd;
int i;
pmenu_t *p;
if (!ent->client->menu) {
gi.dprintf("warning: ent has no menu\n");
return;
}
hnd = ent->client->menu;
if (hnd->cur < 0)
return; // no selectable entries
i = hnd->cur;
p = hnd->entries + hnd->cur;
do {
i++, p++;
if (i == hnd->num)
i = 0, p = hnd->entries;
if (p->SelectFunc)
break;
} while (i != hnd->cur);
hnd->cur = i;
PMenu_Update(ent);
gi.unicast (ent, true);
}
void PMenu_Prev(edict_t *ent)
{
pmenuhnd_t *hnd;
int i;
pmenu_t *p;
if (!ent->client->menu) {
gi.dprintf("warning: ent has no menu\n");
return;
}
hnd = ent->client->menu;
if (hnd->cur < 0)
return; // no selectable entries
i = hnd->cur;
p = hnd->entries + hnd->cur;
do {
if (i == 0) {
i = hnd->num - 1;
p = hnd->entries + i;
} else
i--, p--;
if (p->SelectFunc)
break;
} while (i != hnd->cur);
hnd->cur = i;
PMenu_Update(ent);
gi.unicast (ent, true);
}
void PMenu_Select(edict_t *ent)
{
pmenuhnd_t *hnd;
pmenu_t *p;
if (!ent->client->menu) {
gi.dprintf("warning: ent has no menu\n");
return;
}
hnd = ent->client->menu;
if (hnd->cur < 0)
return; // no selectable entries
p = hnd->entries + hnd->cur;
if (p->SelectFunc)
p->SelectFunc(ent, p);
}
int WFMenuFromNumberKey(edict_t *ent, int slot)
{
pmenuhnd_t *hnd;
pmenu_t *p;
int i;
int pos;
if (!ent->client->menu) {
gi.dprintf("warning: ent has no menu\n");
return 0;
}
hnd = ent->client->menu;
if (hnd->cur < 0)
return 0; // no selectable entries
for (i = 0, pos = 0; (i < hnd->num) && (ent->client->menu); ++i)
{
//DEBUGGING MEMORY PROBLEM-GREGG
#ifdef DEBUG_NT
if (_CrtIsValidPointer(hnd, sizeof(pmenuhnd_t), true) != true)
{
gi.dprintf("Bad Menu Handle in p_menu (2)\n");
return 0;
}
#endif
//DEBUGGING MEMORY PROBLEM-GREGG
if (!ent->client->menu) return 0;
//Pick next menu item
p = hnd->entries + i;
//Increment position for selectable items
if ( (p) && p->SelectFunc)
{
++pos;
//Did we find it?
if (pos == slot)
{
//Execute the function
p->SelectFunc(ent, p);
return 1;
}
}
if (!ent->client->menu) return 0;
//DEBUGGING MEMORY PROBLEM-GREGG
#ifdef TARGET_NT
if (_CrtIsValidPointer(hnd, sizeof(pmenuhnd_t), 1) != 1)
{
gi.dprintf("Bad Menu Handle in p_menu (2)\n");
return 0;
}
#endif
//DEBUGGING MEMORY PROBLEM-GREGG
}
return 1;
}