示例#1
0
        /// <summary>
        /// Adds a DrawableHitObject to this Playfield.
        /// </summary>
        /// <param name="hitObject">The DrawableHitObject to add.</param>
        public override void Add(DrawableHitObject hitObject)
        {
            hitObject.AccentColour = AccentColour;
            hitObject.OnJudgement += OnJudgement;

            HitObjects.Add(hitObject);
        }
示例#2
0
        /// <summary>
        /// Adds a DrawableHitObject to this Playfield.
        /// </summary>
        /// <param name="hitObject">The DrawableHitObject to add.</param>
        public override void Add(DrawableHitObject hitObject)
        {
            hitObject.AccentColour = AccentColour;
            hitObject.OnNewResult += OnNewResult;

            HitObjects.Add(hitObject);
        }
示例#3
0
 public void LoadHitObjects()
 {
     if (Timer.Ticks < Duration.TotalMilliseconds && Timer.IsStarted == true)
     {
         foreach (HitObject o in Level.Beatmap.HitObjects)
         {
             if (Timer.Ticks == o.StartTime - (Level.Beatmap.DifficultyApproachRate * Speed[0]))
             {
                 int index = HitObjects.FindIndex(f => f.X == o.StartPosition.X);
                 if (index == -1)
                 {
                     TotalHits++;
                     HitObjects.Add(new Cube(DefaultColor, o.StartPosition.X, -50, Size, Size, false, false));
                     Random gen = new Random();
                     if (gen.Next(100) < 40)
                     {
                         HitObjects.Add(new Cube(DefaultColor, o.StartPosition.X + 10, -150, 20, 20, false, true));
                     }
                 }
             }
         }
     }
     else if (Timer.Ticks > Duration.TotalMilliseconds && State.GetType() != typeof(GameEnded))
     {
         Timer.Stop();
         SplashKit.StopMusic();
         SetState(new GameEnded());
     }
 }
示例#4
0
        /// <summary>
        /// Adds a DrawableHitObject to this Playfield.
        /// </summary>
        /// <param name="hitObject">The DrawableHitObject to add.</param>
        public override void Add(DrawableHitObject hitObject)
        {
            hitObject.Depth = (float)hitObject.HitObject.StartTime;

            hitObject.AccentColour = AccentColour;
            HitObjects.Add(hitObject);
        }
示例#5
0
        /// <summary>
        ///     Adds a HitObject sprite to the container.
        /// </summary>
        public void AddHitObjectSprite(HitObjectInfo h)
        {
            DrawableEditorHitObject hitObject;

            var skin  = SkinManager.Skin.Keys[Ruleset.WorkingMap.Mode];
            var index = skin.ColorObjectsBySnapDistance ? HitObjectManager.GetBeatSnap(h, h.GetTimingPoint(Ruleset.WorkingMap.TimingPoints)) : 0;

            if (h.IsLongNote)
            {
                if (ConfigManager.EditorViewLayers.Value)
                {
                    hitObject = new DrawableEditorHitObjectLong(this, h,
                                                                skin.EditorLayerNoteHitObjects[h.Lane - 1],
                                                                skin.EditorLayerNoteHoldBodies[h.Lane - 1],
                                                                skin.EditorLayerNoteHoldEnds[h.Lane - 1]);
                }
                else
                {
                    hitObject = new DrawableEditorHitObjectLong(this, h,
                                                                skin.NoteHoldHitObjects[h.Lane - 1][index],
                                                                skin.NoteHoldBodies[h.Lane - 1].First(),
                                                                skin.NoteHoldEnds[h.Lane - 1]);
                }
            }
            else
            {
                if (ConfigManager.EditorViewLayers.Value)
                {
                    hitObject = new DrawableEditorHitObject(this, h, skin.EditorLayerNoteHitObjects[h.Lane - 1]);
                }
                else
                {
                    hitObject = new DrawableEditorHitObject(this, h, skin.NoteHitObjects[h.Lane - 1][index]);
                }
            }

            hitObject.Alignment = Alignment.TopLeft;
            hitObject.X         = ScreenRectangle.X + LaneSize * (h.Lane - 1) + DividerLineWidth;
            hitObject.Width     = LaneSize - DividerLineWidth;

            // Make sure the width of the long note is updated if this object is indeed an LN.
            if (hitObject is DrawableEditorHitObjectLong longNote)
            {
                longNote.Body.Width = hitObject.Width;
                longNote.Tail.Width = hitObject.Width;
            }

            hitObject.AppearAsActive();

            // Check if the layer is hidden that the user is adding the object to and display the object
            // as that appropriate colour.
            if (((EditorScreenView)Ruleset.Screen.View).LayerCompositor.ScrollContainer.AvailableItems[hitObject.Info.EditorLayer].Hidden)
            {
                hitObject.AppearAsHiddenInLayer();
            }

            lock (HitObjects)
                HitObjects.Add(hitObject);
        }
示例#6
0
 /// <summary>
 /// Adds the provided HitObject to this Column
 /// </summary>
 /// <param name="hitObject">The HitObject to add</param>
 /// <param name="speed">Current game speed</param>
 /// <param name="crosshairZLoc">The z-axis position of the Crosshair</param>
 public void AddHitObject(HitObject hitObject, double speed, float crosshairZLoc)
 {
     // If this HitObject is hittable, add it to the end of the list.
     if (hitObject.Hittable)
     {
         HitObjects.Add(hitObject);
         UpdateHitObjects.Add(new KeyValuePair <long, HitObject>(hitObject.IsSeenAt(speed, crosshairZLoc), hitObject));
     }
     // If this HitObject is not hittable (Fading Out Effect Arcs), add it to the front of the list.
     else
     {
         HitObjects.Insert(0, hitObject);
         UpdateHitObjects.Insert(0, new KeyValuePair <long, HitObject>(hitObject.IsSeenAt(speed, crosshairZLoc), hitObject));
     }
 }
示例#7
0
 /// <summary>
 ///     Data used to represent a point in time and other variables that influence difficulty.
 /// </summary>
 /// <param name="hitOb"></param>
 /// <param name="rate"></param>
 public StrainSolverData(StrainSolverHitObject hitOb, float rate = 1)
 {
     StartTime = hitOb.HitObject.StartTime / rate;
     EndTime   = hitOb.HitObject.EndTime / rate;
     HitObjects.Add(hitOb);
 }
示例#8
0
 /// <summary>
 /// Adds a DrawableHitObject to this Playfield.
 /// </summary>
 /// <param name="hitObject">The DrawableHitObject to add.</param>
 public override void Add(DrawableHitObject <ManiaHitObject, ManiaJudgement> hitObject)
 {
     hitObject.AccentColour = AccentColour;
     HitObjects.Add(hitObject);
 }
示例#9
0
        /// <summary>
        ///     Ctor - Automatically parses a Peppy beatmap
        /// </summary>
        public OsuBeatmap(string filePath)
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

            if (!File.Exists(filePath.Trim()))
            {
                IsValid = false;
                return;
            }

            // Create a new beatmap object and default the validity to true.
            IsValid          = true;
            OriginalFileName = filePath;

            // This will hold the section of the beatmap that we are parsing.
            var section = "";

            try
            {
                foreach (var raw_line in File.ReadAllLines(filePath))
                {
                    // Skip empty lines and comments.
                    if (string.IsNullOrWhiteSpace(raw_line) ||
                        raw_line.StartsWith("//", StringComparison.Ordinal) ||
                        raw_line.StartsWith(" ", StringComparison.Ordinal) ||
                        raw_line.StartsWith("_", StringComparison.Ordinal))
                    {
                        continue;
                    }

                    var line = StripComments(raw_line);

                    switch (line.Trim())
                    {
                    case "[General]":
                        section = "[General]";
                        break;

                    case "[Editor]":
                        section = "[Editor]";
                        break;

                    case "[Metadata]":
                        section = "[Metadata]";
                        break;

                    case "[Difficulty]":
                        section = "[Difficulty]";
                        break;

                    case "[Events]":
                        section = "[Events]";
                        break;

                    case "[TimingPoints]":
                        section = "[TimingPoints]";
                        break;

                    case "[HitObjects]":
                        section = "[HitObjects]";
                        break;

                    case "[Colours]":
                        section = "[Colours]";
                        break;

                    default:
                        break;
                    }

                    // Parse Peppy file format
                    if (line.StartsWith("osu file format"))
                    {
                        PeppyFileFormat = line;
                    }

                    // Parse [General] Section
                    if (section.Equals("[General]"))
                    {
                        if (line.Contains(":"))
                        {
                            var key   = line.Substring(0, line.IndexOf(':'));
                            var value = line.Split(':').Last().Trim();

                            switch (key.Trim())
                            {
                            case "AudioFilename":
                                AudioFilename = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(value));
                                break;

                            case "AudioLeadIn":
                                AudioLeadIn = int.Parse(value, CultureInfo.InvariantCulture);
                                break;

                            case "PreviewTime":
                                PreviewTime = int.Parse(value, CultureInfo.InvariantCulture);
                                break;

                            case "Countdown":
                                Countdown = int.Parse(value, CultureInfo.InvariantCulture);
                                break;

                            case "SampleSet":
                                SampleSet = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(value));;
                                break;

                            case "StackLeniency":
                                StackLeniency = float.Parse(value, CultureInfo.InvariantCulture);
                                break;

                            case "Mode":
                                Mode = int.Parse(value, CultureInfo.InvariantCulture);
                                if (Mode != 3)
                                {
                                    IsValid = false;
                                }
                                break;

                            case "LetterboxInBreaks":
                                LetterboxInBreaks = int.Parse(value, CultureInfo.InvariantCulture);
                                break;

                            case "SpecialStyle":
                                SpecialStyle = int.Parse(value, CultureInfo.InvariantCulture);
                                break;

                            case "WidescreenStoryboard":
                                WidescreenStoryboard = int.Parse(value, CultureInfo.InvariantCulture);
                                break;
                            }
                        }
                    }

                    // Parse [Editor] Data
                    if (section.Equals("[Editor]"))
                    {
                        if (line.Contains(":"))
                        {
                            var key   = line.Substring(0, line.IndexOf(':'));
                            var value = line.Split(':').Last();

                            switch (key.Trim())
                            {
                            case "Bookmarks":
                                Bookmarks = value;
                                break;

                            case "DistanceSpacing":
                                DistanceSpacing = float.Parse(value, CultureInfo.InvariantCulture);
                                break;

                            case "BeatDivisor":
                                BeatDivisor = int.Parse(value, CultureInfo.InvariantCulture);
                                break;

                            case "GridSize":
                                GridSize = int.Parse(value, CultureInfo.InvariantCulture);
                                break;

                            case "TimelineZoom":
                                TimelineZoom = float.Parse(value, CultureInfo.InvariantCulture);
                                break;
                            }
                        }
                    }

                    // Parse [Metadata] Data
                    if (section.Equals("[Metadata]"))
                    {
                        if (line.Contains(":"))
                        {
                            var key   = line.Substring(0, line.IndexOf(':'));
                            var value = line.Substring(line.IndexOf(':') + 1);

                            switch (key.Trim())
                            {
                            case "Title":
                                Title = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(value));
                                break;

                            case "TitleUnicode":
                                TitleUnicode = value;
                                break;

                            case "Artist":
                                Artist = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(value));
                                break;

                            case "ArtistUnicode":
                                ArtistUnicode = value;
                                break;

                            case "Creator":
                                Creator = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(value));
                                break;

                            case "Version":
                                Version = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(value));
                                break;

                            case "Source":
                                Source = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(value));
                                break;

                            case "Tags":
                                Tags = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(value));
                                break;

                            case "BeatmapID":
                                BeatmapID = int.Parse(value, CultureInfo.InvariantCulture);
                                break;

                            case "BeatmapSetID":
                                BeatmapSetID = int.Parse(value, CultureInfo.InvariantCulture);
                                break;

                            default:
                                break;
                            }
                        }
                    }

                    // Parse [Difficulty] Data
                    if (section.Equals("[Difficulty]"))
                    {
                        if (line.Contains(":"))
                        {
                            var key   = line.Substring(0, line.IndexOf(':'));
                            var value = line.Split(':').Last();

                            switch (key.Trim())
                            {
                            case "HPDrainRate":
                                HPDrainRate = float.Parse(value, CultureInfo.InvariantCulture);
                                break;

                            case "CircleSize":
                                KeyCount = int.Parse(value, CultureInfo.InvariantCulture);

                                if (KeyCount != 4 && KeyCount != 7 && KeyCount != 5 && KeyCount != 8)
                                {
                                    IsValid = false;
                                }
                                break;

                            case "OverallDifficulty":
                                OverallDifficulty = float.Parse(value, CultureInfo.InvariantCulture);
                                break;

                            case "ApproachRate":
                                ApproachRate = float.Parse(value, CultureInfo.InvariantCulture);
                                break;

                            case "SliderMultiplier":
                                SliderMultiplier = float.Parse(value, CultureInfo.InvariantCulture);
                                break;

                            case "SliderTickRate":
                                SliderTickRate = float.Parse(value, CultureInfo.InvariantCulture);
                                break;
                            }
                        }
                    }

                    // Parse [Events] Data
                    if (section.Equals("[Events]"))
                    {
                        var values = line.Split(',');

                        // Background
                        if (line.ToLower().Contains("png") || line.ToLower().Contains("jpg") || line.ToLower().Contains("jpeg"))
                        {
                            Background = values[2].Replace("\"", "");
                        }

                        // Sound effects
                        if (values[0] == "Sample" || values[0] == "5")
                        {
                            var path = values[3].Trim('"').Replace(Path.DirectorySeparatorChar, '/');

                            SoundEffects.Add(new OsuSampleInfo()
                            {
                                StartTime = int.Parse(values[1]),
                                Layer     = int.Parse(values[2]),
                                Volume    = Math.Max(0, Math.Min(100, values.Length >= 5 ? int.Parse(values[4], CultureInfo.InvariantCulture) : 100)),
                                Sample    = CustomAudioSampleIndex(path)
                            });
                        }
                    }

                    try
                    {
                        // Parse [TimingPoints] Data
                        if (section.Equals("[TimingPoints]"))
                        {
                            if (line.Contains(","))
                            {
                                var values = line.Split(',');

                                // Parse as double because there are some maps which have this value too large to fit in
                                // a float, for example https://osu.ppy.sh/beatmapsets/681731#mania/1441497. Parsing as
                                // double and then casting to float results in the correct outcome though.
                                var msecPerBeat = double.Parse(values[1], CultureInfo.InvariantCulture);

                                var timingPoint = new OsuTimingPoint
                                {
                                    Offset = float.Parse(values[0], CultureInfo.InvariantCulture),
                                    MillisecondsPerBeat = (float)msecPerBeat,
                                    Signature           = values[2][0] == '0' ? TimeSignature.Quadruple : (TimeSignature)int.Parse(values[2], CultureInfo.InvariantCulture),
                                    SampleType          = int.Parse(values[3], CultureInfo.InvariantCulture),
                                    SampleSet           = int.Parse(values[4], CultureInfo.InvariantCulture),
                                    Volume    = Math.Max(0, int.Parse(values[5], CultureInfo.InvariantCulture)),
                                    Inherited = int.Parse(values[6], CultureInfo.InvariantCulture),
                                    KiaiMode  = int.Parse(values[7], CultureInfo.InvariantCulture)
                                };

                                TimingPoints.Add(timingPoint);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        IsValid = false;
                    }

                    // Parse [HitObjects] Data
                    if (section.Equals("[HitObjects]"))
                    {
                        if (line.Contains(","))
                        {
                            var values = line.Split(',');

                            // We'll need to parse LNs differently than normal HitObjects,
                            // as they have a different syntax. 128 in the object's type
                            // signifies that it is an LN
                            var osuHitObject = new OsuHitObject
                            {
                                X         = int.Parse(values[0], CultureInfo.InvariantCulture),
                                Y         = int.Parse(values[1], CultureInfo.InvariantCulture),
                                StartTime = int.Parse(values[2], CultureInfo.InvariantCulture),
                                Type      = (HitObjectType)int.Parse(values[3], CultureInfo.InvariantCulture),
                                HitSound  = (HitSoundType)int.Parse(values[4], CultureInfo.InvariantCulture),
                                Additions = "0:0:0:0:",
                                KeySound  = -1
                            };

                            // If it's an LN, we'll want to add the object's EndTime as well.
                            if (osuHitObject.Type.HasFlag(HitObjectType.Hold))
                            {
                                var endTime = values[5].Substring(0, values[5].IndexOf(":", StringComparison.Ordinal));
                                osuHitObject.EndTime = int.Parse(endTime, CultureInfo.InvariantCulture);
                            }

                            // Parse the key sound.
                            if (values.Length > 5)
                            {
                                var additions = values[5].Split(':');

                                var volumeField = osuHitObject.Type.HasFlag(HitObjectType.Hold) ? 4 : 3;
                                if (additions.Length > volumeField && additions[volumeField].Length > 0)
                                {
                                    osuHitObject.Volume = Math.Max(0, int.Parse(additions[volumeField], CultureInfo.InvariantCulture));
                                }

                                var keySoundField = volumeField + 1;
                                if (additions.Length > keySoundField && additions[keySoundField].Length > 0)
                                {
                                    osuHitObject.KeySound = CustomAudioSampleIndex(additions[keySoundField]);
                                }
                            }

                            HitObjects.Add(osuHitObject);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                IsValid = false;
            }
        }
示例#10
0
 /// <summary>
 /// Adds a DrawableHitObject to this Playfield.
 /// </summary>
 /// <param name="h">The DrawableHitObject to add.</param>
 public virtual void Add(DrawableHitObject h) => HitObjects.Add(h);
示例#11
0
文件: Playfield.cs 项目: tgi74/osu
 /// <summary>
 /// Adds a DrawableHitObject to this Playfield.
 /// </summary>
 /// <param name="h">The DrawableHitObject to add.</param>
 public virtual void Add(DrawableHitObject <TObject, TJudgement> h) => HitObjects.Add(h);
示例#12
0
 public void Add(DrawableBarLine barline) => HitObjects.Add(barline);
示例#13
0
        protected override void HandleNinja()
        {
            if (ActiveWeapon != Weapon.Ninja)
            {
                return;
            }

            void ResetVelocity()
            {
                Core.Velocity = NinjaStat.ActivationDirection * NinjaStat.OldVelAmount;
            }

            if (Server.Tick - NinjaStat.ActivationTick > ServerData.Weapons.Ninja.Duration * Server.TickSpeed / 1000)
            {
                Weapons[(int)Weapon.Ninja].Got = false;
                ActiveWeapon = LastWeapon;

                if (NinjaStat.CurrentMoveTime > 0)
                {
                    ResetVelocity();
                }
                return;
            }

            NinjaStat.CurrentMoveTime--;
            if (NinjaStat.CurrentMoveTime == 0)
            {
                ResetVelocity();
            }

            if (NinjaStat.CurrentMoveTime > 0)
            {
                Core.Velocity = NinjaStat.ActivationDirection * ServerData.Weapons.Ninja.Velocity;
                var previousPos = Core.Position;
                var pos         = Core.Position;
                var velocity    = Core.Velocity;
                GameContext.MapCollision.MoveBox(ref pos, ref velocity, new Vector2(ProximityRadius, ProximityRadius), 0);

                Core.Position = pos;
                Core.Velocity = Vector2.Zero;

                var direction = previousPos - pos;
                var radius    = ProximityRadius * 2f;
                var center    = previousPos + direction * 0.5f;

                foreach (var hitCharacter in Entities.Find(center, radius))
                {
                    if (hitCharacter == this)
                    {
                        continue;
                    }

                    if (HitObjects.Contains(hitCharacter))
                    {
                        continue;
                    }

                    if (MathHelper.Distance(hitCharacter.Position, pos) > ProximityRadius * 2f)
                    {
                        continue;
                    }

                    GameContext.CreateSound(pos, Sound.NinjaHit);
                    HitObjects.Add(hitCharacter);
                    hitCharacter.TakeDamage(
                        force: new Vector2(0, -10f),
                        source: NinjaStat.ActivationDirection * -1,
                        damage: ServerData.Weapons.Ninja.Damage,
                        from: Player.ClientId,
                        weapon: Weapon.Ninja);
                }
            }
        }
示例#14
0
 public override void Add(DrawableHitObject hitObject)
 {
     HitObjects.Add(hitObject);
 }