示例#1
0
        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();
                    }
                }
            }
        }