Exemple #1
0
 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)];
        }
Exemple #8
0
        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);
        }
Exemple #9
0
        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);
            }
        }