示例#1
0
文件: menu.c 项目: Wuzzy2/cdogs-sdl
int KeyAvailable(int key, int code, input_keys_t *keys, input_keys_t *keysOther)
{
	key_code_e i;

	if (key == SDLK_ESCAPE || key == SDLK_F9 || key == SDLK_F10)
	{
		return 0;
	}
	if (key == gConfig.Input.PlayerKeys[0].Keys.map && code >= 0)
	{
		return 0;
	}

	for (i = 0; i < KEY_CODE_MAP; i++)
		if ((int)i != code && InputGetKey(keys, i) == key)
			return 0;

	if (keysOther->left == key ||
		keysOther->right == key ||
		keysOther->up == key ||
		keysOther->down == key ||
		keysOther->button1 == key ||
		keysOther->button2 == key)
	{
		return 0;
	}

	return 1;
}
示例#2
0
文件: menu.c 项目: Wuzzy2/cdogs-sdl
static void MenuDisplaySubmenus(const MenuSystem *ms)
{
	int x = 0, yStart = 0;
	const menu_t *menu = ms->current;

	switch (menu->type)
	{
	// TODO: refactor the three menu types (normal, options, campaign) into one
	case MENU_TYPE_NORMAL:
	case MENU_TYPE_OPTIONS:
		{
			int iStart = 0;
			int iEnd = (int)menu->u.normal.subMenus.size;
			int numMenuLines = 0;
			int maxIEnd = (int)menu->u.normal.subMenus.size;
			if (menu->u.normal.maxItems > 0)
			{
				// Calculate first/last indices
				if (menu->u.normal.scroll != 0)
				{
					iStart = menu->u.normal.scroll;
				}
				maxIEnd = iStart + menu->u.normal.maxItems;
			}
			// Count the number of menu items that can fit
			// This is to account for multi-line items
			for (iEnd = iStart;
				iEnd < maxIEnd && iEnd < (int)menu->u.normal.subMenus.size;
				iEnd++)
			{
				const menu_t *subMenu =
					CArrayGet(&menu->u.normal.subMenus, iEnd);
				const int numLines = FontStrNumLines(subMenu->name);
				if (menu->u.normal.maxItems > 0 &&
					numMenuLines + numLines > menu->u.normal.maxItems)
				{
					break;
				}
				numMenuLines += numLines;
			}

			int maxWidth = 0;
			for (int i = 0; i < (int)menu->u.normal.subMenus.size; i++)
			{
				const menu_t *subMenu = CArrayGet(&menu->u.normal.subMenus, i);
				const int width = FontStrW(subMenu->name);
				if (width > maxWidth)
				{
					maxWidth = width;
				}
			}
			// Limit max width if it is larger than the menu system size
			maxWidth = MIN(ms->size.x, maxWidth);
			const bool isCentered = menu->type == MENU_TYPE_NORMAL;
			switch (ms->align)
			{
			case MENU_ALIGN_CENTER:
				x = MS_CENTER_X(*ms, maxWidth);
				if (!isCentered)
				{
					x -= 20;
				}
				break;
			case MENU_ALIGN_LEFT:
				x = ms->pos.x;
				break;
			default:
				assert(0 && "unknown alignment");
				break;
			}

			yStart = MS_CENTER_Y(*ms, numMenuLines * FontH());
			if (menu->u.normal.maxItems > 0)
			{
				// Display scroll arrows
				if (menu->u.normal.scroll != 0)
				{
					DisplayMenuItem(
						Vec2iNew(
							MS_CENTER_X(*ms, FontW('^')),
							yStart - 2 - FontH()),
						"^",
						0, 0,
						colorBlack);
				}
				if (iEnd < (int)menu->u.normal.subMenus.size - 1)
				{
					DisplayMenuItem(
						Vec2iNew(
							MS_CENTER_X(*ms, FontW('v')),
							yStart + numMenuLines*FontH() + 2),
						"v",
						0, 0,
						colorBlack);
				}
			}
			const int xOptions = x + maxWidth + 10;

			// Display normal menu items
			Vec2i pos = Vec2iNew(x, yStart);
			for (int i = iStart; i < iEnd; i++)
			{
				const menu_t *subMenu = CArrayGet(&menu->u.normal.subMenus, i);
				char *nameBuf;
				CMALLOC(nameBuf, strlen(subMenu->name) + 3);
				if (subMenu->type == MENU_TYPE_NORMAL &&
					subMenu->u.normal.isSubmenusAlt)
				{
					sprintf(nameBuf, "%s >", subMenu->name);
				}
				else
				{
					strcpy(nameBuf, subMenu->name);
				}

				switch (menu->u.normal.align)
				{
				case MENU_ALIGN_CENTER:
					pos.x = MS_CENTER_X(*ms, FontStrW(nameBuf));
					break;
				case MENU_ALIGN_LEFT:
					// Do nothing
					break;
				default:
					assert(0 && "unknown alignment");
					break;
				}

				const int yNext = DisplayMenuItem(
					pos,
					nameBuf,
					i == menu->u.normal.index,
					subMenu->isDisabled,
					subMenu->color).y + FontH();

				// display option value
				if (subMenu->type == MENU_TYPE_SET_OPTION_TOGGLE ||
					subMenu->type == MENU_TYPE_SET_OPTION_RANGE ||
					subMenu->type == MENU_TYPE_SET_OPTION_SEED ||
					subMenu->type == MENU_TYPE_SET_OPTION_UP_DOWN_VOID_FUNC_VOID ||
					subMenu->type == MENU_TYPE_SET_OPTION_RANGE_GET_SET)
				{
					const int optionInt = MenuOptionGetIntValue(subMenu);
					const Vec2i value_pos = Vec2iNew(xOptions, pos.y);
					switch (subMenu->u.option.displayStyle)
					{
					case MENU_OPTION_DISPLAY_STYLE_INT:
						{
							char buf[32];
							sprintf(buf, "%d", optionInt);
							FontStr(buf, value_pos);
						}
						break;
					case MENU_OPTION_DISPLAY_STYLE_YES_NO:
						FontStr(optionInt ? "Yes" : "No", value_pos);
						break;
					case MENU_OPTION_DISPLAY_STYLE_ON_OFF:
						FontStr(optionInt ? "On" : "Off", value_pos);
						break;
					case MENU_OPTION_DISPLAY_STYLE_STR_FUNC:
						FontStr(subMenu->u.option.uFunc.str(), value_pos);
						break;
					case MENU_OPTION_DISPLAY_STYLE_INT_TO_STR_FUNC:
						FontStr(
							subMenu->u.option.uFunc.intToStr(optionInt),
                            value_pos);
						break;
					default:
						break;
					}
				}

				pos.y = yNext;
			}
		}
		break;
	case MENU_TYPE_KEYS:
		{
			int xKeys;
			x = MS_CENTER_X(*ms, (FontW('a') * 10)) / 2;
			xKeys = x * 3;
			yStart = (gGraphicsDevice.cachedConfig.Res.y / 2) - (FontH() * 10);

			for (int i = 0; i < (int)menu->u.normal.subMenus.size; i++)
			{
				int y = yStart + i * FontH();
				int isSelected = i == menu->u.normal.index;
				const menu_t *subMenu = CArrayGet(&menu->u.normal.subMenus, i);

				const char *name = subMenu->name;
				if (isSelected &&
					subMenu->type != MENU_TYPE_SET_OPTION_CHANGE_KEY)
				{
					FontStrMask(name, Vec2iNew(x, y), colorRed);
				}
				else
				{
					FontStr(name, Vec2iNew(x, y));
				}

				if (subMenu->type == MENU_TYPE_SET_OPTION_CHANGE_KEY)
				{
					const char *keyName;
					if (menu->u.normal.changeKeyMenu == subMenu)
					{
						keyName = "Press a key";
					}
					else if (subMenu->u.changeKey.code == KEY_CODE_MAP)
					{
						keyName = SDL_GetKeyName(gConfig.Input.PlayerKeys[0].Keys.map);
					}
					else
					{
						keyName = SDL_GetKeyName(InputGetKey(
							subMenu->u.changeKey.keys,
							subMenu->u.changeKey.code));
					}
					DisplayMenuItem(
						Vec2iNew(xKeys, y),
						keyName,
						isSelected,
						0,
						colorBlack);
				}
			}
		}
		break;
	default:
		// No submenus, don't display anything
		break;
	}
}
示例#3
0
static int mainProc(sTaskBody *body, int msg, int lParam, int rParam)
{
	int res = 0;
	TitleVar *var = (TitleVar *)TaskGetVar(body, sizeof(TitleVar), MEM_APP);
	switch(msg)
	{
	case MSG_CREATE:
		{
			sParam *param = ParamRead(PATH_DATA"/title.param");
			var->param = param;
			var->texture = ParamGetTex(param, "texture");

			for(int i = 0; i < LOGO_CHARANUM; i += 1)
			{
				char id_str[ID_MAXLEN];
				sprintf(id_str, "%d", i + 1);
				SpriteSetup(&var->logo[i], id_str, param);
			}
			SpriteSetup(&var->game, "game", param);
			SpriteSetup(&var->start, "start", param);
			SpriteSetup(&var->copyright, "copy", param);
			SpriteSetup(&var->ngs, "ngs", param);
			SpriteSetup(&var->cursor[0], ">", param);
			SpriteSetup(&var->cursor[1], "<", param);
			var->cursor_pos[0] = var->cursor[0].pos;
			var->cursor_pos[1] = var->cursor[1].pos;

			var->start_fade = ParamGetReal(param, "start_fade");

			FVector2 *scale = ParamGetFVec2(param, "start_scale");
			var->start_scale = scale->x;
			var->game.scale.x = var->game.scale.y = var->start_scale;
			var->start.scale.x = var->start.scale.y = var->start_scale;

			var->start_cur = FALSE;
			var->started = FALSE;

			var->abort_count = ParamGetReal(param, "title_count") * FRAME_RATE;

			SpriteSetup(&var->speker, "vol", param);
			SpriteSetup(&var->vol[0], "vol1", param);
			SpriteSetup(&var->vol[1], "vol2", param);
			SpriteSetup(&var->vol[2], "vol3", param);
			SpriteSetup(&var->vol_var[0], "v_var1", param);
			SpriteSetup(&var->vol_var[1], "v_var2", param);

			if(lParam) SndEffectReq("title", 15, 0.8f);

			if(!rParam)
			{
				int delay = ParamGetReal(param, "title_delay") * FRAME_RATE;
				if(delay > 0) TaskSleep(body, delay);

				for(int i = 0; i < LOGO_CHARANUM; i += 1)
				{
					char id_str[ID_MAXLEN];
					sprintf(id_str, "%ds", i + 1);
					createSpriteTask(&var->logo[i], id_str, var->param, delay);
				}

				var->start_delay = ParamGetReal(param, "start_delay") * FRAME_RATE;
				var->game.disp = FALSE;
				var->start.disp = FALSE;
				var->copyright.disp = FALSE;
				var->ngs.disp = FALSE;
				var->cursor[0].disp = FALSE;
				var->cursor[1].disp = FALSE;

				var->speker.disp = FALSE;
				for(int i = 0; i < 3; i += 1)
				{
					var->vol[i].disp = FALSE;
				}
				for(int i = 0; i < 2; i += 1)
				{
					var->vol_var[i].disp = FALSE;
				}
			}
			else
			{
				createLogoTask(var->logo, 1 * FRAME_RATE);
				var->start_delay = 0;
				setupVolume(var);
			}

			BOOL exec = rParam;
			if(exec) exec = !InputGetBtnP(MOUSE_LEFT);
			InputSetAppExec(INP_CH0, exec);
			/* SHOTの暴発を避けるため、若干回りくどい */
		}
		break;
		
	case MSG_KILL:
		{
			if(var->chg_gain)
			{
				sParam *settings = MainGetSettings();
				ParamSetReal(settings, "gain", SndGetMasterGain());
				WriteGameSettings(settings);
			}
			ParamDestroy(var->param);
		}
		break;

	case MSG_PREPROC:
		{
			if(!var->started && (var->start_delay == 0))
			{
				BOOL slider = sliderVolume(var);
				if(slider && var->abort_count < (1 * FRAME_RATE)) var->abort_count = 1 * FRAME_RATE;
				if(!slider && var->abort_count > 0) var->abort_count -= 1;
			}
		}
		break;

	case MSG_STEP:
		{
			if(var->started)
			{
				switch(var->start_eft_mode)
				{
				case 0:
					{
						var->start_count -= 1;

						float alpha = (var->start_count & 0x2) ? 1.0f : 0.5f;
						if(var->start_count == 0)
						{
							var->start_eft_mode += 1;
							var->start_count = ParamGetReal(var->param, "end_delay") * FRAME_RATE;

							for(int i = 0; i < LOGO_CHARANUM; i += 1)
							{
								char id_str[ID_MAXLEN];
								sprintf(id_str, "%de", i + 1);
								createSpriteTask(&var->logo[i], id_str, var->param, 0);
							}
							createSpriteTask(&var->game, "game", var->param, 0);
							createSpriteTask(&var->start, "start", var->param, 0);
							createSpriteTask(&var->copyright, "copy", var->param, 0);
							createSpriteTask(&var->ngs, "ngs", var->param, 0);

							createSpriteTask(&var->speker, "vol", var->param, 0);
							createSpriteTask(&var->vol[0], "vol1", var->param, 0);
							createSpriteTask(&var->vol[1], "vol2", var->param, 0);
							createSpriteTask(&var->vol[2], "vol3", var->param, 0);
							createSpriteTask(&var->vol_var[0], "v_var1", var->param, 0);
							createSpriteTask(&var->vol_var[1], "v_var2", var->param, 0);

							SndEffectReq("title_fin", 0.4f * FRAME_RATE, 0.3f);
							
							alpha = 1.0f;
						}
						var->game.col.alpha = alpha;
						var->start.col.alpha = alpha;
					}
					break;

				case 1:
					{
						var->start_count -= 1;
						if(var->start_count <= 0)
						{
							InputSetAppBtnExec(INP_CH0, TRUE);
							TaskPostMsgAll(TASK_PRI_NONE, MSG_GAME_GAMESTART, 0, 0);
							res = 1;
						}
					}
					break;
				}
			}
			else
			if(var->start_delay > 0)
			{
				BOOL disp = var->start_delay -= 1;
				BOOL abort = InputGetBtnTD(MOUSE_LEFT | MOUSE_D_LEFT);
				if(abort)
				{
					disp = FALSE;
					TaskPostMsgAll(TASK_PRI_03, MSG_GAME_TITLE_SKIP_EFFECT, 0, 0);
					var->start_delay = 0;
				}

				if(!disp)
				{
					createLogoTask(var->logo, 1 * FRAME_RATE);
					var->game.disp = TRUE;
					var->start.disp = TRUE;
					var->copyright.disp = TRUE;
					var->ngs.disp = TRUE;
					var->cursor[0].disp = TRUE;
					var->cursor[1].disp = TRUE;
					var->speker.disp = TRUE;
					for(int i = 0; i < 2; i += 1)
					{
						var->vol_var[i].disp = TRUE;
					}
					setupVolume(var);

					if(!abort) InputSetAppExec(INP_CH0, TRUE);
				}
			}
			else
			{
				if(InputGetBtnTU(MOUSE_LEFT | MOUSE_D_LEFT))
				{
					InputSetAppExec(INP_CH0, TRUE);
					/* ボタンが離されるまで入力禁止 */
				}
				
				int x = InputGetMouseX();
				int y = InputGetMouseY();

				/* かなり強引な方法 */
				BOOL start = FALSE;
				sBox box = {{ 180 -10, 330 - 10 }, {328 + 10, 362 + 10} };
/* 				box.inf.x = 180 - 10; */
/* 				box.inf.y = 330 - 10; */
/* 				box.sup.x = 328 + 10; */
/* 				box.sup.y = 362 + 10; */

				FVector2 *scale = ParamGetFVec2(var->param, "start_scale");
				if(MathBoxCrossPoint(x, y, &box))
				{
					start = TRUE;
					var->start_scale += (scale->y - var->start_scale) * 0.4f;
					var->cursor[0].col.alpha -= 0.08f;
					var->cursor[1].col.alpha -= 0.08f;
					var->start_count = 0;
				}
				else
				{
					var->start_scale += (scale->x - var->start_scale) * 0.3f;
					var->cursor[0].col.alpha += 0.025f;
					var->cursor[1].col.alpha += 0.025f;
					var->start_count += 1;
				}
				var->game.scale.x = var->game.scale.y = var->start_scale;
				var->start.scale.x = var->start.scale.y = var->start_scale;

				if(var->cursor[0].col.alpha < 0.0f)
				{
					var->cursor[0].col.alpha = 0.0f;
					var->cursor[1].col.alpha = 0.0f;
				}
				else
				if(var->cursor[0].col.alpha > 1.0f)
				{
					var->cursor[0].col.alpha = 1.0f;
					var->cursor[1].col.alpha = 1.0f;
				}

				float alpha = 0.5f + cosf((float)var->start_count * var->start_fade) * 0.5f;
				var->game.col.alpha = alpha;
				var->start.col.alpha = alpha;

				{
					float ofs = fabsf(sinf((float)g.time * 0.08f)) * 8.0f;
					var->cursor[0].pos.x = var->cursor_pos[0].x - ofs;
					var->cursor[1].pos.x = var->cursor_pos[1].x + ofs;
				}
				
				if(var->start_cur != start)
				{
					if(start) SndEffectReq("start_touch", 0, 1.0f);
					InputSetAppBtnExec(INP_CH0, !start);
					var->start_cur = start;
				}
				
				if(start && InputGetBtnTD(MOUSE_LEFT | MOUSE_D_LEFT))
				{
					SndStop("bgm");
					SndEffectReq("start_push", 0, 1.0f);
					var->started = TRUE;
					var->start_eft_mode = 0;
					var->start_scale = 1.5f;
					var->start_count = ParamGetReal(var->param, "start_count") * FRAME_RATE;
					var->cursor[0].disp = FALSE;
					var->cursor[1].disp = FALSE;
					TaskPostMsgAll(TASK_PRI_03, MSG_GAME_TITLE_LOGOEFT_FIN, 0, 0);
				}
				else
				{
					if(var->abort_count == 0)
					{
						TaskDeleteAll(TASK_PRI_03);
						TaskPostMsgAll(TASK_PRI_NONE, MSG_GAME_TITLE_FIN, 0, 0);
						res = 1;
					}
				}
			}

#ifdef DEBUG
			if((!res) && (InputGetKey() == 'd'))
			{
				TaskDeleteAll(TASK_PRI_03);
				TaskPostMsgAll(TASK_PRI_NONE, MSG_GAME_START, TRUE, 0);
				res = 1;
			}
#endif
		}
		break;
			
	case MSG_DRAW:
		{
			for(int i = 0; i < LOGO_CHARANUM; i += 1)
			{
				SpriteDraw(&var->logo[i], var->texture);
			}
			SpriteDraw(&var->game, var->texture);
			SpriteDraw(&var->start, var->texture);
			SpriteDraw(&var->copyright, var->texture);
			SpriteDraw(&var->ngs, var->texture);
			SpriteDraw(&var->cursor[0], var->texture);
			SpriteDraw(&var->cursor[1], var->texture);

			SpriteDraw(&var->speker, var->texture);
			for(int i = 0; i < 3; i += 1)
			{
				SpriteDraw(&var->vol[i], var->texture);
			}
			SpriteDraw(&var->vol_var[0], var->texture);
			SpriteDraw(&var->vol_var[1], var->texture);
		}
		break;
	}

	return res;
}
示例#4
0
void MenuDisplaySubmenus(menu_t *menu)
{
	int i;
	int x = 0, yStart = 0;
	int maxWidth = 0;

	switch (menu->type)
	{
	// TODO: refactor the three menu types (normal, options, campaign) into one
	case MENU_TYPE_NORMAL:
	case MENU_TYPE_OPTIONS:
		{
			int isCentered = menu->type == MENU_TYPE_NORMAL;
			int xOptions;
			for (i = 0; i < menu->u.normal.numSubMenus; i++)
			{
				int width = CDogsTextWidth(menu->u.normal.subMenus[i].name);
				if (width > maxWidth)
				{
					maxWidth = width;
				}
			}
			x = CenterX(maxWidth);
			if (!isCentered)
			{
				x -= 20;
			}
			yStart = CenterY(menu->u.normal.numSubMenus * CDogsTextHeight());
			xOptions = x + maxWidth + 10;

			// Display normal menu items
			for (i = 0; i < menu->u.normal.numSubMenus; i++)
			{
				int y = yStart + i * CDogsTextHeight();
				menu_t *subMenu = &menu->u.normal.subMenus[i];

				// Display menu item
				const char *name = subMenu->name;
				if (i == menu->u.normal.index)
				{
					CDogsTextStringWithTableAt(x, y, name, &tableFlamed);
				}
				else
				{
					CDogsTextStringAt(x, y, name);
				}

				// display option value
				if (subMenu->type == MENU_TYPE_SET_OPTION_TOGGLE ||
					subMenu->type == MENU_TYPE_SET_OPTION_RANGE ||
					subMenu->type == MENU_TYPE_SET_OPTION_SEED ||
					subMenu->type == MENU_TYPE_SET_OPTION_UP_DOWN_VOID_FUNC_VOID ||
					subMenu->type == MENU_TYPE_SET_OPTION_RANGE_GET_SET ||
					subMenu->type == MENU_TYPE_SET_OPTION_CHANGE_CONTROL ||
					subMenu->type == MENU_TYPE_VOID_FUNC_VOID)
				{
					int optionInt = MenuOptionGetIntValue(subMenu);
					switch (subMenu->u.option.displayStyle)
					{
					case MENU_OPTION_DISPLAY_STYLE_INT:
						CDogsTextIntAt(xOptions, y, optionInt);
						break;
					case MENU_OPTION_DISPLAY_STYLE_YES_NO:
						CDogsTextStringAt(xOptions, y, optionInt ? "Yes" : "No");
						break;
					case MENU_OPTION_DISPLAY_STYLE_ON_OFF:
						CDogsTextStringAt(xOptions, y, optionInt ? "On" : "Off");
						break;
					case MENU_OPTION_DISPLAY_STYLE_STR_FUNC:
						CDogsTextStringAt(xOptions, y, subMenu->u.option.uFunc.str());
						break;
					case MENU_OPTION_DISPLAY_STYLE_INT_TO_STR_FUNC:
						CDogsTextStringAt(xOptions, y, subMenu->u.option.uFunc.intToStr(optionInt));
						break;
					default:
						break;
					}
				}
			}
		}
		break;
	case MENU_TYPE_CAMPAIGNS:
		{
			int y = CenterY(12 * CDogsTextHeight());

		#define ARROW_UP	"\036"
		#define ARROW_DOWN	"\037"

			if (menu->u.normal.scroll != 0)
			{
				DisplayMenuItem(
					CenterX(CDogsTextWidth(ARROW_UP)),
					y - 2 - CDogsTextHeight(),
					ARROW_UP,
					0);
			}

			for (i = menu->u.normal.scroll;
				i < MIN(menu->u.normal.scroll + 12, menu->u.normal.numSubMenus);
				i++)
			{
				int isSelected = i == menu->u.normal.index;
				menu_t *subMenu = &menu->u.normal.subMenus[i];
				const char *name = subMenu->name;
				// TODO: display subfolders
				DisplayMenuItem(
					CenterX(CDogsTextWidth(name)), y, name, isSelected);

				if (isSelected)
				{
					char s[255];
					const char *filename = subMenu->u.campaign.filename;
					int isBuiltin = subMenu->u.campaign.isBuiltin;
					sprintf(s, "( %s )", isBuiltin ? "Internal" : filename);
					CDogsTextStringSpecial(
						s,
						TEXT_XCENTER | TEXT_BOTTOM,
						0,
						gGraphicsDevice.cachedConfig.ResolutionWidth / 12);
				}

				y += CDogsTextHeight();
			}

			if (i < menu->u.normal.numSubMenus - 1)
			{
				DisplayMenuItem(
					CenterX(CDogsTextWidth(ARROW_DOWN)),
					y + 2,
					ARROW_DOWN,
					0);
			}
		}
		break;
	case MENU_TYPE_KEYS:
		{
			int xKeys;
			x = CenterX((CDogsTextCharWidth('a') * 10)) / 2;
			xKeys = x * 3;
			yStart = (gGraphicsDevice.cachedConfig.ResolutionHeight / 2) - (CDogsTextHeight() * 10);

			for (i = 0; i < menu->u.normal.numSubMenus; i++)
			{
				int y = yStart + i * CDogsTextHeight();
				int isSelected = i == menu->u.normal.index;
				menu_t *subMenu = &menu->u.normal.subMenus[i];

				const char *name = subMenu->name;
				if (isSelected &&
					subMenu->type != MENU_TYPE_SET_OPTION_CHANGE_KEY)
				{
					CDogsTextStringWithTableAt(x, y, name, &tableFlamed);
				}
				else
				{
					CDogsTextStringAt(x, y, name);
				}

				if (subMenu->type == MENU_TYPE_SET_OPTION_CHANGE_KEY)
				{
					const char *keyName;
					if (menu->u.normal.changeKeyMenu == subMenu)
					{
						keyName = "Press a key";
					}
					else if (subMenu->u.changeKey.code == KEY_CODE_MAP)
					{
						keyName = SDL_GetKeyName(gConfig.Input.PlayerKeys[0].Keys.map);
					}
					else
					{
						keyName = SDL_GetKeyName(InputGetKey(
							subMenu->u.changeKey.keys,
							subMenu->u.changeKey.code));
					}
					DisplayMenuItem(xKeys, y, keyName, isSelected);
				}
			}
		}
		break;
	default:
		assert(0);
		break;
	}
}
示例#5
0
static int mainProc(sTaskBody *body, int msg, int lParam, int rParam)
{
	int res = 0;
	RankingVar *var = (RankingVar *)TaskGetVar(body, sizeof(RankingVar), MEM_APP);
	switch(msg)
	{
	case MSG_CREATE:
		{
			var->param = ParamRead(PATH_DATA"/ranking.param");
			var->ranking = ReadGameSettings(); 
			RankingInfo *info = (RankingInfo *)StkRefFrameP(0);
			var->score = info->score;
			var->boss = info->boss;
			var->weapon = info->weapon;

			var->playend = lParam;
			FVector2 *value = ParamGetFVec2(var->param, "ranking_count");
			var->abort_count = ((lParam) ? value->y : value->x) * FRAME_RATE;
			var->fade_in = ParamGetReal(var->param, "fade_in") * FRAME_RATE;
			var->input_delay = ParamGetReal(var->param, "input_delay") * FRAME_RATE;

			RankingScore *rankingScore = var->rankingScore;
			for(int i = 0; i < RANKING_MAX; i++)
			{
				char id_str[ID_MAXLEN];
				sprintf(id_str, "%d.name", i + 1);
				char *name = ParamGetStr(var->ranking, id_str);
				strcpy(rankingScore->name, name);

				sprintf(id_str, "%d.score", i + 1);
				rankingScore->score = ParamGetReal(var->ranking, id_str);

				sprintf(id_str, "%d.boss", i + 1);
				rankingScore->boss = ParamGetReal(var->ranking, id_str);

				sprintf(id_str, "%d.weapon", i + 1);
				rankingScore->weapon = ParamGetReal(var->ranking, id_str);

				rankingScore += 1;
			}

			if(var->playend)
			{
				RankingScore *rankingScore = var->rankingScore;
				int index = RANKING_MAX;
				for(int i = 0; i < RANKING_MAX; i += 1)
				{
					if(var->score >= rankingScore->score)
					{
						index = i;
						break;
					}
					rankingScore += 1;
				}
				for(int i = RANKING_MAX - 1; i > index; i -= 1)
				{
					var->rankingScore[i] = var->rankingScore[i - 1];
				}
				if(index < RANKING_MAX)
				{
					var->rank_in = TRUE;
					var->rank_in_index = index;
					rankingScore->score = var->score;
					rankingScore->boss = var->boss;
					rankingScore->weapon = var->weapon;
					strcpy(rankingScore->name, "   ");
					SndEffectReq("rank_in", ParamGetReal(var->param, "se_delay") * FRAME_RATE, 1.0f);
				}
			}
		}
		break;
		
	case MSG_KILL:
		{
			ParamDestroy(var->ranking);
			ParamDestroy(var->param);
		}
		break;


	case MSG_STEP:
		{
			BOOL abort = InputGetBtnTD(MOUSE_LEFT | MOUSE_D_LEFT);
			BOOL inkey = FALSE;
			BOOL key_input = var->rank_in;

			if(var->fade_in > 0)
			{
				var->fade_in -= 1;
				float fade_in = ParamGetReal(var->param, "fade_in") * FRAME_RATE;
				var->alpha = (fade_in - (float)var->fade_in) / fade_in;
			}

			if(var->input_delay > 0)
			{
				var->input_delay -= 1;
				abort = FALSE;
				key_input = FALSE;
			}

			if(key_input)
			{
				char input = InputGetKey();
				if(input == '"') input = '\'';		/* 苦肉の策 */
				
				RankingScore *rankingScore = &var->rankingScore[var->rank_in_index];
				if(input == 0xd)
				{
					abort = TRUE;
				}
				else
				if((var->cursor > 0) && (input == ASCII_BS || input == ASCII_DEL))
				{
					var->cursor -= 1;
					rankingScore->name[var->cursor] = ' ';
					inkey = TRUE;
				}
				else
				if((var->cursor < 3) && (input >= 0x20) && (input <= 0x7e))
				{
					rankingScore->name[var->cursor] = input;
					var->cursor += 1;
					inkey = TRUE;
				}
			}
			else
			if(var->abort_count > 0)
			{
				var->abort_count -= 1;
			}
			if(inkey || abort) SndEffectReq("rank_key", 0, 1.0f);

			res = ((var->abort_count == 0) || abort);
			if(res)
			{
				if(var->rank_in)
				{
					recordRanking(var);
				}

				TaskPostMsgAll(TASK_PRI_NONE, MSG_GAME_RANKING_FIN, 0, 0);
			}
		}
		break;
			
	case MSG_DRAW:
		{
			FontPrintF(174, 115, PRIO_COCKPIT, "$A%f$$F1$C1R $C7A N K I N $C2G", var->alpha);

			RankingScore *rankingScore = var->rankingScore;
			for(int i = 0; i < RANKING_MAX; i += 1)
			{
				char *name = rankingScore->name;
				int score = rankingScore->score;
				int boss = rankingScore->boss;
				if(var->rank_in && (var->rank_in_index == i))
				{
					char id_str[ID_MAXLEN];
					sprintf(id_str, "%d.rank_str", i + 1);
					char *rank_str = ParamGetStr(var->param, id_str);

					int col = (g.time % 7) + 1;
					FontPrintF(115, 165 + 24 * i, PRIO_COCKPIT, "$A%f$$F1$C%d%s  %s  %7d  B-%-2d", var->alpha, col, rank_str, name, score, boss);
					char cur[5] = "    ";
					cur[var->cursor] = (var->input_delay == 0) ? '_' : ' ';
					FontPrintF(115, 167 + 24 * i, PRIO_COCKPIT, "$A%f$$F1$C%d      %s", var->alpha, col, cur);
				}
				else
				{
					char id_str[ID_MAXLEN];
					sprintf(id_str, "%d.rank_hdr", i + 1);
					char *rank_hdr = ParamGetStr(var->param, id_str);
					sprintf(id_str, "%d.rank_str", i + 1);
					char *rank_str = ParamGetStr(var->param, id_str);
					
					FontPrintF(115, 165 + 24 * i, PRIO_COCKPIT, "$A%f$$F1%s%s  $C7%s  %7d  $C8B$C7-%-2d", var->alpha, rank_hdr, rank_str, name, score, boss);
				}
				rankingScore += 1;
			}
		}
		break;
	}

	return res;
}