void Game_System::BgmPlay(RPG::Music const& bgm) { RPG::Music previous_music = data.current_music; data.current_music = bgm; // (OFF) means play nothing // A Polish RPG Maker translation overtranslated the (OFF) reserved string. // This particular translation uses (Brak) in editor for these cases. // Because RPG_RT doesn't show warnings about audios not found, // theses strings are ignored to prevent filling the log. // Though RPG_RT plays files named (Brak) is still preferred to ignore it. if (!bgm.name.empty() && bgm.name != "(OFF)" && bgm.name != "(Brak)") { // Same music: Only adjust volume and speed if (previous_music.name == bgm.name) { if (previous_music.volume != bgm.volume) { if (!bgm_pending) { // Delay if not ready Audio().BGM_Volume(bgm.volume); } } if (previous_music.tempo != bgm.tempo) { if (!bgm_pending) { // Delay if not ready Audio().BGM_Pitch(bgm.tempo); } } } else { Audio().BGM_Stop(); bgm_pending = true; FileRequestAsync* request = AsyncHandler::RequestFile("Music", bgm.name); request->Bind(&Game_System::OnBgmReady); request->Start(); } } else { BgmStop(); } }
void Scene_Gameover::Start() { // Load Background Graphic background.reset(new Sprite()); background->SetBitmap(Cache::Gameover(Data::system.gameover_name)); // Stop current music Audio().BGM_Stop(); Audio().BGS_Stop(); // Play gameover music Game_System::BgmPlay(Game_System::GetSystemBGM(Game_System::BGM_GameOver)); }
Audio OpenAudio(const Arg::loop_<bool> loop, const FilePath& defaultPath, const String& title) { if (const auto path = OpenFile(detail::OpenAudioFilters, defaultPath, title)) { return Audio(path.value(), loop); } else { return Audio(); } }
void Game_System::BgmPlay(RPG::Music const& bgm) { RPG::Music previous_music = data.current_music; data.current_music = bgm; // Validate if (bgm.volume < 0 || bgm.volume > 100) { data.current_music.volume = 100; Output::Debug("BGM %s has invalid volume %d", bgm.name.c_str(), bgm.volume); } if (bgm.fadein < 0 || bgm.fadein > 10000) { data.current_music.fadein = 0; Output::Debug("BGM %s has invalid fadein %d", bgm.name.c_str(), bgm.fadein); } if (bgm.tempo < 50 || bgm.tempo > 200) { data.current_music.tempo = 100; Output::Debug("BGM %s has invalid tempo %d", bgm.name.c_str(), bgm.tempo); } // (OFF) means play nothing if (!bgm.name.empty() && bgm.name != "(OFF)") { // Same music: Only adjust volume and speed if (!force_bgm_play && previous_music.name == bgm.name) { if (previous_music.volume != data.current_music.volume) { if (!bgm_pending) { // Delay if not ready Audio().BGM_Volume(data.current_music.volume); } } if (previous_music.tempo != data.current_music.tempo) { if (!bgm_pending) { // Delay if not ready Audio().BGM_Pitch(data.current_music.tempo); } } } else { Audio().BGM_Stop(); bgm_pending = true; FileRequestAsync* request = AsyncHandler::RequestFile("Music", bgm.name); music_request_id = request->Bind(&Game_System::OnBgmReady); request->Start(); } } else { BgmStop(); } force_bgm_play = false; }
void Game_System::BgmPlay(RPG::Music const& bgm) { // Same music: Only adjust volume and speed if (data.current_music.name == bgm.name) { if (data.current_music.volume != bgm.volume) { Audio().BGM_Volume(bgm.volume); } if (data.current_music.tempo != bgm.tempo) { Audio().BGM_Pitch(bgm.tempo); } } else { Audio().BGM_Play(bgm.name, bgm.volume, bgm.tempo, bgm.fadein); } data.current_music = bgm; Graphics::FrameReset(); }
CGameWindow() : CFKWindow( 640,480,false ) , m_Player( Graphics(), Audio() ) , m_Font( Graphics(), FK2DEngine::DefaultFontName(), 24 ) , m_nFps( 0 ) , m_nLastFps( 0 ) { SetCaption( L"自由骑士笃志引擎:DEMO1" ); std::wstring szFileName = FK2DEngine::ShareResourcePrefix() + L"rc/media/Space.png"; m_pBackgroundImage.reset( new FK2DEngine::CImage( Graphics(), szFileName, false ) ); szFileName = FK2DEngine::ShareResourcePrefix() + L"rc/media/Star.png"; FK2DEngine::ImagesFromTiledBitmap( Graphics(), szFileName, 25, 25, false, m_StarAnim ); m_Player.Warp( 320, 240 ); //szFileName = FK2DEngine::ShareResourcePrefix() + L"avgRc\\Attack.cur"; //SetNewCursor( szFileName ); szFileName = FK2DEngine::ShareResourcePrefix() + L"avgRc\\AnimCursor.bmp"; m_pCursorBitmap = LoadImageFile( szFileName ); SSAnimationCursorManager::Instance()->AddCursor( m_pCursorBitmap, L"默认鼠标", 32, 32 ); SSAnimationCursorManager::Instance()->SetAnimCursor( L"默认鼠标" ); SSAnimationCursorManager::Instance()->Enable( true ); }
void Pages::track(Document *doc){ std::string sub; int tid = route("track", path, sub); bool post = cgi.getEnvironment().getRequestMethod() == "POST"; if(!tid) return; if(sub == ""){ ExtendedTrack t(tid); if(!t) return; doc->setHtml("html/track.tpl", t.title); doc->rootDict()->SetValueAndShowSection("TID", number(t.id), "HAS_OEMBED"); t.fill(doc->dict()); t.player(doc->dict(), true); Audio(&t).fill(doc->dict()); Dict *embed = doc->dict()->AddIncludeDictionary("EMBED_CODE"); embed->SetFilename("html/embed-code.tpl"); embed->SetIntValue("WIDTH", 150); t.Track::fill(embed); Dict *uploader = doc->dict()->AddIncludeDictionary("UPLOADER"); uploader->SetFilename("html/uploader.tpl"); uploader->SetValue("ACTION", t.url() + "/upload"); EventList::track(t).fill(doc->dict(), "EVENTS"); } }
void Game_System::OnBgmReady(FileRequestResult* result) { // Take from current_music, params could have changed over time bgm_pending = false; std::string path; if (isStopFilename(result->file, FileFinder::FindMusic, path)) { Audio().BGM_Stop(); return; } else if (path.empty()) { Output::Debug("Music not found: %s", result->file.c_str()); return; } if (Utils::EndsWith(result->file, ".link")) { // Handle Ineluki's MP3 patch std::shared_ptr<std::fstream> stream = FileFinder::openUTF8(path, std::ios_base::in); if (!stream) { Output::Warning("Ineluki link read error: %s", path.c_str()); return; } // The first line contains the path to the actual audio file to play std::string line = Utils::ReadLine(*stream.get()); line = ReaderUtil::Recode(line, Player::encoding); Output::Debug("Ineluki link file: %s -> %s", path.c_str(), line.c_str()); #ifdef EMSCRIPTEN Output::Warning("Ineluki MP3 patch unsupported in the web player"); return; #else std::string line_canonical = FileFinder::MakeCanonical(line, 1); std::string ineluki_path = FileFinder::FindDefault(line_canonical); if (ineluki_path.empty()) { Output::Debug("Music not found: %s", line_canonical.c_str()); return; } Audio().BGM_Play(ineluki_path, data.current_music.volume, data.current_music.tempo, data.current_music.fadein); return; #endif } Audio().BGM_Play(path, data.current_music.volume, data.current_music.tempo, data.current_music.fadein); }
void Player::add(std::string code, std::string path) { try { letters.insert({code, Audio(code, path)}); std::cerr << "<5>" << "Adding '" << code << "' from '" << path << "'\n"; } catch(std::runtime_error &e) { std::cerr << "<3>" << e.what() << "\n"; } }
void Game_System::SePlay(RPG::Sound const& se) { // HACK: // Yume Nikki plays hundreds of sound effects at 0% volume on // startup. Probably for caching. This triggers "No free channels" // warnings. if (se.volume > 0) { Audio().SE_Play(se.name, se.volume, se.tempo); } }
void Game_System::OnSeReady(FileRequestResult* result, int volume, int tempo, bool stop_sounds) { auto item = se_request_ids.find(result->file); if (item != se_request_ids.end()) { se_request_ids.erase(item); } std::string path; if (isStopFilename(result->file, FileFinder::FindSound, path)) { if (stop_sounds) { Audio().SE_Stop(); } return; } else if (path.empty()) { Output::Debug("Sound not found: %s", result->file.c_str()); return; } Audio().SE_Play(path, volume, tempo); }
void Game_System::OnBgmReady(FileRequestResult* result) { if (data.current_music.name != result->file) { // Not the music we expect, probably changed over time return; } // Take from current_music, params could have changed over time Audio().BGM_Play(result->file, data.current_music.volume, data.current_music.tempo, data.current_music.fadein); bgm_pending = false; }
static bool DefaultPreload(AudioAssetData& asset) { if (asset.audio) { return true; } asset.audio = Audio(asset.path, asset.loop); return !asset.audio.isEmpty(); }
void Game_System::BgmPlay(RPG::Music const& bgm) { // (OFF) means play nothing if (!bgm.name.empty() && bgm.name != "(OFF)") { // Same music: Only adjust volume and speed if (data.current_music.name == bgm.name) { if (data.current_music.volume != bgm.volume) { Audio().BGM_Volume(bgm.volume); } if (data.current_music.tempo != bgm.tempo) { Audio().BGM_Pitch(bgm.tempo); } } else { Audio().BGM_Play(bgm.name, bgm.volume, bgm.tempo); } } else { Audio().BGM_Stop(); } data.current_music = bgm; Graphics::FrameReset(); }
void Scene_End::Update() { command_window->Update(); if (Input::IsTriggered(Input::CANCEL)) { Game_System::SePlay(Main_Data::game_data.system.cancel_se); Scene::Pop(); // Select End Game } else if (Input::IsTriggered(Input::DECISION)) { Game_System::SePlay(Main_Data::game_data.system.decision_se); switch (command_window->GetIndex()) { case 0: // Yes Audio().BGM_Fade(800); Audio().BGS_Fade(800); Audio().ME_Fade(800); Scene::PopUntil(Scene::Title); break; case 1: // No Scene::Pop(); break; } } }
void Track::deleteTrack() { log("Deleting track: " + title + " (" + number(id) + ")"); Art art(id); if(art) art.remove(); Audio(this).unlink(); Playlist::removeTrack(id); DB::query("DELETE FROM events WHERE track_id = " + number(id)); DB::query("DELETE FROM featured_tracks WHERE track_id = " + number(id)); DB::query("DELETE FROM favorites WHERE type = 'track' AND ref = " + number(id)); DB::query("DELETE FROM user_features WHERE type = 'track' AND ref = " + number(id)); DB::query("DELETE FROM tracks WHERE id = " + number(id)); }
bool Game_Interpreter_Map::ContinuationShowInnFinish(RPG::EventCommand const& /* com */) { if (Graphics::IsTransitionPending()) return false; const RPG::Music& bgm_inn = Game_System::GetSystemBGM(Game_System::BGM_Inn); if (bgm_inn.name.empty() || bgm_inn.name == "(OFF)" || bgm_inn.name == "(Brak)" || !Audio().BGM_IsPlaying() || Audio().BGM_PlayedOnce()) { Game_System::BgmStop(); continuation = NULL; Graphics::GetTransition().Init(Transition::TransitionFadeIn, Scene::instance.get(), 36, false); Game_System::BgmPlay(Main_Data::game_data.system.before_battle_music); if (Game_Temp::inn_handlers) SkipTo(Cmd::Stay, Cmd::EndInn); index++; return false; } return false; }
void Scene_Title::CommandNewGame() { if (!CheckValidPlayerLocation()) { Output::Warning("The game has no start location set."); } else { Game_System::SePlay(Main_Data::game_data.system.decision_se); Audio().BGM_Stop(); Graphics::SetFrameCount(0); CreateGameObjects(); Game_Map::Setup(Data::treemap.start.party_map_id); Main_Data::game_player->MoveTo( Data::treemap.start.party_x, Data::treemap.start.party_y); Main_Data::game_player->Refresh(); Game_Map::Autoplay(); Scene::Push(EASYRPG_MAKE_SHARED<Scene_Map>()); } }
void Game_System::SePlay(const RPG::Sound& se, bool stop_sounds) { static bool ineluki_warning_shown = false; if (se.name.empty()) { return; } else if (se.name == "(OFF)") { if (stop_sounds) { Audio().SE_Stop(); } return; } std::string end = ".script"; if (se.name.length() >= end.length() && 0 == se.name.compare(se.name.length() - end.length(), end.length(), end)) { if (!ineluki_warning_shown) { Output::Warning("This game seems to use Ineluki's key patch to support " "additional keys, mouse or scripts. Such patches are " "unsupported, so this functionality will not work!"); ineluki_warning_shown = true; } return; } // NOTE: Yume Nikki plays hundreds of sound effects at 0% volume on startup, // probably for caching. This avoids "No free channels" warnings. if (se.volume == 0) return; int volume = se.volume; int tempo = se.tempo; // Validate if (se.volume < 0 || se.volume > 100) { Output::Debug("SE %s has invalid volume %d", se.name.c_str(), se.volume); volume = 100; } if (se.tempo < 50 || se.tempo > 200) { Output::Debug("SE %s has invalid tempo %d", se.name.c_str(), se.tempo); tempo = 100; } FileRequestAsync* request = AsyncHandler::RequestFile("Sound", se.name); se_request_ids[se.name] = request->Bind(std::bind(&Game_System::OnSeReady, std::placeholders::_1, volume, tempo, stop_sounds)); request->Start(); }
void UploadWinController::Add(MainWindow* mainWin){ QStringList files = QFileDialog::getOpenFileNames(mainWin, QString::fromUtf8("Выберите аудиофайлы"), QDir::homePath(), "Music (*.mp3 *.mp4 *.wav)"); QVector<Audio> tracks; foreach(QString str, files){ tracks.append(Audio(str)); //currentPath = str.mid(0, startIndexNameSong + 1); // информация о преобразовании имени песни // и пути к ней /*qDebug() << str; qDebug() << startIndexNameSong; qDebug() << str.size() - 1; qDebug() << str.mid(startIndexNameSong + 1, str.size() - 1); qDebug() << currentPath;*/ }
Audio Audio::fromQDomElement(const QDomElement& fr, const QString& srvcId, const QString& accountId, const QString& friendId) { Audio ret = Audio(); ret.setAudioId(fr.elementsByTagName(NODE_AUDIO_ID).at(0).firstChild().toText().data()); if (fr.elementsByTagName(NODE_AUDIO_TITLE).count() > 0) ret.setTitle(fr.elementsByTagName(NODE_AUDIO_TITLE).at(0).firstChild().toText().data()); if (fr.elementsByTagName(NODE_AUDIO_ARTIST).count() > 0) ret.setArtist(fr.elementsByTagName(NODE_AUDIO_ARTIST).at(0).firstChild().toText().data()); if (fr.elementsByTagName(NODE_AUDIO_DURATION).count() > 0) ret.setDuration(fr.elementsByTagName(NODE_AUDIO_DURATION).at(0).firstChild().toText().data().toInt()); if (fr.elementsByTagName(NODE_AUDIO_URL).count()>0) ret.setUrl(fr.elementsByTagName(NODE_AUDIO_URL).at(0).firstChild().toText().data()); ret.setServiceId(srvcId); ret.setAccountId(accountId); ret.setOwnerId(friendId); return ret; }
void Scene_Title::CommandShutdown() { Game_System::SePlay(Main_Data::game_data.system.decision_se); Audio().BGS_Fade(800); Graphics::Transition(Graphics::TransitionFadeOut, 32, true); Scene::Pop(); }
void Pages::track(Document *doc){ std::string sub; int tid = route("track", path, sub); bool post = cgi.getEnvironment().getRequestMethod() == "POST"; if(!tid) return; if(sub == ""){ ExtendedTrack t(tid); if(!t) return; doc->setHtml("html/track.tpl", t.title); doc->rootDict()->SetValueAndShowSection("TID", number(t.id), "HAS_OEMBED"); t.fill(doc->dict()); t.player(doc->dict(), true); Audio(&t).fill(doc->dict()); doc->dict()->ShowSection(Youtube(t.artist.id) ? "HAS_YOUTUBE" : "NO_YOUTUBE"); Dict *embed = doc->dict()->AddIncludeDictionary("EMBED_CODE"); embed->SetFilename("html/embed-code.tpl"); embed->SetIntValue("WIDTH", 150); t.Track::fill(embed); Dict *uploader = doc->dict()->AddIncludeDictionary("UPLOADER"); uploader->SetFilename("html/uploader.tpl"); uploader->SetValue("ACTION", t.url() + "/upload"); int hits = Stat::push("trackView", t.artist.id, tid); doc->dict()->SetValue("HIT_COUNT", number(hits)); int unique_hits = Stat::get("trackView", 0, tid, true); doc->dict()->SetValue("UNIQUE_HIT_COUNT", number(unique_hits)); doc->rootDict()->ShowSection("REQUIRES_STATS_JS"); Session::fill(doc->dict()); EventList::track(t).fill(doc->dict(), "EVENTS", false); doc->dict()->ShowSection(Follower(Session::user().id).favorited(tid) ? "IS_FAVORITE" : "NOT_FAVORITE"); if(Session::user()){ DB::Result playlists = DB::query( "SELECT id, name FROM playlists WHERE user_id = " + number(Session::user().id) + " ORDER BY name ASC"); if(!playlists.empty()){ doc->dict()->ShowSection("HAS_PLAYLISTS"); for(DB::Result::const_iterator i=playlists.begin(); i!=playlists.end(); i++){ Dict *playlist = doc->dict()->AddSectionDictionary("PLAYLIST"); playlist->SetValue("PLAYLIST_ID", i->at(0)); playlist->SetValue("PLAYLIST_NAME", i->at(1)); } } } } else if(sub == "delete"){ Track t(tid); if(!t) return; if(!t.artist.self()) doc->redirect(t.url()); else if(!post || cgi("confirm") != "Delete" || Session::nonce() != cgi("nonce")){ Session::newNonce(); doc->setHtml("html/delete.tpl", "Track deletion"); doc->dict()->SetValue("WHAT", t.title); doc->dict()->SetValue("CANCEL_URL", t.url()); } else{ log("Deleting track: " + t.title + " (" + number(t.id) + ")"); Art art(t.id); if(art) art.remove(); Audio(&t).unlink(); Playlist::removeTrack(t.id); DB::query("DELETE FROM events WHERE track_id = " + number(t.id)); DB::query("DELETE FROM featured_tracks WHERE track_id = " + number(t.id)); DB::query("DELETE FROM favorites WHERE type = 'track' AND ref = " + number(t.id)); DB::query("DELETE FROM user_features WHERE type = 'track' AND ref = " + number(t.id)); DB::query("DELETE FROM tracks WHERE id = " + number(t.id)); doc->redirect(Session::user().url()); } } else if(sub == "publish"){ Track t(tid); if(!t) return; if(tid != number(cgi("tid"))) return doc->redirect(t.url()); if(t.artist.self() && !t.visible && post){ DB::query("UPDATE tracks SET visible = 't', date = 'now' WHERE id = " + number(t.id)); Event e; e.type = Event::Publish; e.source = t.artist; e.track = t; e.push(); std::vector<std::string> emails = Follower(t.artist.id).followers(); std::string maildata = "From: EqBeats notification <*****@*****.**>\n" "Message-ID: notify-t" + number(t.id) + "\n" "Subject: " + filter("EqBeats notification: " + t.artist.name + " - " + t.title) + "\n" "Precedence: bulk\n\n" + t.artist.name + " just published a new track : " + t.title + "\n" "Listen to it here : " + eqbeatsUrl() + t.url() + "\n\n" "You're receiving this email because you're following " + t.artist.name + " on EqBeats.\n" "If you don't want to receive these notifications anymore, go to " + eqbeatsUrl() + t.artist.url() + " and click \"Stop following\"."; for(std::vector<std::string>::const_iterator i = emails.begin(); i!=emails.end(); i++) sendMail(i->c_str(), maildata.c_str()); } doc->redirect(t.url()); } }
void Scene_Title::CommandShutdown() { Game_System::SePlay(Game_System::GetSystemSE(Game_System::SFX_Decision)); Audio().BGS_Fade(800); Graphics::Transition(Graphics::TransitionFadeOut, 32, true); Scene::Pop(); }
bool Game_Interpreter::CommandFadeOutBGM(RPG::EventCommand const& com) { // code 11520 int fadeout = com.parameters[0]; Audio().BGM_Fade(fadeout); return true; }
void Game_Character::MoveTypeCustom() { if (IsStopping()) { move_failed = false; if ((size_t)move_route_index >= move_route->move_commands.size()) { // End of Move list if (move_route->repeat) { move_route_index = 0; } else if (move_route_forcing) { move_route_forcing = false; if (move_route_owner != NULL) { move_route_owner->EndMoveRoute(move_route); } move_route = original_move_route; move_route_index = original_move_route_index; original_move_route = NULL; } } else { RPG::MoveCommand& move_command = move_route->move_commands[move_route_index]; switch (move_command.command_id) { case RPG::MoveCommand::Code::move_up: MoveUp(); break; case RPG::MoveCommand::Code::move_right: MoveRight(); break; case RPG::MoveCommand::Code::move_down: MoveDown(); break; case RPG::MoveCommand::Code::move_left: MoveLeft(); break; case RPG::MoveCommand::Code::move_upright: break; case RPG::MoveCommand::Code::move_downright: break; case RPG::MoveCommand::Code::move_downleft: break; case RPG::MoveCommand::Code::move_upleft: break; case RPG::MoveCommand::Code::move_random: MoveRandom(); break; case RPG::MoveCommand::Code::move_towards_hero: MoveTowardsPlayer(); break; case RPG::MoveCommand::Code::move_away_from_hero: MoveAwayFromPlayer(); break; case RPG::MoveCommand::Code::move_forward: MoveForward(); break; case RPG::MoveCommand::Code::face_up: TurnUp(); break; case RPG::MoveCommand::Code::face_right: TurnRight(); break; case RPG::MoveCommand::Code::face_down: TurnDown(); break; case RPG::MoveCommand::Code::face_left: TurnLeft(); break; case RPG::MoveCommand::Code::turn_90_degree_right: Turn90DegreeRight(); break; case RPG::MoveCommand::Code::turn_90_degree_left: Turn90DegreeLeft(); break; case RPG::MoveCommand::Code::turn_180_degree: Turn180Degree(); break; case RPG::MoveCommand::Code::turn_90_degree_random: Turn90DegreeLeftOrRight(); break; case RPG::MoveCommand::Code::face_random_direction: break; case RPG::MoveCommand::Code::face_hero: break; case RPG::MoveCommand::Code::face_away_from_hero: break; case RPG::MoveCommand::Code::wait: break; case RPG::MoveCommand::Code::begin_jump: break; case RPG::MoveCommand::Code::end_jump: break; case RPG::MoveCommand::Code::lock_facing: Lock(); break; case RPG::MoveCommand::Code::unlock_facing: Unlock(); break; case RPG::MoveCommand::Code::increase_movement_speed: move_speed = min(move_speed + 1, 6); break; case RPG::MoveCommand::Code::decrease_movement_speed: move_speed = max(move_speed - 1, 1); break; case RPG::MoveCommand::Code::increase_movement_frequence: break; case RPG::MoveCommand::Code::decrease_movement_frequence: break; case RPG::MoveCommand::Code::switch_on: // Parameter A: Switch to turn on Game_Switches[move_command.parameter_a] = true; Game_Map::SetNeedRefresh(true); break; case RPG::MoveCommand::Code::switch_off: // Parameter A: Switch to turn off Game_Switches[move_command.parameter_a] = false; Game_Map::SetNeedRefresh(true); break; case RPG::MoveCommand::Code::change_graphic: // String: File, Parameter A: index character_name = move_command.parameter_string; character_index = move_command.parameter_a; break; case RPG::MoveCommand::Code::play_sound_effect: // String: File, Parameters: Volume, Tempo, Balance if (move_command.parameter_string != "(OFF)") { Audio().SE_Play(move_command.parameter_string, move_command.parameter_a, move_command.parameter_b); } break; case RPG::MoveCommand::Code::walk_everywhere_on: through = true; break; case RPG::MoveCommand::Code::walk_everywhere_off: through = false; break; case RPG::MoveCommand::Code::stop_animation: break; case RPG::MoveCommand::Code::start_animation: break; case RPG::MoveCommand::Code::increase_transp: break; // ??? case RPG::MoveCommand::Code::decrease_transp: break; // ??? } if (move_route->skippable || !move_failed) { ++move_route_index; } } } }
void Player::Resume() { Input::ResetKeys(); Audio().BGM_Resume(); Graphics::FrameReset(); }
void Player::Pause() { Audio().BGM_Pause(); }
void Game_System::BgmFade(int duration) { Audio().BGM_Fade(duration); force_bgm_play = true; }
void Game_System::BgmStop() { music_request_id = FileRequestBinding(); data.current_music.name = "(OFF)"; Audio().BGM_Stop(); }