public override void GameProc(IStateOwner pOwner) { if (ReplayData == null) { ReplayData = new StatefulReplay(); } if (!FirstRun) { if (GameOptions.MusicEnabled) { iActiveSoundObject musicplay = null; if (pOwner.Settings.std.MusicOption == "<RANDOM>") { musicplay = Sounds.PlayMusic(pOwner.AudioThemeMan.BackgroundMusic.Key, pOwner.Settings.std.MusicVolume, true); } else { musicplay = Sounds.PlayMusic(pOwner.Settings.std.MusicOption, pOwner.Settings.std.MusicVolume, true); } if (musicplay != null) { musicplay.Tempo = 1f; } FirstRun = true; GameHandler.PrepareField(this, pOwner); } } //update particles. FrameUpdate(); if (pOwner.GameStartTime == DateTime.MinValue) { pOwner.GameStartTime = DateTime.Now; } if (pOwner.LastPausedTime != DateTime.MinValue) { pOwner.GameStartTime += (DateTime.Now - pOwner.LastPausedTime); pOwner.LastPausedTime = DateTime.MinValue; foreach (var iterate in PlayField.BlockGroups) { iterate.LastFall = pOwner.GetElapsedTime(); iterate.HighestHeightValue = 0; } } PlayField.AnimateFrame(); HandleActiveGroups(pOwner); if (GameOvered) { //For testing: write out the replay data as a sequence of little images. //ReplayData.WriteStateImages("T:\\ReplayData"); Sounds.StopMusic(); pOwner.FinalGameTime = DateTime.Now - pOwner.GameStartTime; GameHandler.Statistics.TotalGameTime = pOwner.FinalGameTime; NextAngleOffset = 0; pOwner.EnqueueAction(() => { pOwner.CurrentState = new GameOverGameState(this, GameHandler.GetGameOverStatistics(this, pOwner)); }); } if (PlayField.BlockGroups.Count == 0 && !SpawnWait && !pOwner.CurrentState.GameProcSuspended && !NoTetrominoSpawn) { SpawnWait = true; pOwner.EnqueueAction (() => { SpawnNewTetromino(pOwner); SpawnWait = false; }); } }