/// <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); }
/// <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); }
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()); } }
/// <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); }
/// <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); }
/// <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)); } }
/// <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); }
/// <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); }
/// <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; } }
/// <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);
/// <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);
public void Add(DrawableBarLine barline) => HitObjects.Add(barline);
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); } } }
public override void Add(DrawableHitObject hitObject) { HitObjects.Add(hitObject); }