Exemplo n.º 1
0
 public static AudioFX loadFromFile(String path, bool sfx)
 {
     initBass();
     try
     {
         if (Loaded[path] != null && !sfx)
         {
             return(Loaded[path]);
         }
     }
     catch (Exception)
     { //just means wasn't in dict yet
     }
     if (File.Exists(path))
     {
         //int h = Bass.BASS_StreamCreateFile(path, 0L, 0, BASSFlag.BASS_DEFAULT);
         int h = Bass.BASS_StreamCreateFile(path, 0L, 0, BASSFlag.BASS_STREAM_DECODE | BASSFlag.BASS_STREAM_PRESCAN);
         h = BassFx.BASS_FX_TempoCreate(h, BASSFlag.BASS_MUSIC_PRESCAN);
         //Bass.BASS_ChannelSetAttribute(h, BASSAttribute.BASS_ATTRIB_TEMPO_FREQ, frequency);
         if (h == 0)
         {
             Console.WriteLine(Bass.BASS_ErrorGetCode());
         }
         AudioFX fx = new AudioFX(h, path, sfx);
         if (!sfx)
         {
             Loaded.Add(path, fx);
         }
         return(fx);
     }
     Console.WriteLine("Could not find " + path);
     return(new AudioFX()); //so game doesnt get nullpointerexceptions, no audio plays though
 }
Exemplo n.º 2
0
 public static void dispose(AudioFX fx)
 {
     Bass.BASS_StreamFree(fx.handle);
     Loaded.Remove(fx.path);
 }
Exemplo n.º 3
0
 public static AudioFX loadFromFile(String path, bool sfx)
 {
     initBass();
     try
     {
         if (Loaded[path] != null && !sfx)
         {
             return Loaded[path];
         }
     }
     catch (Exception)
     { //just means wasn't in dict yet
     }
     if (File.Exists(path))
     {
         //int h = Bass.BASS_StreamCreateFile(path, 0L, 0, BASSFlag.BASS_DEFAULT);
         int h = Bass.BASS_StreamCreateFile(path, 0L, 0, BASSFlag.BASS_STREAM_DECODE | BASSFlag.BASS_STREAM_PRESCAN);
         h = BassFx.BASS_FX_TempoCreate(h, BASSFlag.BASS_MUSIC_PRESCAN);
         //Bass.BASS_ChannelSetAttribute(h, BASSAttribute.BASS_ATTRIB_TEMPO_FREQ, frequency);
         if (h == 0)
         {
             Console.WriteLine(Bass.BASS_ErrorGetCode());
         }
         AudioFX fx = new AudioFX(h, path, sfx);
         if (!sfx)
         {
             Loaded.Add(path, fx);
         }
         return fx;
     }
     Console.WriteLine("Could not find " + path);
     return new AudioFX(); //so game doesnt get nullpointerexceptions, no audio plays though
 }
Exemplo n.º 4
0
 public static void dispose(AudioFX fx)
 {
     Bass.BASS_StreamFree(fx.handle);
     Loaded.Remove(fx.path);
 }
Exemplo n.º 5
0
 public static void luaInit()
 {
     if (Game.lua != null)
     {
         if (!luaInitd)
         {
             luaInitd = true;
             add("location");
             add("color4");
             add("color3");
             add("color3b");
             add("color4b");
             add("size");
             add("setFrameLocation");
             add("getFrameLocation");
             add("setAccuracyLocation");
             add("getAccuracyLocation");
             add("setScoreLocation");
             add("getScoreLocation");
             add("setPulseColor");
             add("getPulseColor");
             add("setBurstColor");
             add("getBurstColor");
             add("setLightColor");
             add("getLightColor");
             add("setKeyColor");
             add("getKeyColor");
             add("setBottomSpace");
             add("getBottomSpace");
             add("getBarColor");
             add("setBarColor");
             add("setTextOverlap");
             add("getTextOverlap");
             add("getAccuracyColor");
             add("setAccuracyColor");
             add("setClearFrame");
             add("getClearFrame");
             add("setLaneWidth");
             add("getLaneWidth");
             add("setEndColor");
             add("getEndColor");
             add("setStartColor");
             add("getStartColor");
             add("setColorHolds");
             add("getColorHolds");
             add("setDivColor");
             add("getDivColor");
             add("setMaskHolds");
             add("getMaskHolds");
             add("setMaskBursts");
             add("getMaskBursts");
             add("getHoldFramerate");
             add("setHoldFramerate");
             add("setBurstFramerate");
             add("getBurstFramerate");
             add("getHoldFramecount");
             add("getNoteFramecount");
             add("getNoteFramerate");
             add("setNoteFramerate");
             add("setNoteFramecount");
             add("setBurstFramecount");
             add("getBurstFramecount");
             add("setHoldFramecount");
             add("setScoreSize");
             add("getScoreSize");
             add("setAccuracySize");
             add("getAccuracySize");
         }
         defaultskin(Config.SkinFolder);
         if (File.Exists(Root + "config.lua"))
         {
             Game.lua.DoFile(Root + "config.lua");
         }
         noteStyle = 1;
         int total = 0;
         for (int x = 0; x < 8; x++)
         {
             laneLoc[x] = total;
             total += laneWidth[x];
         }
         playframe = new Frame(Skin.FrameLoc, false, false);
         editframe = new Frame(frameLoc, Config.EditMiddle, true);
         chatSound = Audio.AudioManager.loadFromFile(Root + "chatsound.mp3", true);
     }
 }
Exemplo n.º 6
0
        public void setSong(ref SongInfo s)
        {
            currentSong = SongLibrary.loadSong(s);
            music = AudioManager.loadFromFile("songs\\" + currentSong.Dir + "\\" + currentSong.FileName);
            music.Volume = Config.Volume / 100.0f;
            updateText = true;
            if (currentSong.FileVersion > 0)
            {
                if (currentSong.ID == -1)
                {
                    NameValueCollection nvc = new NameValueCollection();
                    nvc.Add("c", Utils.calcHash(currentSong.Charts[0].Path));
                    int id = Convert.ToInt32(Utils.HttpUploadFile("http://p.ulse.net/idchart", nvc));
                    if (id == -1)
                    {
                        id = -2;
                    }
                    currentSong.ID = id;

                    SongLibrary.Songs[SongLibrary.Songs.IndexOf(s)].ID = id;
                    SongLibrary.songInfos[currentSong.Dir].ID = id;
                }
            }
            else
            {
                Console.WriteLine("Cannot get song id, pncv0");
            }
        }
Exemplo n.º 7
0
        public override void OnUpdateFrame(FrameEventArgs e)
        {
            base.OnUpdateFrame(e);
            if (currentOffset > updateTime && updateTime != -1234)
            {
                score.TotalScore = scoreUpdate;
                score.Combo = comboUpdate;
                hp = hpUpdate;
                score.Accuracy = accUpdate;
                updateTime = -1234;
            }
            if (skip.Visible == true && keyPress(Config.SkipKey))
            {
                running = true;
                unpause();
                music.PositionAsMilli = (long)startOffset - 2000;
                currentOffset = music.PositionAsMilli;
                skip.Visible = false;
                skip.Enabled = false;
            }
            if (!Config.Specs.Equals(oldSpecs) && Config.Spectating)
            {
                userList.Update(Config.Specs);
                oldSpecs = Config.Specs;
            }
            else if (!Config.SpecsOnMe.Equals(oldSpecs) && Config.Spectated)
            {
                userList.Update(Config.SpecsOnMe);
                oldSpecs = Config.SpecsOnMe;
            }
            if (startOffset - currentOffset < 2000)
            {
                skip.Visible = false;
                skip.Enabled = false;
            }
            if (!paused)
            {
                heartbeatTime += e.Time;
                time1 += e.Time;
                time2 += e.Time;
                time3 += e.Time;
                if (time3 > 0.5)
                {
                    time3 = 0;
                    double min = Math.Floor((endOffset - music.PositionAsMilli) / 60000);
                    double sec = Math.Floor((endOffset - music.PositionAsMilli) % 60000);
                    sec = Math.Floor(sec / 1000);
                    countDown.Text = min.ToString("0#") + ":" + sec.ToString("0#");
                }
            }
            if (time2 > 0.05 && !comboText.moving && comboMove)
            {
                comboMove = false;
                comboText.scale(new Size((int)(frame.LaneWidth[0] * 1.5), (int)(frame.LaneWidth[0] * 1.5)), 0.12);
                comboText.move(new Point(frame.Location.X + (int)frame.Width / 2 - (int)(GraphicalText.measureString(comboText.Text, (int)(frame.LaneWidth[0] * 1.5))) / 2, frame.Location.Y + 200), 0.12);
            }
            if (!running && !paused && !scores)
            {
                currentOffset += e.Time * 1000 * mods.Speed;
                if (time1 > chart.LeadInTime / mods.Speed)
                {
                    running = true;
                    unpause();
                    time1 = 0;
                }
            }
            if (failed)
            {
                pause();
                try
                {
                    if (running == true)
                    {
                        if (Config.Spectated)
                        {
                            PacketWriter.sendSpectateFail(Game.conn.Bw);
                        }
                        PacketWriter.sendSongStart(Game.conn.Bw, Account.currentAccount.AccountName, "", "", (short)2, 0, 0, 0);
                    }
                }
                catch
                {
                }
                running = false;
                scores = false;
                pauseScreen.Failed = true;
            }
            if (scores)
            {
                if (invert)
                {
                    invert = false;
                    foreach (Note n in chart.Notes)
                    {
                        if (Config.Mirror)
                        {
                            n.Location = 9 - n.Location;
                        }
                    }
                }
                music.Speed = 0.0f;
                scoreScreen.OnUpdateFrame(e);
                if (scoreScreen.Score == null)
                {
                    scoreScreen.Score = score;
                }
                scoreFadeTime += e.Time;
                if (scoreFadeTime > 0.025 && overlay.Colour.A < 1.0f)
                {
                    float newAlpha = overlay.Colour.A + 0.2f;
                    overlay.Colour = new Color4(overlay.Colour.R, overlay.Colour.G, overlay.Colour.B, newAlpha);
                    scoreFadeTime = 0;
                }
            }
            if (keyPress(Key.Escape))
            {
                if (buffering || specFailed)
                {
                    Game.setScreen(game.screens["selectScreen"]);
                    game.Title = "Pulse";
                    try
                    {
                        PacketWriter.sendSpectateCancel(Game.conn.Bw, Config.SpectatedUser);
                        Config.Spectating = false;
                        Config.SpectatedUser = "";
                        buffering = false;
                    }
                    catch
                    {

                    }
                }
                else if (!running && paused && !scores && !failed)
                {
                    unpause();
                    //time = 0;
                    //running = true;
                }
                else if (!running && !scores && !failed)
                {
                    pause();
                }
                else if (!scores && !failed)
                {
                    if (currentOffset > endOffset - 1510)
                    {
                        forceScores = true;
                    }
                    else
                    {
                        togglePause();
                    }
                }
                else if (playType == PlayType.PLAY && !scores && failed)
                {
                    foreach (Note n in Chart.Notes)
                    {
                        if (Config.Mirror)
                        {
                            n.Location = 9 - n.Location;
                        }
                    }
                    loadSong(CurrentSong, Difficulty, mods, null, playType);
                    onSwitched();
                }
            }
            for (int i = 0; i < 8; i++)
            {
                if (!holding[i])
                {
                    canHit[i] = true;
                }
            }
            if (!paused && running)
            {
                currentOffset = music.PositionAsMilli + Config.Offset + (-7 * (music.Speed / 10));
            }
            if (replay)
            {
                #region replay
                if (!paused)
                {
                    if (playType == PlayType.SPECTATE)
                    {
                        if (bufferOffset - currentOffset < bufferGap)
                        {
                            pause();
                            buffering = true;
                            bufferAmount += 250;
                        }
                    }
                    pulse = true;
                    foreach (TimingSection t in currentSong.TimingsList)
                    {
                        if (currentOffset > t.Offset)
                        {
                            if (sectionSnap != t.Snap)
                            {
                                sectionSnap = t.Snap;
                                glow.Bounds = new Rectangle(new Point((int)frame.Location.X, (int)frame.HitHeight - 43), new Size((int)frame.Width, 40));
                            }
                        }
                    }
                    foreach (var pair in currentReplay.PressTimings)
                    {
                        if (currentOffset > pair.key && !pair.value.value)
                        {
                            pair.value.value = true;
                            keys[pair.value.key] = true;
                            int temp = 0;
                            for (int x = 0; x < pair.value.key; x++)
                            {
                                temp += frame.LaneWidth[x];
                            }
                            lights[pair.value.key].fade(0.65f, 0.075);
                            lights[pair.value.key].move(new Point((int)frame.Location.X + (frame.LaneLoc[pair.value.key]) + (1 * pair.value.key) + 5, 96), 0.1);
                            lights[pair.value.key].scale(new Size(frame.LaneWidth[pair.value.key], (int)frame.HitHeight - 99), 0.1);
                            glows[pair.value.key].fade(0.65f, 0.075);
                            presses[pair.value.key].fade(1.0f, 0.05);
                        }
                    }
                    foreach (var pair in currentReplay.ReleaseTimings)
                    {
                        if (currentOffset > pair.key && !pair.value.value)
                        {
                            pair.value.value = true;
                            keys[pair.value.key] = false;
                            int temp = 0;
                            for (int x = 0; x < pair.value.key; x++)
                            {
                                temp += frame.LaneWidth[x];
                            }
                            lights[pair.value.key].fade(0.0f, 0.075);
                            lights[pair.value.key].move(new Point((int)frame.Location.X + (frame.LaneLoc[pair.value.key] + (1 * pair.value.key)) + 5 + 25, 596), 0.075);
                            lights[pair.value.key].scale(new Size(0, (int)frame.HitHeight - 599), 0.05);
                            glows[pair.value.key].fade(0.0f, 0.075);
                            presses[pair.value.key].fade(0.0f, 0.05);
                        }
                    }
                }
                else
                {
                    pulse = false;
                }
                if (playType != PlayType.TEST && (currentOffset > endOffset && !scores) || (music.PositionAsMilli == music.Length && !scores))
                {
                    scores = true;
                    if (playType == PlayType.SPECTATE)
                    {
                        this.score = finalScore;
                    }
                    try
                    {
                        PacketWriter.sendSongStart(Game.conn.Bw, Account.currentAccount.AccountName, "", "", (short)2, 0, 0, 0);
                    }
                    catch
                    {
                    }
                    scoreScreen = new ScoreScreen(game, "scores", currentReplay, currentSong, difficulty, false);
                    scoreScreen.OnLoad(null);
                    paused = false;
                    running = false;
                    SongInfo curr = SongLibrary.songInfos[CurrentSong.PncName];
                    String cstring = chart.Name;
                    score.chartName = chart.Name;
                    score.ArtistTitle = currentSong.Artist + " - " + currentSong.SongName;
                    score.dateString = DateTime.Now.ToString();
                    scoreScreen.Score = score;
                }
                if (!scores)
                {
                    foreach (ReplayHit r in currentReplay.HitTimings)
                    {
                        if (r.Used == false && currentOffset > r.NoteOffset - r.OffsetDifference)
                        {
                            Note temp = null;
                            bool hold = false;
                            foreach (Note n in chart.Notes)
                            {
                                if (n.Hold && n.HoldOffset + hitWindow < currentOffset)
                                {
                                    n.Enabled = false;
                                    n.setAlpha(0.0f);
                                    foreach (Animation a in holdBursts)
                                    {
                                        if (a.Bounds.X == ((int)frame.Location.X + (frame.LaneLoc[n.Location - 1]) + (1 * r.Lane)) + 5 - frame.LaneWidth[n.Location - 1] * 2)
                                        {
                                            a.Active = false;
                                            holdRem.Add(a);
                                        }
                                    }
                                }
                                else if (!n.Hold && n.Offset + hitWindow < currentOffset)
                                {
                                    n.Enabled = false;
                                    n.setAlpha(0.0f);
                                }
                                if (n.Offset == r.NoteOffset && n.Location == r.Lane + 1)
                                {
                                    temp = n;
                                    break;
                                }
                                else if (n.HoldOffset == r.NoteOffset && n.Location == r.Lane + 1)
                                {
                                    temp = n;
                                    hold = true;
                                    break;
                                }
                            }
                            r.Used = true;
                            if (r.Hit != Replay.HitType.MISS && r.Hit != Replay.HitType.HOLDMISS && temp != null)
                            {
                                score.Combo++;
                                //comboText.Location = new Point(frame.Location.X + (int)frame.Width / 2 - (int)(GraphicalText.measureString(comboText.Text, 50)) / 2, frame.Location.Y + 200);
                                comboText.move(new Point(frame.Location.X + (int)frame.Width / 2 - (int)(GraphicalText.measureString(comboText.Text, frame.LaneWidth[0] * 2)) / 2, frame.Location.Y + 185), 0.02);
                                comboText.scale(new Size(frame.LaneWidth[0] * 2, frame.LaneWidth[0] * 2), 0.02);
                                if (score.Combo > 2)
                                {
                                    comboText.Visible = true;
                                }
                                comboMove = true;
                                time2 = 0;
                                if (Config.HitVolume > 0)
                                {
                                    sfx = AudioManager.loadFromMemory(hitsound);//.loadFromFile(Skin.skindict["normal-hitnormal"],true);
                                    sfx.Volume = Config.HitVolume / 100f; //add separate hitsound config setting later?
                                    sfx.play(false);
                                }
                                temp.Texture.fade(0.0f, 0.05);
                                if (!temp.Hold)
                                {
                                    temp.Enabled = false;
                                }
                                else if (temp.Hold && hold)
                                {
                                    temp.Enabled = false;
                                    temp.Texture.fade(0.0f, 0.05);
                                    temp.Holdbar.fade(0.0f, 0.05);
                                    temp.HoldStart.fade(0.0f, 0.05);
                                    temp.HoldEnd.fade(0.0f, 0.05);
                                    foreach (Animation a in holdBursts)
                                    {
                                        if (a.Bounds.X == ((int)frame.Location.X + (frame.LaneLoc[temp.Location - 1]) + (1 * r.Lane)) + 5 - frame.LaneWidth[temp.Location - 1] * 2)
                                        {
                                            a.Active = false;
                                            holdRem.Add(a);
                                        }
                                    }
                                }
                                else if (temp.Hold)
                                {
                                    holdBursts.Add(new Animation(new Rectangle(((int)frame.Location.X + (frame.LaneLoc[temp.Location - 1]) + (1 * r.Lane)) + 5 - frame.LaneWidth[temp.Location - 1] * 2, (int)frame.HitHeight - 25 - frame.LaneWidth[temp.Location - 1] * 2, frame.LaneWidth[temp.Location - 1] + frame.LaneWidth[temp.Location - 1] * 4, frame.LaneWidth[temp.Location - 1] + frame.LaneWidth[temp.Location - 1] * 4), Skin.HoldFrameRate, "holdBurst", 3, true, Skin.MaskHolds));
                                }
                                if (r.Hit == Replay.HitType.PERFECT)
                                {
                                    adjustHp(2);
                                    burstAcc(3);
                                    score.TotalScore += (int)(scoreMod * ((score.Combo * 9) / 6.5) * 3);
                                    score.AccuracyTotal.Add(3);
                                }
                                else if (r.Hit == Replay.HitType.GREAT)
                                {
                                    adjustHp(1);
                                    burstAcc(2);
                                    score.TotalScore += (score.Combo * 45) / 6;
                                    score.AccuracyTotal.Add(3.5f);
                                }
                                else if (r.Hit == Replay.HitType.GOOD)
                                {
                                    adjustHp(1);
                                    burstAcc(2);
                                    score.TotalScore += (int)(scoreMod * ((score.Combo * 9) / 6.5) * 2);
                                    score.AccuracyTotal.Add(2);
                                }
                                else if (r.Hit == Replay.HitType.OK)
                                {
                                    adjustHp(-3);
                                    burstAcc(1);
                                    score.TotalScore += (int)(scoreMod * ((score.Combo * 9) / 6.5) * 1);
                                    score.AccuracyTotal.Add(1);
                                }
                                if (!hold)
                                {
                                    burst = new Animation(new Rectangle(((int)frame.Location.X + (frame.LaneLoc[temp.Location - 1]) + (1 * r.Lane)) + 5 - frame.LaneWidth[temp.Location - 1] * 2, (int)frame.HitHeight - 25 - frame.LaneWidth[temp.Location - 1] * 2, frame.LaneWidth[temp.Location - 1] + frame.LaneWidth[temp.Location - 1] * 4, frame.LaneWidth[temp.Location - 1] + frame.LaneWidth[temp.Location - 1] * 4), Skin.BurstFrameRate, "burst", Skin.BurstFrameCount, false, Skin.MaskBursts);
                                    bursts.Add(burst);
                                }
                            }
                            else if (temp != null)
                            {
                                temp.Enabled = false;
                                temp.Texture.fade(0.0f, 0.1);
                                if (temp.Hold)
                                {
                                    temp.Holdbar.fade(0.0f, 0.1);
                                    temp.HoldEnd.fade(0.0f, 0.1);
                                    temp.HoldStart.fade(0.0f, 0.1);
                                    foreach (Animation a in holdBursts)
                                    {
                                        if (a.Bounds.X == ((int)frame.Location.X + (frame.LaneLoc[temp.Location - 1]) + (1 * r.Lane)) + 5 - frame.LaneWidth[temp.Location - 1] * 2)
                                        {
                                            a.Active = false;
                                            holdRem.Add(a);
                                        }
                                    }
                                }
                                burstAcc(0);
                                if (r.Hit == Replay.HitType.HOLDMISS)
                                {
                                    adjustHp(-24);
                                }
                                else
                                {
                                    adjustHp(-12);
                                }
                                miss();
                            }
                            //comboText.Location = new Point(frame.Location.X + (int)frame.Width / 2 - (int)(GraphicalText.measureString(comboText.Text, comboText.CharWidth)) / 2, frame.Location.Y + 200);
                        }
                    }
                    foreach (Note n in chart.Notes)
                    {
                        if (n.Offset - currentOffset > 20000)
                            break;
                        if (n.Texture.Colour.A <= 0 && running && n.Holdbar.Colour.A <= 0)
                        {
                            n.Visible = false;
                        }
                        if (n.Offset - currentOffset < n.MoveTime && n.Visible)
                        {
                            moveRate = (double)(int)frame.HitHeight / n.MoveTime;
                            double temp = n.Offset - currentOffset;
                            double moved = (n.MoveTime - temp) * moveRate;
                            n.Vertical = moved;
                            if (n.Hold)
                            {
                                temp = n.HoldOffset - currentOffset;
                                moved = (n.MoveTime - temp) * moveRate;
                                n.HoldVertical = moved;
                            }
                            if (((Mods.Flags & 8) == 8) && n.Offset - currentOffset < n.MoveTime - (n.MoveTime / 3))
                            {
                                if (!n.Texture.Fading)
                                {
                                    n.Texture.fade(0.0f, 0.2 / (mods.Scroll > 5 ? mods.Scroll / 10 : mods.Scroll));
                                }
                                if (n.Hold && n.HoldOffset - currentOffset < n.MoveTime - (n.MoveTime / 3) && !n.Holdbar.Fading)
                                {
                                    n.Holdbar.fade(0.0f, 0.2);
                                    n.HoldEnd.fade(0.0f, 0.2);
                                    n.HoldStart.fade(0.0f, 0.2);
                                    foreach (Animation a in holdBursts)
                                    {
                                        if (a.Bounds.X == ((int)frame.Location.X + (frame.LaneLoc[n.Location - 1]) + (1 * n.Location - 1)) + 5 - frame.LaneWidth[n.Location - 1] * 2)
                                        {
                                            a.Active = false;
                                            holdRem.Add(a);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {

                }
                #endregion
            }
            else if (!replay)
            {
                if (Config.Spectated && heartbeatTime > 1 && !paused && !scores)
                {
                    try
                    {
                        PacketWriter.sendSpectateHeartbeat(Game.conn.Bw, (int)currentOffset, score.TotalScore, score.Combo, hp, score.Accuracy);
                        heartbeatTime = 0;
                    }
                    catch
                    {
                    }
                }
                #region play
                if (!paused)
                {
                    pulse = true;
                    foreach (TimingSection t in currentSong.TimingsList)
                    {
                        if (currentOffset > t.Offset)
                        {
                            if (sectionSnap != t.Snap)
                            {
                                sectionSnap = t.Snap;
                                glow.Bounds = new Rectangle(new Point((int)frame.Location.X + 5, (int)frame.HitHeight - 43), new Size((int)frame.Width - 3, 40));
                            }
                        }
                    }
                    if (recordingReplay)
                    {
                        for (int x = 0; x < chart.Keys; x++)
                        {
                            if (newKeyState.Contains(Config.keys[keygroup][x]) && !oldKeyState.Contains(Config.keys[keygroup][x]))
                            {
                                currentReplay.PressTimings.Add(new Pair<int, Pair<int, bool>>((int)currentOffset - 8, new Pair<int, bool>(x, false)));
                                if (Config.Spectated)
                                {
                                    PacketWriter.sendSpectatePress(Game.conn.Bw, (int)currentOffset, x);
                                }
                            }
                            else if (!newKeyState.Contains(Config.keys[keygroup][x]) && oldKeyState.Contains(Config.keys[keygroup][x]))
                            {
                                currentReplay.ReleaseTimings.Add(new Pair<int, Pair<int, bool>>((int)currentOffset - 8, new Pair<int, bool>(x, false)));
                                if (Config.Spectated)
                                {
                                    PacketWriter.sendSpectateRelease(Game.conn.Bw, (int)currentOffset, x);
                                }
                            }
                            if (newKeyState.Contains(Config.keys[keygroup][x]))
                            {
                                keys[x] = true;
                                if (lights[x].Colour.A == 0.0f && !lights[x].Fading)
                                {
                                    lights[x].fade(0.65f, 0.075);
                                    lights[x].move(new Point(((frame.Location.X) + frame.LaneLoc[x]) + (1 * x) + 5, 96), 0.1);
                                    lights[x].scale(new Size(frame.LaneWidth[x], (int)frame.HitHeight - 99), 0.1);
                                    glows[x].fade(0.65f, 0.075);
                                }
                                if (!presses[x].Fading && presses[x].Colour.A == 0.0f)
                                {
                                    presses[x].fade(1.0f, 0.05);
                                }
                            }
                            else
                            {
                                keys[x] = false;
                                if (!lights[x].Fading && lights[x].Colour.A > 0.0f)
                                {
                                    lights[x].fade(0.0f, 0.075);
                                    lights[x].move(new Point(((frame.Location.X) + frame.LaneLoc[x]) + (1 * x) + 5 + 25, 596), 0.075);
                                    lights[x].scale(new Size(0, (int)frame.HitHeight - 599), 0.05);
                                    glows[x].fade(0.0f, 0.075);
                                }
                                if (!presses[x].Fading && presses[x].Colour.A > 0.0f)
                                {
                                    presses[x].fade(0.0f, 0.05);
                                }
                            }
                        }
                    }
                }
                else
                {
                    pulse = false;
                }
                if ((playType == PlayType.PLAY && !scores && (currentOffset > endOffset || music.PositionAsMilli == music.Length)) || forceScores)
                {
                    scores = true;
                    try
                    {
                        PacketWriter.sendSongStart(Game.conn.Bw, Account.currentAccount.AccountName, "", "", (short)2, 0, 0, 0);
                    }
                    catch
                    {
                    }
                    paused = false;
                    running = false;
                    if (notAdded)
                    {
                        try
                        {
                            if (Config.Spectated)
                            {
                                PacketWriter.sendSpectateFinish(Game.conn.Bw, score.TotalScore, score.MaxCombo, score.Perfects, score.Goods, score.Oks, score.Misses, (int)mods.Flags, (double)score.Accuracy);
                            }
                        }
                        catch { }
                        if (!calibrate)
                        {
                            SongInfo curr = SongLibrary.songInfos[CurrentSong.PncName];
                            String cstring = chart.Name;
                            score.chartName = chart.Name;
                            score.ArtistTitle = currentSong.Artist + " - " + currentSong.SongName;
                            score.dateString = DateTime.Now.ToString();
                            try
                            {
                                if (CurrentSong.FileVersion == 1)
                                {
                                    string fileName = ScoreLibrary.getFileFromDiff(curr, cstring);
                                    string hash = Utils.calcHash(fileName);
                                    string sName = "replay\\" + hash + ".psf";
                                    string rName;
                                    XmlDocument rep = new XmlDocument();
                                    XmlDeclaration d = rep.CreateXmlDeclaration("1.0", null, "yes");
                                    rep.AppendChild(d);
                                    XmlElement r = rep.CreateElement("replay");
                                    r.SetAttribute("Version", "1");
                                    XmlElement m = rep.CreateElement("m");
                                    XmlElement scr = rep.CreateElement("c");
                                    scr.InnerText = "" + Convert.ToDouble(mods.Scroll, Config.cultureEnglish);
                                    m.AppendChild(scr);
                                    XmlElement speed = rep.CreateElement("s");
                                    speed.InnerText = "" + mods.Speed;
                                    m.AppendChild(speed);
                                    XmlElement flags = rep.CreateElement("f");
                                    flags.InnerText = "" + mods.Flags;
                                    m.AppendChild(flags);
                                    r.AppendChild(m);
                                    foreach (ReplayHit h in currentReplay.HitTimings)
                                    {
                                        XmlElement t = rep.CreateElement("h");
                                        XmlElement hit = rep.CreateElement("t");
                                        hit.InnerText = "" + (int)h.Hit;
                                        t.AppendChild(hit);
                                        XmlElement lane = rep.CreateElement("l");
                                        lane.InnerText = "" + h.Lane;
                                        t.AppendChild(lane);
                                        XmlElement o = rep.CreateElement("o");
                                        o.InnerText = "" + h.NoteOffset;
                                        t.AppendChild(o);
                                        XmlElement di = rep.CreateElement("d");
                                        di.InnerText = "" + h.OffsetDifference;
                                        t.AppendChild(di);
                                        r.AppendChild(t);
                                    }
                                    foreach (Pair<int, Pair<int, bool>> h in currentReplay.PressTimings)
                                    {
                                        XmlElement p = rep.CreateElement("p");
                                        XmlElement o = rep.CreateElement("o");
                                        o.InnerText = "" + h.key;
                                        p.AppendChild(o);
                                        XmlElement l = rep.CreateElement("l");
                                        l.InnerText = "" + h.value.key;
                                        p.AppendChild(l);
                                        r.AppendChild(p);
                                    }
                                    foreach (Pair<int, Pair<int, bool>> h in currentReplay.ReleaseTimings)
                                    {
                                        XmlElement p = rep.CreateElement("r");
                                        XmlElement o = rep.CreateElement("o");
                                        o.InnerText = "" + h.key;
                                        p.AppendChild(o);
                                        XmlElement l = rep.CreateElement("l");
                                        l.InnerText = "" + h.value.key;
                                        p.AppendChild(l);
                                        r.AppendChild(p);
                                    }
                                    rep.AppendChild(r);
                                    if (File.Exists(sName))
                                    {
                                        Console.WriteLine("1237");
                                        rName = "replay\\r\\" + Config.UnixTime() + " " + hash + ".pcr";
                                        if (!Directory.Exists("replay\\r"))
                                        {
                                            Directory.CreateDirectory("replay\\r");
                                        }
                                        rep.Save(rName);
                                        score.ReplayName = Config.UnixTime() + " " + hash;
                                        List<Score> reconstructed = ScoreLibrary.reconstruct(sName);
                                        if (reconstructed.Count < 8)
                                        {
                                            reconstructed.Add(score);
                                            ScoreLibrary.serializeScores(reconstructed, sName);
                                        }
                                        else
                                        {
                                            Comparison<Score> scoreCompare = new Comparison<Score>(ScoreLibrary.CompareScores);
                                            reconstructed.Sort(scoreCompare);
                                            if (reconstructed[reconstructed.Count - 1].TotalScore < score.TotalScore)
                                            {
                                                File.Delete("replay\\r\\" + reconstructed[reconstructed.Count - 1].ReplayName);
                                                reconstructed.RemoveAt(reconstructed.Count - 1);
                                                reconstructed.Add(score);
                                                ScoreLibrary.serializeScores(reconstructed, sName);
                                            }
                                        }
                                    }
                                    else
                                    {
                                        List<Score> newL = new List<Score>();
                                        newL.Add(score);
                                        ScoreLibrary.serializeScores(newL, sName);
                                        rName = "replay\\r\\" + Config.UnixTime() + " " + hash + ".pcr";
                                        Directory.CreateDirectory("replay\\r");
                                        rep.Save(rName);
                                        score.ReplayName = Config.UnixTime() + " " + hash;
                                        newL = new List<Score>();
                                        newL.Add(score);
                                        ScoreLibrary.serializeScores(newL, sName);
                                    }
                                    if (Account.currentAccount != null)
                                    {
                                        NameValueCollection nvc = new NameValueCollection();
                                        nvc.Add("u", Account.currentAccount.AccountName);
                                        nvc.Add("p", Account.currentAccount.passHash);
                                        nvc.Add("c", hash);
                                        XmlDocument doc = new XmlDocument();
                                        XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", null, "yes");
                                        doc.AppendChild(dec);
                                        XmlElement root = doc.CreateElement("score");
                                        root.SetAttribute("Version", "1");
                                        XmlElement oks = doc.CreateElement("oks");
                                        oks.InnerText = score.Oks.ToString();
                                        root.AppendChild(oks);
                                        XmlElement perfects = doc.CreateElement("perfects");
                                        perfects.InnerText = score.Perfects.ToString();
                                        root.AppendChild(perfects);
                                        XmlElement goods = doc.CreateElement("goods");
                                        goods.InnerText = score.Goods.ToString();
                                        root.AppendChild(goods);
                                        XmlElement misses = doc.CreateElement("misses");
                                        misses.InnerText = score.Misses.ToString();
                                        root.AppendChild(misses);
                                        XmlElement maxC = doc.CreateElement("maxc");
                                        maxC.InnerText = score.MaxCombo.ToString();
                                        root.AppendChild(maxC);
                                        XmlElement totalScore = doc.CreateElement("totalscore");
                                        totalScore.InnerText = score.TotalScore.ToString();
                                        root.AppendChild(totalScore);
                                        XmlElement acc = doc.CreateElement("acc");
                                        acc.InnerText = score.Accuracy.ToString(Config.cultureEnglish);
                                        root.AppendChild(acc);
                                        XmlElement flag = doc.CreateElement("flags");
                                        flag.InnerText = "" + score.Flags;
                                        root.AppendChild(flag);
                                        doc.AppendChild(root);
                                        doc.Save("tmp.xml");
                                        UploadClass uc = new UploadClass();
                                        uc.uploadDone += new Action<string, int>(uc_uploadDone);
                                        try
                                        {
                                            uc.HttpUploadFileAsync("http://p.ulse.net/scoresubmit", nvc, rName, "replay", "text/xml", "tmp.xml", "score", "text/xml");
                                        }
                                        catch (Exception ex)
                                        {
                                            Console.WriteLine(ex.Message);
                                        }
                                    }
                                }
                            }
                            catch (Exception ex) { Console.WriteLine("Score submit failed: " + ex.Message); }
                        }
                        notAdded = false;
                        scoreScreen = new ScoreScreen(game, "scores", currentReplay, currentSong, difficulty, true);
                        scoreScreen.OnLoad(null);
                    }
                }
                if (!scores)
                {
                    foreach (Note n in chart.Notes)
                    {
                        if (n.Offset - currentOffset > 20000)
                            break;
                        if (n.Texture.Colour.A <= 0 && running && n.Offset - currentOffset > -hitWindow && n.Holdbar.Colour.A <= 0 && !holding[n.Location - 1])
                        {
                            n.Visible = false;
                        }
                        if (n.Offset - currentOffset < n.MoveTime && n.Visible && n.Enabled)
                        {
                            moveRate = (double)(int)frame.HitHeight / n.MoveTime;
                            double temp = n.Offset - currentOffset;
                            double moved = (n.MoveTime - temp) * moveRate;
                            n.Vertical = moved;
                            if (n.Hold)
                            {
                                temp = n.HoldOffset - currentOffset;
                                moved = (n.MoveTime - temp) * moveRate;
                                n.HoldVertical = moved;
                            }
                            if (((Mods.Flags & 8) == 8) && n.Offset - currentOffset < n.MoveTime - (n.MoveTime / 3))
                            {
                                if (!n.Texture.Fading)
                                {
                                    n.Texture.fade(0.0f, 0.2 / (mods.Scroll > 5 ? mods.Scroll / 10 : mods.Scroll));
                                }
                                if (n.Hold && n.HoldOffset - currentOffset < n.MoveTime - (n.MoveTime / 3) && !n.Holdbar.Fading)
                                {
                                    n.Holdbar.fade(0.0f, 0.2);
                                    n.HoldEnd.fade(0.0f, 0.2);
                                    n.HoldStart.fade(0.0f, 0.2);
                                }
                            }
                        }
                        if (n.Enabled)
                        {
                            bool added = false;
                            if ((n.Offset - currentOffset < n.MoveTime && n.Offset - currentOffset > -hitWindow) || holding[n.Location - 1])
                            {
                                if (!Music.Paused)
                                {
                                    if (canHit[n.Location - 1])
                                    {
                                        if (keys[n.Location - 1] && !prevKey[n.Location - 1])
                                        {
                                            if (n.Offset - currentOffset < hitWindow && n.Offset - currentOffset > -hitWindow)
                                            {
                                                if (calibrate)
                                                {
                                                    offsets.Add((int)currentOffset - (int)n.Offset);
                                                    offsetLabel.Text = "Average mistime: " + Math.Round(offsets.Average(), 3);
                                                }
                                                comboText.move(new Point(frame.Location.X + (int)frame.Width / 2 - (int)(GraphicalText.measureString(comboText.Text, frame.LaneWidth[0] * 2)) / 2, frame.Location.Y + 185), 0.02);
                                                comboText.scale(new Size(frame.LaneWidth[0] * 2, frame.LaneWidth[0] * 2), 0.02);
                                                comboMove = true;
                                                canHit[n.Location - 1] = false;
                                                if (Config.HitVolume > 0 && hitsound != null)
                                                {
                                                    sfx = AudioManager.loadFromMemory(hitsound);//.loadFromFile(Skin.skindict["normal-hitnormal"],true);
                                                    sfx.Volume = Config.HitVolume / 100f; //add separate hitsound config setting later?
                                                    sfx.play(false);
                                                }
                                                if (!added)
                                                {
                                                    Replay.HitType hit = Replay.HitType.MISS;
                                                    added = true;

                                                    score.Combo++;
                                                    if (n.Offset - currentOffset < (hitWindow - ((hitWindow / 100) * 70)) && n.Offset - currentOffset > -(hitWindow - ((hitWindow / 100) * 70)))
                                                    {
                                                        adjustHp(2);
                                                        burstAcc(3);
                                                        score.TotalScore += (int)(scoreMod * ((score.Combo * 9) / 6.5) * 3);
                                                        score.AccuracyTotal.Add(3);
                                                        hit = Replay.HitType.PERFECT;
                                                    }
                                                    else if (n.Offset - currentOffset < (hitWindow - ((hitWindow / 100) * 40)) && n.Offset - currentOffset > -(hitWindow - ((hitWindow / 100) * 40)))
                                                    {
                                                        adjustHp(1);
                                                        burstAcc(2);
                                                        score.TotalScore += (int)(scoreMod * ((score.Combo * 9) / 6.5) * 2);
                                                        score.AccuracyTotal.Add(2);
                                                        hit = Replay.HitType.GOOD;
                                                    }
                                                    else if (n.Offset - currentOffset < (hitWindow - ((hitWindow / 100) * 10)) && n.Offset - currentOffset > -(hitWindow - ((hitWindow / 100) * 10)))
                                                    {
                                                        adjustHp(-3);
                                                        burstAcc(1);
                                                        score.TotalScore += (int)(scoreMod * ((score.Combo * 9) / 6.5) * 1);
                                                        score.AccuracyTotal.Add(1f);
                                                        hit = Replay.HitType.OK;
                                                    }
                                                    if (hit != Replay.HitType.MISS)
                                                    {
                                                        currentReplay.HitTimings.Add(new ReplayHit((int)n.Offset, (int)n.Offset - (int)currentOffset, n.Location - 1, hit));
                                                        if (Config.Spectated)
                                                        {
                                                            PacketWriter.sendSpectateHit(Game.conn.Bw, (int)n.Offset, (int)(n.Offset - currentOffset), n.Location - 1, (int)hit);
                                                        }
                                                        burst = new Animation(new Rectangle(((int)frame.Location.X + (frame.LaneLoc[n.Location - 1]) + (1 * n.Location - 1)) + 5 - frame.LaneWidth[n.Location - 1] * 2, (int)frame.HitHeight - 25 - frame.LaneWidth[n.Location - 1] * 2, frame.LaneWidth[n.Location - 1] + frame.LaneWidth[n.Location - 1] * 4, frame.LaneWidth[n.Location - 1] + frame.LaneWidth[n.Location - 1] * 4), Skin.BurstFrameRate, "burst", Skin.BurstFrameCount, false, Skin.MaskBursts);
                                                        bursts.Add(burst);
                                                    }
                                                }
                                                if (!n.Hold)
                                                {
                                                    n.Enabled = false;
                                                    n.Texture.fade(0.0f, 0.05);
                                                }
                                                else
                                                {
                                                    holding[n.Location - 1] = true;
                                                    n.Texture.fade(0.0f, 0.05);
                                                    holdBursts.Add(new Animation(new Rectangle(((int)frame.Location.X + (frame.LaneLoc[n.Location - 1]) + (1 * n.Location)) + 5 - frame.LaneWidth[n.Location - 1] * 2, (int)frame.HitHeight - 25 - frame.LaneWidth[n.Location - 1] * 2,
                                                        frame.LaneWidth[n.Location - 1] + frame.LaneWidth[n.Location - 1] * 4, frame.LaneWidth[n.Location - 1] + frame.LaneWidth[n.Location - 1] * 4), Skin.HoldFrameRate, "holdBurst", 3, true, Skin.MaskHolds));
                                                }
                                            }
                                            else if (n.Offset - currentOffset < ((double)hitWindow * 1.1) && n.Offset - currentOffset > (double)(hitWindow * 0.9))
                                            {
                                                n.Enabled = false;
                                                n.Texture.fade(0.0f, 0.1);
                                                if (n.Hold)
                                                {
                                                    n.Holdbar.fade(0.0f, 0.1);
                                                    n.HoldEnd.fade(0.0f, 0.1);
                                                    n.HoldStart.fade(0.0f, 0.1);
                                                }
                                                burstAcc(0);
                                                if (!added)
                                                {
                                                    if (!n.Hold)
                                                    {
                                                        currentReplay.HitTimings.Add(new ReplayHit((int)n.Offset, (int)n.Offset - (int)currentOffset, n.Location - 1, Replay.HitType.MISS));
                                                        if (Config.Spectated)
                                                        {
                                                            PacketWriter.sendSpectateHit(Game.conn.Bw, (int)n.Offset, (int)(n.Offset - currentOffset), n.Location - 1, (int)Replay.HitType.MISS);
                                                        }
                                                        adjustHp(-12);
                                                    }
                                                    else
                                                    {
                                                        currentReplay.HitTimings.Add(new ReplayHit((int)n.Offset, (int)n.Offset - (int)currentOffset, n.Location - 1, Replay.HitType.HOLDMISS));
                                                        if (Config.Spectated)
                                                        {
                                                            PacketWriter.sendSpectateHit(Game.conn.Bw, (int)n.Offset, (int)(n.Offset - currentOffset), n.Location - 1, (int)Replay.HitType.HOLDMISS);
                                                        }
                                                        adjustHp(-24);
                                                    }
                                                    miss();
                                                    added = true;
                                                }
                                            }
                                            //Console.WriteLine("Current: " + currentOffset + ", Note: " + n.Offset + ", Diff: " + (currentOffset - n.Offset));
                                            comboText.Location = new Point(frame.Location.X + (int)frame.Width / 2 - (int)(GraphicalText.measureString(comboText.Text, frame.LaneWidth[0])) / 2, frame.Location.Y + 200);
                                            if (score.Combo > 2)
                                            {
                                                comboText.Visible = true;
                                            }
                                        }
                                    }
                                    else if (!canHit[n.Location - 1] && n.Hold && holding[n.Location - 1])
                                    {
                                        //display hold success texture/effect when implemented
                                        if (!keys[n.Location - 1] && prevKey[n.Location - 1])
                                        {
                                            foreach (Animation a in holdBursts)
                                            {
                                                if (a.Bounds.X == ((int)frame.Location.X + (frame.LaneLoc[n.Location - 1]) + (1 * n.Location)) + 5 - frame.LaneWidth[n.Location - 1] * 2)
                                                {
                                                    a.Active = false;
                                                    holdRem.Add(a);
                                                }
                                            }
                                            if (n.HoldOffset - currentOffset < hitWindow * 2 && n.HoldOffset - currentOffset > -hitWindow * 2)
                                            {
                                                comboText.move(new Point(frame.Location.X + (int)frame.Width / 2 - (int)(GraphicalText.measureString(comboText.Text, frame.LaneWidth[0] * 2)) / 2, frame.Location.Y + 185), 0.03);
                                                comboText.scale(new Size(frame.LaneWidth[0] * 2, frame.LaneWidth[0] * 2), 0.03);
                                                comboMove = true;
                                                if (Config.HoldHitsounds && Config.HitVolume > 0 && hitsound != null)
                                                {
                                                    sfx = AudioManager.loadFromMemory(hitsound);//.loadFromFile(Skin.skindict["normal-hitnormal"],true);
                                                    sfx.Volume = Config.HitVolume / 100f; //add separate hitsound config setting later?
                                                    sfx.play(false);
                                                }
                                                if (!added)
                                                {
                                                    Replay.HitType hit = Replay.HitType.MISS;
                                                    if (n.HoldOffset - currentOffset < (hitWindow - ((hitWindow / 100) * 70)) * 2 && n.HoldOffset - currentOffset > -(hitWindow - ((hitWindow / 100) * 70)) * 2)
                                                    {
                                                        adjustHp(2);
                                                        burstAcc(3);
                                                        score.TotalScore += (int)(scoreMod * ((score.Combo * 9) / 6.5) * 3);
                                                        score.AccuracyTotal.Add(3);
                                                        hit = Replay.HitType.PERFECT;
                                                    }
                                                    else if (n.HoldOffset - currentOffset < (hitWindow - ((hitWindow / 100) * 40)) * 2 && n.HoldOffset - currentOffset > -(hitWindow - ((hitWindow / 100) * 40)) * 2)
                                                    {
                                                        adjustHp(1);
                                                        burstAcc(2);
                                                        score.TotalScore += (int)(scoreMod * ((score.Combo * 9) / 6.5) * 2);
                                                        score.AccuracyTotal.Add(2);
                                                        hit = Replay.HitType.GOOD;
                                                    }
                                                    else if (n.HoldOffset - currentOffset < (hitWindow - ((hitWindow / 100) * 10)) * 2 && n.HoldOffset - currentOffset > -(hitWindow - ((hitWindow / 100) * 10)) * 2)
                                                    {
                                                        adjustHp(-3);
                                                        burstAcc(1);
                                                        score.TotalScore += (int)(scoreMod * ((score.Combo * 9) / 6.5) * 3);
                                                        score.AccuracyTotal.Add(1);
                                                        hit = Replay.HitType.OK;
                                                    }
                                                    if (hit != Replay.HitType.MISS)
                                                    {
                                                        currentReplay.HitTimings.Add(new ReplayHit((int)n.HoldOffset, (int)n.HoldOffset - (int)currentOffset, n.Location - 1, hit));
                                                        if (Config.Spectated)
                                                        {
                                                            PacketWriter.sendSpectateHit(Game.conn.Bw, (int)n.HoldOffset, (int)(n.HoldOffset - currentOffset), n.Location - 1, (int)hit);
                                                        }
                                                        score.Combo++;
                                                        added = true;
                                                        if (score.Combo > 2)
                                                        {
                                                            comboText.Visible = true;
                                                        }
                                                    }
                                                }
                                                n.Enabled = false;
                                                n.Texture.fade(0.0f, 0.05);
                                                n.Holdbar.fade(0.0f, 0.05);
                                                n.HoldStart.fade(0.0f, 0.05);
                                                n.HoldEnd.fade(0.0f, 0.05);
                                                holding[n.Location - 1] = false;
                                            }
                                            else if (n.Offset - currentOffset < 0)
                                            {
                                                burstAcc(0);
                                                adjustHp(-12);
                                                currentReplay.HitTimings.Add(new ReplayHit((int)n.Offset, (int)n.Offset - (int)currentOffset, n.Location - 1, Replay.HitType.MISS));
                                                if (Config.Spectated)
                                                {
                                                    PacketWriter.sendSpectateHit(Game.conn.Bw, (int)n.Offset, (int)(n.Offset - currentOffset), n.Location - 1, (int)Replay.HitType.MISS);
                                                }
                                                if (!added)
                                                {
                                                    miss();
                                                }
                                                n.Enabled = false;
                                                n.Texture.fade(0.0f, 0.1);
                                                n.Holdbar.fade(0.0f, 0.1);
                                                n.HoldEnd.fade(0.0f, 0.1);
                                                n.HoldStart.fade(0.0f, 0.1);
                                                holding[n.Location - 1] = false;
                                            }
                                            comboText.Location = new Point(frame.Location.X + (int)frame.Width / 2 - (int)(GraphicalText.measureString(comboText.Text, frame.LaneWidth[0])) / 2, frame.Location.Y + 200);
                                        }
                                        else if (n.HoldOffset - currentOffset < -hitWindow * 2)
                                        {
                                            foreach (Animation a in holdBursts)
                                            {
                                                if (a.Bounds.X == ((int)frame.Location.X + (frame.LaneLoc[n.Location - 1]) + (1 * n.Location)) + 5 - frame.LaneWidth[n.Location - 1] * 2)
                                                {
                                                    a.Active = false;
                                                    holdRem.Add(a);
                                                }
                                            }
                                            burstAcc(0);
                                            adjustHp(-12);
                                            currentReplay.HitTimings.Add(new ReplayHit((int)n.HoldOffset, (int)n.HoldOffset - (int)currentOffset, n.Location - 1, Replay.HitType.MISS));
                                            if (Config.Spectated)
                                            {
                                                PacketWriter.sendSpectateHit(Game.conn.Bw, (int)n.HoldOffset, (int)(n.HoldOffset - currentOffset), n.Location - 1, (int)Replay.HitType.MISS);
                                            }
                                            if (!added)
                                            {
                                                added = true;
                                                miss();
                                            }
                                            n.Enabled = false;
                                            n.Texture.fade(0.0f, 0.1);
                                            n.Holdbar.fade(0.0f, 0.1);
                                            n.HoldEnd.fade(0.0f, 0.1);
                                            n.HoldStart.fade(0.0f, 0.1);
                                            holding[n.Location - 1] = false;
                                            comboText.Location = new Point(frame.Location.X + (int)frame.Width / 2 - (int)(GraphicalText.measureString(comboText.Text, frame.LaneWidth[0])) / 2, frame.Location.Y + 200);
                                        }
                                    }
                                    if (n.Enabled && n.Offset - currentOffset < -hitWindow && !holding[n.Location - 1])
                                    {
                                        burstAcc(0);
                                        adjustHp(-12);
                                        currentReplay.HitTimings.Add(new ReplayHit((int)n.HoldOffset, (int)n.HoldOffset - (int)currentOffset, n.Location - 1, Replay.HitType.MISS));
                                        if (Config.Spectated)
                                        {
                                            PacketWriter.sendSpectateHit(Game.conn.Bw, (int)n.HoldOffset, (int)(n.HoldOffset - currentOffset), n.Location - 1, (int)Replay.HitType.MISS);
                                        }
                                        if (!added)
                                        {
                                            added = true;
                                            miss();
                                        }
                                        n.Enabled = false;
                                        n.Texture.fade(0.0f, 0.1);
                                        if (n.Hold)
                                        {
                                            n.Holdbar.fade(0.0f, 0.1);
                                            n.HoldEnd.fade(0.0f, 0.1);
                                            n.HoldStart.fade(0.0f, 0.1);
                                        }
                                        comboText.Location = new Point(frame.Location.X + (int)frame.Width / 2 - (int)(GraphicalText.measureString(comboText.Text, frame.LaneWidth[0])) / 2, frame.Location.Y + 200);
                                    }
                                }
                            }
                            else if ((n.Offset - currentOffset) < -hitWindow)
                            {
                                n.Enabled = false;
                                n.Texture.fade(0.0f, 0.1);
                                if (n.Hold)
                                {
                                    n.Holdbar.fade(0.0f, 0.1);
                                    n.HoldEnd.fade(0.0f, 0.1);
                                    n.HoldStart.fade(0.0f, 0.1);
                                    adjustHp(-24);
                                    currentReplay.HitTimings.Add(new ReplayHit((int)n.Offset, (int)n.Offset - (int)currentOffset, n.Location - 1, Replay.HitType.HOLDMISS));
                                    if (Config.Spectated)
                                    {
                                        PacketWriter.sendSpectateHit(Game.conn.Bw, (int)n.Offset, (int)(n.Offset - currentOffset), n.Location - 1, (int)Replay.HitType.HOLDMISS);
                                    }
                                }
                                else
                                {
                                    adjustHp(-12);
                                    currentReplay.HitTimings.Add(new ReplayHit((int)n.Offset, (int)n.Offset - (int)currentOffset, n.Location - 1, Replay.HitType.MISS));
                                    if (Config.Spectated)
                                    {
                                        PacketWriter.sendSpectateHit(Game.conn.Bw, (int)n.Offset, (int)(n.Offset - currentOffset), n.Location - 1, (int)Replay.HitType.MISS);
                                    }
                                }
                                burstAcc(0);
                                if (!added)
                                {
                                    added = true;
                                    miss();
                                }
                                comboText.Location = new Point(frame.Location.X + (int)frame.Width / 2 - (int)(GraphicalText.measureString(comboText.Text, frame.LaneWidth[0])) / 2, frame.Location.Y + 200);
                            }
                        }
                    }
                }
                else
                {

                }
                #endregion
            }
            for (int x = 0; x < keys.Length; x++)
            {
                prevKey[x] = keys[x];
            }
            if (paused)
            {
                if (!buffering && !specFailed)
                {
                    pauseScreen.OnUpdateFrame(e);
                }
            }
            if (scoreLabel.Text != score.TotalScore.ToString("D9"))
            {
                scoreLabel.Text = score.TotalScore.ToString("D9");
            }
            if (comboText.Text != score.Combo + "x")
            {
                comboText.Text = score.Combo + "x";
            }
            if (score.Accuracy > 0)
            {
                if (accuracyLabel.Text != "" + String.Format("{0:0.00}%", score.Accuracy))
                {
                    accuracyLabel.Text = "" + String.Format("{0:0.00}%", score.Accuracy);
                }
            }
            else
            {
                accuracyLabel.Text = "";
            }
            for (int z = accRem.Count - 1; z > -1; z--)
            {
                bursts.Remove(accRem[z]);
                accRem.Remove(accRem[z]);
            }
            for (int z = holdRem.Count - 1; z > -1; z--)
            {
                holdBursts.Remove(holdRem[z]);
                holdRem.Remove(holdRem[z]);
            }
            for (int z = hitTimingsToAdd.Count - 1; z > -1; z--)
            {
                currentReplay.HitTimings.Add(hitTimingsToAdd[z]);
                hitTimingsToAdd.RemoveAt(z);
            }
            for (int z = pressTimingsToAdd.Count - 1; z > -1; z--)
            {
                currentReplay.PressTimings.Add(pressTimingsToAdd[z]);
                pressTimingsToAdd.RemoveAt(z);
            }
            for (int z = releaseTimingsToAdd.Count - 1; z > -1; z--)
            {
                currentReplay.ReleaseTimings.Add(releaseTimingsToAdd[z]);
                releaseTimingsToAdd.RemoveAt(z);
            }
        }