sParam *ReadGameSettings(void) { char *fname; if(MmFileCheck(SETTINGS_FILE)) fname = SETTINGS_FILE; else fname = PATH_DATA "/" SETTINGS_FILE; return ParamRead(fname); }
//============================================================== sParam *ObjSetup(char *id_str) //-------------------------------------------------------------- // オブジェクトのセットアップ // ※同じ名前が存在する場合、読み込み直す //-------------------------------------------------------------- // in: id_str = 識別子 //-------------------------------------------------------------- // out: 読み込んだパラメータ //============================================================== { char file[FNAME_MAXLEN]; sParam *param; param = (sParam *)HashGet(param_hash, id_str); if(param) ParamDestroy(param); sprintf(file, OBJ_FILE_PATH"/%s.param", id_str); param = ParamRead(file); HashAdd(param_hash, id_str, param); return param; }
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; }
uint16_t app_get_value() { return ParamRead(PARAM_SENSORVALUE_O_ADDR); }
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; }