Ejemplo n.º 1
0
        internal override void PlaySound()
        {
            ControlPoint p   = hitObjectManager.Beatmap.ControlPointAt(StartTime + 5);
            int          vol = SampleVolume != 0 ? SampleVolume : p.Volume;

            HitObjectManager.OnHitSound(new HitSoundInfo(SoundType, p.SampleSet, p.CustomSamples, vol));

            if (SoundType.IsType(HitObjectSoundType.Finish))
            {
                AudioEngine.PlayHitSamples(new HitSoundInfo(CorrectButtonIsLeft ? HitObjectSoundType.Finish : HitObjectSoundType.Whistle, p.SampleSet, p.CustomSamples, vol), PositionalSound, true);
            }
        }
Ejemplo n.º 2
0
        internal HitObject CloneAsNormal()
        {
            HitCircleOsu h = new HitCircleOsu(hitObjectManager, Position, StartTime, false,
                                              SoundType.IsType(HitObjectSoundType.Whistle),
                                              SoundType.IsType(HitObjectSoundType.Finish),
                                              SoundType.IsType(HitObjectSoundType.Clap), ComboOffset);

            h.SetColour(Colour);
            h.ComboNumber        = ComboNumber;
            h.Selected           = Selected;
            h.SampleSet          = SampleSet;
            h.SampleSetAdditions = SampleSetAdditions;
            h.CustomSampleSet    = CustomSampleSet;
            h.SampleVolume       = SampleVolume;
            h.SampleAddr         = SampleAddr;
            h.SampleFile         = SampleFile;
            return(h);
        }
Ejemplo n.º 3
0
 internal void GenerateHitObjects()
 {
     if ((convertType & ManiaConvertType.NotChange) > 0)
     {
         Add(0, StartTime, EndTime);
         return;
     }
     if (EndTime - StartTime < 100)
     {
         if (hitObjectManager.ManiaStage.Columns.Count == 8)
         {
             if (SoundType.IsType(HitObjectSoundType.Finish) && (EndTime - StartTime) < 1000)
             {
                 Add(0, StartTime, StartTime);
             }
             else
             {
                 Add(getColumnNext(hitObjectManager.ManiaStage.RandomStart), StartTime, StartTime);
             }
         }
         else
         {
             Add(getColumnNext(0), StartTime, StartTime);
         }
     }
     else
     {
         if (hitObjectManager.ManiaStage.Columns.Count == 8)
         {
             if (SoundType.IsType(HitObjectSoundType.Finish) && (EndTime - StartTime) < 1000)
             {
                 Add(0, StartTime, EndTime);
             }
             else
             {
                 Add(getColumnNext(hitObjectManager.ManiaStage.RandomStart), StartTime, EndTime);
             }
         }
         else
         {
             Add(getColumnNext(0), StartTime, EndTime);
         }
     }
 }
Ejemplo n.º 4
0
        /// <summary>
        /// calculate how many notes in a row by giving probability
        /// </summary>
        /// <param name="noteNeed5"></param>
        /// <param name="noteNeed4"></param>
        /// <param name="noteNeed3"></param>
        /// <param name="noteNeed2"></param>
        /// <param name="rn"></param>
        private void NoteCalculationNormal(float noteNeed5, float noteNeed4, float noteNeed3, float noteNeed2)
        {
            //reduce probability by Column limit.
            switch (hitObjectManager.ManiaStage.Columns.Count)
            {
            case 2:
                noteNeed5 = 1f;
                noteNeed4 = 1f;
                noteNeed3 = 1f;
                noteNeed2 = 1f;
                break;

            case 3:
                noteNeed5 = 1f;
                noteNeed4 = 1f;
                noteNeed3 = 1f;
                noteNeed2 = Math.Max(noteNeed2, 0.90f);
                break;

            case 4:
                noteNeed5 = 1f;
                noteNeed4 = 1f;
                noteNeed3 = Math.Max(noteNeed3, 0.96f);
                noteNeed2 = Math.Max(noteNeed2, 0.77f);
                break;

            case 5:
                noteNeed5 = 1f;
                noteNeed4 = Math.Max(noteNeed4, 0.97f);
                noteNeed3 = Math.Max(noteNeed3, 0.85f);
                break;
            }
            if (SoundType.IsType(HitObjectSoundType.Clap))
            {
                noteNeed2 = 0;
            }
            int noteNeed = hitFactoryMania.GetRandomValue(noteNeed2, noteNeed3, noteNeed4, noteNeed5);

            AddRandomNote(noteNeed);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// calculate how many notes in a row by giving probability
        /// </summary>
        /// <param name="deltaTime"></param>
        /// <param name="repeatCount"></param>
        /// <param name="noteNeed4">put 4 notes in a row if probability larger than this value</param>
        /// <param name="noteNeed3"></param>
        /// <param name="noteNeed2"></param>
        private void NoteCalculation(int startTime, int deltaTime, float noteNeed4, float noteNeed3, float noteNeed2)
        {
            //reduce probability by Column limit.
            switch (hitObjectManager.ManiaStage.Columns.Count)
            {
            case 2:
                noteNeed4 = 1f;
                noteNeed3 = 1f;
                noteNeed2 = 1f;
                break;

            case 3:
                noteNeed4 = 1f;
                noteNeed3 = 1f;
                noteNeed2 = Math.Max(noteNeed2, 0.90f);
                break;

            case 4:
                noteNeed4 = 1f;
                noteNeed3 = Math.Max(noteNeed3, 0.96f);
                noteNeed2 = Math.Max(noteNeed2, 0.7f);
                break;

            case 5:
                noteNeed4 = Math.Max(noteNeed4, 0.97f);
                noteNeed3 = Math.Max(noteNeed3, 0.90f);
                noteNeed2 = Math.Max(noteNeed2, 0.66f);
                break;
            }

            if ((convertType & ManiaConvertType.LowProbability) == 0 &&
                (SoundType.IsType(HitObjectSoundType.Clap | HitObjectSoundType.Finish) ||
                 SoundTypeAt(startTime).IsType(HitObjectSoundType.Clap | HitObjectSoundType.Finish)))
            {
                noteNeed2 = 0;
            }
            AddRandomNote(hitFactoryMania.GetRandomValue(noteNeed2, noteNeed3, noteNeed4), startTime, deltaTime);
        }
Ejemplo n.º 6
0
        internal void UpdateCalculations(bool force, double multiplier)
        {
            if (force || taikoMiddle == null)
            {
                //slider endpoint is not hittable when the next hitobject has
                //a starttime before the slider's endtime.
                List <HitObject> hitobjects = hitObjectManager.hitObjects;
                int ind = hitobjects.IndexOf(this);
                if (ind < hitobjects.Count - 1 &&
                    hitobjects[ind + 1].HittableStartTime - (EndTime + (int)MinHitDelay) <= (int)MinHitDelay)
                {
                    endpointHittable = false;
                }

                float scalefactor = !SoundType.IsType(HitObjectSoundType.Finish) ? 0.65f : 1;

                SpatialLength *= SegmentCount;
                double v = hitObjectManager.SliderScoringPointDistance * hitObjectManager.Beatmap.DifficultySliderTickRate;
                double b = hitObjectManager.Beatmap.BeatLengthAt(StartTime);
                EndTime = StartTime + (int)(SpatialLength / v * b);

                SpatialLength *= multiplier;

                taikoMiddle = new pSprite(TextureManager.Load(@"taiko-roll-middle"), Fields.GamefieldWide,
                                          Origins.TopLeft, Clocks.Audio,
                                          new Vector2(Position.X,
                                                      Position.Y - hitObjectManager.HitObjectRadius * scalefactor),
                                          SpriteManager.drawOrderBwd(EndTime + 10),
                                          false, new Color(252, 184, 6));
                taikoMiddle.VectorScale =
                    new Vector2((float)SpatialLength * GameBase.WindowManager.Ratio / hitObjectManager.SpriteRatio * (1 / scalefactor), 1);
                taikoMiddle.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1,
                                                                   StartTime - hitObjectManager.PreEmpt, StartTime));
                taikoMiddle.Transformations.Add(new Transformation(TransformationType.Fade, 1, 0, EndTime,
                                                                   EndTime + hitObjectManager.PreEmptSliderComplete));
                spriteManager.Add(taikoMiddle);
                SpriteCollection.Add(taikoMiddle);
                DimCollection.Add(taikoMiddle);

                taikoEnd = new pSprite(TextureManager.Load(@"taiko-roll-end"), Fields.GamefieldWide, Origins.TopLeft,
                                       Clocks.Audio,
                                       new Vector2(Position.X, Position.Y - hitObjectManager.HitObjectRadius * scalefactor),
                                       SpriteManager.drawOrderBwd(EndTime + 8),
                                       false, new Color(252, 184, 6));
                taikoEnd.OriginPosition =
                    new Vector2(
                        (float)-SpatialLength * GameBase.WindowManager.Ratio / hitObjectManager.SpriteRatio * (1 / scalefactor), 0);
                taikoEnd.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1,
                                                                StartTime - hitObjectManager.PreEmpt, StartTime));
                taikoEnd.Transformations.Add(new Transformation(TransformationType.Fade, 1, 0, EndTime,
                                                                EndTime + hitObjectManager.PreEmptSliderComplete));

                spriteManager.Add(taikoEnd);
                SpriteCollection.Add(taikoEnd);
                DimCollection.Add(taikoEnd);

                sliderBall.Transformations.Add(new Transformation(sliderStartCircle.Position,
                                                                  sliderStartCircle.Position, StartTime - 500, EndTime));
                sliderFollower.Transformations.Add(new Transformation(sliderStartCircle.Position,
                                                                      sliderStartCircle.Position, StartTime, EndTime));

                counter =
                    new pSpriteText("", SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap,
                                    Fields.GamefieldWide, Origins.Centre, Clocks.Audio,
                                    HitObjectManagerTaiko.HIT_LOCATION, 0.9f, false, Color.White);
                counter.Scale = 0.8f;
                counter.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1, StartTime, StartTime));
                counter.Transformations.Add(new Transformation(TransformationType.Fade, 0.6f, 0, EndTime, EndTime + 300));
                spriteManager.Add(counter);

                int index = 0;

                for (double i = StartTime; i < HittableEndTime; i += MinHitDelay)
                {
                    if (i == StartTime)
                    {
                        hittablePoints.Add(new HitPoint((int)i, null));
                        index++;
                        continue;
                    }

                    bool major = ((hitObjectManager.Beatmap.DifficultySliderTickRate == 3) ||
                                  (hitObjectManager.Beatmap.DifficultySliderTickRate == 6) ||
                                  (hitObjectManager.Beatmap.DifficultySliderTickRate == 1.5d)) ? (index % 3) == 0 : (index % 4) == 0;

                    pSprite scoringDot = new pSprite(TextureManager.Load(@"sliderscorepoint"),
                                                     Fields.GamefieldWide, Origins.Centre, Clocks.Audio, new Vector2(Position.X,
                                                                                                                     Position.Y),
                                                     SpriteManager.drawOrderBwd(StartTime + 1), false, major ? Color.Yellow : Color.White, this);

                    if (!major)
                    {
                        scoringDot.Scale *= 0.8f;
                    }


                    scoringDot.OriginPosition.X -= (float)(SpatialLength * (float)(i - StartTime) / Length) * GameBase.WindowManager.Ratio / hitObjectManager.SpriteRatio / scoringDot.Scale * (1 / scalefactor);

                    scoringDot.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1,
                                                                      StartTime - hitObjectManager.PreEmpt, StartTime));
                    scoringDot.Transformations.Add(new Transformation(TransformationType.Fade, 1, 0, EndTime,
                                                                      EndTime + hitObjectManager.PreEmptSliderComplete));

                    hittablePoints.Add(new HitPoint((int)i, scoringDot));

                    spriteManager.Add(scoringDot);
                    SpriteCollection.Add(scoringDot);
                    DimCollection.Add(scoringDot);

                    index++;
                }

                if (scalefactor != 1)
                {
                    foreach (pSprite p in SpriteCollection)
                    {
                        p.Scale *= scalefactor;
                    }
                }

                for (int i = 0; i < sliderStartCircle.SpriteCollection.Count; i++)
                {
                    pSprite s = sliderStartCircle.SpriteCollection[i];
                    foreach (Transformation t in s.Transformations)
                    {
                        if (t.Type ==
                            TransformationType.Fade &&
                            t.StartFloat == 1)
                        {
                            t.Time1 = EndTime;
                            t.Time2 = EndTime;
                        }
                    }
                    SpriteCollection.Add(s);
                    DimCollection.Add(s);
                    spriteManager.Add(s);
                }
            }
        }
Ejemplo n.º 7
0
        internal void GenerateHitObjects()
        {
            hitFactoryMania = hitObjectManager.hitFactory as HitFactoryMania;

            //sample specific,arranged by priority
            //don't generate mirror style for 7+1K
            if ((convertType & ManiaConvertType.KeepSingle) == 0)
            {
                if (SoundType.IsType(HitObjectSoundType.Finish) && hitObjectManager.ManiaStage.Columns.Count != 8)
                {
                    convertType |= ManiaConvertType.Mirror;
                }
                else if (SoundType.IsType(HitObjectSoundType.Clap))
                {
                    convertType |= ManiaConvertType.Gathered;
                }
            }

            //some special convertypes ignore other conversion indication.
            if ((convertType & ManiaConvertType.NotChange) > 0 ||
                hitObjectManager.ManiaStage.Columns.Count == 1)
            {
                Add(hitObjectManager.ManiaStage.ColumnAt(Position));
                PostProcessing();
                return;
            }

            if ((convertType & ManiaConvertType.Reverse) > 0 && lastCount > 0)
            {
                for (int i = hitObjectManager.ManiaStage.RandomStart; i < lastRow.Length; i++)
                {
                    if (lastRow[i])
                    {
                        Add(hitObjectManager.ManiaStage.Columns.Count - i - 1 + hitObjectManager.ManiaStage.RandomStart);
                    }
                }
                PostProcessing();
                return;
            }
            if ((convertType & ManiaConvertType.Cycle) > 0 && lastCount == 1)
            {
                //make sure last note not in centre column.
                if (!(hitObjectManager.ManiaStage.Columns.Count == 8 && lastColumn == 0) && (hitObjectManager.ManiaStage.Columns.Count % 2 == 0 || lastColumn != hitObjectManager.ManiaStage.Columns.Count / 2))
                {
                    lastColumn = hitObjectManager.ManiaStage.Columns.Count - lastColumn - 1 + hitObjectManager.ManiaStage.RandomStart;
                    Add(lastColumn);
                    PostProcessing();
                    return;
                }
            }
            if ((convertType & ManiaConvertType.ForceStack) > 0 && lastCount > 0)
            {
                //keep the same column with last row
                for (int i = hitObjectManager.ManiaStage.RandomStart; i < lastRow.Length; i++)
                {
                    if (lastRow[i])
                    {
                        Add(i);
                    }
                }
                PostProcessing();
                return;
            }
            if ((convertType & (ManiaConvertType.Stair | ManiaConvertType.ReverseStair)) > 0 && lastCount == 1)
            {
                if ((convertType & ManiaConvertType.Stair) > 0)
                {
                    lastColumn++;
                    if (lastColumn == hitObjectManager.ManiaStage.Columns.Count)
                    {
                        lastColumn = hitObjectManager.ManiaStage.RandomStart;
                    }
                }
                else
                {
                    lastColumn--;
                    if (lastColumn == hitObjectManager.ManiaStage.RandomStart - 1)
                    {
                        lastColumn = hitObjectManager.ManiaStage.Columns.Count - 1;
                    }
                }
                Add(lastColumn);
                PostProcessing();
                return;
            }
            if ((convertType & ManiaConvertType.KeepSingle) > 0)
            {
                AddRandomNote(1);
                PostProcessing();
                return;
            }

            if ((convertType & ManiaConvertType.Mirror) > 0)
            {
                if (hitObjectManager.Beatmap.DifficultyBemaniStars > 6.5)
                {
                    NoteCalculationMirror(0.88f, 0.88f, 0.62f);
                }
                else if (hitObjectManager.Beatmap.DifficultyBemaniStars > 4.0)
                {
                    NoteCalculationMirror(0.88f, 1f, 0.83f);
                }
                else
                {
                    NoteCalculationMirror(0.88f, 1f, 1f);
                }
            }
            else
            {
                if (hitObjectManager.Beatmap.DifficultyBemaniStars > 6.5)
                {
                    if ((convertType & ManiaConvertType.LowProbability) > ManiaConvertType.None)
                    {
                        NoteCalculationNormal(1f, 1f, 0.58f, 0.22f);
                    }
                    else
                    {
                        NoteCalculationNormal(1f, 1f, 0.38f, 0);
                    }
                }
                else if (hitObjectManager.Beatmap.DifficultyBemaniStars > 4.0)
                {
                    if ((convertType & ManiaConvertType.LowProbability) > ManiaConvertType.None)
                    {
                        NoteCalculationNormal(1f, 1f, 0.92f, 0.65f);
                    }
                    else
                    {
                        NoteCalculationNormal(1f, 1f, 0.85f, 0.48f);
                    }
                }
                else if (hitObjectManager.Beatmap.DifficultyBemaniStars > 2.0)
                {
                    if ((convertType & ManiaConvertType.LowProbability) > ManiaConvertType.None)
                    {
                        NoteCalculationNormal(1f, 1f, 1f, 0.82f);
                    }
                    else
                    {
                        NoteCalculationNormal(1f, 1f, 1f, 0.55f);
                    }
                }
                else
                {
                    NoteCalculationNormal(1f, 1f, 1f, 1f);
                }
            }
            if (hitObjectManager.ManiaStage.RandomStart > 0 && SoundType.IsType(HitObjectSoundType.Finish | HitObjectSoundType.Clap))
            {
                Add(0);
            }
            PostProcessing();
        }