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 }
public static void dispose(AudioFX fx) { Bass.BASS_StreamFree(fx.handle); Loaded.Remove(fx.path); }
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 }
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); } }
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"); } }
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); } }