void CRingtoneManager::stop() { HRESULT hr; if (!m_hSound) return; hr = SndClose(m_hSound); if (hr != S_OK) { //TODO: log extended error LOG(ERROR) + "RingtoneManager: failed to close file"; return; } m_hSound = 0; hr = SndStop(SND_SCOPE_PROCESS, NULL); if (hr != S_OK) { //TODO: log extended error LOG(ERROR) + "RingtoneManager: failed to stop playing"; return; } }
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; }