public static bool AllowRanking(Mods enabledMods) { if (Player.Mode == PlayModes.OsuMania) { if (CheckActive(Mods.HardRock | Mods.Random, enabledMods)) { return(false); } if (CheckActive(Mods.KeyCoop, enabledMods)) { return(false); } if (BeatmapManager.Current.PlayMode == PlayModes.Osu) { int columns = StageMania.ColumnsWithMods(BeatmapManager.Current, enabledMods); if (columns < 4 || columns > 9) { return(false); } } } if (CheckActive(Mods.Autoplay, enabledMods)) { return(false); } if (CheckActive(Mods.Target, enabledMods)) { return(false); } return(true); }
public ComboCounterMania(SpriteManager spriteManager, StageMania maniaStage, bool primary = true) : base(spriteManager) { this.stage = maniaStage; s_hitCombo.Position = new Vector2(maniaStage.Left + maniaStage.Width / 2, maniaStage.ScaleFlipPosition(maniaStage.Skin.ComboPosition)); s_hitCombo.OriginPosition = Vector2.Zero; s_hitCombo.Origin = Origins.Centre; if (SkinManager.Current.Version >= 2.4 || maniaStage.HeightRatio < 1f) { s_hitCombo.Scale = maniaStage.MinimumRatio; } s_hitCombo.TextConstantSpacing = true; holdColour = maniaStage.Skin.GetColour(@"Hold"); breakColour = maniaStage.Skin.GetColour(@"Break"); if (!primary) { return; } if (maniaStage.SecondaryStage != null) { foreach (StageMania stage in maniaStage.SecondaryStage) { secondaryComboCounters.Add(new ComboCounterMania(spriteManager, stage, false)); } } }
private void disposeManiaStage() { if (stage != null) { stage.Dispose(); stage = null; } }
internal void UpdateDifficultyText() { if (Beatmap == null) { return; } textDifficulty.Text = Beatmap.Version; if ((Player.Mode == PlayModes.OsuMania && Beatmap.PlayMode == PlayModes.Osu) || Beatmap.PlayMode == PlayModes.OsuMania) { textDifficulty.Text += string.Format(@" ({0}K{1})", StageMania.ColumnsWithMods(Beatmap), Math.Round(Beatmap.DifficultyOverall) <= 4 ? @"↓" : string.Empty); } }
protected override void OnSetBeatmap() { if (spriteManager != null) { ManiaStage = new StageMania(SkinManager.LoadManiaSkin(StageMania.ColumnsWithMods(Beatmap, ActiveMods), ActiveMods)); } else { ManiaStage = new StageMania(this); } nextSound = new HitCircleMania[ManiaStage.Columns.Count]; releaseTime = new int[ManiaStage.Columns.Count]; //generate random index randomIndex = new int[ManiaStage.Columns.Count]; Dictionary <int, bool> exist = new Dictionary <int, bool>(ManiaStage.Columns.Count); Random random = new Random(Player.Seed); for (int i = 0; i < ManiaStage.Columns.Count; i++) { if (ManiaStage.AllowSpecialStyle && i == 0) { if (ManiaStage.SpecialStyleRight) { randomIndex[0] = ManiaStage.Columns.Count - 1; exist[ManiaStage.Columns.Count - 1] = true; } else { randomIndex[0] = 0; exist[0] = true; } } else { int next = random.Next(0, ManiaStage.Columns.Count); while (exist.ContainsKey(next)) { next = random.Next(0, ManiaStage.Columns.Count); } randomIndex[i] = next; exist[next] = true; } } exist.Clear(); }
static public Mods MaskRelevantMods(Mods mods, PlayModes mode, Beatmap map) { switch (mode) { case PlayModes.Taiko: return(mods & BeatmapDifficultyCalculatorTaiko.RelevantMods); case PlayModes.CatchTheBeat: return(mods & BeatmapDifficultyCalculatorFruits.RelevantMods); case PlayModes.OsuMania: return(StageMania.CanonicalKeyMods(map, mods) & BeatmapDifficultyCalculatorMania.RelevantMods); default: return(mods & BeatmapDifficultyCalculatorOsu.RelevantMods); } }
public HitFactoryMania(HitObjectManager hitObjectMananager) : base(hitObjectMananager) { // scroll speed should not be set by difficuly calc if (hitObjectManager.spriteManager != null) { // the scroll speed is only owned if we're playing, or watching autoplay bool owned = !InputManager.ReplayMode || (InputManager.ReplayScore != null && ModManager.CheckActive(InputManager.ReplayScore.EnabledMods, Mods.Autoplay)); SpeedMania.ResetSpeed(owned); } int seed = (int)Math.Round(hitObjectManager.Beatmap.DifficultyHpDrainRate + hitObjectManager.Beatmap.DifficultyCircleSize) * 20 + (int)(hitObjectManager.Beatmap.DifficultyOverall * 41.2) + (int)Math.Round(hitObjectManager.Beatmap.DifficultyApproachRate); random.Reinitialise(seed); randomSync.Reinitialise(seed); prevNotes = new List <int>(prevCount); record(Vector2.Zero, 0); prevRow = new bool[StageMania.ColumnsWithMods(hitObjectManager.Beatmap, hitObjectManager.ActiveMods)]; }
internal HpBarMania(StageMania stage) : base(stage.SpriteManagerBelow) { s_kiIcon.Bypass = true; s_barBg.Rotation = -OsuMathHelper.PiOver2; s_barFill.Rotation = -OsuMathHelper.PiOver2; s_barBg.Scale = 0.7F; s_barFill.Scale = 0.7F; s_barBg.VectorScale = new Vector2(1, stage.HeightRatio); s_barFill.VectorScale = new Vector2(1, stage.HeightRatio); s_barBg.Position = new Vector2(stage.Left + stage.Width + 1, stage.Top + stage.Height); if (newDefault) { s_barFill.Position = new Vector2(stage.Left + stage.Width + 6.6f, stage.Top + 474.8f * stage.HeightRatio); } else { s_barFill.Position = new Vector2(stage.Left + stage.Width + 8f, stage.Top + 478 * stage.HeightRatio); } InitialIncrease = false; this.spriteManager.Add(SpriteCollection); }
internal static double ScoreMultiplier(Mods modStatus, PlayModes mode, Beatmap beatmap) { double multiplier = 1; switch (mode) { case PlayModes.Osu: case PlayModes.Taiko: if (CheckActive(modStatus, Mods.NoFail)) { multiplier *= 0.5; } if (CheckActive(modStatus, Mods.Easy)) { multiplier *= 0.5; } if (CheckActive(modStatus, Mods.HalfTime)) { multiplier *= 0.3; } if (CheckActive(modStatus, Mods.Hidden)) { multiplier *= 1.06; } if (CheckActive(modStatus, Mods.HardRock)) { multiplier *= 1.06; } if (CheckActive(modStatus, Mods.DoubleTime)) { multiplier *= 1.12; } if (CheckActive(modStatus, Mods.Flashlight)) { multiplier *= 1.12; } if (CheckActive(modStatus, Mods.SpunOut)) { multiplier *= 0.9; } if (CheckActive(modStatus, Mods.Relax) || CheckActive(modStatus, Mods.Relax2)) { multiplier *= 0; } break; case PlayModes.CatchTheBeat: if (CheckActive(modStatus, Mods.NoFail)) { multiplier *= 0.5; } if (CheckActive(modStatus, Mods.Easy)) { multiplier *= 0.5; } if (CheckActive(modStatus, Mods.HalfTime)) { multiplier *= 0.3; } if (CheckActive(modStatus, Mods.Hidden)) { multiplier *= 1.06; } if (CheckActive(modStatus, Mods.HardRock)) { multiplier *= 1.12; } if (CheckActive(modStatus, Mods.DoubleTime)) { multiplier *= 1.06; } if (CheckActive(modStatus, Mods.Flashlight)) { multiplier *= 1.12; } if (CheckActive(modStatus, Mods.SpunOut)) { multiplier *= 0.9; } if (CheckActive(modStatus, Mods.Relax) || CheckActive(modStatus, Mods.Relax2)) { multiplier *= 0; } break; case PlayModes.OsuMania: if (CheckActive(modStatus, Mods.NoFail)) { multiplier *= 0.5; } if (CheckActive(modStatus, Mods.Easy)) { multiplier *= 0.5; } if (CheckActive(modStatus, Mods.HalfTime)) { multiplier *= 0.5; } if (CheckActive(modStatus, Mods.Hidden) || CheckActive(modStatus, Mods.FadeIn)) { multiplier *= 1.06; } if (CheckActive(modStatus, Mods.HardRock)) { multiplier *= 1.08; } if (CheckActive(modStatus, Mods.DoubleTime)) { multiplier *= 1.1; } if (CheckActive(modStatus, Mods.Flashlight)) { multiplier *= 1.06; } if (CheckActive(modStatus, Mods.SpunOut)) { multiplier *= 0; } if (CheckActive(modStatus, Mods.Relax)) { multiplier *= 0; } if (CheckActive(modStatus, Mods.Relax2)) { multiplier *= 0; } if (CheckActive(modStatus, Mods.Random)) { multiplier *= 1; } if (beatmap != null) { int org = StageMania.ColumnsWithoutMods(beatmap); int use = StageMania.ColumnsWithMods(beatmap, modStatus); if (use > org) { multiplier *= 0.9; } else if (use < org) { multiplier *= (0.9 - 0.04 * (org - use)); } } break; } return(Math.Max(0, multiplier)); }
internal void LoadKeys(bool setDefaultSplitStages = false) { currentBindingColumn = 0; spriteManager.SpriteList.FindAll(s => s.Tag == this).ForEach(s => { s.FadeOut(50); s.AlwaysDraw = false; spriteManager.Remove(s); }); disposeManiaStage(); SkinMania skin = SkinManager.LoadManiaSkin(currentKeyConfig); cSplitLayout.Enabled = currentKeyConfig > 1 && skin.SplitStagesFromSkin == null; if (!setDefaultSplitStages) { skin.SplitStages = cSplitLayout.Checked; } cSplitLayout.SetStatusQuietly(skin.SplitStages); dKeyConfig.SpriteMainBox.Text = getKeyOptionText(currentKeyConfig, skin.SplitStages); stage = new StageMania(skin, true); //Validate the layout by recopying it to itself stage.CopyBindingToLayout(stage.LayoutList.Layout); dSpecialStyle.Enabled = stage.AllowSpecialStyle; switch (stage.SpecialStyle) { case ManiaSpecialStyle.Left: dSpecialStyle.SetSelected(1, true); break; case ManiaSpecialStyle.Right: dSpecialStyle.SetSelected(2, true); break; default: dSpecialStyle.SetSelected(0, true); break; } cBindAlternateKeys.Enabled = stage.SpecialStyle != ManiaSpecialStyle.None; if (stage.SpecialStyle == ManiaSpecialStyle.None) { cBindAlternateKeys.SetStatusQuietly(false); } cJudgementLine.SetStatusQuietly(skin.JudgementLine); cUpsideDown.SetStatusQuietly(skin.UpsideDown); float delta = 40f; float separation = skin.SplitStages ? 1f : 0f; float totalWidth = (currentKeyConfig + separation) * delta; //Scale down if the keys are too wide to fit on the screen float scale = Math.Min(1f, GameBase.WindowManager.WidthScaled / totalWidth); totalWidth *= scale; delta *= scale; float start = (GameBase.WindowManager.WidthScaled - totalWidth) / 2; arrow = new pSprite(TextureManager.LoadFirstAvailable(new[] { @"arrow-generic", @"play-warningarrow" }, SkinSource.Osu), Fields.TopLeft, Origins.CentreLeft, Clocks.Game, new Vector2(0, 100), 0.92f, true, GameBase.NewGraphicsAvailable ? Color.SkyBlue : Color.White); arrow.Tag = this; arrow.Rotation = OsuMathHelper.PiOver2; spriteManager.Add(arrow); keys = new pText[currentKeyConfig]; int layoutIndex = 0; for (int i = 0; i < currentKeyConfig; i++) { bool skip = false; if (cBindAlternateKeys.Checked) { skip = true; foreach (StageMania s in stage) { if (i == s.Columns[s.SpecialColumn]) { skip = false; } } } if (!skip) { pSprite p = new pSprite(TextureManager.Load(@"mania-key1D", SkinSource.Osu), Fields.TopLeft, Origins.TopLeft, Clocks.Game, new Vector2(start, 192), 0.92f, true, stage.Columns[i].Colour); p.VectorScale = 1.3f * new Vector2(scale, 1f); p.Tag = this; spriteManager.Add(p); keys[i] = new pText(getKeyText(i), Math.Max(1, (int)Math.Round(14 * scale)), new Vector2(start + delta / 2f, 192 + 40), 0.93f, true, Color.White); keys[i].TextBorder = true; keys[i].Origin = Origins.Centre; keys[i].Tag = this; keys[i].TagNumeric = layoutIndex; spriteManager.Add(keys[i]); //Found the first non-skipped key if (layoutIndex++ == 0) { currentBindingColumn = i; arrow.Position.X = start + delta / 2; } } start += delta + delta * (i == stage.PrimaryStageColumns - 1 ? separation : 0); } }