public HitCircleMania(HitObjectManager hom, int column, int startTime, HitObjectSoundType soundType) : base(hom) { LogicalColumn = column; column = ((HitObjectManagerMania)hom).GetPhysicalColumn(column); Column = hom.ManiaStage.Columns[column]; Position = new Vector2(Column.Left - Column.Host.Left + Column.Width / 2, -100); BasePosition = Position; StartTime = startTime; EndTime = startTime; SoundType = soundType; if (!hom.ManiaStage.Minimal) { s_note = new pAnimation(LoadCustomImages(@"NoteImage" + column.ToString(), Column.NoteString), Fields.TopLeft, hom.ManiaStage.FlipOrigin(Origins.BottomCentre), Clocks.Audio, Position, 0.8f, false, Color.White); s_note.Alpha = 1; s_note.FlipVertical = hom.ManiaStage.Skin.GetNoteFlipVertical(column); ScaleAdjust(s_note); SpriteCollection.Add(s_note); } }
internal override void UpdateHitObjects() { //notes hit here. bool[] hitted = new bool[ManiaStage.Columns.Count];//some notes have already hitted in that column Player.IsSliding = false; foreach (HitObject h in hitObjectsMinimal) { HitCircleMania curr = (HitCircleMania)h; curr.Update(); if (curr.IsHit) { //note been hitted too early, and it's still above judge line. if (curr.StartTime > AudioEngine.Time) { hitted[curr.Column] = true; } continue; } if (hitted[curr.Column] || AudioEngine.Time < curr.StartTime - hitWindowEarly) { continue; } //give a 0 value hit if (AudioEngine.Time - HitWindow100 >= curr.EndTime && !curr.IsHit) { Hit(curr); continue; } if (curr.Column.KeyState && !curr.Column.KeyStateLast) { //press if (curr.ManiaType == ManiaNoteType.Normal || curr.ManiaType == ManiaNoteType.Special) { curr.Pressed = true; curr.TimePress = AudioEngine.Time; hitted[curr.Column] = true; nextSound[curr.Column] = null; Player.Instance.LogHitError(curr); //mania here Hit(curr); } else if (curr.ManiaType == ManiaNoteType.Long && !curr.Pressed) { HitCircleManiaLong currLong = (HitCircleManiaLong)curr; Player.IsSliding = true; curr.TimePress = AudioEngine.Time; hitted[curr.Column] = true; nextSound[curr.Column] = null; curr.Pressed = true; currLong.TimesPressed++; //Only the first press should be logged if (currLong.TimesPressed <= 1) { Player.Instance.LogHitError(curr); } HitStart(currLong); curr.Column.HasLongHitLight = true; } } else if (curr.Column.KeyState && curr.Column.KeyStateLast) { //holding if (curr.ManiaType == ManiaNoteType.Long && curr.Pressed) { HitCircleManiaLong currLong = (HitCircleManiaLong)curr; hitted[curr.Column] = true; nextSound[curr.Column] = null; Holding(currLong); Player.IsSliding = true; curr.Column.HasLongHitLight = true; } } else if (!curr.Column.KeyState) { //not pressing if (curr.ManiaType == ManiaNoteType.Long) { HitCircleManiaLong currLong = (HitCircleManiaLong)curr; if (curr.Pressed) { curr.Pressed = false; curr.TimeRelease = AudioEngine.Time; currLong.TimesReleased++; //Only the first release should be logged if (currLong.TimesReleased <= 1) { Player.Instance.LogHitError(curr, AudioEngine.Time - curr.EndTime); } Hit(curr); } else if (!currLong.IsMissing) { Hit(curr); } } curr.Column.HasLongHitLight = false; } } if (Player.Instance.Status != PlayerStatus.Playing) { return; } for (int i = 0; i < ManiaStage.Columns.Count; i++) { ColumnMania column = ManiaStage.Columns[i]; //release time hax check if (column.KeyState && !column.KeyStateLast) { releaseTime[i] = AudioEngine.Time; } else if (!column.KeyState && column.KeyStateLast && releaseTime[i] != 0) { //press-release interval of normal player should be 40~70ms int interval = AudioEngine.Time - releaseTime[i]; if (interval < 20) { PressHaxCount += 2; } else if (interval < 38) //based on cheat replay analysis { PressHaxCount++; } if (interval < 100) { pressHaxChecked++; //interval less than 100ms should be count as normal hit. } } //empty press if (hitted[i]) { continue; } if (column.KeyState && !column.KeyStateLast) { if (nextSound[i] == null) { HitCircleMania h = (HitCircleMania)hitObjects.Find(obj => obj.StartTime > AudioEngine.Time && ((HitCircleMania)obj).Column == i); nextSound[i] = h; } if (nextSound[i] != null) { nextSound[i].PlaySound(); } } } }