亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? p_menu.c

?? 著名游戲quake2原代碼最新版本(vc6.0可以編譯的)
?? C
字號:
/*
Copyright (C) 1997-2001 Id Software, Inc.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  

See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/
#include "g_local.h"

// Note that the pmenu entries are duplicated
// this is so that a static set of pmenu entries can be used
// for multiple clients and changed without interference
// note that arg will be freed when the menu is closed, it must be allocated memory
pmenuhnd_t *PMenu_Open(edict_t *ent, pmenu_t *entries, int cur, int num, void *arg)
{
	pmenuhnd_t *hnd;
	pmenu_t *p;
	int i;

	if (!ent->client)
		return NULL;

	if (ent->client->menu) {
		gi.dprintf("warning, ent already has a menu\n");
		PMenu_Close(ent);
	}

	hnd = malloc(sizeof(*hnd));

	hnd->arg = arg;
	hnd->entries = malloc(sizeof(pmenu_t) * num);
	memcpy(hnd->entries, entries, sizeof(pmenu_t) * num);
	// duplicate the strings since they may be from static memory
	for (i = 0; i < num; i++)
		if (entries[i].text)
			hnd->entries[i].text = strdup(entries[i].text);

	hnd->num = num;

	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_Do_Update(ent);
	gi.unicast (ent, true);

	return hnd;
}

void PMenu_Close(edict_t *ent)
{
	int i;
	pmenuhnd_t *hnd;

	if (!ent->client->menu)
		return;

	hnd = ent->client->menu;
	for (i = 0; i < hnd->num; i++)
		if (hnd->entries[i].text)
			free(hnd->entries[i].text);
	free(hnd->entries);
	if (hnd->arg)
		free(hnd->arg);
	free(hnd);
	ent->client->menu = NULL;
	ent->client->showscores = false;
}

// only use on pmenu's that have been called with PMenu_Open
void PMenu_UpdateEntry(pmenu_t *entry, const char *text, int align, SelectFunc_t SelectFunc)
{
	if (entry->text)
		free(entry->text);
	entry->text = strdup(text);
	entry->align = align;
	entry->SelectFunc = SelectFunc;
}

void PMenu_Do_Update(edict_t *ent)
{
	char string[1400];
	int i;
	pmenu_t *p;
	int x;
	pmenuhnd_t *hnd;
	char *t;
	qboolean alt = false;

	if (!ent->client->menu) {
		gi.dprintf("warning:  ent has no menu\n");
		return;
	}

	hnd = ent->client->menu;

	strcpy(string, "xv 32 yv 8 picn inventory ");

	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++;
		}
		sprintf(string + strlen(string), "yv %d ", 32 + i * 8);
		if (p->align == PMENU_ALIGN_CENTER)
			x = 196/2 - strlen(t)*4 + 64;
		else if (p->align == PMENU_ALIGN_RIGHT)
			x = 64 + (196 - 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);
}

void PMenu_Update(edict_t *ent)
{
	if (!ent->client->menu) {
		gi.dprintf("warning:  ent has no menu\n");
		return;
	}

	if (level.time - ent->client->menutime >= 1.0) {
		// been a second or more since last update, update now
		PMenu_Do_Update(ent);
		gi.unicast (ent, true);
		ent->client->menutime = level.time;
		ent->client->menudirty = false;
	}
	ent->client->menutime = level.time + 0.2;
	ent->client->menudirty = true;
}

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

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

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, hnd);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久亚洲蜜桃| 国产精品免费人成网站| 久久99精品一区二区三区三区| 91精品国产入口| 欧美aa在线视频| 国产色婷婷亚洲99精品小说| 99久久国产综合色|国产精品| 亚洲乱码国产乱码精品精98午夜| 日韩一卡二卡三卡| 在线国产亚洲欧美| 国产一区二区三区免费播放| 亚洲女同ⅹxx女同tv| 日韩美女视频一区二区在线观看| 99久久夜色精品国产网站| 丝瓜av网站精品一区二区| 中文字幕乱码一区二区免费| 日韩视频一区二区三区| 欧美日韩亚州综合| 91天堂素人约啪| 波多野结衣精品在线| 韩国精品久久久| 国产一区二区91| 日本系列欧美系列| 丝袜美腿亚洲色图| 喷水一区二区三区| 亚洲国产精品一区二区www| 国产精品乱人伦中文| 中文字幕乱码一区二区免费| 久久精品一区二区| 国产亚洲成av人在线观看导航| 欧美成va人片在线观看| 久久综合狠狠综合久久综合88| 欧美群妇大交群中文字幕| 欧美色综合网站| 欧美一级二级在线观看| 日韩欧美成人午夜| 国产拍欧美日韩视频二区| 欧美激情一区二区在线| 中文字幕国产一区| 亚洲欧美色一区| 水野朝阳av一区二区三区| 麻豆精品蜜桃视频网站| 国产一区不卡在线| 色综合久久久久综合| 欧美羞羞免费网站| 国产亚洲1区2区3区| 尤物av一区二区| 精品亚洲免费视频| 91一区二区三区在线观看| 欧美浪妇xxxx高跟鞋交| 久久久久综合网| 香蕉影视欧美成人| 成人午夜激情片| 欧美激情中文不卡| 日产欧产美韩系列久久99| 顶级嫩模精品视频在线看| 在线电影一区二区三区| 亚洲丝袜精品丝袜在线| 国产一区二区三区精品欧美日韩一区二区三区 | 一色桃子久久精品亚洲| 日韩精品每日更新| 97久久精品人人做人人爽| 精品久久久久久久一区二区蜜臀| 亚洲一区二区3| 日本精品一区二区三区高清| 日韩午夜在线播放| 亚洲国产一区二区三区| hitomi一区二区三区精品| 中文字幕亚洲视频| av不卡免费电影| 亚洲精品少妇30p| 欧美性xxxxxx少妇| 樱花影视一区二区| 欧美性三三影院| 久久精工是国产品牌吗| 久久青草欧美一区二区三区| 国产自产视频一区二区三区| 国产婷婷色一区二区三区在线| 精品一区二区三区欧美| 亚洲欧洲性图库| 91精品国产一区二区三区香蕉| 裸体歌舞表演一区二区| 国产免费久久精品| 欧美午夜理伦三级在线观看| 久久精品国产亚洲一区二区三区| 日韩欧美高清一区| 色嗨嗨av一区二区三区| 亚洲国产日韩a在线播放| 欧美精品一区二区三区在线播放 | 国产成人综合自拍| 亚洲国产综合色| 国产精品久久久久一区二区三区共| 99久久久国产精品免费蜜臀| 图片区小说区国产精品视频| 日本一区二区成人在线| 欧美精品乱码久久久久久| 懂色av一区二区三区免费看| 理论电影国产精品| 爽好多水快深点欧美视频| 亚洲欧美影音先锋| 久久精品夜色噜噜亚洲a∨| 欧美日韩aaaaaa| 91久久人澡人人添人人爽欧美| 国产91精品免费| 国产宾馆实践打屁股91| 国产麻豆午夜三级精品| 另类小说一区二区三区| 天堂资源在线中文精品| 亚洲午夜久久久久久久久电影网| 中文字幕在线视频一区| 久久夜色精品国产噜噜av| 日韩欧美综合一区| 精品免费一区二区三区| 久久久精品tv| 久久香蕉国产线看观看99| 久久久影视传媒| 国产免费成人在线视频| 国产精品视频一区二区三区不卡| 日本一区免费视频| 国产三级一区二区| 亚洲你懂的在线视频| 亚洲女与黑人做爰| 国产午夜三级一区二区三| 国产精品蜜臀av| 一区二区激情小说| 久久99久久99精品免视看婷婷| 国产一区91精品张津瑜| bt欧美亚洲午夜电影天堂| 欧美日韩一区二区三区高清| 26uuu精品一区二区三区四区在线| 久久久高清一区二区三区| 中文字幕亚洲不卡| 美女精品一区二区| av在线一区二区三区| 欧美成人a视频| 天堂在线亚洲视频| 色噜噜狠狠色综合中国| 久久久高清一区二区三区| 天天色图综合网| 99精品久久99久久久久| 欧美α欧美αv大片| 一区二区不卡在线播放| 国产福利精品一区二区| 欧美一卡二卡三卡四卡| 五月天亚洲精品| 91福利在线免费观看| 国产精品美女一区二区| 美女久久久精品| 日韩一区二区三区视频| 亚洲影视资源网| 91影视在线播放| 亚洲图片欧美一区| 在线欧美小视频| 中文字幕在线播放不卡一区| 成人午夜看片网址| 成人免费视频在线观看| 色综合欧美在线| 亚洲午夜私人影院| 69堂成人精品免费视频| 日韩高清在线观看| 久久久青草青青国产亚洲免观| 狠狠色综合播放一区二区| 国产亚洲一区二区三区在线观看| 极品美女销魂一区二区三区免费| 久久久久99精品国产片| 91美女视频网站| 日本系列欧美系列| 国产精品天干天干在观线| 色婷婷综合五月| 日本不卡123| 国产精品久久久久久久午夜片| 不卡影院免费观看| 丝袜美腿高跟呻吟高潮一区| 久久蜜臀中文字幕| 欧美影院精品一区| 岛国一区二区三区| 日韩精品一级二级| 中文字幕一区二区三| 在线成人av网站| 色欧美片视频在线观看在线视频| 美洲天堂一区二卡三卡四卡视频| 亚洲人快播电影网| 国产蜜臀av在线一区二区三区| 欧美片网站yy| 欧美日韩中文字幕一区| 99vv1com这只有精品| 国产成人午夜99999| 久久成人综合网| 偷拍一区二区三区| 亚洲成人免费在线观看| 亚洲日本成人在线观看| 国产精品情趣视频| 国产精品成人免费在线| 欧美国产综合色视频| 国产欧美一区二区三区鸳鸯浴| 久久久综合九色合综国产精品| 日韩三级视频在线观看| 精品成人一区二区三区| 欧美一区二区三区播放老司机| 欧美日韩激情一区二区|