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